¿Qué es la simulación de eventos discretos?
La simulación de eventos discretos (DES) modela un sistema como una secuencia de eventos (Events) que suceden en puntos específicos en el tiempo. En un contexto de manufactura, cada evento representa algo concreto: una entidad (Entity) llegando a un proceso (Process), un recurso (Resource) volviéndose disponible, un lote completándose. ProDex ejecuta DES usando el motor SimPy por debajo. No interactúas con SimPy directamente — construyes modelos visualmente en un lienzo, y ProDex maneja la ejecución de la simulación. La idea clave de DES: puedes modelar operaciones complejas, variables e interdependientes con precisión sin necesitar un prototipo físico o ejecutar el sistema real. Cambia la capacidad de un recurso, ajusta una distribución (Distribution) de tiempo de procesamiento, agrega un búfer (Buffer) — y observa los efectos descendentes en segundos.Construyendo un modelo
Los modelos se construyen como un grafo dirigido en el lienzo del Modelador. Los componentes son nodos; las conexiones son aristas que definen el flujo de entidades.Barra superior
La barra superior del modelo (Model) expone los controles que actúan sobre el modelo como un todo:- Selector de modelo — abre un menú desplegable con el modelo activo (marca de verificación),
+ New Model,Renamey unDeleterojo. - Selector de calendario (Schedule) — elige contra cuál calendario corre el modelo. El menú desplegable lista
Default (no schedule), cada calendario definido (el activo con marca de verificación),+ New Scheduley unDeleterojo. Cuando el calendario activo esDefault (no schedule)el siguiente campo es la entrada de Duration (un selector de tiempoDDD:HH:MM:SSque establece cuánto dura la simulación); cuando un calendario distinto de Default está activo, esa entrada se reemplaza por un ícono de edición (lápiz) que abre el editor de calendarios. - Save (ícono de disco) — guarda una Instantánea (Snapshot) de la configuración actual. Tooltip: “Save current work as snapshot.” El diálogo (titulado Create Snapshot, con un pequeño ícono de cámara, subtítulo “Save the current state of your model to return to it later.”) toma un Snapshot Name (requerido) y una Description opcional, con un botón primario Create Snapshot.
- Historial de Instantáneas (ícono de reloj) — abre un selector Search snapshots que lista las Instantáneas existentes agrupadas por recencia. Elegir una la carga al lienzo (con un toast “Snapshot loaded successfully”).
- Undo / Redo — historial completo de edición para la sesión actual.
Tipos de componentes
Source (Fuente) Genera entidades y las inyecta en el modelo. Configura:- Qué tipo de entidad producir
- Lógica de llegada — elige una distribución de un menú desplegable de 10 opciones (Fixed, Normal, Exponential, Uniform, Lognormal, Weibull, Triangular, Erlang, Beta, Gamma). Los campos de parámetros de distribución se renderizan como un selector de tiempo
DDD:HH:MM:SS, y cada uno tiene un toggle</>que lo cambia al editor de expresiones (Expressions) DSL. - Valores iniciales de atributos, establecidos por atributo a través de un menú desplegable Strategy. Existen seis estrategias canónicas — Fixed, DSL Expression, Round Robin, Random Choice, Random (muestrea de una distribución de probabilidad) y Weighted (renderiza una tabla Value/Weight). El menú desplegable se filtra por el tipo del atributo — los atributos Number solo ven Fixed / Random / DSL Expression; los tipos categóricos (Boolean / Text List / Number List) ven Fixed / Round Robin / Random Choice / Weighted; los atributos Text ven Fixed / DSL Expression. Ver Entidades y atributos para la matriz completa tipo-por-estrategia.
- Event Hooks
- Entity Type — alcanza el resto del panel a un tipo de entidad específico
- Tiempo de procesamiento como una distribución (mismo menú desplegable de 10 opciones que Source) o expresión DSL
- Requisitos de recurso — una tabla multi-fila (+ Add Row) especificando qué recursos y cuántos de cada uno
- Estación (Station) — opcionalmente coloca el proceso dentro de un contenedor de estación por referencia
- Event Hooks — process started, process completed
- Capacidad (número de unidades disponibles)
- Disciplina de asignación — FIFO (First In, First Out), LIFO (Last In, First Out) o Priority
- Tiempos de cambio — duraciones por-(de proceso, a proceso) aplicadas cuando el recurso cambia entre procesos (+ Add Row para cada uno)
- Event Hooks — más comúnmente usados para reaccionar a tópicos de turno con la acción Set Capacity (ver el patrón de programación de turnos)
Las claves de cambio son procesos, no tipos de entidad. Un recurso que maneja dos productos a través del mismo proceso no incurre en cambio; cambiar entre dos procesos (incluso en el mismo tipo de entidad) sí. Si tu modelo de cambio está indexado por tipo de entidad hoy, reelabóralo alrededor de los procesos que realmente demandan la configuración.
- Entity Type — requerido; solo las entidades del tipo coincidente pueden entrar al sumidero.
- Event Hooks — Los Sumideros disparan entity terminated.
- Entity Type
- Capacidad, con un toggle explícito Infinite para colas no acotadas
- Queue Discipline — FIFO (First In, First Out), LIFO (Last In, First Out) o Priority
- Release Mode — Push (auto-release) (libera tan pronto como el componente descendente esté listo) o Hold (manual release) (libera solo en una acción Release Entity, útil para patrones pull-based / kanban)
- Event Hooks — Los Búferes y Estaciones son los únicos componentes de flujo que emiten entity entered y entity exited
- Round Robin — cicla a través de las salidas en orden
- Conditional — reglas IF/THEN sobre atributos de entidad, estado de simulación o consultas de componente; soporta una Default Route configurable
- Probabilistic — divisiones porcentuales con un filtro Entity Type; los pesos se normalizan automáticamente a probabilidades (no tienes que hacer que sumen 1). Sin Default Route — cada entidad coincide con una ruta ponderada.
- Type-based — mapea cada tipo de entidad a un destino
SUM(weight), MAX(priority), ALL(qc_passed)) y la interacción basada en linaje con las Estaciones.
Separator (Separador)
Divide una entidad de entrada en múltiples entidades de salida. Configura una Input Entity, una tabla Output Batch donde cada fila empareja un tipo de entidad de salida con una expresión de conteo (por ejemplo IF(tube_count >= 5, 2, 1)), y Asignaciones de Atributos por-tipo-de-salida con Strategy = Fixed | DSL Expression. Ver Combinadores, separadores y transformadores para el contexto multi-entidad en el hook batch created.
Transformer (Transformador)
Produce una nueva entidad de salida de un tipo diferente — útil cuando una materia prima se convierte en un producto diferente después de un paso de proceso. Ver Combinadores, separadores y transformadores.
Station (Estación)
Un contenedor con restricción de capacidad para componentes que representa un espacio físico o centro de trabajo. La capacidad se configura como una tabla por-tipo-de-entidad (por ejemplo Tube = 500, Tray = 100) para que la misma estación pueda contener diferentes números de diferentes elementos a la vez.
Model Node (Nodo de modelo)
Embebe otro modelo de simulación dentro de este. Usa esto para construir modelos jerárquicos — define un subproceso una vez y reúsalo a través de múltiples modelos padre. Los Nodos de Modelo no aparecen en la paleta izquierda como un componente arrastrable; en su lugar, importa un archivo de modelo a través de la opción de importación de la barra superior para que aparezca en el panel Models a la izquierda, luego arrástralo desde allí al lienzo. Ver Nodos de modelo y modelado jerárquico para conexiones mapeadas, recursos compartidos, tópicos puenteados, variables de estado con alias y la sintaxis de ruta calificada parent::child.
Cada componente de flujo lleva una sección Event Hooks en su panel de configuración — Source, Process, Resource, Sink, Buffer, Router, Combiner, Separator, Transformer, Station. Cada hook se suscribe ya sea a un evento de ciclo de vida a nivel de componente (process started, entity created, entity terminated, etc.) o a un tópico publicado en otro lugar, y ejecuta una acción cuando se dispara (Assign, Emit, Pause, Resume, Release Entity, Set Capacity). Así es como la lógica de turnos, kanban, contrapresión y cualquier coordinación entre componentes se conectan. Ver Sistema de eventos para la lista completa de eventos por tipo de componente y el contrato de acción.
Conexiones
Dibuja conexiones entre las salidas y entradas de los componentes para definir cómo fluyen las entidades. Una conexión de un Proceso a un Búfer significa que las entidades que salen de ese proceso hacen cola en ese búfer antes de seguir.Expresiones y el DSL
La mayoría de los campos numéricos y lógicos en la configuración de componentes aceptan ya sea un valor literal o una expresión escrita en el DSL (lenguaje específico de dominio) de ProDex. Las expresiones te permiten hacer modelos dinámicos y orientados a datos. Ver El lenguaje de expresiones para la referencia completa de funciones, variables incorporadas, contextos de expresión y patrones comunes. Usos comunes:- Tiempo de procesamiento como una distribución — por ejemplo, una distribución Triangular con Lower Bound 2, Mode 5, Upper Bound 10
- Lógica de enrutamiento:
IF(ENTITY_TYPE == "TypeA", "path_1", "path_2") - Requisito de recurso basado en atributo de entidad:
IF(priority == "high", 2, 1) - Búsqueda desde una tabla:
LOOKUP(cycle_times_table, ENTITY_TYPE)
SIM_TIME/NOW— tiempo actual de simulaciónSIM_DURATION— duración total configurada de la ejecuciónENTITY_TYPE— tipo de la entidad actualENTITY_AGE— tiempo que la entidad ha estado en el sistemaBUFFER_LEVEL(buffer_name)— número actual de entidades en un búferBUFFER_CAPACITY(buffer_name)— capacidad configurada de un búferRESOURCE_AVAILABLE(resource_name)— unidades disponibles de un recursoSTATION_WIP(station_name)— trabajo en progreso en una estación
Las distribuciones se eligen del menú desplegable de 10 opciones, no se escriben como llamadas a funciones DSL. El selector en cada campo numérico expone el conjunto completo: Fixed, Normal, Exponential, Uniform, Lognormal, Weibull, Triangular, Erlang, Beta, Gamma. Cada campo de parámetro es un selector de tiempo
DDD:HH:MM:SS con un toggle </>, así que cualquier parámetro puede ser él mismo una expresión DSL. Ver Distribuciones para la lista completa y las convenciones de parámetros.Biblioteca
La biblioteca alberga los datos de referencia compartidos de los que tus modelos extraen. Todos los elementos de la biblioteca están alcanzados a una fábrica (Factory) y disponibles a través de cada modelo en ella. Verás “Library” en dos lugares que ambos se refieren a los mismos datos: el ícono Data en el riel global izquierdo (la superficie de gestión, donde creas y editas) y la pestaña Library dentro del panel izquierdo del Modelador (la vista en contexto para arrastrar entidades y componentes al grafo mientras construyes). El contenido es el mismo. Dentro del Modelador, la pestaña Metrics junto a Library superpone valores de KPI en vivo sobre los componentes en el lienzo después de una ejecución (Run) — útil para detectar dónde ocurre realmente la desaceleración sin salir de la vista de grafo.Entidades
Las entidades son los elementos que fluyen a través de tu simulación — materias primas, trabajo en proceso y productos terminados. Cada entidad referenciada en una Fuente, Transformador o BOM debe definirse primero en la biblioteca. Cada tipo de entidad lleva un conjunto de atributos tipados (Boolean, Number, Text, Text List, Number List). En cualquier contexto de expresión de entidad única referencias un atributo por su nombre simple (priority, weight) — sin prefijo self.. Los atributos establecidos en una entidad persisten con ella a través de todo el flujo y pueden ser inspeccionados, mutados por Transformadores o agregados en Combinadores.
El tipo de entidad está disponible en expresiones como ENTITY_TYPE. Ver Entidades y atributos para el sistema completo de tipos de atributos y las seis estrategias de asignación (Fixed, DSL Expression, Round Robin, Random Choice, Random, Weighted) usadas dondequiera que una entidad se cree o actualice.
Constantes
Las constantes son parámetros nombrados, alcanzados a fábrica, que puedes referenciar por nombre en cualquier campo de expresión a través de todos los modelos. Cada constante tiene un nombre, descripción, tipo (Text, Number o Boolean) y un valor. Los nombres usan SCREAMING_SNAKE_CASE por convención — la misma convención aplica a los nombres de tablas de búsqueda y nombres de variables de estado — así que son fáciles de identificar dentro de una expresión. Referencia una constante por nombre directamente:Tablas de búsqueda (Lookup Tables)
Las tablas de búsqueda son tablas clave-valor nombradas consultables en expresiones:LOOKUP retorna un cero específico al tipo (0, "" o FALSE) — envuelve la llamada en un IF() si necesitas un fallback diferente. Ver Constantes y tablas de búsqueda para detalles.
Usos comunes: tiempo de procesamiento por tipo de producto, tasas de rendimiento por material, pesos de enrutamiento por clase de orden, o cualquier dato que varía por un atributo categórico de la entidad siendo procesada.
Variables de estado
Las Variables de estado son valores mutables a nivel de modelo que persisten a través de las entidades — turno actual, contador de uptime de máquina, nivel de inventario, señal de demanda, promedio móvil. Léelas en cualquier expresión por su nombre simple; escríbelas vía una acción Assign en un Event Hook o una acción programada. Usa una Variable de estado cuando el valor pertenece al sistema en lugar de a una entidad específica. Para datos por entidad, usa un atributo de entidad en su lugar.Tópicos
Los tópicos son canales pub/sub nombrados. Un componente publica un mensaje vía una acción Emit; cualquier componente suscrito a ese tópico reacciona vía un Event Hook. Los tópicos son cómo los componentes no relacionados se coordinan sin estar cableados por conexiones de flujo. Las Constantes, Tablas de búsqueda, Variables de estado y Tópicos se gestionan todos en el mismo modal de cuatro pestañas abierto haciendo clic en Lookups en la parte inferior del panel Library del Modelador (junto al botón Entities). Las pestañas del modal son Constants, Lookup Tables, State Variables y Topics — misma superficie, cuatro tipos de datos. Ver Sistema de eventos para patrones como kanban, contrapresión y capacidad impulsada por turnos.Sistema de eventos
Más allá de las conexiones de flujo, ProDex soporta coordinación entre componentes vía Tópicos, Variables de estado, Event Hooks y Event Listeners. Estos te permiten modelar producción pull-based, contrapresión, cambios de capacidad impulsados por turnos y cualquier comportamiento que no sea expresable con un simple grafo de flujo. Un modelo construido solo con Fuentes, Procesos y Sumideros captura aproximadamente el 40% de lo que la plataforma puede hacer. El Sistema de eventos es cómo modelas el resto — reglas operativas que abarcan múltiples componentes, estado que persiste a través de las entidades y reacciones a eventos de ciclo de vida como cambios de turno o umbrales de búfer.Hooks vs. Listeners
Las dos primitivas de reacción lucen similares pero viven en lugares diferentes:- Event Hooks — en línea, configurados directamente en el panel de un componente de flujo (cada Source, Process, Buffer, etc. tiene una sección Event Hooks). Un hook se dispara solo cuando el componente en el que vive emite el evento de ciclo de vida correspondiente, o cuando el tópico al que se suscribe publica.
- Event Listeners — objetos de primera clase por derecho propio, desacoplados de cualquier componente único. Un listener tiene su propio alcance y expresión de condición, y se ejecuta cuando su disparador se dispara en cualquier lugar del modelo. Recurre a un listener cuando la reacción tiene que abarcar múltiples componentes o cuando la misma lógica debe aplicarse a través de muchos lugares.
Calendarios
Un modelo corre en tiempo abstracto a menos que esté emparejado con un calendario. Los calendarios anclan la simulación al tiempo del mundo real: las liberaciones de material se disparan en momentos específicos, las transiciones de turno se disparan en momentos específicos, y los resultados se vuelven comparables directamente con lo que realmente sucedió en tu piso. Un modelo puede tener múltiples calendarios definidos y eliges uno en la barra superior. Cada Instantánea (Snapshot) guardada mientras un calendario particular está activo correrá contra ese calendario cuando se agregue a un experimento. Usos típicos: escenarios línea base vs. estrés, replay histórico, planes alternativos de turno. Ver Calendarios para la referencia completa — liberaciones de material, acciones programadas (Assign Variable y Emit Event solamente), el patrón de programación de turnos y semántica de Start Time / End Time.Ejecutando una simulación
Los controles de ejecución (Run) en la parte inferior del lienzo te dan tres botones:- Run simulation (botón verde de reproducir, tooltip “Run simulation”) — corre la simulación hasta completarla. Hace doble función como indicador de validación.
- Step (ícono de skip-forward) — avanza un evento a la vez, útil para depurar una cadena de eventos o verificar una decisión de enrutamiento. Habilitado solo mientras una simulación está en vuelo.
- Playback speed (tooltip “Playback speed”) — controla qué tan rápido se reproduce la animación del lienzo. Este es un control de visualización, no un control de velocidad del motor — el motor de simulación subyacente siempre corre a velocidad completa.
00:00–08:00 (8 horas), y cambiar Duration cambia el eje. Elige un calendario distinto de Default y el eje cambia a fechas de reloj de pared y marcas reflejando el Start Time / End Time del calendario y los eventos en él. Usa la línea de tiempo para confirmar que el calendario se alinea con lo que esperas antes de correr.
Controles del lienzo
La parte inferior derecha del lienzo expone una pila vertical de controles de vista: Zoom In (+), Zoom Out (–), Fit View (auto-ajusta todos los nodos), Auto format layout (ícono de varita-destellos, reorganiza nodos) y Find node (⌘F / Ctrl+F).
Cada ejecución crea un registro de Ejecución (Run) con un conjunto completo de resultados, enlazado de vuelta a la Instantánea contra la que se ejecutó. Puedes correr el mismo modelo múltiples veces y comparar ejecuciones en las secciones Resultados y Experimentos.
Leyendo tus resultados
Los resultados están definidos por los KPIs y Gráficos adjuntos a tu modelo. Ver la guía Resultados y análisis para un desglose completo.Consejos y mejores prácticas
- Empieza simple. Una Fuente → Proceso → Sumidero es suficiente para validar tu configuración antes de agregar complejidad.
- Usa constantes para cualquier valor que podrías querer cambiar entre ejecuciones. Esto hace que el análisis de escenarios sea mucho más fácil.
- Nombra todo claramente. Los nombres de componentes aparecen en los resultados y registros de eventos — los nombres descriptivos hacen que los resultados sean mucho más fáciles de interpretar.
- Usa estaciones para agrupar componentes relacionados. Los modelos grandes se vuelven difíciles de navegar sin organización.
- Observa el botón de reproducir. Verde significa válido, rojo significa que hay un bloqueador específico — ver Validación para lo que se verifica. El botón Fix with Assistant en el popover de estado rojo entrega el error a Dexter para una propuesta de un clic.
- Guarda Instantáneas en momentos clave. Las Instantáneas capturan la configuración completa de un modelo y son lo que los Experimentos comparan. Guarda una antes de cambios significativos o como línea base para comparación.

