Está en la página 1de 187

1

Simulation Modelling using Practical Examples:

A Plant Simulation Tutorial

Dr.ir. M.R.K. (Martijn) Mes

Associate Professor

University of Twente

Faculty of Behavioural, Management and Social sciences

Department of Industrial Engineering and Business Information Systems

P.O. Box 217

7500 AE Enschede

The Netherlands

Phone: (+31 53 489)4062

E-mail: m.r.k.mes@utwente.nl

Web: http://www.utwente.nl/bms/iebis/staff/mes/

Copyright © 2017 Martijn R.K. Mes

This work is available under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0

International License. For the licence agreement see


[https://creativecommons.org/licenses/by-ncnd/4.0/legalcode]

and for a summary see [https://creativecommons.org/licenses/by-nc-nd/4.0/].

2
3
4
Introducción

El modelado de simulación es una excelente herramienta para analizar y optimizar procesos dinámicos.
Específicamente, cuando la optimización matemática de sistemas complejos se vuelve inviable, y al
conducir los experimentos dentro de sistemas reales son demasiado costosos, lentos o peligrosos, la
simulación se convierte en una herramienta poderosa El objetivo de la simulación es apoyar la toma de
decisiones objetivas mediante análisis dinámicos, para permitir a los gerentes planificar sus operaciones
de manera segura y ahorrar costos.

1.1 ¿Qué es la simulación?


En las asignaciones a lo largo de este tutorial, confiamos en la teoría y la terminología tal como se
presentan en el libro de simulación de uso frecuente de Robinson (2014) 1 y Law (2015) 2. Robinson
(2014) define simulación como:
Experimentación con una imitación simplificada (en una computadora) de un sistema de operaciones, ya
que progresa a través del tiempo, con el propósito de una mejor comprensión y / o mejora sistema. Y
Law (2015) declara:
En una simulación utilizamos una computadora para evaluar un modelo numéricamente, y los datos se
recopilan para estimar las características verdaderas deseadas del modelo.
La simulación busca obtener resultados que puedan transferirse a una instalación real. En adición, la
simulación define la preparación, ejecución y evaluación de experimentos cuidadosamente dirigidos
dentro de un modelo de simulación Como regla general, ejecutará un estudio de simulación usando los
siguientes pasos:
• Primero verifica la instalación en el mundo real que desea modelar y reúne los datos que
necesita para crear su modelo de simulación
• A continuación, abstrae esta instalación del mundo real y crea su modelo de simulación de
acuerdo con los objetivos de los estudios de simulación.
• Después de esto, ejecuta experimentos, es decir, ejecuta ejecuciones de simulación con su
modelo de simulación. Esto producirá una serie de resultados, como la frecuencia con la que fallan
las máquinas, la frecuencia con la que son bloqueado, los tiempos de preparación acumulados
para las estaciones individuales, que tienen que utilizar las máquinas , etc.
• El siguiente paso será interpretar los datos que produce la simulación.
• Finalmente, la administración utilizará los resultados como base para sus decisiones sobre la
optimización de la realidad.

Desarrollar su modelo de simulación es un proceso cíclico y evolutivo. Comenzarás con una primer
borrador de su modelo y luego refinarlo y modificarlo para hacer uso de los resultados intermedios de la
simulación. Una ilustración de este proceso se puede encontrar en la página siguiente. Eventualmente,
después de varios ciclos, llegará a su modelo final. Como experto en simulación, nunca debes perder de
vista estas preguntas:

5
 ¿Qué quieres lograr con el estudio de simulación?
• ¿Qué estás examinando?
• ¿Qué conclusiones sacas de los resultados del estudio de simulación?
• ¿Cómo transfieres los resultados del estudio de simulación a la instalación en el mundo real?

1.2 Simulación orientada en el tiempo versus simulación de eventos discretos

En el mundo real, el tiempo pasa continuamente. Por ejemplo, al ver una parte moverse a lo largo de un
sistema de transporte, no detectará saltos en el tiempo. El tiempo que toma la pieza para cubrir el
sistema es continuo, de modo que la curva de la distancia recorrida es una línea recta.

Por otro lado, un programa de simulación de eventos discretos (DES) solo tiene en cuenta los puntos en
el tiempo (eventos) que son importantes para el curso posterior de la simulación. Tales eventos pueden
ser, por ejemplo, una parte que ingresa a una estación, la abandona o pasa a otra máquina. Cualquier
movimiento entre esos eventos tiene poco interés para la simulación.

Plant Simulation usa DES. Una de las principales ventajas de la simulación DES en relación con el tiempo
(simulación continua o de paso de tiempo) es el rendimiento. Como el programa simplemente puede
omitir todos los momentos en el tiempo que no son de interés, es posible simular años de
funcionamiento de la fábrica en cuestión de minutos. Esto es particularmente útil cuando quiere simular
diferentes configuraciones del mismo sistema, y hacer varias repeticiones para cada configuración. Plant
Simulation tiene funcionalidades incorporadas para exactamente ese propósito, que trataremos en el
Capítulo 5.

6
1.3 Consejos para usar el tutorial

Los ejemplos en este tutorial están destinados a comenzar con Plant Simulation. Las características más
importantes de Plant Simulation se introducen y usan en ejemplos. Sin embargo, no espere una
discusión en profundidad de todos los temas, ya que están cubiertos en el Manual paso a paso de
Siemens y la función de ayuda de Plant Simulation.
No se requiere conocimiento previo del programa, ya que todos los ejemplos se describen en detalle.
Para trabajar en los ejemplos y ejercicios, debe tener instalado Plant Simulation en su computadora, o
debe tener acceso a una computadora que ejecute Plant Simulation.
Encontrará tres tipos de cuadros a lo largo del tutorial:

Nota Tarea ¿Sabías?


Las notas proporcionan Las tareas dan paso a paso Estas cajas revelan detalles y
información adicional instrucciones sobre cómo funcionalidad avanzada de Plant
información que vale la pena construir Simulation que son interesantes
teniendo en cuenta cuando se modelos en Plant Simulation. mencionar, pero no es
trabaja Debes apuntar a entender necesario para comprensión
con Plant Simulation. Poner lo que está sucediendo en cada completa Usted puede saltar
particular atención a ellos en paso. con seguridad estos si está
caso de que te quedes aprisa
estancado.

1.4 Descripción general del tutorial


El Capítulo 2 proporciona una introducción a Plant Simulation y los componentes básicos que se
proporcionan.
Los capítulos restantes 3 a 9 están divididos en dos partes. En la Parte A, capítulos 3 a 5, construirá una
serie de modelos básicos en Plant Simulation. Cada uno de estos capítulos termina con un modelo de
simulación de trabajo y una asignación. Los modelos de simulación presentados en estos capítulos giran
en torno a un ejemplo en marcha: el modelado y la optimización de la oficina de un médico general.
• El Capítulo 3 implica la construcción de un modelo simple, utilizando los conceptos de
ramificación, push-pull y priorización en el camino.
• El Capítulo 4 presenta el uso avanzado de TableFiles, que puede almacenar una gran cantidad de
información que se genera en un modelo, con énfasis en verificación y validación.
Este capítulo también explica el uso de números aleatorios.
• El Capítulo 5 le permite crear un modelo más complejo que implementa citas y utiliza
Experiment Manager para llevar a cabo una serie de experimentos con varias repeticiones.
Plant Simulation se puede utilizar para modelar muchos tipos de sistemas del mundo real, como
hospitales, fábricas, redes de computadoras, redes de transporte, aeropuertos, etc. Además, el
programa admite numerosos conceptos avanzados, como los trabajadores y las líneas de producción. En
la Parte A, solo usaste las funcionalidades básicas de Plant Simulation. El Capítulo 6 proporciona una
vista previa de los conceptos más avanzados de Plant Simulation, que se presentan con más detalle en la
Parte B de este tutorial.

7
En la Parte B, capítulos 7 a 9, construirá modelos de simulación más avanzados y con mayor orientación
gráfica. De nuevo, cada uno de estos capítulos contiene una asignación. Sin embargo, utilizamos otro
ejemplo en ejecución a lo largo de estos capítulos, a saber, de un fabricante de automóviles.

• El Capítulo 7 implica la construcción de un modelo simplificado de un fabricante de automóviles,


introduciendo así el concepto de Marcos para crear sus propios bloques de construcción y el uso
de la depuración.

• El Capítulo 8 presenta el uso de Líneas y trabajadores para modelar un entorno de fabricación


más realista. El capítulo termina con un modelo de simulación 3D del fabricante del automóvil.

• El Capítulo 9 presenta el tema de Optimización de Simulación, donde sistemáticamente realiza


experimentos para encontrar los mejores ajustes de la fábrica.

8
2 Descripción general de la simulación de la planta

Plant Simulation es un software orientado a objetos para modelado, simulación y animación


integrados. Muchos sistemas complejos se pueden modelar y mostrar con gran detalle muy
parecido a la realidad.

2.1 Orientación del objeto

Plant Simulation está completamente orientado a objetos. Comprender los principios básicos de la
programación orientada a objetos le permite modelar sistemas grandes y complejos de una
manera organizada y sostenible.

Clases, Atributos e Instancias


Como ejemplo, supongamos que queremos modelar a los pacientes en un sistema. Las
propiedades relevantes de un paciente son la edad del paciente, el tiempo de la cita y el sexo. No
nos importa la edad exacta, la hora de la cita y el sexo todavía, pero solo reconocemos que el
modelo de un paciente debe tener estas propiedades.
En términos de diseño orientado a objetos, tenemos la clase Patient, que tiene los atributos de
edad, hora de cita, y sexo.
La clase Patient aún no representa pacientes individuales, sino que describe las propiedades de
todos los pacientes. Para obtener pacientes individuales, hacemos una instancia de la clase
Paciente. Los pacientes individuales ahora se llaman instancias de la clase Paciente. Cada instancia
tendrá los mismos atributos (edad, hora de cita y género), pero los valores de esos atributos
pueden diferir de una instancia a otra.

Derivación y Herencia

El modelo de nuestro sistema se vuelve más complejo. También queremos hacer una distinción entre
adultos y niños. Ambos tienen todas las propiedades de un paciente, pero para los niños también
necesitamos saber si están vacunados o no. Podríamos implementar esto agregando los atributos
ageCategory y isVaccinated a la clase Patient, afectando tanto a adultos como a niños. Sin embargo, la
orientación a objetos nos brinda una herramienta más adecuada para este objetivo: la derivación.
Derivamos dos nuevas clases de la clase original Patient y las llamamos Adult and Child. Para la última
clase, agregamos el atributo isVaccinated. Cuando hablamos de la relación entre las clases Paciente,
Adulto y Niño, la clase Paciente es la clase de origen o de origen, mientras que las clases Adulto y Niño
son niños o subclases de la clase Paciente.

9
Las clases Adulto y Niño heredan los tres atributos existentes del Paciente, lo que significa que si
actualizamos (por ejemplo, renombramos) esos atributos en la clase Paciente, entonces esa actualización
también se reflejará en Adulto y Niño. Sin embargo, la herencia solo funciona desde el origen hasta la
subclase. Si cambia un atributo heredado en Adulto o Niño, entonces la herencia se desactivará para ese
atributo y los cambios no se reflejarán en la clase Paciente. Finalmente, podemos instanciar y derivar de
Adulto y Niño como cualquier otra clase.

Nota

Nota
1. Tanto las clases como las instancias se denominan objetos en Plant Simulation. Sin embargo, siempre
es importante tener en mente la distinción entre clases de objetos e instancias de objetos.
2. En lugar de derivar, también es posible duplicar una clase. Al duplicar, se deriva esencialmente de una
clase sin herencia, de modo que simplemente obtiene una copia idéntica e independiente de la clase
duplicada.
3. Plant Simulation consta de varias clases básicas para formar los bloques de construcción de su
modelo. Puede usar duplicación y derivación para crear sus propias clases especiales. Sin embargo, a
veces es necesario crear una nueva clase a partir de una colección de clases existentes. El objeto
incorporado Frame le permite hacer eso (se pueden colocar múltiples clases básicas en un Frame para
formar una nueva clase); este tema se discutirá en la Parte B de este tutorial. El único Marco que se
considerará en la Parte A de este tutorial es el que contiene su modelo de simulación completo;
denotamos este Marco por RootFrame.

10
2.2 El Escritorio

Tarea: Abriendo un Nuevo Modelo


1. Inicie Plant Simulation.
2. Elija Crear nuevo modelo.
3. El programa le pregunta si desea crear un modelo con 2D, 3D o ambos. Simplemente elija 2D solo
para continuar.

Ahora verá el escritorio en la figura a continuación. Se compone de varias barras de herramientas y


ventanas de acoplamiento:

• Biblioteca de clases (Class Library). Vista estructurada de todas las clases de objetos
disponibles en el modelo actual. Las clases de objetos se almacenan en el familiar
formato de árbol de Windows. Puede agregar carpetas usted mismo y mover, copiar,
crear y eliminar clases. ¡Es sabio no borrar las clases básicas de Plant Simulation, ya que
necesitará muchas de ellas para construir sus modelos!
• Consola (Console). Esta es una ventana que muestra información sobre las acciones
que ejecuta Plant Simulation.
• Caja de herramientas (Toolbox). Una vista estructurada de clases de objetos en el
modelo. Es conveniente usar cajas de herramientas predeterminadas (y construir cajas
de herramientas personalizadas) para las clases de objetos que usa con frecuencia.
Usando cajas de herramientas, puede insertar clases de objetos más fácilmente en su
modelo.
• RootFrame. Sostiene todos los objetos que componen su modelo.

11
Nota
1. Si una barra de herramientas o ventana aún no está activada, puede activarla en la cinta
seleccionando Ventana - Windows acoplable.
2. Abrir, cerrar y guardar su modelo se puede hacer usando el menú Archivo. Puede abrir solo un
modelo a la vez, por lo que debe cerrar un modelo antes de poder abrir uno nuevo.
3. Puede habilitar o deshabilitar la animación en el menú Inicio. La desactivación de la animación
acelerará sus simulaciones, por ejemplo, cuando necesite hacer una gran cantidad de repeticiones.
4. En el menú Archivo  Preferencias, tiene acceso a varias configuraciones. Por ejemplo, puede
cambiar el formato de hora en General, puede seleccionar qué elementos mostrar y ocultar en
Modelado y puede modificar la configuración de licencia bajo Licencia. Las instrucciones para
configurar la licencia están cubiertas en un documento separado.

2.3 Trabajar con la Biblioteca de clases y la Caja de herramientas


Plant Simulation proporciona un conjunto de objetos básicos. Estos tienen características que, en
muchos casos, le permiten usarlos directamente en un modelo de simulación. Sin embargo, las
instalaciones en el mundo real muestran una variedad tan amplia de constelaciones que es imposible
predecir cada situación y proporcionar los objetos apropiados. Esta es la razón por la cual Plant
Simulation ofrece objetos básicos que puede modificar de forma perceptible para satisfacer sus
necesidades específicas. Estos objetos se llaman objetos de aplicación.

Los objetos básicos que proporciona Plant Simulation se pueden


clasificar utilizando criterios simples. Conocer este sistema le
permite más adelante encontrar un objeto de Simulación de Planta
que represente una parte del mundo real. Si no encuentra un objeto
que se ajuste, puede modelar uno modificando o combinando
objetos básicos existentes. Puede encontrar los objetos en la
Biblioteca de clases. Plant Simulation muestra los objetos
incorporados en la Biblioteca de clases en una vista jerárquica en
carpetas y subcarpetas. Puede agregar, cambiar el nombre y
eliminar carpetas cuando sea necesario. Por defecto, la Biblioteca de
clases contiene ocho carpetas:

• Los objetos de MaterialFlow sirven para (i) transportar o procesar objetos de la unidad móvil / móvil (UM) dentro de modelos
(activo) y (ii) almacenamiento de partes y visualización de pistas en las que se mueven las partes (pasivo).
• Los objetos fluidos, como tuberías, tanques o mezcladores, facilitan el modelado de los denominados materiales de flujo libre.
Estos materiales pueden estar en forma líquida, gaseosa o vertible.
• Los objetos de recursos sirven para agregar trabajadores humanos a una estación de procesamiento y permiten a los
trabajadores moverse en las rutas entre las estaciones de trabajo relacionadas con las estaciones de producción.
• Los objetos de InformationFlow sirven para el intercambio de información entre objetos (por ejemplo, una Variable, un
TableFile o un Método).
• Los objetos UserInterface facilitan la interacción entre el usuario y un modelo, por ejemplo, los cuadros de diálogo para la
entrada del modelo y los gráficos e informes para el resultado del modelo.
• Las MU (unidades móviles) representan el flujo de materiales. La distinción con otras clases de objetos es que las MU se
mueven a través del modelo; esto es válido para los tipos de MU Entidad (productos), Contenedor y Transportador.
• Herramientas, una carpeta para almacenar complementos especiales para realizar tareas de simulación específicas.
• Modelos es una carpeta para almacenar los modelos que usted hace como usuario. También puede crear carpetas y
subcarpetas adicionales para estructurar su Biblioteca de clases.

12
Como acceso directo para acceder a clases de objetos, puede usar la Caja de herramientas, que es un
contenedor para las diferentes barras de herramientas de simulación de plantas que contienen los
objetos de la Biblioteca de clases. Cada pestaña contiene una Caja de herramientas con objetos. Es una
cuestión de preferencia personal si desea utilizar la Biblioteca de clases o la Caja de herramientas para la
construcción del modelo. En general, Toolbox será más rápido.

2.4 Resumen de objetos básicos

Como se muestra en la sección anterior, Plant Simulation proporciona un conjunto de objetos básicos,
agrupados en diferentes carpetas en la Biblioteca de clases. Ahora presentamos los objetos básicos más
utilizados de la biblioteca estándar (se pueden agregar bibliotecas adicionales yendo a Home  Manage
Class library) agrupadas según estas carpetas utilizadas por Plant Simulation: flujo de materiales,
recursos, flujo de información, interfaz de usuario, dispositivo móvil Unidades y Herramientas.

2.4.1 Flujo de materiales


La carpeta MaterialFlow contiene las clases de objetos básicas como se
muestra anteriormente. Discutiremos brevemente los objetos más
importantes de esta carpeta. Su uso será aclarado cuando los use más
adelante en este tutorial.

Connector
El Conector establece conexiones entre los objetos de MaterialFlow, de modo
que las MU (vea la Sección 2.4.5) puedan moverse a través del modelo. Una
flecha en el medio del conector indica la dirección. Una sola conexión solo
puede apuntar en una dirección.

EventController
Plant Simulation es un simulador de eventos discretos, es decir, el programa
solo inspecciona esos puntos a tiempo, donde los eventos tienen lugar dentro
del modelo de simulación. EventController administra y sincroniza estos
eventos.

Frame
The Frame sirve para agrupar objetos y construir modelos estructurados
jerárquicamente. Cada nuevo modelo comienza con un Marco donde el
EventController se coloca en; este Marco se denota por RootFrame.

13
Interface
La interfaz representa las interfaces de entrada y salida en un Frame. Se utiliza para conectar múltiples
marcos entre sí, de modo que las MU puedan fluir a través de ellos.

Source
La fuente crea MU e intenta pasarlos. Se usa en lugares donde se crea / genera una MU (generalmente al
comienzo de un proceso). El tiempo entre las creaciones consecutivas de MU puede ser especificado por
una variable aleatoria.

Drain
El objeto destruye las MU después de procesarlas. Se usa en lugares donde las MU deben abandonar el
sistema (generalmente al final de un proceso).

SingleProc
El objeto recibe una MU, la conserva durante el tiempo de procesamiento y luego intenta pasarla. Por
ejemplo, una máquina con capacidad 1.

ParallelProc
El objeto recibe una MU, la conserva durante el tiempo de procesamiento y luego intenta pasarla. Varias
MU pueden procesarse al mismo tiempo. Los tiempos de procesamiento pueden diferir y las MU pueden
pasar el uno al otro. Por ejemplo, una máquina con capacidad> 1.

Store
El objeto recibe MU pasivas. Una MU permanece en la Tienda hasta que sea eliminada por un control de
usuario. Se puede usar, por ejemplo, para un sistema de estantería de una tienda.

Buffer
El objeto recibe una MU, la conserva durante un tiempo de permanencia determinado y luego intenta
pasarla. Cuando las estaciones precedentes no están disponibles (por ejemplo, ocupado o en falla), el
MU permanece en el Buffer. Las MU pueden salir de la memoria intermedia en el mismo orden en que la
ingresaron (FIFO) o en la dirección opuesta (LIFO). Estas opciones se indican mediante el tipo de buffer
Queue y Stack, respectivamente.

PlaceBuffer
El objeto es similar al Buffer, pero con una funcionalidad más avanzada (consiste en una secuencia de
estaciones que deben ser visitadas secuencialmente por cada MU). PlaceBuffer no forma parte de los
objetos integrados de Toolbox, pero puede agregarlo haciendo clic en Manage Class Library en la
pestaña de la cinta Home.

Sorter
Similar a un PlaceBuffer, pero con funcionalidad de clasificación. La ordenación se puede hacer en
función de, por ejemplo, un valor de atributo de objeto o el resultado de un Método de clasificación.

14
2.4.2 Recursos
La carpeta de recursos contiene algunos objetos más especializados que facilitan el modelado de
operadores en el taller. Solo describimos el ShiftCalendar aquí.

ShiftCalendar
Le permite configurar las horas de funcionamiento de los objetos.

2.4.3 Flujo de información

La carpeta de InformationFlow contiene las clases de objetos básicas


como se muestra aquí. Discutiremos brevemente los objetos más
importantes de esta clase. Su uso se aclarará al usarlos en los ejemplos.
Las listas se proporcionan para registrar grandes cantidades de datos,
almacenarlos y ponerlos a disposición durante la simulación.
Proporcionan la funcionalidad de una base de datos en una instalación
real. Plant Simulation proporciona StackFile, QueueFile, CardFile y
TableFile. Estas listas difieren en sus dimensiones y los métodos
proporcionados para acceder a ellas. En este tutorial, solo usaremos
TableFile.

Method
El método permite al modelador programar la lógica personalizada en
el modelo, utilizando el lenguaje de programación SimTalk 2.0 (ver nota
en la sección 3.9).

Variable
La clase Variable es una variable global a la que pueden acceder todos los objetos.

TableFile
TableFile es uno de los objetos de flujo de información más importantes en Plant Simulation. Sirve como
un contenedor de datos bidimensional. Sus elementos pueden ser accedidos aleatoriamente. Además,
hay varias funciones de búsqueda y lectura disponibles.

Generator
El generador le permite llamar a métodos en tiempos predefinidos durante la simulación.

15
2.4.4 Interfaz de usuario
Los objetos UserInterface facilitan la interacción entre el usuario y un
modelo, por ejemplo, con Dialogs para la entrada del modelo y Gráficos e
Informes para la salida del modelo.

Comment
El comentario le permite agregar descripciones y notas adicionales. Para el
modelo.

Display
La pantalla muestra los valores durante una ejecución de simulación. Los valores se pueden mostrar en
forma de cadena o como barras.

Chart
Un gráfico se puede usar para visualizar los datos generados por un modelo.

2.4.5 Unidades Móviles


Estas clases pueden representar todo tipo de producto, paleta, contenedor o
vehículo que se mueve a través de un sistema (de logística).

Entity (MU)
Este es el objeto o Unidad Móvil que se mueve en un modelo de simulación. Puede representar cualquier
cosa que deba pasar por diferentes estaciones para procesar, por ejemplo, pacientes, productos, piezas y
pedidos.

Container
Similar a la Entidad, este es un objeto móvil durante la simulación. Tiene un espacio de carga que puede
contener MUs. Representa cualquier tipo de contenedor, por ejemplo, paletas y cajas.

Transporter
Similar al Contenedor, pero el Transporter es autopropulsado y su velocidad está definida por el usuario.
Representa cualquier tipo de transportador, por ejemplo, AGV y carretillas elevadoras.

2.4.6 Herramientas
Esta carpeta contiene complementos para realizar tareas de simulación
específicas. En este tutorial, solo usamos las herramientas
ExperimentManager y GAWizard.

16
ExperimentManager
Use este objeto para configurar una lista de experimentos y la cantidad de repeticiones por
experimento. El ExperimentManager luego lleva a cabo todos los experimentos predefinidos.

GAWizard
Esta herramienta se puede utilizar en caso de que la cantidad de experimentos predefinidos crezca
demasiado y si lleva demasiado tiempo llevarlos a cabo. GAWizard hace uso de un algoritmo llamado
genético para seleccionar el próximo experimento basado en los resultados de experimentos previos. De
esta forma, la cantidad de experimentos llevados a cabo puede reducirse considerablemente, al mismo
tiempo que proporciona buenas soluciones.

En la siguiente tarea, aprende a obtener ayuda sobre un objeto específico.

Tarea: Busque en la función de ayuda las características del SingleProc

Supongamos que desea saber más sobre las características de SingleProc. Luego proceda de la siguiente
manera:
1. Seleccione Ayuda Contenidos en el menú Archivo. Llegas a la ayuda del objeto.
2. Seleccione Ayuda de referencia  Objetos de flujo de material  SingleProc. Debería ver la
siguiente pantalla:

3. Esta página le brinda una descripción general de SingleProc, así como enlaces a temas relacionados.

17
4. Cierre la ventana de Ayuda.
5. Un atajo es usar la función Ayuda sobre el objeto. Dentro de la Biblioteca de clases, abra la carpeta
MaterialFlow y haga doble clic en SingleProc. Ahora seleccione Ayuda, y luego Ayuda sobre Objeto en el
menú local. Otro atajo es seleccionar un objeto, o incluso un atributo específico de un objeto, y
presionar F1.

2.5 Objetos utilizados en este tutorial


El objetivo de este tutorial es familiarizarte con el software Plant Simulation y con el modelado de
simulación en general. El objetivo no es discutir todas las funcionalidades del software Plant Simulation,
sino solo presentar las funcionalidades básicas que a menudo están presentes también en otros
paquetes de software de simulación gráfica. A continuación, se ofrece una descripción general de los
objetos estándar de Plant Simulation utilizados en este tutorial.

18
2.6 Funcionalidad, animación y visualización
Plant Simulation comprende todas las características necesarias para modelar los aspectos funcionales
de la mayoría de los sistemas del mundo real. Sin embargo, también contiene funciones para fines de
animación y visualización de resultados, por ejemplo, en gráficos. La animación y la visualización se usan
ampliamente en aplicaciones comerciales para comunicarse, convencer o simplemente impresionar al
cliente. También es una herramienta útil para depurar un modelo, porque un modelador puede ver con
sus propios ojos si el modelo se comporta como se esperaba.
En un entorno académico, generalmente es suficiente enfocarse en la funcionalidad, ya que el modelo
en sí mismo a menudo no es el resultado principal. La animación solo se utiliza para la depuración, y se
apaga cuando es posible para aumentar el rendimiento del modelo. La visualización se difiere para un
análisis adicional de los datos generados por un modelo, por ejemplo, en Excel. En este tutorial, nos
centraremos en los objetos básicos que le permiten modelar los aspectos funcionales de un sistema. Esta
es la forma más rápida de familiarizarse con las herramientas necesarias para modelar una gran variedad
de sistemas, y facilita la transición a otros paquetes de software de simulación. En otras palabras, el
objetivo de este tutorial es proporcionar información sobre la implementación del modelo de simulación
en general en lugar de presentar una lista exhaustiva de las características de simulación de la planta.

19
Parte A: Modelado Básico de Simulación
MODELAR UNA OFICINA DE MÉDICOS GENERALES

20
3 Construyendo un Modelo: Médico General
Los modelos de simulación le permiten capturar las propiedades de un sistema del mundo real y
experimentar con diferentes configuraciones que podrían mejorar el sistema del mundo real. Por lo
general, el modelo comienza de manera simple, y la complejidad solo se agrega cuando es necesario
para describir mejor las propiedades esenciales del sistema del mundo real. El sistema que modelaremos
en este capítulo es el de un médico general o un médico general, para abreviar. Este GP comienza de
manera simple: tiene una oficina y la consulta con cada paciente toma una cantidad conocida de tiempo.
Luego, ampliaremos el sistema paso a paso para incluir una sala de espera y dos GP. Entonces, un
médico de cabecera decide especializarse en la consulta de niños, mientras que el otro médico trata a
adultos. Finalmente, implementará la priorización básica en la sala de espera para reducir los tiempos de
espera percibidos.
En este capítulo, modelará al médico general utilizando Plant Simulation. Aprenderá a usar las clases
estándar disponibles en Plant Simulation y derivará subclases de estas clases. Además, aprendes a
utilizar el Editor de iconos y aprendes los principios del teorema del bloque de inserción.
Temas tratados en este capítulo:
• Construcción de modelos simples
• Objetos MaterialFlow
• Unidades móviles (MU)
• Atributos personalizados
• Editor de íconos
• Controles de entrada y salida
• Métodos simples
• Priorización
• Medición de rendimiento simple

3.1 Creación de un Nuevo Modelo


El médico general se modelará en un único cuadro, llamado RootFrame (ver Capítulo 2). Es importante
que guarde su trabajo de forma regular, ya que podría ocurrir que Plant Simulation falle (debido a
errores de codificación como un ciclo infinito).

Tarea: Crea un nuevo modelo


1. Inicie Plant Simulation.
2. Elija Crear nuevo modelo.
3. Haga clic en 2D solo en la ventana de diálogo que aparece.

3.2 Un Modelo Básico


Antes de que pueda construir modelos de simulación complejos, es necesario aprender los conceptos
básicos de modelado. Comenzamos con un modelo básico de la consulta de un médico general, que
ofrece consultas a los pacientes. Para construir este modelo, necesitaremos tres objetos básicos, a saber,
el Origen, el Proceso Único y el Drenaje. Estos objetos deben conectarse utilizando el conector.

21
• El objeto Fuente genera los pacientes (MU) en el modelo de Médico General.
• El objeto SingleProc procesa a los pacientes durante un cierto tiempo de procesamiento. Este
objeto representará al médico general.
• El objeto Drain permite a los pacientes abandonar el modelo después de haber visitado al
médico general.
• El conector conecta los objetos básicos, lo que hace posible que los pacientes fluyan a través
del modelo.
Como tenemos la intención de utilizar el objeto generalista con más frecuencia, es útil duplicar y crear
una instancia del objeto primero desde el SingleProc. Al crear una clase separada en la Biblioteca de
clases, ahorraremos tiempo al expandir nuestro modelo más adelante. Debido a la herencia, solo
tenemos que crear y configurar el objeto para el médico general una vez y no para cada instancia que
usemos del médico general. Otra ventaja es que si queremos ajustar nuestro médico general (por
ejemplo, el tiempo de procesamiento) solo tenemos que hacer esto una vez. El Origen y el Drenaje, sin
embargo, se crean instancias directamente, porque solo los utilizaremos una vez en nuestro modelo y,
por esa razón, no hay ningún valor agregado para duplicarlos primero.

Tarea: Crear El Médico General


1. Haga clic con el botón derecho en el objeto SingleProc en la carpeta MaterialFlow.
2. Seleccione duplicado. Ahora tiene un objeto llamado SingleProc1 en la carpeta MaterialFlow.

3. Cambie el nombre de SingleProc1 a GeneralPractitioner. Puede hacer esto haciendo clic con el botón
derecho en el objeto y seleccionando Cambiar nombre, o seleccionando el objeto y presionando F2.

Todos los objetos que nos gustaría utilizar ahora están disponibles en la carpeta MaterialFlow. El
siguiente paso es construir el primer modelo básico.

22
Tarea: Crea el modelo básico

1. Arrastre el objeto Source, Drain y GeneralPractitioner desde la biblioteca de clases de MaterialFlow o


la caja de herramientas a su RootFrame.

2. Conecte los objetos entre sí. Para conectar los objetos manualmente, debe seleccionar el conector de
la Caja de herramientas.
3. Conecte los objetos haciendo clic en el objeto donde desea iniciar la conexión y luego en el objeto
que desea en el otro extremo de la conexión.
4. Cambie el nombre de la Fuente y el Drenaje a Llegada y Salida, respectivamente.

¿Sabías?

Si tiene que conectar varios objetos, active el modo de conexión manteniendo presionada la tecla Ctrl
mientras realiza las conexiones. De esta manera, no tiene que seleccionar el conector de la caja de
herramientas cada vez. Para finalizar el modo de conexión, haga clic con el botón derecho del mouse en
el modelo, seleccione el puntero o presione la tecla Esc. Una forma alternativa de conectar objetos es
colocarlos uno al lado del otro y luego separarlos; un conector se colocará en el medio
automáticamente.

3.3 El EventController
Para ver si su modelo funciona correctamente, debe probarlo con el EventController. Una de sus tareas
es coordinar los eventos que tienen lugar durante la simulación. Para hacer eso, el EventController
gobierna la lista de eventos, que es una lista de todos los eventos que están programados para suceder
en el futuro. Por ahora, es importante recordar que la ventana EventController es donde inicia, detiene,
reinicia y altera la velocidad de su simulación. Por definición, EventController se coloca en el RootFrame
que contiene el modelo completo, no en un Frame que contiene un submodelo o en un objeto.

23
1. Real time. Por lo general, la simulación salta de un evento a
otro a un ritmo fluctuante (p. Ej., Cuando no hay evento, el
reloj de simulación simplemente salta hacia adelante en el
tiempo). Seleccione la opción Tiempo real para permitir que el
tiempo de simulación se ejecute en un ritmo constante,
correspondiente al tiempo real (por ejemplo, "Tiempo real x
10" significa que el modelo de simulación intenta ejecutarse 10
veces más rápido que la realidad).
2. Reset. Elimine todas las MU y restablezca el reloj de
simulación a cero.
3. Start/Stop. Deje que la simulación se ejecute; saltando de un
evento a otro. Haz clic de nuevo para pausar.
4. Fast forward. Desactive la animación para aumentar el
rendimiento y ejecute la simulación a alta velocidad.
5. Step. Ejecute el próximo evento en la lista de eventos. Útil
para la depuración.
6. Speed. Mueva el control deslizante para elegir una velocidad
de simulación.
7. Event debugger. Abre la lista de eventos. La lista de eventos
se detallará en "¿Sabía que...?" Al final de la Sección 5.3.
8. Date. La fecha de inicio de la simulación.
9. End. El tiempo de finalización de la simulación. Por ejemplo,
ajústelo a 70: 00: 00: 00 si la simulación debe ejecutarse
durante 70 días (consulte la sección 3.4 para obtener una
explicación del formato de hora).
10. Statistics. La hora en que el modelo comienza a recopilar
estadísticas. Úselo cuando su modelo tenga un período de
calentamiento.
11. Simulation clock. Por defecto, este reloj muestra el tiempo
relativo, es decir, el tiempo de simulación transcurrido desde la
fecha de inicio. Haga clic en Tiempo para cambiar a la fecha de
simulación absoluta.

Tarea: Pon a prueba tu modelo

1. Haga doble clic en EventController y se abrirá una ventana de diálogo.


2. Haga clic en el botón Restablecer para regresar el modelo a una posición de inicio predefinida.
3. Comience la simulación haciendo clic en el botón Iniciar / Parar.
4. Detenga la simulación haciendo clic en el botón Comenzar / Detener.
5. Debería ver que las MU fluyen en su modelo.
6. Restablezca la simulación haciendo clic en el botón Restablecer.
7. El reloj de simulación debe restablecerse a cero y todas las MU se eliminan del modelo.

24
3.4 Tiempos de llegada y tiempos de procesamiento entre llegadas
Ahora que ha construido los fundamentos del modelo básico, necesita ajustar la configuración de los
objetos para simular un sistema del mundo real. Plant Simulation tiene el siguiente formato de hora:
DD: HH: MM: SS.XXXX, que representa días, horas, minutos, segundos y milisegundos, respectivamente.

Si desea ajustar, por ejemplo, el tiempo de procesamiento de un determinado objeto, debe seguir este
formato de tiempo. Sin embargo, también puede ingresar la duración de un determinado proceso en
segundos. Plant Simulation traducirá la cantidad de segundos al formato de tiempo descrito
anteriormente.

Puede cambiar la configuración de un objeto haciendo doble clic en el objeto. Si hace doble clic en el
objeto en la Biblioteca de clases, ajustará las configuraciones para cada objeto de su modelo que se haya
derivado o instanciado de ese objeto. Esto es útil si necesita ajustar el tiempo de procesamiento para
múltiples objetos, por ejemplo, para el GeneralPractitioner.

Tarea: Ajustar el objeto de Médico General

1. Haga doble clic en GeneralPractitioner en la carpeta MaterialFlow de su Biblioteca de clases.


2. Establezca el tiempo de procesamiento de GeneralPractitioner a 15:00. Deje la distribución del
tiempo de procesamiento en Const (abreviatura de Constante).

3. Haga doble clic en GeneralPractitioner en su modelo (en RootFrame).


4. Tenga en cuenta que el tiempo de procesamiento de este objeto se ajusta debido a la herencia.

25
Como se ilustra en la Sección 3.2, el objeto Fuente genera las MU. Puede ajustar la creación de estas MU
cambiando la configuración del objeto. Si hace doble clic en el objeto Fuente en su modelo, aparece la
siguiente ventana de diálogo:

El intervalo describe la duración del tiempo entre la generación de dos MU. También puede establecer
una Hora de inicio o una Hora de detención para generar MU. Como puede ver en la ventana de diálogo,
los tiempos interarrivales se configuran como constantes (Const). Puede cambiar esto ajustando la
distribución interarrival. Haga clic en el botón desplegable y seleccione la distribución correspondiente
que se ajuste a sus datos. Tenga en cuenta que cuando quiera modelar un proceso de llegada de Poisson,
debe seleccionar la distribución de Negexp (exponencial negativo).

26
Tarea: Ajustar el objeto de llegada

1. Haga doble clic en el objeto Arrival en su modelo.


2. Establezca el tiempo de intervalo en una constante de 720 segundos.
3. Cierre la ventana de diálogo.
4. Haga doble clic en el objeto Arrival en su modelo.
5. Tenga en cuenta que el formato de hora se ajusta a 12:00.
6. Haga doble clic en el objeto Fuente en la carpeta MaterialFlow de su Biblioteca de clases.
7. Tenga en cuenta que el intervalo de tiempo no se ha cambiado y sigue siendo 0. La razón es que la
herencia del intervalo de tiempo se desconectó en el momento en que la cambió en la instancia del
objeto.

3.5 Agregar una Sala de Espera

Puede haber notado que los tiempos de procesamiento establecidos en la Sección 3.4 crearán un
modelo desequilibrado (utilización ρρ = λλ / (𝑐𝑐𝑐𝑐) ≥1). La tasa de procesamiento combinada del médico
general es, a saber, menor que la tasa de llegada de los pacientes. Si ejecuta su modelo con los tiempos
de procesamiento ajustados, es posible que observe que las MU a la llegada a veces se vuelven amarillas.

El ícono amarillo indica que el MU está actualmente bloqueado, porque no puede avanzar más en el
modelo. Si la próxima estación de procesamiento está disponible nuevamente, volverá a mostrar su
ícono regular y continuará en el modelo. Tenga en cuenta que no se crean nuevas MU cuando una MU
bloqueada ocupa la Fuente. Este podría ser el comportamiento deseado, por ejemplo, para modelar un
sistema de colas en el que las MU decidan no ingresar al sistema cuando la cola es demasiado larga. En la
mayoría de los casos, sin embargo, este comportamiento conduce a un modelo no válido.

¿Sabías?

Plant Simulation proporciona los siguientes estados predefinidos para objetos básicos de flujo de
materiales.
• Objetos estáticos: bloqueados, fallados, en recuperación, operativos, en pausa, configurados,
en funcionamiento, en espera
• Objetos en movimiento: operativo, en espera, fallido, en pausa
Durante la animación, el programa muestra el icono apropiado dependiendo del estado del objeto
básico, siempre que exista un icono con el nombre. Por defecto, los objetos básicos tienen los íconos
enumerados arriba. El cambio entre iconos durante la simulación, dependiendo del estado, se vuelve
visible en los siguientes ejercicios.

Plant Simulation ofrece varios objetos para almacenar temporalmente MUs como se describe
brevemente en el Capítulo 2, a saber:

27
El objeto Store. Este objeto es uno de los objetos pasivos en Plant Simulation, lo que significa que no
tiene tiempo de configuración ni tiempo de procesamiento ni control de salida. Los lugares de
almacenamiento están organizados en una matriz, con una dimensión X y una dimensión Y. Siempre que
la Tienda tenga lugares disponibles, puede recibir MUs. Las MU pueden permanecer en la tienda hasta
que se eliminen mediante el uso de un método de control.
• El objeto PlaceBuffer. En este tipo de búfer, las MU no pueden pasar el uno al otro. La primera
MU que se pasará al siguiente paso de procesamiento será la MU con el tiempo de espera más
largo en el búfer (First In First Out, FIFO). Cuando se pasa esa MU, todas las demás MU avanzan
un lugar. Tenga en cuenta que la Biblioteca de clases podría no contener PlaceBuffer de manera
predeterminada. En ese caso, puede agregar este objeto a la Biblioteca de clases yendo a Inicio 
Administrar biblioteca de clases y marcar la casilla de verificación antes de PlaceBuffer.
• El objeto Buffer. A diferencia del PlaceBuffer, el buffer no tiene una estructura orientada al
lugar. Puede determinar un tipo de memoria intermedia para descargar las MU.

Si selecciona Cola, el Búfer descargará las MU usando el principio Primero en entrar primero en
salir (FIFO). Si selecciona Apilar, el Búfer descargará las MU usando el orden Último en entrar
primero en salir (LIFO).
• El objeto Clasificador. En este objeto, las MU pueden reordenarse en un orden diferente. El
Clasificador priorizará las MU presentes en el Clasificador. Puede usar los siguientes criterios de
selección para determinar la priorización de las MU, lo que se demostrará más adelante:
o Duración de la estadía (FIFO)
o atributo MU
o Método

La capacidad de estos objetos se puede ajustar en su ventana de diálogo de configuración. Es posible


configurar la capacidad hasta el infinito: si ingresa -1 como capacidad, su objeto de almacenamiento
tiene una capacidad infinita.

Tarea: Añadir una Sala de Espera

1. Elimine el conector entre su objeto Arrival y su objeto GeneralPractitioner.


2. Inserte un objeto Buffer entre su objeto Arrival y su objeto GeneralPractitioner.
3. Cambie el nombre del objeto Buffer a WaitingRoom.
4. Conecte los objetos.

5. Establezca la capacidad de WaitingRoom a ilimitada (-1).

28
6. Haga clic en la pestaña Times.
7. Asegúrese de que el tiempo de Dwell esté configurado en 0.
8. Pon a prueba tu modelo.

29
3.6 Múltiples Médicos Generales
Para el siguiente paso, agregará un segundo médico general a su modelo. Dado que ya
hemos derivado una subclase de GeneralPractitioner de la clase SingleProc, simplemente
podemos crear una instancia de un nuevo objeto de GeneralPractitioner sin tener que
configurar todo (por ejemplo, el tiempo de procesamiento) nuevamente.

Tarea: Añadir un Médico General Adicional

1. Arrastre un segundo objeto de GeneralPractitioner a su modelo.


2. Conecte el objeto WaitingRoom y el objeto Departure con el segundo objeto
GeneralPractitioner.
3. Cambie el nombre de sus objetos de GeneralPractitioner a GP1 y GP2, respectivamente.
4. Pruebe su modelo.

5. Tenga en cuenta que las MU se pasan al objeto GP que ha estado inactivo por más tiempo.

¿Sabías?

Puede preguntarse qué ocurre internamente cuando las piezas que están listas para moverse están
bloqueadas. La siguiente ilustración muestra cuatro posibilidades diferentes para pasar piezas. Plant
Simulation ha implementado el teorema push-block como funcionalidad básica al pasar partes entre
objetos básicos. Un objeto con una parte que está lista para moverse activamente intenta mover esa
parte a su sucesor (principio de empuje). Si el sucesor no puede recibir la pieza en este momento, se
activa el principio de bloqueo, garantizando que el objeto listo para mover una MU se reactive tan
pronto como el sucesor esté listo para recibir la pieza.

30
El teorema push-block asegura que las piezas se transmiten utilizando la funcionalidad básica de los
objetos y que la secuencia de eventos no se interrumpa por bloqueos, fallas o pausas. Las siguientes
ilustraciones muestran cómo funciona el teorema push-block en Plant Simulation.

3.7 Adults and Children


Actualmente, las MU en su modelo son del tipo Entidad de la carpeta MU en su
Biblioteca de clases. Para nuestro modelo, nos gustaría hacer una distinción entre el tipo
de pacientes, es decir, entre adultos y niños (ver Sección 2.1). Para este propósito,
(nuevamente) haremos uso de la herencia. Primero crearemos el paciente MU.
31
Tarea: Crear un Paciente MU

1. Haga clic con el botón derecho en el objeto Entity en la carpeta MUs.


2. Seleccione Duplicar. Ahora tiene un objeto llamado Entity1 en la carpeta MU.
3. Cambie el nombre de la MU al paciente.

El siguiente paso es configurar el paciente MU recién creado como entrada para su


modelo. Por lo tanto, debe ajustar el objeto Fuente en su modelo.

Tarea: Cambiar la Entrada para un Objeto Fuente

1. Haga doble clic en el objeto Arrival en su modelo.


2. Haga clic en el botón … de entrada de MU, que actualmente indica * .MUs.Entity.
3. Seleccione Paciente y presione OK.

4. Cierre la ventana de diálogo.


5. Ejecute su modelo y pause cuando se hayan generado algunas MU.
6. Haga clic en MU y observe que las MU ahora son Pacientes.

32
Debido a que el paciente podría ser un niño o un adulto, nos gustaría distinguir entre los
dos. Por lo tanto, debe derivar dos subclases adicionales del paciente MU.

Tarea: Crear Subclases del Paciente MU

1. Derivar del paciente MU dos nuevas MU.


2. Cambie el nombre de Adulto y Niño, respectivamente.
3. Haga clic derecho en Patient y seleccione Show Herencia.
4. Tenga en cuenta que Adulto y niño son subclases del paciente.

Si ejecuta su modelo, solo recibirá al paciente como entrada. Para obtener un MU o un


adulto como MU de entrada, haremos uso de un TableFile, que se puede encontrar en
InformationFlow. TableFile es una lista bidimensional que puede almacenar información
para diversos fines en proyectos de simulación, p. Ej .:
33
• Almacenamiento de planes de producción
• Colección de información
• Parámetros para objetos
Para nuestros propósitos, usamos el TableFile para establecer la proporción relativa de
niños y adultos que ingresan al modelo.

Tarea: Insertar un TableFile

1. Inserte un TableFile de InformationFlow en su modelo.


2. Cambie el nombre a PatientDist.
3. Haga doble clic en PatientDist para ver el diseño actual.
4. Cierre TableFile.
5. Haga doble clic en el objeto Arrival.
6. Cambie la selección de MU a aleatorio.
7. Haga clic en el botón … en el campo de entrada de la Tabla y seleccione PatientDist.

8. Haga clic en Aplicar y cierre la ventana de diálogo.


9. Haga doble clic en el objeto PatientDist y observe que su diseño ha cambiado.

34
Como se ilustra en la tarea anterior, TableFile se ajustó automáticamente al tipo de
información que contendrá. Es posible hacerlo manualmente, pero no profundizaremos
en esta característica. Ahora que se ha seleccionado TableFile como entrada para el
objeto Arrival, deberá especificar qué tipo de MU se generará a partir de TableFile.
También es necesario definir la frecuencia relativa en la que llegan.

Tarea: Complete el TableFile

1. Abra PatientDist haciendo doble clic.


2. Arrastre el MU Adult a la primera celda debajo de la columna MU (o simplemente escriba la
ubicación de la MU en la Biblioteca de clases).
3. Arrastre el MU Child a la segunda celda debajo de la columna MU.
4. Ingrese las frecuencias 0.60 y 0.40 en la columna Frecuencia.

5. Cierre TableFile.
6. Pon a prueba tu modelo.
7. Haga una pausa en el modelo y tenga en cuenta que algunas MU se denominan Niño y otros
Adultos.

3.8 Icons
Como habrás notado, es bastante difícil distinguir qué
tipo de MU está fluyendo a través del modelo. Podría
ser un adulto o un niño. Para fines de visualización,
podría ser útil crear nuevos iconos para los objetos que
ha creado. Ajustar los íconos de sus objetos puede
ayudarlo a detectar los errores que ha cometido en su
modelo o ayudar al cliente, para quien realiza un
estudio de simulación, a comprender el modelo. Para
crear iconos nuevos o ajustar los actuales, use el Editor
de iconos. Puede abrir el Editor de iconos haciendo clic
con el botón derecho del mouse en el objeto deseado
en la Biblioteca de clases, y luego elegir la opción de
menú Edit Icons ...

35
Esto abrirá el Editor de iconos en una nueva ventana de diálogo.

Puede editar el icono en la ventana de dibujo haciendo clic en una herramienta de


dibujo en el modo Dibujar y seleccionando un color en la barra de colores. Use la
herramienta Copiar / Pegar área para seleccionar, copiar, cortar y mover partes del
icono. Cada objeto en la Biblioteca de clases se le asigna un conjunto de iconos. Cada
icono tiene un número asignado por el sistema y un nombre asignado por el usuario. Los
diferentes iconos pueden usarse para mostrar diferentes estados del objeto. El estado
más común es Operacional.

El ícono que se muestra al insertar el objeto tiene Corriente marcada. Puede agregar
íconos adicionales en cualquier momento. Para lograr esto, elija Nuevo en el menú
Editar. Sin embargo, también puede elegir ajustar los íconos estándar del objeto.

36
En el menú Editar también puede ajustar el tamaño (medido en píxeles) de un icono.
Para eliminar un ícono, elija Cortar (Ctrl + X) en el menú de Inicio.

¿Sabías?

Aquí hay algunos consejos útiles para tratar con iconos:


• Puede establecer uno o varios íconos para un objeto. En el caso de que haya varios iconos
presentes en un objeto, estos iconos pueden cambiar dependiendo del estado (por ejemplo,
operativo y en espera) o este cambio se puede desencadenar usando un Método (usando el
comando CurrIcon).
• Simulación de planta asigna automáticamente un número a cada icono y, opcionalmente, un
nombre por parte del usuario. Los nombres deben ser únicos, es decir, un objeto puede no
tener múltiples íconos con el mismo nombre.
• La cantidad de iconos asignados es ilimitada.
• Cada objeto básico en Plant Simulation tiene varios estados predefinidos (operacional, fallido,
pausa, bloqueado). Los iconos con este nombre se mostrarán automáticamente cuando estén
en ese estado. Esto se demostrará más adelante.
• Cada objeto tiene un ícono con el número (No.) 0, llamado Predeterminado y un tamaño de
41 * 41 píxeles. Este es el ícono usado para mostrar en la Biblioteca de clases. El nombre
Predeterminado de este ícono no se puede cambiar. Sin embargo, en un modelo, este objeto
puede tener un ícono diferente.
• El tamaño máximo es 4000 * 4000 píxeles.
• Como los iconos ocupan una cantidad considerable de memoria, el conjunto de iconos de un
objeto solo se guarda una vez. Todos los objetos de este tipo usan el mismo conjunto de íconos.
Si se cambia un ícono, este cambio se transfiere a todas las instancias de este objeto.
• También es posible importar imágenes .BMP y .GIF como ícono.

Para distinguir entre un Niño y un Adulto en el modelo, debe modificar los íconos de las
MU Adulto y Niño.

Tarea: Modificar los íconos del Adulto y el Niño

1. Abra el Editor de iconos para MU Adult.


2. Asegúrese de que el botón Heredar está desactivado (porque no desea usar el icono
personalizado para las clases de Paciente y Adulto).

3. Dibuja una imagen para el MU adulto. Por ejemplo:

37
4. Asegúrese de aplicar los cambios (haciendo clic en la marca de verificación verde o
presionando F7).
5. Busque en el Editor de iconos la imagen con el nombre En espera.
6. Nuevamente, asegúrese de que el botón Heredar imagen esté desactivado.
7. Dibuje una imagen (o copie / pegue desde la imagen anterior) que ilustre que el estado MU
está bloqueado, por ejemplo:

8. Repita los pasos 1 a 7 para el hijo MU. Por ejemplo:

38
9. Ejecuta tu modelo. Los íconos que dibujó estarán presentes en el modelo.

Si las áreas de color verde oscuro en los íconos ilustrados no son transparentes, abra el Editor
de iconos y encienda Transparente en el menú Edición. Si no ve los íconos, es posible que deba
desactivar la propiedad VectorgraphicsActive. Puede hacer esto para MUs Adult y Child
haciendo doble clic en MU Patient en la Biblioteca de clases. A continuación, vaya a la pestaña
Gráficos y desmarque la casilla de verificación antes de gráficos vectoriales activos.

39
3.9 Médicos Generales Especializados
Los médicos generales se especializan en el tratamiento de niños o en el tratamiento de
adultos. El comportamiento de los objetos básicos de Plant Simulation no es suficiente
para este propósito. Por lo tanto, necesitamos extender las características estándar de
estos objetos utilizando un código personalizado. Plant Simulation proporciona SimTalk
2.0 para este fin, que es el lenguaje de programación estándar en Plant Simulation
(consulte la nota al final de esta sección sobre las diferentes versiones de SimTalk). Con
este lenguaje de programación puede programar todo tipo de lógica personalizada.
Necesita utilizar el método del objeto InformationFlow para programar SimTalk 2.0 en su
modelo. Si implementa un Método en su modelo, obtendrá la siguiente ventana de
diálogo haciendo doble clic en el objeto.

En un Método, declara las variables locales que tiene la intención de utilizar en las
primeras líneas del Método, haciendo uso de la palabra clave var. La lógica real de su
función / procedimiento se insertará después de la declaración de las variables. Una vez
que haya terminado de programar su Método, aplique los cambios haciendo clic en la
marca de verificación verde en la Cinta o presionando F7.

Tarea: Enviar al Paciente a la Sala de Espera

1. Elimine el objeto WaitingRoom de su modelo.


2. Cambie el nombre de GP1 a AdultGP y GP2 a ChildGP.
3. Inserta dos clasificadores en tu modelo. Llámalos AdultWR y ChildWR respectivamente (WR
significa WaitingRoom).
4. Establezca la capacidad de ambos clasificadores en infinito (-1) y mantenga todos los demás
valores en sus configuraciones predeterminadas.
5. Conecte el AdultWR al AdultGP.
6. Conecte el ChildWR al ChildGP.
7. Inserte un objeto Método y asígnele el nombre ForwardPatient.
8. Haga doble clic en ForwardPatient.
40
9. Inserta el siguiente código:

(@.origin se refiere a la clase para padres en la Biblioteca de clases; alternativamente,


puede usar @.name = "Adult")

10. Aplique los cambios y cierre la ventana de diálogo.


11. Haz doble clic en el objeto Arrival.
12. Haga clic en la pestaña Controles y elija como Salir, controle el Método
ForwardPatient.

13. Cierre la ventana de diálogo.


14. Pruebe su modelo.
15. En caso de que haya cometido un error en uno de sus métodos (en este caso, esto podría
suceder en ForwardPatient), el programa se detiene y muestra una barra roja en una línea de
programación que produce un error y proporciona información de error en la parte inferior
del Método ventana. En tales casos, debe finalizar la simulación presionando Ctrl + T o usando
el botón .

41
Como puede ver, ya no hay conectores entre Arrival y las salas de espera. La razón es
que ahora el Método se ocupa de mover a los pacientes a la sala de espera (usando el
comando @ .move ()). De hecho, se recomienda encarecidamente eliminar un conector
cuando un método se ocupa de mover MU, para evitar un comportamiento inesperado.
Cuanto más sofisticado sea su modelo, más a menudo se encontrará utilizando Métodos
para mover MU de un objeto de MaterialFlow a otro. Mientras que el Connector es
conveniente para modelos simples, a menudo necesitará un control más preciso sobre el
movimiento de sus MU, por ejemplo, para enrutarlos correctamente, o dejarlos en un
objeto de MaterialFlow durante más tiempo.
En el modelo actual, se ilustra el principio de empuje, ya que los pacientes son
empujados a su destino. El objeto Método en el modelo puede desencadenar diferentes
acciones (ya sea para ir a AdultWR o a ChildWR). Esta forma de vincular el flujo de
materiales y el flujo de información se denomina teorema del actor sensor.
Nota El Identificador Anónimo
Aprendimos que el flujo de material y el flujo de información pueden estar conectados por el teorema
del actor sensor. Una MU que llega a la salida de un objeto de flujo de material activa el control de
salida de este objeto mediante su sensor de salida (de manera similar para el control de entrada). En el
control, puede emplear el carácter "@" para acceder a la MU sin saber su nombre. El "@" es un cursor
(referencia) al MU que activó el sensor y causó la ejecución del Método. También está el identificador
anónimo "?", Que es un cursor del objeto MaterialFlow que contiene la MU desencadenante (consulte
la Sección 4.2).

¿Sabías?

Puede obtener una descripción general de todos los atributos y métodos de un objeto haciendo
clic derecho en el objeto y seleccionando Mostrar atributos y métodos ... o presionando F8
cuando haya seleccionado el objeto. Esto podría ser útil cuando programe ciertas interacciones
con el objeto, y tiene curiosidad sobre qué atributos y métodos existen para manipular el
objeto. Haga clic en la viñeta verde para mostrar solo los atributos estándar, que son suficientes
para la mayoría de los modelos de simulación.
42
En el modelo que creó no solo hay una función de inserción, sino también una función
de extracción (consulte la Sección 3.6). Cuando un paciente está listo para el médico
general, el médico general debe llamar al siguiente paciente desde la sala de espera, es
decir, debe tirar. Para fines ilustrativos, implementamos esta característica de extracción
también en un Método.

Tarea: Seleccione el Siguiente Paciente

1. Borre todos los conectores restantes del modelo.


2. Inserte un objeto Método, asígnele el nombre NextPatient y ábralo.
3. Inserta el siguiente código (mira también el código en el Apéndice) y trata de entenderlo:

43
4. Aplique los cambios y cierre la ventana de diálogo.
5. Abra el objeto AdultGP.
6. Haga clic en la pestaña Controles y elija como Salir, controle el Método PróximoPerio.
7. Cierre la ventana de diálogo.
8. Abra el objeto AdultWR.
9. Haga clic en la pestaña Controles y elija como Entrada controlar el Método SiguientePatiente.
10. Repita los pasos 5 a 9 para ChildGP.
11. Pon a prueba tu modelo.

Tenga en cuenta que los atributos utilizados en el método NextPatient se pueden


encontrar mirando los atributos de los objetos individuales AdultWR, AdultGP, ChildWR
y ChildGP (haciendo clic con el botón derecho en estos objetos o presionando F8,
consulte la observación anterior). En lugar de utilizar el atributo Ocupado, también
podríamos haber usado los atributos completo, vacío o numMu:
“Not AdultGP.Occupied” = “AdultGP.empty” = “AdultGP.numMu=0”

Tenga en cuenta que estas igualdades no necesariamente son válidas para otros objetos
distintos de SingleProc. Finalmente, tenga en cuenta que ahora hemos eliminado todos
los conectores del modelo, de modo que todos los movimientos de MU son manejados
por métodos.
44
Nota SimTalk 1.0 y SimTalk 2.0

El lenguaje de programación integrado SimTalk proporciona una gran flexibilidad de modelado, ya que
ya no está obligado por las funcionalidades de los objetos Plant Simulation existentes. El código fuente
de SimTalk debe ingresarse en Métodos. Hay dos versiones de SimTalk, el SimTalk 1.0 original y el nuevo
SimTalk 2.0. Puede seleccionar una versión con el botón de la cinta Método> Herramientas> Nueva
sintaxis. Ambos tipos de métodos se pueden usar en el mismo modelo en paralelo. Sin embargo,
SimTalk 2.0 hace que los métodos de programación en Plant Simulation sean más rápidos, fáciles y
menos propensos a errores. A lo largo de este tutorial, usamos SimTalk 2.0. Las principales diferencias
de esta versión en comparación con el SimTalk 1.0 original son las siguientes:

• Ya no es necesario escribir un punto y coma al final de cada instrucción.


• Ya no es necesario utilizar las palabras clave is, do, end para su código, donde todas las
variables deben declararse entre is y do, y el resto del código debe colocarse entre do y end.
• Declaraciones de flujo de control simplificadas (por ejemplo, if-else-end en lugar de if-then-
else-end).
• Nuevos operadores para agregar, restar o multiplicar un valor (p. Ej., x + = y es la abreviatura
de x: = x + y)
• Cambiado sobre operadores iguales (p. Ej., ~= En lugar de ==)
• Nuevos operadores div/mod.
• Diferente forma de referenciar los métodos y las variables globales.
• Una sintaxis mejorada para Lists y TableFiles.

Nota Estructurando código en Simtalk 2.0


El final de línea define el final de una
declaración. Si la declaración aún no está
completa (por ejemplo, y: = 10 +),
continuará automáticamente en la
siguiente línea. Puede usar paréntesis
para forzar que la instrucción continúe
en la siguiente línea. El punto y coma
separa múltiples declaraciones en una
línea. Tenga cuidado con la línea ingrese
y use la sangría adecuada para mejorar la
legibilidad y evitar errores.

3.10 Atributos Definidos por el Usuario


En un estudio de simulación realista, es probable que se conozca más información sobre
los pacientes. Es fácil imaginar que cada paciente que llegue tendrá un tiempo
determinado de citas con su médico de cabecera y que algunos pacientes llegarán tarde,
mientras que otros llegarán temprano. Para realizar tal situación en Plant Simulation, es
necesario crear Atributos definidos por el usuario para nuestros pacientes.

45
Tarea: Crear un atributo definido por el usuario
1. Abra el paciente MU.
2. Haga clic en la pestaña Definido por el usuario.
3. Haga clic en el botón Nuevo.
4. Nombre el atributo citahora.
5. Establezca el tipo de datos a la hora.

6. Haga clic en Aceptar y cierre la ventana de diálogo.


7. Tenga en cuenta que debido a la herencia, MU Child y Adult también tendrán este atributo.

¿Sabías?

Además de los atributos estándar, cada objeto de flujo de material básico se puede agregar con
información adicional formada por atributos personalizados. Puede usarlo para agregar
información sobre el tipo de parte, el número de orden, el estado del procesamiento, etc. Cada
atributo personalizado consta de un nombre, un tipo de datos y un valor. Solo puede guardar un
solo valor. La cantidad de atributos personalizados no está limitada. Un atributo personalizado
corresponde a una variable global en un lenguaje de programación.
Plant Simulation ofrece varios tipos de datos. Los más importantes se enumeran aquí:

• boolean logical value, may be TRUE or FALSE.


• integer integer number, such as 1, 127, -3566.
• real floating point number, such as 3.141, -382.657.
• string text, such as "This is text", "123 – ABC".
• object cursor to an object.

46
El tipo de datos determina el rango de valores, es decir, qué entradas están permitidas y
cuáles no. Dependiendo del tipo de datos, diferentes operadores están disponibles. Los
operadores le permiten realizar operaciones aritméticas y lógicas en variables. Las
operaciones importantes son:

Con el fin de generar un horario de cita para nuestros pacientes, nuevamente hacemos
uso del objeto Método.

Tarea: Definir el tiempo de la cita

1. Inserta un objeto Método, nómbralo EnterArrival y ábrelo.


2. Inserta el siguiente código:
Se asemeja a la situación en la que los pacientes llegan de manera uniforme entre 0 y 30
minutos demasiado temprano; el 1 se refiere a un flujo de números aleatorios que
explicamos más adelante en esta sección.
3. Aplique los cambios y cierre la ventana de diálogo.
4. Abra el objeto Arrival.
5. Haga clic en la pestaña Controles y elija como Entrada controlar el Método EnterArrival.
6. Ejecute su modelo y pause después de un tiempo.
7. Haz doble clic en una MU.
8. Haga clic en la pestaña Definido por el usuario.
9. Tenga en cuenta que el atributo appointmentTime ahora tiene un valor.

47
Nota Comparación vs asignación
Puede haber notado que a veces = o: = se usa en Métodos. El operador = se usa para comparar dos
variables, por ejemplo, en una instrucción if (por ejemplo, variable1 = variable2). El operador: = se usa
para asignar un nuevo valor a una variable (por ejemplo, variable: = 4.6).

Además del tiempo de cita de un paciente, la urgencia o la gravedad de su motivo para


visitar al médico general también pueden ser importantes. Agregamos un Atributo
definido por el usuario adicional para esta característica del paciente.

Tarea: Definir la Urgencia de un Paciente

1. Abra el paciente MU.


2. Haga clic en la pestaña Definido por el usuario.
3. Haga clic en el botón Nuevo.
4. Nombre la urgencia del atributo.
5. Establezca el tipo de datos en entero.
6. Haga clic en Aceptar y cierre la ventana de diálogo.
7. Haga doble clic en EnterArrival.
8. Agregue la siguiente línea a su código:

(número aleatorio uniforme entre 1 y 4 redondeado a un número entero 1, 2 o 3)


9. Pruebe su modelo.

¿Sabía que…? Flujos de números aleatorios

Un modelo de simulación típico usa números aleatorios en numerosos lugares. De hecho, las
computadoras no generan verdaderos números aleatorios; usan una función que toma un valor
inicial y luego genera una secuencia de números que se llaman pseudoaleatorios. La función que
genera esta secuencia se llama generador de números pseudoaleatorios, o PRNG para abreviar.
Un PRNG adecuado siempre genera el mismo flujo de números para el mismo valor inicial. Esta
propiedad es útil para propósitos de simulación, ya que los experimentos se pueden comparar
más fácilmente si usan exactamente el mismo flujo de números aleatorios. En Plant Simulation,
se generan flujos de números aleatorios en todos los lugares donde se usa una distribución
aleatoria. Ahora observe la diferencia en las entradas para las siguientes dos especificaciones de
una distribución de probabilidad:

48
En ambos casos, se especifica una distribución aleatoria exponencial con β = 25 segundos, pero en el
Método se proporciona un número entero adicional. Este es el valor inicial, o en otras palabras, el
número del flujo de números aleatorios del que se extraen los números aleatorios. Es una práctica
común utilizar diferentes flujos de números aleatorios para diferentes procesos estocásticos.
Para los objetos de MaterialFlow, no es posible especificar un flujo de números aleatorios
específico ya que Plant Simulation proporciona automáticamente a cada objeto de MaterialFlow
un número único. Sin embargo, es posible cambiar las secuencias de números aleatorios de
todos los objetos de MaterialFlow configurando la Variante de números aleatorios (consulte a
continuación). Para obtener más información sobre cómo usar RandomNumbersVariant,
consulte la Sección 9.4.

En un sistema justo, la regla de prioridad para los pacientes, es decir, a quién se le está
atendiendo primero, no sería First Come First Served (FCFS) como se hace actualmente
en el modelo. Una forma más deseable de clasificar a los pacientes es clasificándolos en
el horario de citas que tienen. El objeto Sorter que insertó anteriormente se adapta a
este propósito.

Tarea: Priorizar a los Pacientes

1. Haga doble clic en el objeto AdultWR.


2. Cambie el criterio de clasificación a la propiedad MU. 48

49
3. Seleccione Atributo definido por el usuario de las nuevas opciones que aparecen.
4. Escriba appointmentTime en la celda de abajo.

50
5. Haga clic en Aceptar.
6. Repita los pasos 1 a 4 para ChildWR.
7. Pruebe su modelo.

3.11 Medición del rendimiento


Para validar y probar su modelo, debe instalar algún tipo de medición de rendimiento.
Para este propósito, puede usar el objeto Variable de la carpeta InformationFlow. La
diferencia con la variable local que define en un Método (en las primeras líneas,
haciendo uso de la palabra clave var) es que el objeto Variable es una variable global.
Esto significa que los datos almacenados por esta variable se pueden usar en todos los
métodos. Los métodos pueden establecer y leer el valor de estas variables globales.
Como Indicador clave de rendimiento (KPI) en este modelo, utilizaremos el tiempo de
espera percibido: 𝑤𝑡percibido. Lo definimos como la diferencia entre el tiempo de cita de
un paciente 𝑡cita y el momento en que comienza la consulta con el GP 𝑡GP. Sin embargo, es
cero si el paciente comienza la consulta antes de la hora de la cita, por ejemplo, porque
llegó temprano a la oficina de GP y no hay otros pacientes en la sala de espera. Además,
el tiempo de espera se percibe como mayor si la urgencia del paciente es mayor (una
urgencia alta corresponde a un número de urgencia bajo). En resumen, el tiempo de
espera percibido se modela de la siguiente manera:

Donde

Tarea: Definir la Urgencia de un Paciente

1. Inserta dos objetos Variables en tu modelo.


2. Nómbrelos nPatientsAtGP y AvgPerceivedWT, respectivamente.

3. Abra nPatientsAtGP.
4. Establezca el tipo de datos en entero.

51
5. Haga clic en Aceptar.
6. Abra AvgPerceivedWT.
7. Establezca el tipo de datos a la hora.
8. Haga clic en Aceptar.

Si ahora ejecutara su modelo, los valores de las variables globales no cambiarán, porque
no son actualizados por un Método. Por lo tanto, necesitamos insertar un Método que
establezca el valor de estas variables globales. También necesitamos un Método que
restablezca las variables globales cuando reiniciemos una ejecución de simulación.

Tarea: Método para las Variables Globales

1. Inserte un objeto Método, asígnele el nombre CalcPerceivedWT y ábralo.


2. Inserta el siguiente código:

3. Aplique los cambios y cierre la ventana de diálogo.


4. Inserta un objeto Método y nómbralo Restablecer. Este método se invoca cada vez que
presiona el botón de reinicio en EventController (también hay métodos que se llaman cuando el
modelo se inicializa y cuando termina la simulación, consulte "¿Sabía que ...?" En la Sección 4.2).

52
5. Haga doble clic en Restablecer.
6. Inserta el siguiente código:

(el comando DeleteMovables elimina todas las MU del modelo)


7. Aplique los cambios y cierre la ventana de diálogo.

Nos gustaría calcular el tiempo promedio de espera percibido, lo que significa que el
Método debe ser llamado cuando el paciente ingresa a la consulta del Médico General.
Además, para que el modelo sea más realista, suponemos que el tiempo de
procesamiento del médico general ya no es constante sino que sigue una distribución
Normal.

Tarea: Cálculo de las Variables Globales

1. Abra el objeto AdultGP.


2. Establezca el tiempo de procesamiento en Normal y complete los siguientes parámetros:

(como se hace aquí, puede especificar un límite superior e inferior para la distribución
normal, la razón es que una observación de la distribución Normal puede ser teóricamente
<0, que es un tiempo de procesamiento no válido, o + ∞, lo que detendría la simulación )
3. Haga clic en la pestaña Controles.
4. Establezca el Método CalcPerceivedWT como control de entrada.
5. Haga clic en Aceptar.
6. Repita los pasos 1-5 para ChildGP. Para el tiempo de procesamiento de ChildGP, use los
siguientes parámetros.

7. Abra el objeto Arrival.


8. Establezca el Intervalo en 15 minutos.
9. Haga clic en Aceptar.
10. Establezca un tiempo de finalización de 1000 días en EventController: abra el
EventController, abra la pestaña Configuración y escriba 1000: 00: 00: 00 en el campo End (1000
días).
11. Pon a prueba tu modelo.

53
3.12 Ordenar Utilizando un Método
En algunos casos, ordenar en un solo atributo podría no ser apropiado. Puede haber una
situación en la que le gustaría ordenar varios atributos de una MU o le gustaría instalar
algunas reglas sofisticadas al ordenar. Para este propósito, podemos usar el Método
como criterio de clasificación para el Clasificador.

Tarea: Método de Clasificación

1. Inserte un objeto Método y asígnele el nombre Clasificador.


2. Haga doble clic en AdultWR.
3. Seleccione Método como criterio de clasificación y seleccione el Clasificador de métodos como
entrada.

54
4. Haga clic en Aceptar y Sí en la ventana emergente.
5. Repita los pasos 2 a 4 para ChildWR.
6. Haga doble clic en el Clasificador de métodos y verá que el diseño estándar ha cambiado.

Es posible que no vea exactamente este código, pero el código a continuación (izquierda). Este es
el código de la sintaxis antigua SimTalk 1.0 (ver nota en la sección 3.9). Puede convertirlo a la
nueva sintaxis yendo al menú Herramientas en la Cinta de opciones y seleccionando Nueva
sintaxis (ver figura a continuación). Si esto no funciona (sucede en algunos casos en la versión
13.0), deseleccione Nueva sintaxis, aplique los cambios, cierre el método, ábralo de nuevo y
seleccione Nueva sintaxis nuevamente.

Los Métodos que programamos hasta ahora son los llamados Procedimientos, que son
Métodos que no devuelven un valor. Sin embargo, el Método Clasificador devuelve un
valor del tipo real (esto se define en la primera línea), que hace de este Método una
función denominada.

¿Sabía que…? Estructura de los Métodos

Los métodos se pueden usar como procedimientos o como funciones, dependiendo de si el Método
proporciona una devolución (resultado). Como ejemplo, considere la función AddSubtract que se
proporciona a continuación.

Este método requiere dos reales y un booleano como parámetros de entrada. El booleano indica si los
dos reales deben agregarse o restarse. Si llamamos al Método con un valor de a = 1, b = 3 y add = true,
la función nos devolverá como resultado un valor de 4: AddSubtract (1,3, true) = 4. Si creamos un caso
diferente , por ejemplo con a = 1, b = 3 y add = false, esto nos dará como resultado un valor de menos
2: AddSubtract (1,3, false) = -2. Dentro del Método AddSubtract, la primera línea indica los
parámetros de entrada param a, b: real, add: boolean y el tipo de datos que devolverá este Método "-
> real". Las variables locales, es decir, las variables que solo se usan dentro de este código, se colocan
después de la primera línea, indicadas por la palabra clave var, en este caso solo la "c" real. Al final
del código, la salida será devuelta (mediante el uso de retorno o resultado).

55
Se espera que un Método de clasificación devuelva un número de punto flotante (real),
que se puede usar para clasificar las MU en el Clasificador. Cuando el orden de
clasificación se establece en Ascendente, cuanto menor sea el valor devuelto por el
Método de clasificación, mayor será la prioridad de la MU correspondiente (es decir, los
valores de las MU aumentarán mirando desde la parte frontal a la parte posterior de la
cola). Cuando dos MU coinciden en el mismo número, entonces se priorizará la MU que
ha morado en el clasificador por más tiempo. Esto es lo que sucede actualmente, porque
cada MU ahora obtiene un rango de 1. Podemos clasificar a los pacientes en su prioridad
nuevamente usando una simple modificación del Método Clasificador.

Tarea: Ordenar el tiempo de cita con un método

1. Haga doble clic en el Clasificador de métodos.


2. Inserta el siguiente código:

3. Aplique los cambios y cierre la ventana de diálogo.

Al devolver la hora de la cita como el valor de nuestro Método, ordenamos de la misma


manera que lo hemos hecho en la tarea final de la Sección 3.9. En la tarea al final de este
capítulo, debe mejorar el rendimiento del modelo utilizando un Método que clasifique a
los pacientes.

¿Sabía que…? Cuándo alinear


De forma predeterminada, una MU se clasifica utilizando el Método de clasificación solo
cuando ingresa un Clasificador. Esto está bien en nuestro caso, porque el tiempo de cita de la
MU no cambiará mientras esté en el Clasificador. Sin embargo, hay casos en los que la
clasificación de cada MU debe actualizarse cada vez que una MU ingresa o sale del
Clasificador. Puede habilitar el último comportamiento estableciendo Time of sort en On
Access.

Ordenando en la entrada Ordenando el acceso

56
3.13 Tarea A1: Priorización mejorada
En la actualidad, a los pacientes solo se les da prioridad en cuanto a la hora de su cita,
aunque la urgencia del paciente tiene un fuerte efecto sobre el tiempo de espera
percibido. Además, los pacientes que llegan al médico de cabecera antes de la hora de
su cita siempre perciben un tiempo de espera percibido de cero, por lo que la
priorización de pacientes urgentes pero tempranos puede no ser siempre óptima.
Tarea A1: Sugerir una implementación de la regla de clasificación modificando el código
en el Método Clasificador. Tiene sentido utilizar el horario de cita y / o la urgencia en su
método de clasificación. Tenga en cuenta que cambiar el Método Clasificador también
puede requerir el ajuste de la configuración del Clasificador (Orden y Hora de
Clasificación). Para probar su solución, ejecute el modelo durante 2000 días (consulte la
Sección 3.3) y trate de obtener un AvgPerceivedWT que sea lo más bajo posible. Motive
su elección para la regla de cita mejorada. Debería ser posible llegar a AvgPerceivedWT
por debajo de 15 minutos. No está permitido cambiar nada más sobre el modelo (como
los tiempos de procesamiento GP) ya que eso invalidaría el modelo.

57
4 Construyendo un Modelo: Seguimiento de pacientes y
rendimiento
Si lleva a cabo un estudio de simulación para un cliente, lo más probable es que su
informe de simulación sea un consejo sobre cómo configurar un determinado sistema,
qué inversiones realizar o qué intervenciones de proceso aplicar. Usted forma una base
científica sobre cómo alcanzar un diseño de proceso óptimo para un sistema
determinado y construye un modelo de simulación para experimentar con las
intervenciones organizacionales bajo diferentes escenarios. Con el fin de proporcionar
credibilidad para su informe, nunca debe perder de vista dos cosas, a saber, la
verificación y validación de su modelo.
La verificación es el proceso de verificar que su modelo de simulación programado
corresponde a su modelo conceptual (es decir, su modelo en papel y sus diagramas de
flujo). Es importante que su modelo esté libre de errores cuando comience sus
experimentos de simulación, y que el cliente esté involucrado en el proceso de
modelado discutiendo los supuestos de modelado y diagramas de flujo de decisiones y
procesos. De esta manera, la credibilidad de su modelo aumentará.
La validación es el proceso de verificar si el modelo de simulación es una representación
precisa del sistema real para los objetivos particulares del estudio. Una forma de validar
un modelo es comparar un conjunto de datos de valores de salida del modelo con los
valores que se observan en el sistema de la vida real.
En este capítulo, presentamos los conceptos que son necesarios para la verificación y
validación. Construirá un modelo que sea capaz de realizar un seguimiento de los
pacientes en su sistema para los cuales usaremos TableFiles. Para la depuración y la
validación del modelo, el seguimiento de sus pacientes puede ser un concepto
importante, porque le gustaría ver si su modelo es realista y no presenta errores. Al
rastrear a los pacientes en su modelo, es posible que observe que un paciente está
esperando mucho tiempo en la sala de espera o que omite ciertos procesos que se
supone que debe seguir. Además de la depuración, cuando su modelo crece y se vuelve
más complejo, las unidades móviles (MU) pueden terminar prácticamente en cualquier
parte del modelo. Para mantener un descuido, es útil tener una tabla que contenga la
ubicación actual de todas las unidades móviles en el modelo.
Para verificar la corrección de su modelo, es importante que la medición del rendimiento
se realice correctamente. Debe recopilar estadísticas sobre su modelo y los pacientes
para ver si su modelo proporciona resultados realistas y para determinar qué ajustes
mejoran el sistema.
Temas tratados en este capítulo:
58
• Validación y verificación
• TableFiles
• La cola M / M / 2
• MU de seguimiento
• Métodos
• Medición del desempeño
• Exportar datos a Excel

4.1 Un Modelo Básico


Para este capítulo, construiremos un modelo básico con dos servidores. El sistema de
dos servidores tendrá tanto tiempos de conexión exponenciales como tiempos de
procesamiento, de modo que tengamos una cola M/M/2. Construiremos este modelo en
Plant Simulation usando el objeto estándar ParallelProc.
El ParallelProc tiene el mismo comportamiento básico que el SingleProc, pero luego
tiene varios lugares. El objeto tiene una dimensión X y una dimensión Y y la
multiplicación de estas dimensiones es la cantidad total de lugares en el ParallelProc. En
un ParallelProc sin un método de control, una MU que llegue siempre se colocará en la
estación de procesamiento que ha estado inactiva por más tiempo en el ParallelProc.

Tarea: Construye el Modelo Básico

1. Inicie Plant Simulation.


2. Elija Crear nuevo modelo.
3. Haga clic en 2D solo en la ventana de diálogo que aparece.
4. Inserte los siguientes objetos básicos en su modelo: una Fuente (llámalo Llegada), una
Memoria intermedia (llámela Sala de espera), una Prueba paralela (póngale el nombre GP) y un
Drenaje (nómbrela Salida).
5. Conecte los objetos.

Debe especificar el tiempo de llegada entre llegadas y el horario de servicio de los


médicos generales, de modo que el sistema tenga tiempos de conexión exponenciales y
tiempos de procesamiento exponenciales. Tenga en cuenta que la distribución
exponencial a menudo se denomina distribución exponencial negativa, que también es
el nombre que utiliza la simulación de plantas.

Tarea: Especifique los Tiempos de llegada y los Tiempos de Servicio

1. Abra el objeto Arrival.


2. Establezca el intervalo en una distribución de Negexp con el parámetro β = 15:00.

59
3. Haga clic en Aceptar y abra el objeto WaitingRoom.
4. Establezca la capacidad en ilimitada, el tiempo de espera en cero y cierre la ventana de
diálogo.
5. Haga doble clic en el objeto GPs.
6. Cambie las dimensiones de ParallelProc de modo que la cantidad total de lugares sea igual a
dos.

7. Establezca el tiempo de procesamiento en una distribución Negexp con el parámetro β =


28:00.

8. Haga clic en Aceptar y pruebe su modelo.

Al igual que en el capítulo anterior, nos gustaría que los pacientes fluyan a través de
nuestro modelo, por lo que necesitamos derivar un nuevo objeto de la Entidad en la
carpeta MU.

Tarea: Crear un paciente

1. Derive un nuevo objeto de la Entidad en la carpeta MUs.


2. Cambie el nombre del objeto Paciente.
3. Establezca el objeto como entrada para el objeto Arrival.

4. Cree nuevos íconos para el objeto (para el ícono operacional y el ícono de espera).

4.2 Seguimiento de pacientes en un TableFile


Como se indicó en la introducción de este capítulo, cuando los modelos crecen, puede
ser más difícil realizar un seguimiento de todas las MU sin las herramientas adecuadas.
Para mantener la supervisión, es útil tener una tabla que contenga la ubicación actual de
todas las MU en el modelo. Además, dicha tabla puede realizar un seguimiento de todo
tipo de otros atributos y estadísticas de nivel de unidad. Primero crearemos un TableFile,
que contiene toda la información que queremos recopilar para cada paciente. También
configuramos un contador para el número de pacientes en el sistema con el objeto
Variable y un Método que borrará el TableFile automáticamente cuando el sistema se
reinicie.

60
Tarea: Mantenga un registro de los pacientes

1. Inserte el objeto TableFile, asígnele el nombre Patients, y ábralo.


2. Haga clic en List  Column Index, así como en List  Row Index activo en la cinta de
opciones. Asegúrese de que Inherit Format esté desactivado, ya que desea utilizar un formato
diferente de la tabla en su modelo que luego se utilizó para el objeto TableFile en la Biblioteca
de clases.

3. Haga clic con el botón derecho en la celda de la esquina de la fila del encabezado (vea la
captura de pantalla a continuación) y seleccione Formatear ...

4. En la pestaña Dimensión, establezca el número de columnas en 8. Cierre el cuadro de diálogo.


5. Proporcione a las columnas los siguientes nombres y formatos:

(puede cambiar un formato haciendo clic con el botón derecho en el encabezado de una columna y
seleccionando Formatear ...)

61
6. Cierre la ventana de diálogo TableFile.
7. Inserte una variable de objeto y asígnele el nombre nPatients.
8. Inserta un método y nómbralo Reset.
9. Inserte el siguiente código (consulte la Nota al final de la Sección 4.3 para obtener una explicación
del argumento que se pasa a .delete ()):

10. Aplique cambios y cierre la ventana de diálogo.

¿Sabía que…?
El Método de Restablecimiento se ha presentado brevemente en el Capítulo 3. Se llamará a este
Método cuando presione el botón Restablecer en el EventController. También hay otros métodos que
tienen un propósito especial, a saber, los métodos Init y EndSim. El Method Init es el primer método
que se ejecutará cuando inicie la simulación. Esto puede ser útil cuando desee crear un número de MU
inmediatamente al comienzo de cada ejecución. El método EndSim es similar al Method Init, pero se
llama al final de una ejecución de simulación.

Ahora que se han establecido los fundamentos básicos para rastrear a nuestros
pacientes, necesitamos métodos que actualicen esa información. Cada vez que un
paciente ingresa un objeto nuevo (por ejemplo, la sala de espera o los médicos
generales), la información debe actualizarse.
Cuando los pacientes ingresan al modelo, un Método debe crear una nueva fila con la
información sobre el paciente en TableFile Patients. La información inicial disponible
sobre el paciente es su hora de llegada, hora de la cita y urgencia. A diferencia del
capítulo anterior, no establecemos los Atributos definidos por el usuario, el Tiempo de
cita y la urgencia de un Paciente individual, sino que escribimos estos valores
directamente en un TableFile haciendo un seguimiento de los datos de rendimiento de
todos los pacientes.

62
Tarea: Crear un método de llegada

1. Inserte un método y asígnele el nombre Arrive.


2. Inserta el siguiente código:

3. Aplique los cambios y cierre la ventana de diálogo.


4. Abre el objeto Llegada.
5. Configure el método como control de entrada.

6. Haga clic en Aceptar y pruebe su modelo. Pausa después de un tiempo.


7. Haga doble clic en TableFile Patients y verá que ahora está lleno de datos.

En Arrive, hemos definido la variable local "n". La única razón para esto es la legibilidad
del código, ya que de otro modo tendríamos que escribir "nPatients" en lugar de la "n"
mucho más corta en varios lugares del código. Además, la ubicación del paciente como
conectado en TableFile Patients sigue siendo el objeto Arrival, por lo que necesitaremos
escribir un método que actualice la ubicación del paciente cada vez que se mueva. Esto
sucede cuando el paciente ingresa a la sala de espera, el médico general o abandona el
sistema.

63
Puede observar que las celdas en la primera columna en Pacientes se llenan en su
mayoría de color rojo con la declaración (?). Esto significa que los objetos que estas
células señalan ya no existen. La razón es que los pacientes abandonan el modelo una
vez que se han procesado, pero sus filas correspondientes no se eliminan de la tabla.
Además, verá un número 0 en el encabezado de la primera columna. El número de
columna de la columna de índice, es decir, la columna que contiene los Índices de filas,
siempre es cero. Consulte la nota al final de la Sección 4.3 para obtener más información
sobre los índices TableFile.

Tarea: Crea los controles de entrada

1. Inserta un nuevo Método en tu modelo y nómbralo UpdateLocation.


2. Inserta el siguiente código:

(Este Método debe ser llamado por otros Métodos de modo que la ubicación de un objeto en
movimiento se cambie cuando sea necesario)
3. Aplique cambios y cierre la ventana de diálogo.
4. Inserta un nuevo Método en tu modelo y nómbralo EnterWR.
5. Inserta el siguiente código:
(tenga en cuenta que este método llama a otro método con @ y? como los dos argumentos)
6. Aplique cambios y cierre la ventana de diálogo.
7. Abra el objeto WaitingRoom y configure el método EnterWR como Control de entrada. Haga
clic en Aceptar.
8. Inserta un nuevo Método en tu modelo y nómbralo EnterGPs.
9. Inserte el siguiente código (consulte también el código en el Apéndice) e intente
comprenderlo:

64
10. Aplique cambios y cierre la ventana de diálogo.
11. Haga doble clic en el objeto GPs y configure el método EnterGPs como Control de entrada.
Haga clic en Aceptar.
12. Inserte un nuevo Método y asígnele el nombre ExitGPs.
13. Inserta el siguiente código:

14. Aplique cambios y cierre la ventana de diálogo.


15. Haga doble clic en el objeto GPs y configure el método ExitGPs como Exit Control. Haga clic
en Aceptar.
16. Inserta un nuevo Método y nómbralo.
17. Inserta el siguiente código:

18. Aplique cambios y cierre la ventana de diálogo.


19. Haga doble clic en el objeto de Salida y configure el Método de Salida como Control de
Entrada. Haga clic en Aceptar.
20. Pon a prueba tu modelo. Haga una pausa después de un tiempo y verifique si cada columna
en su TableFile Patient se completará para cada paciente.

Podríamos haber programado este modelo de manera más eficiente, porque en el


modelo hasta ahora tenemos algunos métodos que hacen exactamente lo mismo. Sin

65
embargo, ampliaremos estos métodos más adelante. Con el modelo actual, es posible
recopilar toda la información sobre el paciente.
Nota: @ and ?
En el Capítulo 3, hemos mencionado el identificador anónimo @. Este @ designa el MU que
desencadenó el control, por lo que en el caso de nuestra declaración UpdateLocation (@,?), El @ se
refiere al paciente específico que desencadena el Método en el que se escribe el enunciado. Los ? se
refiere al objeto de flujo de material que contiene el @ y lo hace a la llamada real, por ejemplo, el
objeto GPs.
Pasamos al paciente @ y al objeto que llama? al Method UpdateLocation. La primera línea de este
Método lee param patient: object, location: object, lo que significa que debemos pasar dos objetos
como argumentos al llamar a UpdateLocation. Estos objetos están disponibles en el método
UpdateLocation bajo los nombres patient y location. Tenga en cuenta que podríamos haber usado la
notación más breve param patient, location: object.

4.3 Cálculo de estadísticas y medidas de rendimiento


La información que ahora se recopila en TableFile permite todo tipo de análisis de
rendimiento. En este caso, queremos calcular el tiempo de espera promedio
experimentado por un paciente, el tiempo promedio de espera percibido y el tiempo
total empleado en el sistema. Es posible usar simplemente los pacientes TableFile para
esto, pero ese enfoque se volverá ineficiente cuando el número de filas crezca. Por lo
tanto, implementaremos un segundo TableFile, que almacena toda la información
relevante. Ampliaremos el Método de entrega, de forma que copie la información
relevante en el nuevo TableFile, calcule las estadísticas deseadas y luego elimine la
información superflua de TableFile Patients. Tenga en cuenta que debido a las adiciones
de un nuevo TableFile y Variables globales, también se debe extender el
Restablecimiento del método.

Tarea: Calcule la información deseada


1. Inserte el objeto TableFile y asígnele el nombre PatientStats.
2. Haga clic en Índice de columna en el menú Lista en la cinta de opciones. Asegúrese de que
Heredar formato esté desactivado.
3. Haga clic con el botón derecho en la celda de la esquina de la fila del encabezado y seleccione
Formatear ....
4. En la pestaña Dimensiones, establezca el número de columnas en 5. Cierre el cuadro de
diálogo.
5. Proporcione a las columnas los siguientes nombres y formatos:

6. Inserte un objeto Variable en el RootFrame y asígnele el nombre nPatientStats.


7. Inserte cuatro variables en RootFrame y asígneles el nombre AvgWT, AvgPerceivedWT, AvgPT
y AvgLengthOfStay. Establezca el tipo de datos para estas cuatro variables en Tiempo.
8. Haga doble clic en el Método de salida.
9. Agregue el siguiente código al código existente:

66
10. Aplique cambios y cierre la ventana de diálogo.
11. Haga doble clic en Restablecer método y agregue el siguiente código:

12. Pon a prueba tu modelo.

Constantemente utilizamos contadores como nPatients y nPatientStats para contar el


número de filas en una tabla. De esta forma, podemos ver rápidamente la cantidad de
datos contenidos en un TableFile, y los Métodos pueden usar el contador para encontrar
la siguiente fila vacía. Esto último se puede hacer sin un contador también. Como puede
ver al hacer clic con el botón derecho en TableFile y seleccionar Mostrar atributos y
métodos, el objeto TableFile tiene un atributo llamado YDim, que puede usar para
contar el número de filas ocupadas en TableFile y, por consiguiente, la primera fila vacía
será TableFile.YDim + 1. Otros atributos relacionados son XDim, indexXDim e indexYDim.
Nota: Índices de TableFile
TableFile utiliza las siguientes anotaciones para indexar una celda o rango específico:
• Celda específica: TableFile [columna, fila]
• Rango: {columna n, fila n} ... {columna m, fila m}
El índice de rango consta de dos atributos, que están separados por dos puntos. El primer atributo del
rango especifica la esquina superior izquierda del rango y el segundo atributo especifica el ángulo
inferior derecho del rango. También puede especificar una sola columna o fila usando solo {columna,

67
*} o {*, fila}, respectivamente. El * indica que se seleccionará la dimensión X o Y completa de
TableFile.
Algunos de los TableFiles que ha creado hasta ahora hacen uso de índices de columnas e índices de
filas. Estos tipos de índices le permiten usar cualquier tipo de variable como índice. Por ejemplo, en
TableFile Patients, los índices de columna son el string object, location, .... Los índices de fila son
punteros a instancias de objetos, como * .MUs.Patient: 1, * .MUs.Patient: 2, .... Ya usa ambos tipos de
índices en la salida del método, para encontrar la ubicación de las celdas de la tabla que deben
copiarse de los pacientes a los estadios del paciente.

4.4 Priorizar a los pacientes que usan un TableFile


En nuestro modelo actual, podemos recopilar todo tipo de estadísticas de rendimiento.
La información almacenada en nuestros TableFile Patients no solo se puede utilizar para
proporcionar la información para nuestras mediciones de rendimiento, sino también
para dar prioridad a los pacientes actualmente presentes en la sala de espera.
Supongamos que tenemos que clasificar a todos los pacientes en la sala de espera en
función de su urgencia (por lo que 1 es el más urgente y 3 el menos urgente), y luego de
su hora de cita. Para hacerlo, necesitamos agregar un Método extra. Este método
recorrerá los pacientes de TableFile en busca del paciente que tiene la lesión más
urgente y la hora de cita más temprana. Hay varios métodos para buscar a través de un
TableFile. En la siguiente tarea utiliza el for-loop, pero también podría ordenar el
TableFile y seleccionar el paciente en la primera fila para enviarlo al médico general si
hay un lugar disponible. El último enfoque se muestra en "¿Sabía que ...?" Al final de
esta sección.

Tarea: Priorice a los pacientes con un TableFile

1. Retire los conectores hacia y desde los GP.


2. Inserte un Método y asígnele el nombre GetPatient.
3. Inserta el siguiente código (mira también el código en el Apéndice) y trata de entenderlo:

68
(recuerde que -> object en la primera línea significa que este Método devolverá un valor con el
tipo de datos objeto, también tenga en cuenta que i y bestUrgency están definidos en la misma
línea, lo que solo es posible para variables con el mismo tipo de datos, a menos que separe las
declaraciones con un punto y coma: var i, bestUrgency: integer; var winner: object)
4. Aplique cambios y cierre la ventana de diálogo.
5. Haga doble clic en el Método EnterWR y agregue los siguientes códigos (dos partes de código
separadas, decida por usted mismo dónde ponerlas):

(tenga en cuenta que se llama al método GetPatient y el resultado de este método se asigna a la
variable local p)
6. Aplique cambios y cierre la ventana de diálogo.
7. Haga doble clic en el método ExitGPs y agregue los siguientes códigos (dos partes de código
separadas, decida por usted mismo dónde ponerlas):

8. Aplique cambios y cierre la ventana de diálogo.


9. Establezca un tiempo de finalización de 100 días en EventController: abra el EventController,
abra la pestaña Configuración y escriba 100: 00: 00: 00 en el campo End (100 días).
10. Pon a prueba tu modelo.
69
¿Sabía que…?
Hay varias opciones para buscar un TableFile, cada una con diferentes ventajas y desventajas. A
continuación puede encontrar una alternativa a la opción que hemos utilizado en la tarea anterior (el
for-loop). Sin embargo, aunque este enfoque requiere menos líneas de código, ciertamente no es más
eficiente en nuestro caso (no es eficiente clasificar a todos los pacientes si necesitamos seleccionar un
solo paciente).

4.5 Exportación de las estadísticas de rendimiento a Excel


Como se ha indicado anteriormente, el propósito de un estudio de simulación es
aprender sobre el comportamiento y el rendimiento del sistema. Por lo tanto, hemos
recopilado datos de nuestro modelo en TableFiles de nuestro modelo. Si quisiéramos
analizar más nuestros datos, como realizar pruebas estadísticas o calcular los intervalos
de confianza, podría ser necesario exportar los datos de nuestro modelo. Mostraremos
una forma en que puede exportar sus datos a Excel.

Tarea: Exportar datos a Excel

1. Ejecute su modelo por un tiempo y luego deténgalo.


2. Haga doble clic en TableFile PatientStats.
3. Haga clic en Exportar en el menú Lista en la Cinta y luego seleccione Exportar archivo de Excel.

70
Tendrás la opción de guardar los datos en tu computadora. A continuación, le preguntará en qué
hoja de trabajo desea almacenar sus datos.
4. Seleccione una hoja de trabajo para guardar sus datos y haga clic en Aceptar.

Sus datos ahora se almacenan en un archivo de Excel.

Alternativamente, puede seleccionar manualmente un área de información que le


gustaría guardar y usar los atajos Ctrl-C y Ctrl-V para pegarlo en un archivo de Excel u
otro programa de hoja de cálculo.
Nota: Formato de tiempo en Excel
Al copiar los datos en Excel, puede observar que el programa tiene dificultades para leer las columnas
formateadas como variables de tiempo. La forma más fácil de solucionar esto es cambiar el formato de
estas columnas a real. Las columnas contendrán ahora tiempos en segundos, que son fáciles de usar en
Excel.
En caso de que prefiera trabajar con formato de tiempo, tenga en cuenta que el formato de tiempo en
Plant Simulation se cuenta en segundos, mientras que el formato de tiempo en Excel se cuenta en
días. Como tal, una hora en Plant Simulation se almacena como un número de coma flotante con un
valor de 60⋅60 = 3600.0, y en Excel una hora se almacena como un número de punto flotante con el
valor 124≈0.041667. Por lo tanto, para convertir una columna de Plant Simulation con tiempos
indicados en segundos, primero debe dividir cada valor con 24⋅60⋅60 = 86400, y luego aplicar el
71
formato de hora en Excel.
También tenga en cuenta que Plant Simulation usa un punto (.) Como la marca decimal de forma
predeterminada, mientras que Excel puede usar una coma (,) dependiendo de su configuración regional.
Si no desea cambiar la configuración regional, también puede copiar sus datos directamente en Excel y
reemplazar todos los puntos por comas.

4.6 Asignación A2: ajuste de una distribución aleatoria y validación


Actualmente, las distribuciones aleatorias utilizadas para los tiempos de interarridación y
los tiempos de procesamiento son exponenciales con λ = 60/15 y λ = 60/28,
respectivamente (tasa en horas). Sin embargo, usted tiene algunas dudas sobre si estas
distribuciones aleatorias describen mejor el mundo real. Por lo tanto, solicitó a la oficina
del médico general que recabe observaciones sobre los tiempos reales de intervención
de los pacientes y los tiempos necesarios para la consulta. Usted recibe los dos
conjuntos de datos solicitados medidos durante los últimos 2.000 pacientes que visitan
esta oficina (consulte los archivos adjuntos).
Tarea A2.1. Ajuste una distribución de probabilidad a estos dos conjuntos de datos
usando Excel o un programa de hoja de cálculo similar. Determine la distribución de
probabilidad que mejor se ajusta a los datos, estime los parámetros y realice una prueba
de bondad de ajuste. Usa los resultados para actualizar tu modelo de simulación.
Como medida de validación, la oficina del médico general realizó mediciones del lapso
de tiempo entre el momento de llegada del paciente y su momento de salida, que se
conoce como la duración de la estancia. Agruparon los datos por día, es decir, el
conjunto de datos contiene promedios diarios de la duración de la estadía de los
pacientes (ver archivo adjunto).
Tarea A2.2. Ejecute su modelo con las nuevas configuraciones de tiempos de llegada y
consultas para recopilar una muestra de las observaciones de la duración de la estadía
de los pacientes (disponible en TableFile PatientStats). Primero, cree un intervalo de
confianza del 95% de la duración promedio de la estadía por día. Segundo, use un
procedimiento estadístico apropiado para determinar si la longitud de las estancias
observadas en el modelo son consistentes con las observaciones del mundo real.
Hint. No es estadísticamente correcto validar su modelo usando la duración individual
de las observaciones de la estancia, ya que las observaciones individuales están
correlacionadas. Sin embargo, puede usar la columna arrivalDay en PatientStats para
calcular la duración promedio de la estadía por día de llegada. Compare estos medios
por lotes con los datos del mundo real.

72
5 Construyendo un Modelo: Experimentando
El tiempo de los eventos en el mundo real a menudo no puede predecirse con absoluta
certeza. Por ejemplo, cuando un paciente hace una cita, generalmente no es posible
determinar de antemano si el paciente llegará a tiempo o no. Sin embargo, es posible
hacer una estimación de la probabilidad de llegar a tiempo, o incluso tratar la diferencia
entre el tiempo de llegada y el tiempo de cita como una variable aleatoria, como lo
hicimos en el capítulo anterior.
Las variables aleatorias en los modelos le permiten describir el mundo real de forma más
precisa, pero plantean un nuevo problema: ¿cómo se pueden comparar las diferentes
configuraciones de un modelo si su rendimiento depende de la casualidad? La respuesta
es tratar el rendimiento de una configuración como una variable aleatoria también, que
se puede estimar con más confianza si hay disponible una muestra más grande de
observaciones. Luego utilizamos pruebas estadísticas estándar para determinar qué
configuración es mejor, de manera similar a como validamos nuestro modelo del
capítulo anterior. Esto se puede hacer creando varias repeticiones de cada configuración
de modelo, usando el ExperimentManager en Plant Simulation.
Temas tratados en este capítulo:
• Lista de eventos y eventos de programación
• Parámetros de entrada
• Creando citas
• Medición del desempeño
• Realización de experimentos

5.1 Especificaciones
En este capítulo, usamos el ExperimentManager para optimizar la oficina de un médico
general que tiene las siguientes especificaciones:
1. El sistema tiene una recepción, una sala de espera con capacidad infinita y dos
médicos generales que brindan consultas a los pacientes.
2. Los pacientes deben tener una cita antes de que puedan ser consultados por un
médico de cabecera. Cada día tiene un número fijo de espacios de citas
equitativamente espaciados entre las 8:00 y las 20:00 (los médicos de cabecera
trabajan en turnos para que tengamos dos médicos de cabecera durante estas 12
horas, no hay necesidad de modelar explícitamente el cambio de turno).
3. Cada mañana a las 8:00, un número aleatorio de nuevos pacientes llama a la
recepción para programar una cita. El número de pacientes que llama sigue una
distribución de Poisson con λλ = 48.

73
4. La recepción asigna a los pacientes un intervalo de tiempo por orden de
llegada, comenzando con la primera ranura de la mañana. Cuando se toman todas
las máquinas tragamonedas por un día, los pacientes restantes son asignados a
las primeras máquinas tragamonedas disponibles en un día posterior. Cuando ese
día esté completo también, se designarán nuevos pacientes para el siguiente día
subsiguiente, etc.
5. Inmediatamente después de programar una cita, el paciente comenzará a
esperar en casa hasta la hora de la cita.
6. Un paciente llegará a la oficina de GP exactamente a la hora de la cita. A partir
de ese momento, el paciente comienza a esperar en la sala de espera hasta que
comience la consulta en el GP.
7. El tiempo requerido para la consulta sigue una distribución Lognormal con μ =
30 minutos y σ = 20 minutos.
8. Los médicos de cabecera continúan iniciando nuevas consultas con los
pacientes hasta que la sala de espera esté vacía y no haya más pacientes
planificados para ese día, o hasta que sean las 21:00.
9. Los pacientes que han recibido su consulta abandonan el sistema.
10. Los pacientes que todavía están en la sala de espera después de las 21:00 se
envían inmediatamente a recepción para reprogramarlos. Obviamente, la
reprogramación es algo que queremos evitar tanto como sea posible. Las
consultas que comenzaron antes de las 21:00 siempre se completan.
11. Un paciente que necesita ser reprogramado, se designará un nuevo horario en
la recepción. Serán designados para el primer intervalo de tiempo disponible
como de costumbre. No hay un trato preferencial
12. Después de reprogramar, el paciente comienza a esperar nuevamente en su
casa y vuelve a aparecer en la oficina de GP exactamente a la hora de la nueva
cita.
13. El tiempo de espera en casa se percibe como 20 veces menos molesto que el
tiempo de espera en la sala de espera. Ambos tipos de tiempo de espera se
cuentan desde el momento en que el paciente llama a la recepción por primera
vez. En otras palabras: los contadores de tiempo de espera no se reinician cuando
un paciente reprograma.
La recepción se pregunta cuántos pasillos de citas deberían estar disponibles cada
día, de modo que:
1. El tiempo de espera percibido es mínimo. La fórmula utilizada para calcular el
tiempo de espera percibido es 𝑤𝑡𝑝erceived = 1/20 × 𝑤𝑡𝑎t_ℎ𝑜me + 𝑤𝑡𝑤aiting_𝑟oom.
2. La tasa de reprogramación (número promedio de reprogramaciones por
paciente) es menor a 0.05.

5.2 Oficina del Médico General con recepción


74
Antes de preocuparse por experimentos, réplicas o citas, es útil crear una versión
simplificada del modelo final y expandir desde allí. Hay un nuevo objeto en la próxima
tarea: el generador. El generador se puede configurar para llamar a un método
predefinido en tiempos predefinidos.

Tarea: Los basicos

1. Use EventController, tres Buffers, un SingleProc, un ParallelProc, un Drain, cinco conectores,


un comentario, dos variables, un generador y un método para crear el siguiente modelo
(consulte la Nota al final de esta sección para obtener una explicación en Comentarios).

2. Configure la capacidad en -1 y el tiempo de espera en 0 en CallQueue, WaitingAtHome y


WaitingRoom.
3. Establezca el tiempo de procesamiento de FrontDesk en 0.
4. Establezca el número de GP en 2 estableciendo la dimensión Y en 2. 73
5. Configure el tiempo de procesamiento en GP de modo que coincida con la especificación del
sistema.
6. Deje que el generador comience en el tiempo de apertura y establezca su intervalo en un día.
Abra la pestaña Controles e ingrese InitDay en el campo Intervalo. De esta forma, se llama a
InitDay todos los días a las 8:00 en punto. Tenga en cuenta que el campo de Inicio debe
establecerse en el tipo Fórmula.

75
7. Derivar un paciente de la entidad MU. Crea iconos para la MU.
8. Permita que Method InitDay cree un número aleatorio de pacientes y muévalos a CallQueue
usando el siguiente código:

9. Obviamente, el código anterior aún no está completo, ya que el Método crea cero pacientes.
Intente determinar el código correcto para usar en la parte derecha de la línea 6, de modo que
se cree el número correcto de pacientes cada día (consulte la nota a continuación para obtener
una pista).
10. Establezca una hora de finalización en EventController: abra EventController, abra la pestaña
Configuración y escriba, por ejemplo, 100: 00: 00: 00 en el campo Finalizar (100 días).
11. Pruebe el modelo.

En la parte superior de InitDay, verá tres líneas de comentarios, que describen el


propósito del Método e indican qué objetos llaman al Método. Las descripciones de
métodos como estas son imprescindibles en cualquier buen modelo, ya que le permiten
a usted y a otros modeladores realizar un seguimiento de lo que hace cada Método sin
tener que recorrer el código del Método en sí.

Nota: Distribuciones aleatorias en SimTalk 2.0


SimTalk 2.0 presenta funciones incorporadas para dibujar números aleatorios de todas las
distribuciones aleatorias comunes. Todas estas funciones comienzan con z_ y toman un valor inicial
entero (que corresponde a una secuencia única de números aleatorios) como primer argumento.
Algunas funciones de uso común son z_poisson, z_normal, z_exp, z_gamma, z_uniform y z_binomial.
76
Nota: Creando comentarios
A veces, un simple comentario puede hacer que un modelo sea más claro y atractivo. Crear un
comentario es sencillo:
1. Arrastra un comentario al RootFrame.
2. Ábrelo y ve a la pestaña Pantalla.
3. Aquí puede escribir el texto de comentarios y aplicar formato.

5.3 Agregar eventos a la lista de eventos


Hay varias formas de simular el efecto de las citas. Una de ellas es decidir el tiempo de
cita de un paciente, determinar la diferencia con el tiempo de simulación actual y dejar
que el paciente permanezca en un búfer durante ese tiempo antes de dirigirse a la sala
de espera. Otra forma es usar la lista de eventos: Plant Simulation contiene una lista de
cada evento que está programado para suceder en el futuro (es decir, eventos que
sabemos que van a suceder actualmente), y SimTalk 2.0 se puede usar para agregar
eventos a ese evento. lista usando & object.methCall (...). Consulte la sección "¿Sabía
que ...?" En la página siguiente para una mayor elaboración de la lista de eventos. Por
ahora, dejamos que los pacientes vayan a la sala de espera 30 minutos después de llegar
a la recepción. El algoritmo real de creación de citas se agrega al modelo en una tarea
posterior.

Tarea: &object.methCall(…)
1. Retire el conector entre WaitingAtHome y WaitingRoom.
2. Cree un método MakeAppointment, configúrelo como el control de entrada en FrontDesk y
prográmelo de la siguiente manera:

3. Cree un método en una cita y programe de la siguiente manera:

4. Ejecute su modelo y verifique que los pacientes se envíen a WaitingRoom a las 8:30:00.

Hemos utilizado &object.methCall (callAt, [arguments, ...]) para programar el


movimiento de pacientes a la sala de espera. De hecho, este código agrega un evento
futuro a la lista de eventos de simulación de planta interna. En este código, object es el
Método que se llamará en el futuro. El momento de la llamada es el tiempo de
simulación actual más el tiempo definido en callAt. Opcionalmente, puede definir una

77
cantidad arbitraria de arguments que se pasarán al Método cuando se llame. En este
caso, pasamos una instancia del objeto Patient.
¿Sabía que…? Navegando a través de la lista de eventos
La lista de eventos es un concepto central en la simulación de eventos discretos. Como se mencionó
anteriormente, esta es una lista de eventos que están programados para ocurrir en el futuro. Los
nuevos eventos se agregan tan pronto como se conoce la hora exacta de ocurrencia. Por ejemplo,
cuando una MU ingresa en un SingleProc, SingleProc programará un evento en la lista de eventos
que establezca que la pieza debe salir de SingleProc en el momento actual más el tiempo de
procesamiento. Nuestro modelo programa un MethCall (abreviatura de Method Call) para cada cita,
indicando que OnAppointment se debe llamar a 𝑐urrent 𝑡ime + 1800 𝑠econds, con el MU actual
como argumento. Una vez programado, puede ver estos eventos en la lista de eventos:
1. Abra el EventController y configure la velocidad de simulación en aproximadamente 50%.
2. Ejecute el modelo por unos segundos.
3. Abra el Depurador de eventos (la lista de eventos).
4. Ahora verá una lista de los eventos que están programados:

5.4 Agregar contadores y parámetros de entrada


Los contadores son una manera fácil de realizar un seguimiento de lo que sucedió en el
modelo. Configurarlos es fácil: simplemente determine qué contadores son necesarios,
cuál es su valor inicial, cuándo deben incrementarse y cuándo deben reiniciarse. Las
variables de entrada son variables que comúnmente cambias cuando experimentas con
el modelo. También demostrarán ser útiles cuando agreguemos el ExperimentManager
más adelante.

78
Tarea: Contando los días
1. Expanda el modelo para reflejar la captura de pantalla a continuación. Tenga en cuenta que
el conector entre WaitingAtHome y WaitingRoom ha sido eliminado.

2. Configure LateEvening para llamar a EndDay todos los días a la hora definida en la variable
MaxOvertime.
3. Programe EndDay tal que incremente CurrentDay.

4. Restablecer programa de modo que restablezca los contadores a su valor inicial y elimine
todas las MU del modelo.

No todos los contadores se están actualizando todavía, pero lo harán más tarde cuando
implementemos un algoritmo de citas más sofisticado y un procedimiento de
seguimiento del paciente.

79
¿Sabía que…?
Como habrás notado, Plant Simulation tiene
una función incorporada para establecer el
valor inicial de una variable, lo que haría que
el código en Reset sea redundante. Sin
embargo, las ventajas de utilizar Restablecer
para restablecer contadores son que todos
los valores iniciales se recopilan en un solo
lugar, y todos los contadores se restablecen
tan pronto como el usuario hace clic en el
botón Restablecer en el EventController en
lugar de cuando el modelo se inicializa. El
primero puede ser más intuitivo.

5.5 Citas
Ahora es el momento de implementar la parte más importante de este modelo: el
algoritmo de citas. La lógica del algoritmo que implementamos es la siguiente:
1. Calcule la diferencia de tiempo entre las horas de citas como el tiempo
disponible para citas en un día dividido por el número de espacios para citas por
día.
2. Si el paciente programado anteriormente tenía una hora de cita que ya pasó
(por ejemplo, ayer), programe la nueva cita a la hora de apertura del día actual.
3. De lo contrario, calcule la nueva hora de la cita como la hora de la cita del
paciente programado previamente más la diferencia de tiempo entre las citas.
4. Si la nueva hora de la cita es en o después de la hora de cierre, entonces
programela a la hora de apertura del día siguiente.

Tarea: Establecer citas


1. Abra MakeAppointment e implemente el algoritmo de citas (consulte también el código en el
Apéndice) e intente comprenderlo. Tenga en cuenta que también necesita crear atributos
personalizados para los pacientes, y que en el resto de este capítulo es posible que necesite
agregar más atributos sin este tutorial que lo señala explícitamente.

80
2. Ejecute el modelo a baja velocidad, para asegurarse de que los pacientes lleguen a intervalos
igualmente espaciados entre las 8:00 y las 20:00.

MakeAppointment incrementa el atributo waitingAtHomeTime en lugar de simplemente


configurarlo. La misma línea se podría escribir como "@.waitingAtHomeTime: =
@ .waitingAtHomeTime + @.appointmentTime - EventController.SimTime" o más corta
como "@.waitingAtHomeTime + = @.ppointmentTime - EventController.SimTime". El
tiempo de espera se incrementa porque es posible que un paciente tenga que esperar
en casa más de una vez debido a una reprogramación.

5.6 Seguimiento de pacientes y cálculo de indicadores de rendimiento


La especificación del modelo requiere que se calculen dos tipos de tiempos de espera: el
tiempo de espera pasado en el hogar y el tiempo de espera en la sala de espera.
MakeAppointment ya calcula el primero, ya que tiene toda la información necesaria para
hacerlo. Ahora implementaremos un Método que calcula el otro tipo de tiempo de
espera. También implementamos varios indicadores de rendimiento y los actualizamos
cada vez que un paciente inicia una consulta o abandona el sistema.

Tarea: Seguimiento de pacientes


1. Cree un Método TrackAppointment y configúrelo como un Control de entrada en GPs y
Departure.
2. Use una instrucción if ... elseif para ejecutar diferentes bloques de código dependiendo de si
GPs o Departure llaman al Método.

81
3. Si los médicos de familia llaman a TrackAppointment, entonces determine la hora de llegada
en el GP y el tiempo de espera en la sala de espera:
4. Si Departure llama a TrackAppointment, vuelva a calcular una serie de indicadores de
rendimiento.

5. Agregue las variables AvgWaitingAtHomeTime, AvgWaitingRoomTime,


AvgPerceivedWaitingTime y RescheduleRate al RootFrame. También actualice Restablecer de
manera que estas Variables se restablezcan a cero una vez que el modelo se restablece.

Observe la fórmula utilizada para actualizar AvgWaitingAtHomeTime,


AvgWaitingRoomTime y RescheduleRate. Sea 𝑋𝑖 la observación de la espera en el horario
local, la hora de la sala de espera o el número de reprogramaciones para el paciente, y
sea ith la cantidad de pacientes utilizada para calcular el indicador de rendimiento. Luego,
la fórmula utilizada en MakeAppointment se deriva de la siguiente manera:

5.7 Reprogramación de pacientes


El modelo casi cumple con las especificaciones. La única característica que falta es la
reprogramación de los pacientes que todavía están en la sala de espera cuando el reloj
marca las 21:00. Afortunadamente, ya tenemos el método EndDay que se llama
exactamente a las 21:00. Expandimos este Método de modo que se tome a todos los
pacientes en la sala de espera, se calcule su tiempo de espera, se incremente el contador
de reprogramaciones y se los mueva a CallQueue, de modo que obtengan una nueva cita
como cada nuevo paciente.

82
Tarea: Volver al punto de partida
1 Expanda el método EndDay (vea también el código en el Apéndice) de modo que se ocupe de
los pacientes que están en la sala de espera después de las 21:00, y trate de comprenderlo:

2. Pruebe su modelo y verifique que todas las variables de salida se estén actualizando a medida
que se ejecuta el modelo.

Nota: Integer or real?


Si la Variable RescheduleRate global no se actualiza cuando ejecuta el modelo, asegúrese de que su
tipo de datos esté establecido en real y no en entero. Las variables en Salida deben tener el mismo
formato numérico que las variables que se muestran en la figura siguiente.

5.8 Experimentando
Ahora que el modelo funciona de acuerdo con las especificaciones, podemos realizar
algunos experimentos para determinar el número óptimo de espacios para citas en un
día. Para este propósito, Plant Simulation viene con el ExperimentManager. Usar este
objeto implica establecer una o más variables de entrada, definir experimentos
(variables de entrada con sus configuraciones), elegir un número de repeticiones y
definir una o más variables de salida.

83
Tarea: Configurando el Administrador de Experimentos

1. Incluya el objeto ExperimentManager en RootFrame y ábralo.


2. Marque la casilla Utilizar valores de entrada y haga clic en Definir variables de entrada.
Arrastre la variable SlotsPerDay a la primera celda de la tabla que se abre (también puede
escribir la ubicación de esta variable en la celda). Cierra la mesa
3. Haga clic en Definir experimentos. Expanda la tabla a la cantidad de experimentos /
configuraciones que desea estudiar haciendo clic con el botón derecho en una celda y
seleccionando Añadir fila (o simplemente presionando enter). Escriba verdadero en todas las
celdas de la primera columna. Escriba diferentes valores para el número de espacios de citas por
día en la segunda columna (los experimentos). Cierra la mesa
4. Haga clic en Definir valores de salida. Expanda la tabla a 4 filas y arrastre las variables
AvgPerceivedWaitingTime, RescheduleRate, AvgWaitingAtHomeTime y AvgWaitingRoomTime a
las celdas de la primera columna. Cierra la mesa
5. Establezca las Observaciones por experimento en 3 (la cantidad de repeticiones).
6. Abra la pestaña Evaluación y establezca Intervalos en confianza.
7. Haga clic en Restablecer y luego en Comenzar para permitir que se ejecute la simulación.
8. En el informe que aparece más adelante, vaya a Evaluaciones estadísticas - Estadísticas de
valores de salida para obtener un gráfico para cada variable de salida. O bien, en
ExperimentManager, en la pestaña Evaluación, seleccione mostrar gráfico (también se pueden
encontrar resultados más detallados en esta pestaña de evaluación del ExperimentManager).
Debería ver algo similar a la figura de abajo.

84
Nota: Desactivar / habilitar la animación
 El Experiment Manager inhabilitó MY animation y Icon animation mientras se ejecutaba de
forma predeterminada, para aumentar el rendimiento.
• Para desactivar o habilitar la animación, use Inicio MU y Inicio  Íconos.

5.9 Creación de un Conjunto de Datos


ExperimentManager recopila una gran cantidad de estadísticas de forma
predeterminada, incluidos los promedios de las variables de salida, sus desviaciones
estándar y los valores de p para determinar si las salidas de los experimentos son
significativamente diferentes entre sí. Los resultados detallados (incluidos los resultados
por replicación) se pueden encontrar en la pestaña Evaluación del ExperimentManager.
Sin embargo, a menudo es deseable continuar el análisis en un programa separado. Por
lo tanto, vamos a crear un método que reúna todos los datos de rendimiento en un
conjunto de datos completo que se pueda exportar a un programa externo, como Excel.
Como no queremos que los datos de la tabla se eliminen cada vez que se restablece el
modelo (lo que ocurre entre las repeticiones), usamos un botón para borrar la tabla a
nuestra propia discreción en lugar de Restaurar método.

Tarea: Reuniendo datos


1. Use un Comentario, TableFile, Variable, Button y un Método para crear el siguiente conjunto
de objetos.

2. Haga clic derecho en el botón y seleccione abrir para acceder a la configuración del botón.
Establezca el nombre en "ClearStatsButton", la etiqueta para "Borrar estadísticas" y el control en
"ClearStats".
3. Programe el método ClearStats de la siguiente manera.

4. Abra TableFile PatientStats, active el índice de columna y formatee las columnas de la


siguiente manera.
85
5. Abra TrackAppointment e inserte el siguiente código para que las estadísticas se registren
cuando un paciente abandona el modelo.

6. Restablezca e inicie el ExperimentManager.


7. Abra la tabla PatientStats para verificar que se haya almacenado la información de cada
paciente, precedida por el experimento y el número de ejecución (= replicación).
8. Haga clic en el botón ClearStats para eliminar los datos de la tabla.

El modelo de simulación ahora funciona de acuerdo con las especificaciones, los


experimentos se pueden definir y ejecutar, y los datos de rendimiento se almacenan
correctamente. Sin embargo, antes de ejecutar los experimentos, debemos pensar
cuidadosamente en un posible período de calentamiento, longitud de ejecución y
cantidad de repeticiones. Determinamos estos aspectos utilizando algún Indicador clave
de rendimiento (KPI), en este caso el tiempo de espera percibido. Para este propósito, es
conveniente introducir una tabla de desempeño adicional donde almacenamos el
tiempo de espera percibido por paciente y por repetición. Después de determinar el
período de calentamiento, la longitud de ejecución y el número de repeticiones,
podemos eliminar esta tabla de rendimiento adicional y eliminar o comentar el código
relacionado (por ejemplo, poner el código entre / * y * /).

Tarea: Recopilación de datos KPI por replicación


1. Agregue el siguiente código a TrackAppointment.

2. Cree la tabla correspondiente ReplicationPatientStats, la variable global


nReplicationPatientStats y la variable local m (con los tipos de formato / datos adecuados).
3. Restaure nReplicationPatientStats a cero después de cada ejecución agregando una línea de
código a Restablecer (en contraste con la variable global nPatientStats, necesitamos restablecer
nReplicationPatientStats después de cada ejecución, estudie el código para encontrar la
diferencia entre estos dos contadores).
4. Modifique ClearStats del método de tal manera que la tabla ReplicationPatientStats se borre
de manera similar a PatientStats.

86
5.10 Asignación A3: Período de calentamiento, longitud de ejecución y número de
repeticiones
Cuando ejecuta el modelo después de implementar las estadísticas de rendimiento en la
Sección 5.6, puede haberse dado cuenta de que lleva un tiempo compensar las variables
de salida. La razón es que le toma un tiempo al modelo "calentarse". En consecuencia,
los primeros días de los resultados de la simulación pueden no ser representativos del
rendimiento real del sistema. Además, cada ejecución debe tener una longitud de
ejecución razonable.
Asignación A3.1: Seleccione un período de calentamiento apropiado y una longitud de
recorrido indicada en días de simulación. Proporcione una argumentación para su
elección de período de calentamiento y longitud de ejecución, y la (s) configuración (es),
es decir, el (los) valor (es) de SlotsPerDay, que usa para determinar estas
configuraciones.
Después de determinar el período de calentamiento, debe asegurarse de que las
estadísticas solo se recopilen después del período de calentamiento. Una forma de
hacerlo es establecer el período de calentamiento en el EventController, en la pestaña
Configuración, en Estadísticas (debajo de la configuración para la hora de finalización) y
agregar la siguiente condición a TrackAppointment:

Tenga en cuenta que, para lograr la longitud de recorrido deseada, necesita aumentar el
tiempo de finalización de la simulación con la duración del período de calentamiento.
Las primeras ejecuciones (repeticiones) de la Sección 5.8 mostraron resultados
interesantes, pero los intervalos de confianza relativamente grandes sugieren que los
resultados pueden no ser estadísticamente significativos (los intervalos de confianza de
varios experimentos se superponen). Aumentar el número de repeticiones puede
reducir el ancho de estos intervalos de confianza, pero más repeticiones implican
tiempos de cálculo más largos.

Asignación A3.2: seleccione un número adecuado de repeticiones por experimento


usando un análisis estadístico apropiado en Excel o en un programa de hoja de cálculo
similar. Elija la cantidad de repeticiones correspondientes a un error relativo de como
máximo 5% (γ = 0.05) y un nivel de confianza del 95% (α = 0.05). De nuevo, depende de
usted qué valor (es) usar SlotsPerDay.
Asignación A3.3: brinde asesoramiento sobre el número de espacios de citas que se
deben usar por día. Para respaldar su elección, brinde información sobre el rendimiento
de esta configuración (dando intervalos de confianza sobre el tiempo promedio de
espera percibido y la tasa de reprogramación). Además, brinde información sobre la
difusión de los tiempos de espera percibidos.

87
6 Demostración de conceptos más avanzados
En los capítulos anteriores de este tutorial, aprendió los conceptos básicos de Plant
Simulation; sin embargo, las posibilidades de Plant Simulation van mucho más allá de lo
que se mostró anteriormente. Este capítulo explicará algunos de estos conceptos más
avanzados y sirve como una vista previa de la Parte B de este tutorial. Primero, se
muestra cómo puede obtener acceso a las demostraciones y ejemplos disponibles en
Plant Simulation. Las otras secciones elaborarán conceptos avanzados que se utilizan con
frecuencia con fines de simulación.
En la Sección 6.2, se tratará el concepto de Marcos. En los capítulos anteriores, solo se
ha utilizado RootFrame, pero también puede crear Frames en la biblioteca en la que
puede agregar varios otros objetos. Estos marcos se pueden poner en RootFrame o en
otro marco, lo que crea una jerarquía dinámica de modelos. Esto le permite construir
modelos de simulación que están bien estructurados y reflejan la jerarquía natural de los
sistemas a simular. Además, esto le permite dividir las tareas complejas en fragmentos
manejables. El concepto de Marcos se tratará en profundidad en el Capítulo 7.
Luego, en la Sección 6.3, se tratará el concepto de objetos de línea. El transporte de
pacientes, productos o vehículos puede mostrarse utilizando SingleProcs como se
mostró en los capítulos anteriores. Sin embargo, para estas situaciones Plant Simulation
ofrece una alternativa, a saber, objetos como un Track. Los objetos Líneas y Pistas serán
tratados en profundidad en el Capítulo 8.
El último concepto avanzado que se discutirá es el llamado Trabajador (Sección 6.4). Es
posible que imagine que hay situaciones en las que nos gustaría simular una situación en
la que un empleado trabaja en varias estaciones de trabajo y tiene que moverse en las
rutas entre estas estaciones de trabajo. Este concepto involucra los objetos WorkerPool
y Worker. También estos objetos serán tratados con más profundidad en el Capítulo 8.

6.1 Ejemplos y demostraciones en Plant Simulation


Como se dijo anteriormente, es mucho más posible con Plant Simulation que solo los
temas tratados en este tutorial hasta el momento. Para tener una idea de algunas de las
otras posibilidades en Plant Simulation, es posible que desee echar un vistazo a las
demostraciones y ejemplos presentes en Plant Simulation. Si inicia Plant Simulation, se
abrirá una ventana de diálogo, llamada Página de inicio. Seleccione la opción Modelos de
ejemplo en esta ventana de diálogo. Esto abrirá la Ayuda paso a paso de Plant
Simulation, donde puede encontrar varios ejemplos de modelos.

88
Si hace clic en los ejemplos pequeños, puede seleccionar una categoría y un tema
relacionado para los cuales puede elegir un modelo que le gustaría ver. Estos modelos
pueden darle una idea de las posibilidades de Plant Simulation e incluso pueden
ayudarlo a modelar ciertos procesos.

6.2 Frames
Los modelos, que ha realizado en los capítulos 3, 4 y 5, fueron hechos en un Marco
llamado RootFrame (vea el Capítulo 2). Sin embargo, si su modelo crece en complejidad
y tiene muchos procesos diferentes para modelar o la repetición de procesos similares,
es posible que desee considerar el uso de varios marcos. Por ejemplo, si tiene varios
procesos similares, puede crear un Marco de este proceso y agregar varias instancias de
este Marco en su RootFrame. Esto le permite estructurar sus modelos, lo que los hace
más fáciles de construir y mantener a través del diseño modular y la programación
orientada a objetos.

89
Si construye un Marco en la Biblioteca de clases, puede usarlo varias veces. Para crear un
nuevo Marco, debe hacer clic con el botón derecho en la carpeta Modelos en su
Biblioteca de clases y seleccionar Nuevo y luego Marco.
Ilustraremos la ventaja de usar marcos con un ejemplo. Supongamos que tenemos un
terreno festivo (ver página anterior) para el cual tenemos que configurar puestos de
primeros auxilios. Como se puede imaginar, tenemos que extendernos a los puestos de
primeros auxilios de manera eficiente a fin de obtener una buena cobertura en toda el
área del festival. Debido al hecho de que necesitaremos varios puestos de primeros
auxilios, sería conveniente modelar una sola publicación de primeros auxilios en un
Marco y agregarla varias veces al terreno de nuestro festival.
Hemos utilizado una versión ligeramente ajustada del modelo que se ha construido en el
Capítulo 3. El GP del Capítulo 3 ha sido remodelado para una publicación de primeros
auxilios. El objeto Arrival se ha eliminado del modelo y se ha agregado al RootFrame.
Además, hemos agregado un Method ExitPatient, que eliminará al paciente de TableFile
Patients. Esta versión ajustada del modelo del Capítulo 3 se coloca en un Marco y se
reutilizará cuatro veces para nuestro nuevo modelo. El marco del puesto de primeros
auxilios consta del siguiente modelo:

90
En RootFrame, hay una imagen del terreno del festival donde se encuentran los cuatro
puestos de primeros auxilios. Todas estas cuatro publicaciones se derivan del mismo
Marco y, por lo tanto, son subjetivas a la Herencia (ver Capítulo 2). También se agrega un
objeto Fuente (llamado Llegada) al RootFrame. La distribución de Adultos y Niños se
define en el TableFile PatientDist, y cada paciente nuevo se caracteriza (utilizando
atributos definidos por el usuario) por una ubicación en el terreno del festival
(coordenada x e y) y una urgencia mediante el método EnterArrival. En el mismo
Método se determina, qué puesto de primeros auxilios es el más cercano a la ubicación
del paciente. El código de EnterArrival se muestra a continuación.

Cada nuevo paciente se envía al puesto de primeros auxilios más cercano. A través de un
Método de pintura, dibujamos, para cada paciente presente actualmente en un puesto
de primeros auxilios, un punto en el mapa del festival para indicar la ubicación original
del paciente. El punto se eliminará si el paciente recibe tratamiento. Para ser más
precisos, cada vez que algo cambia (llegada o partida de un paciente), eliminamos todos
los puntos y pintamos los puntos para todos los pacientes que figuran actualmente en
TableFile Patients. El código de Paint se muestra a continuación.

91
Tenga en cuenta que para hacer referencia, dentro de un Método, a un objeto que no se
encuentra en el Marco que contiene el Método, debe proporcionar una ruta que
funcione desde RootFrame. En nuestro ejemplo, el Método ExitPatient en el Marco de
nuestra publicación de primeros auxilios se refiere a los objetos en RootFrame, a saber,
TableFile Patients y Method Paint. Si el paciente abandona el modelo, se eliminará de la
tabla Pacientes, porque ya no está presente en el modelo y, por lo tanto, no necesita ser
pintado en el mapa del festival. Nos referimos a los pacientes TableFile ubicados en
RootFrame por "root.Patients", como se muestra en el siguiente código.

Debe tener en cuenta que cuando desee tener diferentes tiempos de procesamiento
para su publicación de primeros auxilios, es necesario ajustarlos por separado en el
Marco específico (por lo tanto, en su modelo que no está dentro de la Biblioteca de
clases). La herencia de la clase FirstAid puede hacerse visible haciendo clic derecho en
esta clase y seleccionando Mostrar herencia.

Tenga en cuenta que, al utilizar marcos, tenemos que ser incluso más cuidadosos con el
concepto de herencia (ver el Capítulo 2). Supongamos que abrimos un puesto de
primeros auxilios ubicado en RootFrame de nuestro modelo; FirstAid2 en la figura a
continuación. La ruta completa de este objeto es ".Models.FestivalMap.FirstAid2", que
obviamente es diferente de la ruta ".Models.FirstAid" de la clase FirstAid dentro de
nuestra biblioteca (tenga en cuenta que dentro de nuestro modelo, usamos la notación
abreviada "root .FirstAid2" para la ruta de FirstAid2).

Ahora, si queremos cambiar, por ejemplo, el código dentro del Clasificador de métodos,
de modo que los cambios se apliquen a las cuatro publicaciones de primeros auxilios,
debemos cambiar el Clasificador dentro de la biblioteca, es decir, en ".Models.FirstAid".
Para evitar errores, Plant Simulation también bloquea la edición de los objetos
(derivados de las clases de la biblioteca), por ejemplo, el código en Métodos está
marcado en gris claro y, a menos que desactivemos la herencia, no podemos editar el
código. Se puede encontrar un tratamiento más profundo de Frames en el Capítulo 7.

92
6.3 Objeto línea
A veces, el proceso que pretende modelar implica el transporte de entidades (por
ejemplo, pacientes) y el transporte puede implicar la necesidad de un vehículo. Este es
un proceso típico para el cual el uso del objeto Track y el objeto Transporter podría ser
beneficioso.
El Transporter es el único objeto en movimiento que puede usar la Pista. Estos objetos
pueden encontrarse, respectivamente, en la carpeta MU y MaterialFlow en su Biblioteca
de clases. Puede variar varios atributos de estos objetos, como la longitud de la pista y la
velocidad del Transporter. Puede agregar sensores a su pista, que pueden usarse para
disparar una determinada acción cuando el transportador pasa por dicho sensor. Estos
sensores se pueden encontrar abriendo la pista (haciendo doble clic en la pista), yendo a
la pestaña Controles y seleccionando Sensores. Los sensores se definen por una distancia
desde el inicio de la pista. Una vez que un transportador llega al sensor (ya sea por
delante o por detrás dependiendo de cómo lo haya definido en el sensor), se activará un
método. Ilustramos el uso de Transporter y Track con un ejemplo de un médico de
cabecera que necesita visitar a los pacientes en sus casas.

93
Para fines ilustrativos, hay siete casas, que tienen sensores para indicar la ubicación de
una casa cerca de la pista. Tenemos una verificación de sensor al comienzo de la pista,
que es la posición a la que conducirá el GP cuando ningún paciente está esperando la
ayuda del médico de cabecera. La ambulancia (objeto Transporter) representa al médico
de cabecera que visita las casas. Tenga en cuenta que hemos utilizado Marcos (vea la
sección anterior) para modelar las casas individuales, vea la figura a continuación para
ver el contenido de dicho Marco.

El Transporter ha recibido diversos atributos definidos por el usuario para garantizar que
visite a los pacientes y las casas en el orden
correcto. Los atributos que definimos se
pueden encontrar en la siguiente figura:
Si se necesita visitar a un paciente, el
Método de Tratamiento en el Marco de una
Casa agregará la ubicación del paciente a
TableFile WaitingList en RootFrame. Este
método se invoca cuando un paciente
ingresa al objeto de llegada. Luego verificará
si el GP está ocupado o no. Si el GP está
disponible, cambiará la ubicación de destino
de la GP e indicará que el GP está haciendo
un trabajo ahora y que el GP comenzará a
conducir. Una parte de ese código se puede encontrar a continuación:

94
Tenga en cuenta que el signo de interrogación es necesario para indicar de qué Marco se
llama el Tratamiento del método. Si el médico de cabecera está ocupado, los pacientes
que necesitan su ayuda se agregarán a TableFile WaitingList. Ahora que el GP está
conduciendo, los sensores se usarán para ver si el GP llegó a su ubicación de destino o
no. Con este fin, cada vez que se pasa un sensor, se llama al método SensorCheck.

Si el GP ha llegado a su destino, se llamará al Method TreatPatient, que mueve al


paciente en el House (en la llegada del objeto Source) al GP (un SingleProc). El
Transporter permanecerá en el sensor ubicado en la casa correspondiente hasta que
finalice el tratamiento. Si el tratamiento finaliza, se llamará al método listo, que traslada
al paciente a la partida y busca si hay otros pacientes esperando ayuda. De lo contrario,
el Transporter volverá a su posición inicial.
Otros ejemplos
Como se mencionó en la introducción de este capítulo, muchos modelos de ejemplo se
pueden encontrar en Plant Simulation. En la tabla siguiente, se proporciona una breve
selección de ejemplos que implican el uso del Transporter. Puede encontrar un
tratamiento más profundo de Líneas, Pistas y Transportadores en el Capítulo 8.

95
6.4 Trabajadores
También es posible en Plant Simulation utilizar Workers, que pueden representar a los
empleados, que realizan tareas, pueden asignarse a diferentes lugares de trabajo y
cambiar entre estos lugares de trabajo que posiblemente requieran algún tiempo de
transporte. Plant Simulation tiene objetos estándar para este propósito, que se
explicarán brevemente aquí.

Worker: una persona trabajadora Footpath: en el sendero del objeto,


que realiza trabajos en un lugar de trabajo. los trabajadores se mueven entre el lugar
de trabajo y el WorkerPool.

Workplace: el lugar real en la Broker: el objeto Broker es el


estación donde el Trabajador realiza su intermediario entre los objetos que
trabajo. demandan un servicio y los objetos que
suministran ese servicio.

WorkerPool: los trabajadores se


crean en el objeto WorkerPool y
permanecen en este objeto cuando no hay
trabajos para realizar.

Como ejemplo, considere una clínica para pacientes ambulatorios donde los pacientes
llegan de acuerdo con un proceso de Poisson, con un tiempo medio interarrival de un
minuto. Cada paciente requiere una secuencia de tres etapas: preconsulta, consulta y
consulta posterior. Un paciente recibe todas las etapas en la misma habitación; sin
embargo, la consulta es dada por un médico, y las otras dos etapas por un asistente
médico. La clínica emplea un médico y dos asistentes médicos. Hay tres habitaciones
disponibles y el horario de atención es de 8:00 a 15:30.
El reto de modelar este sistema es que los empleados (médicos y asistentes médicos)
necesitan cambiar de habitación, por lo que básicamente tratan a los pacientes en
paralelo. Esto se puede modelar utilizando los trabajadores como se muestra en la figura
a continuación.

96
Cada lugar de trabajo está conectado a la sala de escenario correspondiente (sala y
etapa de combinación de tratamiento) rellenando el atributo Estación; en el siguiente
ejemplo, Workplace2b está conectado a Consult2. Además, cada WorkPlace requiere un
cierto servicio; en el ejemplo a continuación, Workplace2b requiere el servicio Consult,
que solo puede ser proporcionado por el médico.

Se agrega un WorkerPool para generar el personal requerido. WorkerPool y Source


están conectados al ShiftCalendar. Para el origen, ShiftCalendar debe especificarse en
Controles de pestaña. En la pestaña Atributos, también debe especificar el modo de
funcionamiento, indicando si los pacientes también deben llegar fuera de los turnos (con
el bloqueo verificado, los pacientes también llegan fuera de los turnos, pero se
mantendrán en la fuente hasta el comienzo del turno).

97
En la figura anterior, también se ve que WorkerPool está conectado al Broker. De
manera similar, también necesita conectar SingleProcs al Broker, como se muestra en la
figura a continuación. No se han realizado ajustes en el Broker.

Otros ejemplos
Puede encontrar otros ejemplos del uso de trabajadores en Plant Simulation. Una
selección de ejemplos se da en la tabla a continuación. Puede encontrar un tratamiento
más detallado de Workers y ShiftCalendars en el Capítulo 8.

Los temas que se presentaron brevemente en este capítulo se explicarán con más
detalle en la Parte B de este tutorial. Además, se presentarán algunas otras
características más avanzadas, como el modelado 3D y la optimización de simulación.

98
Part B: Advanced Simulation Modelling
MODELLING A CAR MANUFACTURER

99
7 Construcción de un Modelo: Fabricante de Automóviles

En la Parte A, Capítulos 3 a 5, ha aprendido los conceptos bá sicos del software Plant Simulation y
có mo llevar a cabo un estudio de simulació n. En el Capítulo 6, recibió una vista previa de las
características má s avanzadas de Plant Simulation. A lo largo de estos capítulos, usamos la oficina de
un médico general como ejemplo. En la Parte B, Capítulos 7 al 9, vamos a profundizar má s en las
posibilidades de Simulació n de Plantas, ahora usando un Fabricante de Automó viles como ejemplo
de funcionamiento. Como se puede imaginar, la fá brica del fabricante de automó viles consta de
varios elementos, como cintas transportadoras y transportadores.
Este capítulo tratará una vez má s algunos de los aspectos bá sicos al construir un modelo, pero a
diferencia de los capítulos anteriores, ahora creará sus propios bloques de construcció n. Hasta
ahora, ha estado construyendo su modelo en RootFrame con objetos proporcionados por Plant
Simulation. En este capítulo aprenderá sobre el concepto de Marcos y hará una primera fá brica
bá sica. Creará sus propios elementos de la fá brica y usará los puntos de animació n para mejorar la
visualizació n cuando utilice marcos. Este capítulo también profundizará en la depuració n para la
que se podría usar el Depurador de métodos y otras formas ú tiles de detectar errores en su modelo.

Temas tratados en este capítulo:


• Marcos
• Puntos de animació n
• Interfaz
• Control de flujo
• Depuració n
• Iconos dependientes del estado
• Fallas

7.1 Configuración del fabricante de automóviles


Antes de comenzar a construir los marcos y todos los demá s componentes de la fá brica,
configuraremos los productos que produce esta fá brica. Este fabricante de automó viles en
particular produce dos tipos de automó viles, a saber, el XX y el tipo XY. Ambos tipos de
automó viles comparten pasos de producció n comunes, pero XY requiere un paso de
producció n adicional, a saber, un recubrimiento de pintura especial. Configuraremos las
diferentes MU en simulació n de plantas de manera similar a lo que hemos hecho en la
Secció n 3.7.

Tarea: Crear un tipo de auto MU


1. Inicie Plant Simulation y elija Create New Model.
2. Haga clic en 2D solo en la ventana de diálogo.
3. Cambie el nombre del Marco actual dentro de la carpeta Modelos a CarFactory.
4. Haga clic derecho en el objeto Entity en la carpeta MUs.
5. Seleccione Duplicar. Ahora tiene un objeto llamado Entity1 en la carpeta MU.
6. Cambie el nombre de Entity1 a CarType.
7. Derive del MU CarType dos nuevas MU.
8. Cambieles el nombre XX y XY, respectivamente.

100
7.2 Frames como Bloques Construidos
Previamente, hemos construido modelos dentro de RootFrame (ver Capítulo 2). Si su
modelo crece, es posible que desee agregar jerarquía a su modelo para una mejor visión
general y evitar cometer errores. Además, es posible que desee crear sus propios
objetos en la Biblioteca de clases que consta de varios bloques de construcción estándar.
Para estos fines, el objeto Frame es útil. Dentro de un Marco podemos agrupar objetos
existentes y construir modelos estructurados jerárquicamente. Puede crear marcos
nuevos dentro de la Biblioteca de clases haciendo clic derecho en la carpeta Modelos y
seleccionando Nuevo> Marco.
El Marco que haya cambiado a CarFactory servirá como el RootFrame del modelo que
vamos a construir. Dentro de ese modelo, necesitamos instalar una cinta transportadora
para transportar los autos. La cinta transportadora constará de cuatro componentes
básicos, a saber, un objeto recto, doblado, confluencia y ramificación. Para cada uno de
estos componentes básicos, utilizaremos un Marco por separado.
Antes de comenzar a construir un nuevo Marco, necesitamos introducir un nuevo
objeto, a saber, el objeto Interfaz. La interfaz ofrece la posibilidad de conectar marcos
con otros marcos, incluido RootFrame. Cuando múltiples marcos están conectados entre
sí, las MU pueden fluir a través de ellos. Puede encontrar el objeto Interfaz en la
Biblioteca de clases en la carpeta MaterialFlow. Ahora construiremos nuestro primer
Marco.

Tarea: Crear un Straight


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Renombrarlo directamente.
3. Inserte dos interfaces y un SingleProc en el marco.
4. Conecte las interfaces con SingleProc.

5. Haga doble clic en SingleProc y verifique si el tiempo de procesamiento es de 1 minuto.


6. Haga clic con el botón derecho en el Marco recto en la carpeta Modelos.
7. Abra el Editor de iconos haciendo clic en Editar iconos.
8. Dibuje un icono adecuado para el objeto Recto, indicando una correa de transporte recta.

Si desea actualizar su memoria con respecto a los conectores y los objetos de conexión,
consulte la Sección 3.2. Para distinguir entre los marcos que vamos a construir, es útil
darles iconos personalizados. Puede actualizar su conocimiento sobre Iconos y el Editor
de iconos en la Sección 3.8.

101
Tarea: Pruebe su Frame
1. Para agregar un Marco directamente a su RootFrame CarFactory, simplemente arrastre un
Derecho desde su Biblioteca de clases a su RootFrame CarFactory.
2. Agregue una Fuente y Drenaje a su RootFrame CarFactory.
3. Deje la configuración por defecto.
4. Conecte la fuente con el marco recto.
5. Conecte el marco recto con el drenaje.
6. Haga doble clic en Straight en RootFrame CarFactory.
7. Haga clic con el botón derecho en Entrada y seleccione Abrir lista de conexiones externas.

Tenga en cuenta que el objeto Fuente está conectado correctamente.


8. Verifique que el objeto Drain también esté conectado correctamente (a la interfaz Exit).
9. Vaya a RootFrame y ejecute su modelo a baja velocidad (consulte EventController).

Habrá notado, al observar RootFrame solo, que las MU en su modelo no se muestran en


el objeto Recto. La razón de esto es que no hemos definido los puntos de animación en
el ícono de Frame Straight. Necesitamos hacer una distinción entre el nivel lógico y el
nivel simbólico de cada Marco o cada aplicación. El nivel lógico describe la funcionalidad
del objeto; este nivel consiste en los bloques de construcción estándar que usa para
crear su modelo en el Marco. Los iconos y la animación pertenecen al nivel simbólico. La
distinción entre el nivel lógico y simbólico se ilustra a continuación.

Los puntos de animación deben insertarse en el icono y vincularse con los objetos en el
nivel lógico para permitir que las MU que se mueven a través de los objetos en el nivel
lógico sean visibles en el nivel simbólico. Durante la simulación, los iconos de las MU se
muestran en los puntos de animación de los objetos en los que se encuentran.
Para determinar cómo se asigna el icono de MU al punto de animación del icono del
objeto, el icono de MU tiene un Punto de referencia. Al asignar el icono de MU, el
programa coloca este punto de referencia en el punto de animación. Por defecto, el
punto de referencia de los objetos básicos se encuentra en el centro. En el Editor de
iconos se indica con un píxel rojo.

102
Tarea: Configuración de puntos de animación
1. Haga clic con el botón derecho en el Marco recto en la carpeta Modelos.
2. Abra el Editor de iconos.
3. Cambie al modo animación haciendo clic en el menú Animación en la cinta de opciones.

4. Por defecto, se selecciona el punto de icono (Agregar / Eliminar animación). Agregue un punto
de animación al icono.

5. Vincule el punto de animación al SingleProc ubicado en Frame Straight, haciendo clic en el


ícono Link (Animation Point), que es el ícono .
6. Haga clic en el punto de animación que haya establecido y se abrirá el Marco con sus objetos.
7. Haga clic en el objeto al que desea asignar el punto de animación, que en nuestro caso es
SingleProc.
8. Abra RootFrame y ejecute su modelo. Si ha realizado esta tarea correctamente, el objeto
Derecho ahora también muestra MU en el nivel de icono.

En el Capítulo 2, hemos enfatizado la importancia del concepto de Herencia. Esto


también se aplica a los marcos. Si ajustamos Frame directamente dentro de RootFrame,
esto significaría que solo se ajustará el Straight específico que hemos colocado dentro de

103
RootFrame. Si ajustamos el Derecho haciendo clic en el objeto en la Biblioteca de clases,
este cambio afectará a todas las instancias de Marcos en línea debido a la herencia.
Las diferencias entre las clases y los objetos derivados de las clases también se pueden
ver desde su ubicación. Por ejemplo, cuando hace doble clic en el objeto Directamente
en RootFrame, aparece la ubicación ".Models.CarFactory.Straight" y cuando hace doble
clic en Frame Straight de la Biblioteca de clases, aparece la ubicación ".Models.Straight".
Ilustraremos esto con un ejemplo.

Tarea: Herencia con Frames


1. Elimine los conectores actuales entre los objetos en el RootFrame.
2. Inserta dos rectas adicionales.
3. Conecte los objetos.

Tenga en cuenta que cada Straight tiene un tiempo de procesamiento de 1 minuto por
defecto.
4. Haga doble clic en Frame Straight en Class Library.
5. Cambie el tiempo de procesamiento de SingleProc a 5 minutos.
6. Regrese a RootFrame y tenga en cuenta que cada Straight tiene un tiempo de procesamiento
de 5 minutos.
7. Cambie el tiempo de procesamiento de la primera directamente a 15 minutos haciendo doble
clic en él en RootFrame.
8. Tenga en cuenta que el tiempo de procesamiento de las otras rectas sigue siendo de 5
minutos.
9. Haga doble clic en Frame Straight en Class Library.
10. Cambie el tiempo de procesamiento de SingleProc a 1 minuto.
11. Abra el primer Derecho en el RootFrame y tenga en cuenta que todavía son 15 minutos,
porque hizo un ajuste directo a este objeto deshabilitando la herencia de esta propiedad.

La tarea anterior ilustró que la herencia en el Marco ajustado manualmente estaba


parcialmente deshabilitada. Al cambiar un atributo de una instancia única de un
Derecho, hemos establecido la herencia para ese atributo de ese Derecho a no activo.

104
Al cambiar manualmente el tiempo de procesamiento a 15 minutos, cambiamos la
configuración de herencia activa a no activa. Si quisiéramos volver a convertirlo en
herencia activa, solo tenemos que hacer clic en el botón de herencia de la instancia
recta, como se muestra en la figura anterior. Si lo hace, notará que el tiempo de
procesamiento se establece igual que su padre, es decir, 1 minuto. El cuadro de
selección de herencia, como se ilustra en la figura anterior, puede ser particularmente
útil cuando desea heredar solo algunos atributos del padre. Por ejemplo, una máquina
tiene el mismo tiempo de procesamiento que su padre, pero un comportamiento de
falla diferente. Luego, hereda el tiempo de procesamiento, pero no el comportamiento
de falla.

¿Sabía que…?
Si accidentalmente realizó ajustes en el objeto (Cuadro secundario) en lugar de hacerlo en la
clase (Marco principal), perdiendo así la herencia activa, hay una manera fácil de restaurarlo.
Vaya al cuadro principal mismo y seleccione todo (Ctrl-A) dentro del cuadro, corte todos los
objetos (Ctrl-X) y luego vuelva a pegar los objetos (Ctrl-V). Después de hacerlo, todas las
configuraciones en el elemento secundario (el objeto insertado en el RootFrame) son
exactamente iguales en el elemento primario, con la herencia activa. Si miramos la tarea
anterior, podríamos restaurar la configuración de la primera línea recta haciendo clic en el
Marco recto en la Biblioteca de clases y seleccionando todos los objetos, cortándolos y luego
volviéndolos a pegar.

Para hacer un uso eficiente del concepto de herencia, deberá comprender la forma en
que Plant Simulation aborda y accede a los objetos. La forma en que Plant Simulation
logra esto es mediante el uso de rutas. Ilustramos la idea de caminos usando un
ejemplo. El ejemplo consta de un RootFrame llamado Main con tres marcos (F1, F2 y F3),
y el Frame F3 consta de los marcos S1 y S2 y un método M1. La implementación de Plant
Simulation se puede encontrar en la siguiente figura.

105
La estructura jerárquica de este modelo se muestra en el siguiente esquema.

Una forma de acceder al Frame S1 es usar la ruta absoluta, que es ".Main.F3.S1". Como
habrás notado al trabajar con Plant Simulation, el período se usa como separador
cuando cambiamos al siguiente nivel de jerarquía. El período al comienzo denota que
estamos usando una ruta absoluta. Si una ruta comienza con un período, Plant
Simulation comienza su búsqueda del primer objeto mencionado en la ruta en la
Biblioteca de clases. Una forma alternativa de usar una ruta absoluta es hacer referencia
a RootFrame; para acceder al Frame S1 podemos usar "root.F3.S1".

A diferencia de la ruta absoluta, una ruta relativa no se inicia en la Biblioteca de clases,


sino en un espacio de nombres. Por lo tanto, la ruta no comienza con un punto, sino con
un nombre. Si, por ejemplo, menciona el nombre S1 en el Método M1 (en el Recuadro
F3 en el modelo Principal), Plant Simulation busca el objeto S1 dentro del espacio de
nombre activo (Cuadro F3). Alternativamente, podríamos usar la tilde ~ para referirnos a
un espacio de nombres de un nivel arriba en la jerarquía; para acceder a F2 desde el
Método M1 en F3, puede usar "~ .F2" (aunque la ruta absoluta "root.F2" sería más fácil
aquí).

Tarea: Crear una curva


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Cambie el nombre de Bend.
3. Inserte dos Interfaces y un SingleProc en el Marco (use Ctrl-T para rotar los objetos).
4. Conecte las interfaces con SingleProc como se indica a continuación (para crear esquinas en el
conector, use la tecla Ctrl).

5. Dibuja un ícono para el objeto que representa un giro de 90 ° y establece un punto de


animación.
6. Haga doble clic en SingleProc y configure el tiempo de procesamiento en 2 minutos.
7. Cierre el objeto de la aplicación.

Cuando construye un objeto con múltiples puntos de entrada o salida y desea


conectarlos, obtendrá una lista con posibles entradas o interfaces de salida (si hay más

106
de una interfaz desconectada). Luego deberá seleccionar la interfaz de entrada o salida
deseada de una lista:

Como puede ver en este ejemplo particular, Interface1 e Interface2 tienen 0 conexiones
externas desde la cantidad máxima posible de conexiones externas infinitas. Puede
cambiar la cantidad máxima de conexiones externas haciendo doble clic en la interfaz y
ajustando Max. cantidad de conexiones externas. Ahora creamos un objeto Confluence,
donde dos cinturones se unen en un solo cinturón.

Tarea: Crea una Confluencia


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Cambie el nombre Confluence.
3. Inserte tres interfaces y tres SingleProcs en el Frame.
4. Conecte las interfaces con SingleProcs como se indica a continuación.

5. Cambie el nombre de los objetos en consecuencia.


6. Establezca el tiempo de procesamiento de SingleProc ExitConfluence en 0.
7. Asegúrese de que el lado de conexión de cada objeto de la interfaz sea correcto haciendo
doble clic en un objeto de la interfaz y seleccionando la opción correcta en el menú desplegable
Lado.

8. Inserta tres puntos de animación en el ícono de Marco.


9. Asigne los puntos de animación del icono a las tres SingleProcs.
10. Cierre el objeto de la aplicación.
107
El Marco final que construiremos para nuestra cinta transportadora es para el objeto
Ramificación. A veces, dada una condición, la MU puede seguir caminos diferentes. Para
hacer eso posible, necesitaremos un objeto que permita la ramificación. Un objeto útil
para Frame Branching es el objeto estándar FlowControl, que se puede encontrar en la
carpeta MaterialFlow de Class Library. El objeto puede usarse cuando necesite modelar
estrategias comunes para el flujo de materiales. El propio FlowControl, sin embargo, no
mantiene / procesa una MU, pero solo asegura la distribución de las MU a las estaciones
siguientes.

Tarea: Crear un objeto Branching


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Renombrarlo Branching.
3. Inserte un FlowControl en el Marco.
4. Inserte tres interfaces y dos SingleProcs en el marco.
5. Conecte los objetos como se indica a continuación.

6. Cambie el nombre de los objetos en consecuencia.


7. Asegúrese de que el lado de conexión de cada objeto de la interfaz sea correcto haciendo
doble clic en un objeto de interfaz y eligiendo desde el menú desplegable Lado.
8. Dibuja un ícono para el Marco.
9. Inserta dos puntos de animación.
10. Asigne los puntos de animación del icono a las dos SingleProcs.
11. Cierre el Marco.

Por ahora, configuramos la estrategia de entrada de FlowControl en el servicio First


Come First. Hacer doble clic en el objeto y seleccionar la pestaña Estrategia de entrada
muestra una variedad de estrategias comunes. Más adelante (en la Sección 7.5)
agregaremos un Método para distribuir las MU sobre la línea de ensamblaje.

108
Puede recordar de la Sección 3.9 que utilizamos Métodos para distribuir las MU en
estaciones posteriores. El objeto FlowControl es solo otra posibilidad para distribuir
MUs.

7.3 Source and Drain (Fuente y drenaje)


Además de una cinta transportadora para distribuir los productos, también
necesitaremos un objeto Source y Drain. Sin embargo, debido a que un sistema de cinta
transportadora es a menudo un circuito cerrado, los productos a menudo pueden
superar la Fuente o Drenaje. Los objetos Source y Drain originales no pueden superarse
cuando se colocan en el medio de dos Straights. Por lo tanto, decidimos crear nuestro
propio objeto Fuente y Drenaje.

Tarea: Crear una fuente


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Renombrarlo Fuente.
3. Inserte dos interfaces y dos SingleProcs en el marco.
4. Inserta un objeto TableFile y un objeto Source.
5. Conecte y cambie el nombre de los objetos como se indica a continuación.

6. Establezca el tiempo de procesamiento de SingleProc ExitSource en 0 minutos.


7. Configure el tiempo de intervalo de la Fuente a Negexp 8 minutos (llegadas de Poisson).
8. Dibuja un ícono para el objeto y establece tres Puntos de animación.
9. Asigne los puntos de animación a SingleProcs y a la fuente.
10. Configure su TableFile como se indica a continuación (consulte la Sección 3.7, tenga en
cuenta que también puede arrastrar TableFile CarDistribution a la fuente y establecer la
selección de MU en Source a Random).

11. Establezca TableFile como entrada para su objeto Fuente (consulte la Sección 3.7)
12. Agregue una variable a su Fuente de Marco y asígnele el nombre StationName.
13. Establezca el tipo de datos de la variable en Cadena con el valor Fuente.
14. Cierre el objeto de la aplicación.

También necesitamos crear un Drenaje desde el cual los productos terminados puedan
abandonar el sistema. Sin embargo, los productos que aún necesitan someterse a ciertos
pasos de producción, deben ser capaces de superar el Drain.

109
Tarea: Crear un Drain
1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Renombrarlo Drenar.
3. Inserte dos interfaces y dos SingleProcs en el marco.
4. Inserta un objeto Método y Drenar.
5. Conecte y cambie el nombre de los objetos como se indica a continuación.

6. Establezca el tiempo de procesamiento del punto de comprobación de SingleProc en 0


minutos.
7. Establezca la comprobación de método como control de entrada para SingleProc CheckPoint.
8. Inserta el siguiente código en la comprobación de método.

9. Agregue una variable al drenaje de marco y asígnele el nombre StationName.


10. Establezca el tipo de datos de la variable en Cadena con el valor Drenar.
11. Dibuja un ícono para el objeto y establece tres Puntos de animación.
12. Asigna los puntos de animación a SingleProcs y al Drain.
13. Cierre el objeto de la aplicación.

7.4 Estaciones de procesamiento


Para procesar los diferentes tipos de automóviles, necesitamos instalar Estaciones de
procesamiento, es decir, una estación que ensamblará los automóviles y una estación
que pintará los automóviles (solo del tipo XY). Suponemos que solo se puede manejar un
automóvil en una estación al mismo tiempo. Si la estación está ocupada, la MU tendrá
que superar la estación y continuar en la línea de montaje. Tendrá que regresar a la
estación en un momento posterior.

Tarea: Crear estaciones de procesamiento


1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Cambie el nombre de ProcessingStation.
3. Inserte dos Interfaces, un SingleProc y dos Buffers en el Frame.
4. Agregue dos métodos al marco.
5. Conecte y cambie el nombre de los objetos como se indica a continuación.

110
6. Establezca el tiempo de Dwell de los Buffers en 0, los tamaños de buffer en infinitos (capacidad
de -1) y el tiempo de Procesamiento de la Máquina en 2 minutos.
7. Establezca la comprobación de método como control de salida para el Buffer MachineCheck.
8. Inserta el siguiente código en la comprobación de método.

9. Establezca el método ProcEnd como control de salida para la máquina SingleProc.


10. Inserte el siguiente código en el método ProcEnd.

Tenga en cuenta que crearemos el Frame ProductionPlan en la Sección 7.5 para la cual se
necesita este código.
11. Agregue una variable a Frame ProcessingStation y asígnele el nombre StationName.
12. Establezca el tipo de datos de la variable en Cadena con el valor EnterStationNameHere.
13. Dibuja un ícono para el objeto y establece tres Puntos de animación.
14. Asigne los puntos de animación a las tres SingleProcs.
15. Cierre el objeto de la aplicación.

Nota: Identificadores Anónimos


Hemos abordado dos identificadores anónimos, es decir? y @, en la Sección 4.2, pero hay más de
ellos. En el paso 10 de la tarea anterior, hemos utilizado, por ejemplo, root como identificador.
También podríamos haber reemplazado el código raíz por ubicación (indica la ubicación de la MU u
objeto) o por ~ (se refiere a un Marco de un nivel arriba en la jerarquía). Otros identificadores
anónimos son current, rootFolder y self.

En total, ahora hemos creado ocho bloques de construcción de nuestro fabricante de


automóviles: siete objetos personalizados y un modelo principal para conectarlos. Con
esto, podemos construir una primera versión de nuestra fábrica. Hemos utilizado los
siguientes íconos para nuestros objetos personalizados. Le invitamos a usar sus propios
íconos.

7.5 Plan de Producción


Antes de conectar los bloques de construcción del fabricante de automóviles, debemos
encargarnos del enrutamiento adecuado en la línea de montaje. Para respaldar esto,
creamos un nuevo Frame llamado ProductionPlan. Para actualizar su memoria con
respecto al trabajo con el objeto TableFile, consulte el Capítulo 4.

111
Tarea: Crear un plan de producción
1. Haga clic con el botón derecho en la carpeta Modelos y cree un nuevo Marco.
2. Cambie el nombre de ProductionPlan.
3. Inserte un TableFile y un Método en el Marco.
4. Nombre el TableFile aPlan y el método bestNdest.
5. Configure TableFile aPlan de la siguiente manera.

6. Inserta el siguiente código en el Método bestNdest.

Tenga en cuenta que este Método bestNdest actúa como una función de dos variables (de tipo
cadena y entero) que devuelve una cadena. Para actualizar su memoria al usar entradas y salidas
de Métodos, verifique la Sección 3.12.
7. Déle a la Armadura un ícono adecuado y cierre el Plan de Producción de la Armadura.
8. Abra la ramificación del marco.
9. Agregue una variable al cuadro y asígnele el nombre SuccessorLeft, con tipo de datos String.
10. Agregue tres métodos en el cuadro y asígneles un nombre a Branch, Reset e Init.
11. Inserte el siguiente código en el Restablecimiento de método.

12. Inserta el siguiente código en Method Init e intenta comprender su propósito.

13. Inserta el siguiente código en la Rama de Método.

Tenga cuidado de usar los números de retorno correctos para el objeto FlowControl. Los
números de los conectores de salida se pueden encontrar haciendo clic en el menú General en la
cinta de opciones mientras la ramificación de cuadros está activa y yendo a Opciones de
visualización> Más> Sucesores.
14. Ajuste la configuración del objeto FlowControl a lo siguiente.

15. Cierre la ramificación del cuadro.


16. Inserte un nuevo atributo definido por el usuario para MU CarType y asígnele el nombre dest.

112
Establezca el tipo de datos en Cadena y asígnele el valor Conjunto.
17. Inserte un nuevo atributo definido por el usuario para MU CarType y asígnele el nombre
StateProc. Establezca el tipo de datos en Integer y asígnele el valor 1.

Hemos insertado un Método Reset e Init en la tarea anterior. Como puede recordar, este
tipo de métodos tienen un propósito especial en la simulación de plantas. Puede
actualizar su memoria en esos Métodos en el Capítulo 3 y el Capítulo 4. En este caso
particular, el Restablecimiento establece el valor del Variable SuccessorLeft en blanco
nuevamente. Init es el primer método que se ejecutará cuando inicie la simulación y en
este caso determinará qué estación de procesamiento está conectada al objeto ExitG,
que se indica en Variable StationName en Frame ProcessingStation.
Después de que un MU abandona el objeto Máquina en la Estación de procesamiento de
tramas, se desencadena el ProcEnd de método, lo que le da a MU nuevos valores para
sus atributos definidos por el usuario StateProc y Dest. A través de TableFile aPlan se
determina el destino de MU, que se desencadena mediante la función indicada en el
Método bestNdest. Este método le da a la MU su próximo destino después de que ha
sido procesada en la ProcessingStation. Recuerde que el destino inicial de ambos tipos
de MU está configurado como Ensamblaje.

Nota: La Tilde ~
Es posible que haya notado que hemos utilizado el signo ~ en el código de la tarea anterior. La tilde
nos permite navegar al siguiente nivel superior en la jerarquía Frame sin tener que indicar el nombre
exacto (ver Sección 7.2). Esto hace que sea más fácil generalizar ciertos pasos.

Tarea: Primera versión de la fábrica


1. Limpie Frame CarFactory y asegúrese de que solo el EventController esté presente en el
Frame.
2. Agregue los siguientes objetos a Frame CarFactory: 6 Straights, 2 Branchings, 2 Confluences,
4 Bends, 1 Drain, 1 Source, 2 ProcessingStations y ProductionPlan. Asegúrese de que el tiempo
de procesamiento del SingleProc en línea sea de 1 minuto.
3. Agregue un Restablecimiento de método a su RootFrame y agregue lo siguiente:

El comando initStat se usa para restablecer las estadísticas de los tipos de automóvil XX y XY.
Después de una ejecución, puede hacer clic en estos tipos de vehículos en la Biblioteca de clases
para encontrar estadísticas relevantes, tales como los tiempos promedio de producción (vida
útil) de las instancias generadas.
4. Cree el siguiente diseño para la línea de montaje de esta fábrica y asegúrese de que todos los
objetos personalizados que tienen interfaces estén conectados correctamente.

113
5. Las dos estaciones de procesamiento son dos instancias similares de la clase
ProcessingStation. Aplique los cambios necesarios de modo que la máquina de la izquierda se
convierta en la estación de pintura y la máquina a la derecha en la estación de ensamblaje.
Sugerencia: considere la lógica colocada en Frames Branching and ProductionPlan. Además,
aumente el tiempo de procesamiento de la máquina de pintura de 2 minutos a 3 minutos.
6. Establezca el tiempo de finalización de su simulación en 100 días en el EventController y
ejecute su modelo. La vida media de los autos XX y XY debería ser de aproximadamente 26 y 41
minutos respectivamente.

7.6 Depuración
No importa cuánto tiempo dedique a construir un modelo o a escribir Métodos, los
errores se cometen fácilmente. Especialmente ahora puedes construir modelos más
grandes con la ayuda de Frames. Los errores en Plant Simulation, o en cualquier otro
entorno de programación, conducen a los llamados errores. Una definición breve y
general de la palabra error es: cualquier error o falla que conduzca a un comportamiento
no deseado de su programa. La depuración es la tarea de reparar esos errores y fallas. Ya
has visto algunas herramientas que Plant Simulation tiene para ayudarte a depurar:
• Animación (Sección 2.6)
• El botón de paso en la ventana Controlador de eventos (Sección 3.3)
• La lista de eventos (Sección 5.3)
Un tipo de error que no hemos discutido específicamente son errores en Métodos.
Mientras trabaja en el tutorial, ya ha escrito una cantidad decente Métodos (código).
Algunos de sus métodos pueden crecer bastante y descubrir por qué un método no
funciona como se espera puede ser difícil. Aunque puede descubrir estos errores
utilizando las herramientas mencionadas anteriormente, Plant Simulation le ofrece una
opción aún mejor para encontrarlos y repararlos, concretamente el Depurador de
métodos. El Depurador de métodos aparece cuando un Método contiene una línea de
código que no se puede ejecutar o genera un error, pero también se puede abrir
manualmente.

114
También puede encontrar estas funciones en el Depurador de métodos haciendo clic en
la pestaña Debug.

Nota: Depurador de Métodos y el Editor de Métodos


Es importante comprender la diferencia entre el Depurador de métodos y el Editor de métodos. El
Depurador de métodos no está hecho para editar métodos; su propósito es puramente evaluar.
Cambiar métodos en el Depurador de métodos puede causar eventos inesperados. Sin embargo, es
posible evaluar ciertas expresiones durante la depuración haciendo uso de la pestaña Expresiones en
la ventana Inspección. Al usar la pestaña Expresiones, el código fuente no se modifica, pero el
Depurador de métodos proporciona el valor resultante de una expresión dada por el usuario. Esta
funcionalidad puede ser útil si desea probar diferentes soluciones para corregir un error en el código
fuente. No se olvide de eliminar sus expresiones después, para evitar ejecuciones involuntarias en
momentos posteriores.

El Depurador de métodos busca errores de sintaxis, rutas incorrectas, nombres de


objetos incorrectos y más. El Depurador de métodos aparece y resalta la línea que
contiene un error en rojo cuando Plant Simulation encuentra un error durante la
simulación. El Depurador de métodos también muestra un mensaje que le dice qué está
mal en la barra de estado del Depurador de métodos. Por ejemplo, si divide por cero,
verá la siguiente pantalla que aparece cuando ejecuta su modelo:

115
Aprenderá a usar varias opciones incorporadas en el Depurador de métodos mediante la
evaluación de dos métodos relativamente simples. Todo lo que aprenderá en el resto de
este párrafo es aún más útil cuando los métodos crecen o se vuelven más complicados.

Tarea: Use el Depurador de métodos


1. Abra el objeto Ramificación en su Biblioteca de clases.
2. Cree dos nuevos métodos llamados Randomdest y Randomise en el objeto Branching.
3. Establezca el Método aleatorio como método para la estrategia de salida de su FlowControl.
4. Inserta el siguiente código en Randomdest:

5. Inserta el siguiente código en Randomise:

6. Regrese al Método aleatorio y presione Herramientas> Ejecutar> Depurar en la cinta de


opciones o F11. Tenga en cuenta que la línea ahora es amarilla, ya que usted mismo abrió el
Depurador de métodos y aún no se produjo ningún error.
7. Si no ve una ventana de vigilancia, abra una pulsando Debug> Watch Window, F12 o el
botón . Active la pestaña Variables de la ventana Inspección si aún no está activa. Tenga en
cuenta que la pestaña Variables de la ventana Inspección muestra los valores de las variables
en su Método.

8. En el Depurador de métodos, presione Depurar> Pasar por alto, F10 o el botón varias veces.
Observe cómo Watch Window actualiza los valores de sus variables cada vez que pasa sobre una
línea. Continúe usando Paso a paso hasta que pase todas las líneas de código y se cierre el
Depurador de métodos.

116
En la tarea anterior, la pestaña Variables de la ventana Inspección no solo muestra las
variables definidas en el Método, sino también los identificadores anónimos "@" y "?".
Estas dos variables te muestran qué desencadenó el Método. Como el Método en esta
tarea se activó a mano y no se activó mediante MU, Objeto o Método, los valores de
"@" y "?" Son NULA. Al usar Paso a Paso, el Depurador de Método evaluó cada línea de
código en el Método Randomdest. En la línea 6, se llama a Method Randomise y el
Depurador de métodos lo pasa por alto, mientras que podemos estar interesados en lo
que está sucediendo dentro del Método aleatorio. Para evitar esto, podemos usar la
funcionalidad Paso a paso.

Tarea: Entrar en
1. Regrese al Método Randomdest y abra el Depurador de métodos (Paso 6 de la tarea
anterior).
2. En el Depurador de métodos, use Paso a paso (F10 o el botón ) en la primera línea y
use Paso a paso (F11 o el botón ) en la segunda línea (alternativamente, use Paso a paso
en ambas líneas). Después de usar Step Into en la segunda línea, verá la siguiente pantalla:

Como puede ver, ya no está en el Método aleatorio, sino en el Método aleatorio. También
tenga en cuenta que el valor de la variable "?" Es ahora el del Método de activación aleatoria:
el Método aleatorio.
3. Active la pestaña Pila de llamadas de la ventana Inspección. Esta pestaña muestra los
métodos que se llaman. El de abajo es el primer Método que se activó, el superior es el
Método que se está ejecutando en este momento y obviamente el último activado.

4. Abra otra ventana de vigilancia (F12 o el botón ). Los dos Watch Windows funcionan
de forma independiente para que pueda realizar un seguimiento de dos pestañas a la vez.
5. Salga del Método aleatorio (Shift + F11 o el botón ).
6. Ahora continúe (F5 o el botón ) para salir del Depurador de métodos

117
Step Over lo mantuvo dentro del método Randomdest mientras que Step Into también
le mostró exactamente lo que sucedió en el método Randomise y en cualquier otro
método posterior, si hubiera alguno. Si ingresas a un Método y luego te das cuenta de
que esto no es necesario, puedes presionar Shift + F11 o el botón para regresar al
que activó el Método actual. Puedes mezclar el uso de Step Into y Step Over de la forma
que quieras para corregir tus errores de manera eficiente.

Nota: Interrumpir un método interminable


Bugs in Methods puede dar como resultado largos tiempos de ejecución o incluso en bucles infinitos,
por ejemplo, cuando reiniciamos el contador de nuestro for-loop cada vez que hacemos una
iteración:

Este ciclo nunca terminará si lo ejecutamos (F5). Afortunadamente, el Depurador de métodos


permite interrumpir el Método al presionar las teclas Ctrl + Alt + Shift al mismo tiempo. Si el Método
tarda más de diez segundos, también aparece la siguiente pantalla:

Desde esta pantalla, puede abrir el Depurador, donde puede finalizar la ejecución. Este es un
ejemplo extremadamente simplificado de un bucle for que nunca termina, pero el riesgo de bucles
infinitos se produce fácilmente cuando se utilizan bucles while.

A veces necesitas saber cómo se comporta un Método durante la simulación real. Esto
es posible colocando un Punto de Inflexión en un Método en una línea específica. El
punto de interrupción obliga a Plant Simulation a pausar la ejecución una vez que llega a
esa línea, luego de lo cual se abre el Depurador de métodos. Hay dos tipos de puntos de
ruptura en la simulación de plantas:
• Puntos de interrupción de clase, estos puntos de interrupción representan cada
método de esa clase.
• Puntos de interrupción de instancia, estos puntos de interrupción solo
representan la instancia específica.

Tarea: Haciendo uso de puntos de interrupción de clase.


1. Regrese al Método Randomdest.
2. Ingrese un punto de interrupción de clase en la línea 5 (F9 o el botón ).
3. Cierre el Método y ejecute su modelo a velocidad media. La siguiente pantalla aparecerá:

118
A partir de este punto, puede evaluar su Método como lo hizo anteriormente utilizando Paso
a paso, Paso a paso y Ventana de observación.
4. Continúe (F5 o el botón ) para salir del Depurador de métodos. Después de un tiempo,
el Depurador de métodos volverá a aparecer, desencadenado por un Mu pasando un control
de flujo en una instancia del objeto de ramificación.
5. Por ahora, ha terminado de depurar y simular, de modo que elimine el punto de
interrupción (el botón ) y finalice la simulación (Ctrl + T o el botón ).

Nota: Puntos de interrupción de instancia y puntos de interrupción de clase


Los puntos de interrupción de instancia tienen las mismas propiedades que los puntos de
interrupción de clase, excepto por el hecho de que solo se desencadenan por la instancia específica
en la que se insertan. Recuerde la tarea Herencia con marcos que completó unas páginas atrás y la
diferencia entre cambiar algo en una clase o una instancia. El mismo principio se aplica a los Puntos
de corte de clase y Puntos de interrupción de instancia. Con la pequeña observación de que puede
ingresar un punto de interrupción de clase (presionando Depurar> Punto de interrupción de clase en
el Depurador de métodos o F9) en cualquier instancia y seguirá apareciendo en cualquier otra
instancia de esa clase. Puede ingresar un Punto de interrupción de instancia presionando Depurar>
Punto de interrupción de instancia en el Depurador de métodos o Mayús + F9.

Algunas veces su modelo puede funcionar como se espera, pero lleva una cantidad de
tiempo extrema completar una carrera. Puede ser difícil encontrar cuál es la causa de la
simulación lenta. El Analizador proporciona información sobre qué métodos o eventos
toman más tiempo. El Analizador recopila datos sobre el consumo de tiempo de
ejecución y genera un informe con sus hallazgos.

Tarea:
1. Cambie el objeto Branching a su configuración original conectando la Rama de Método al
Control de Flujo (haga esto dentro de la Biblioteca de Clases).
2. Active el perfilador presionando Depurador> Perfilador> Activar Perfilador en la Cinta.
3. Restablezca y ejecute la simulación.
119
4. Abra el informe del Analizador presionando Depurador> Analizador> Mostrar perfil en la Cinta.
Algo así como la siguiente pantalla debería aparecer:

En este informe, puede ver el tiempo transcurrido total frente al tiempo requerido para
la ejecución del Método. En nuestro caso, la ejecución del Método solo tomó alrededor
de 0.88 segundos. Otra información relevante es la columna% global. Esta columna
muestra el porcentaje que tomó el Método específico del tiempo total para la ejecución
del Método.

120
¿Sabía que…?
La animación aumenta el tiempo de ejecución, por lo tanto, a menudo se desactiva al ejecutar
múltiples repeticiones o simulaciones que toman mucho tiempo. La animación se puede desactivar
presionando en el menú Inicio de la cinta (botón izquierdo para desactivar la animación MU
y botón derecho para desactivar la animación icono) o presionando en el EventController
cuando se inicia la simulación. Trabajar con tablas grandes también ralentiza significativamente la
simulación de plantas. Por lo tanto, antes de decidir almacenar todos sus datos de todas las
ejecuciones y réplicas en una tabla y actualizarlos después de cada paso del proceso, piense
detenidamente sobre:
• Qué almacenar en tu mesa.
• Cuándo actualizar su tabla.
• Cuántas tablas usa.

Para concluir esta sección, echemos un vistazo a la función


Find Object. Aunque su nombre podría permitirle creer lo
contrario, Buscar objeto le permite buscar una variedad de
cosas: objetos, condiciones, texto dentro de un atributo
definido por el usuario de un objeto, código en un método
y un valor dentro de una lista o tabla.
Con modelos más grandes, puede perder visión general.
Verá, por ejemplo, que un determinado objeto no se
comporta como debería, pero no está seguro de qué
Métodos se refieren al objeto. Puede buscar el nombre del
objeto en Métodos usando Find Object. La ventana
Encontrar Objeto se abre haciendo clic con el botón derecho en la Base de la Biblioteca
de Clases (raíz del árbol) y haciendo clic con el botón izquierdo en Buscar Objeto. En el
menú desplegable, seleccione "Código fuente" para buscar solo en Métodos, lo que da
como resultado una lista de todos los Métodos y su ubicación mencionando el nombre
de ese objeto. Para limitar su búsqueda únicamente a una carpeta específica, haga clic
con el botón derecho en la Biblioteca de clases en esa carpeta específica y abra la
ventana Encontrar objeto desde allí.
La mayoría de las veces, no desea ver todas las instancias de un Método sino solo la
clase, por lo tanto, marque la casilla junto a "Ignorar el nombre o el texto heredado".

¿Sabía que…? Los errores pueden tener graves consecuencias


Como se mencionó en la introducción de esta sección, los errores se pueden esconder en cualquier
tipo de software. Por más inofensivos que parezcan, los errores pueden tener serias consecuencias.
Uno de los ejemplos más famosos es el error del milenio. En resumen, el error se redujo al hecho de
que los programadores de software realizaban un seguimiento del año en curso con solo dos dígitos.
Así que el primer día de enero del año 2000 se convirtió en 01-01-00. La mayoría de los programas
interpretaron esta fecha como 01-01-1900, lo que provocó bloqueos y errores en todo el mundo. Uno
de los casos más extremos de daños causados por un error podría ser el choque de la nave espacial
Ariane 5. Las partes de los códigos que se escribieron para Ariane 4 se reutilizaron. En última instancia,

121
esto hizo que el sistema primario y de respaldo fallara, lo que provocó una explosión de la nave
espacial. Afortunadamente, el Ariane 5 era una nave espacial no tripulada.

7.7 Fallas de la Máquina


Hasta ahora, usábamos máquinas que tenían una disponibilidad del 100%, fallar
simplemente no era una opción. En una situación de la vida real, las máquinas pueden
fallar debido a muchas razones diferentes. Diferentes fallas pueden tener diferentes
tiempos de reparación o una tasa diferente de ocurrencia. Puede modelar esto en Plant
Simulation.

Tarea: Modelar una falla simple


1. Abra el modelo de ProcessingStation desde su Class Library.
2. Abra el objeto Máquina.
3. Haga clic en la pestaña Fallas.
4. Haga clic en el botón Nuevo ... , aparecerá la siguiente pantalla:

5. Establezca Disponibilidad en 75% y MTTR en 2 minutos (Tiempo medio de reparación).


6. Asegúrese de que Failure related to esté configurado a SimulationTime.
7. Haga clic en Aceptar, asegúrese de que la casilla que se encuentra delante de su error en la
columna Activa esté marcada y vuelva a presionar OK.
8. Abra la comprobación de método. Además de verificar que la Máquina esté disponible y la MU
tenga el destino correcto, también verifique si la Máquina no está en una condición fallida:

9. Restablezca y ejecute su modelo a velocidad lenta a media y abra una de las estaciones de
procesamiento. Observe cómo aparece un punto rojo cuando la máquina falla.

Modelamos nuestra falla estableciendo su disponibilidad, que no es una forma muy


específica de definir cuántas fallas se producen. No especificamos la distribución del
tiempo entre fallas y lo mismo aplica para la distribución del MTTR. Plant Simulation
realmente usa su propia configuración cuando modela fallas al solo dar valores de
disponibilidad y MTTR.

122
Nota: LEDs
Cuando nuestra máquina falló durante la simulación, un punto rojo apareció en su icono. Tal punto
se llama un LED en simulación de plantas y se usa para mostrar el estado de un objeto. Es posible
que ya los hayas visto en Métodos (puntos grises o verdes en nuestro modelo) o en MU (puntos
verdes o amarillos). Aprenderá más sobre los LED en la próxima sección.

Tarea: Verifica la distribución de una falla


1. Abra la ProcessingStation desde su Class Library.
2. Abra el objeto Máquina.
3. Haga clic en la pestaña Fallas.
4. Elija editar el error que creó en la tarea anterior, debería aparecer la siguiente pantalla:

Aunque solo establecemos la disponibilidad en un 75% y el MTTR en 2 minutos, Plant


Simulation usa una distribución exponencial para los tiempos de intervalo, con una beta
de 6 minutos y una distribución de Erlang para la duración, con un mu de 2 minutos y un
sigma de 1 minuto y 24.85 segundos. Cuando deselecciona la casilla que se encuentra
delante de Disponibilidad en la ventana de una falla, puede definir tiempos y
distribuciones usted mismo. Recuerde el Generador que utilizó en la Sección 5.2, donde
activó el Method InitDay todos los días. Los campos de entrada Start, Stop, Interval y
Duration funcionan igual para el generador que para las fallas. En caso de fallas, se
cumple lo siguiente:
• Start es el tiempo que desea que las fallas comiencen a ocurrir.
• Detener es el tiempo que desea que las fallas dejen de ocurrir.
• Intervalo es el tiempo transcurrido entre el final de la última falla y la ocurrencia
de una nueva falla.
• La duración es el tiempo que tarda una falla en ser reparada.
Los cuatro campos de entrada se ilustran en la siguiente figura:

123
Otro aspecto importante de las fallas es el momento en que se relacionan. Definimos el
hecho de no estar relacionado con el tiempo de simulación, pero también puede elegir
las opciones de tiempo de operación y tiempo de procesamiento. El tiempo de
operación es el tiempo cuando el objeto (en nuestro caso, la Máquina) está en
funcionamiento. El tiempo de operación se interrumpe por pausas y fallas. El tiempo de
procesamiento es el tiempo que el objeto está procesando realmente una MU. Para
líneas y transportadores, que también pueden fallar, el tiempo de procesamiento es el
tiempo en que la velocidad no es cero. No importa si la línea o el transportador está
transportando un MU o moviéndose vacío.

Nota: Fallas manuales


Si desea ver cómo se comporta su modelo cuando una determinada máquina se frena, puede
provocar que falle manualmente. Abra el objeto que desea ver que falló y marque la casilla que
está delante de Error. También puede activar o desactivar una falla con Métodos utilizando
"Machine.failed: = true".

7.8 Iconos dependientes del estado


En la Sección 3.2, aprendió cómo crear sus propios iconos y cómo los íconos podrían
depender del estado del objeto correspondiente. El paciente verde que dibujó en el
Capítulo 3 representaba una MU operacional y el paciente amarillo representaba una
MU en espera. En este párrafo aprenderá más sobre íconos dependientes del estado.
Recuerde que los objetos pueden estar en varios estados diferentes (Sección 3.5). Los
objetos estáticos pueden bloquearse, fallar, recuperarse, funcionar, detenerse,
configurarse, funcionar o esperar. Los objetos movibles pueden estar operativos, en
espera, fallidos o en pausa. No siempre podemos forzar a los objetos a asumir todo tipo
de estado, como lo hicimos en el párrafo anterior, forzando a la Máquina a que falle en
el estado. Esto se debe a que algunos estados dependen de otros estados o atributos del
objeto. Un SingleProc puede fallar y pausarse al mismo tiempo, aunque no puede estar
esperando y pausado al mismo tiempo. Conceptualmente, este último ejemplo tiene
mucho sentido, ya que una máquina que está en pausa simplemente no está esperando.
El hecho de que un objeto puede tomar dos estados causa dificultades al usar íconos
dependientes del estado, por lo tanto, Plant Simulation utiliza principalmente LEDs por
defecto. Un objeto que está en varios estados simplemente tiene varios LED activos,
como se muestra en los siguientes dos ejemplos.

124
• La máquina SingleProc del párrafo anterior que ha fallado y
está en pausa (LED rojo y azul).
• Un método cuyo código se hereda y se está ejecutando (gris y
verde)
LED).
También puede crear iconos nuevos que no tengan un atributo o estado relacionado.

Tarea: Crea tus propios iconos de estado


1. Haga clic con el botón derecho en MU CarType en su Biblioteca de clases.
2. Haga clic en Editar iconos en el menú desplegable.
3. Vaya al menú Editar en la Cinta, y elija Nuevo en el menú Archivo.
4. Cambie el nombre de este ícono Montado.
5. Crea otro ícono y nómbralo Pintado.
6. Dibuje dos íconos que representen una MU ensamblada y una MU pintada.
7. Aplique Cambios y cierre el Editor de iconos.
8. Abra la ProcessingStation desde su Class Library.
9. Abra el método ProcEnd.
10. Agregue la siguiente instrucción if debajo @ .move (Advance)

11. Aplique cambios y cierre el método ProcEnd.


12. Ejecute su modelo a baja velocidad y observe las dos instancias de ProcessingStation.

Si todo funciona como debería, verá que los íconos de las MU cambian cuando se
mueven de la Máquina a Continuar. Tenga en cuenta que en lugar de usar @.CurrIcon: =
"Pintado", también podríamos usar @.CurrIconNo: = 3, donde 3 se refiere al tercer icono
disponible para CarType.
Nota: Animación de iconos con iconos dependientes del estado
Puede ser que, tan pronto como las MU con iconos personalizados se muevan a los objetos
Confluence, sus íconos vuelvan al ícono Operativo. Esto se debe al uso de íconos de estado, que
cambia automáticamente el ícono después de un cambio de estado, por ejemplo, en funcionamiento
o en espera. En nuestro caso, esto podría suceder en la Confluencia. Para la mayoría de los objetos
de flujo de materiales, puede desactivar los iconos de estado estándar en el Editor de iconos. Para
MUs esto no es posible. Sin embargo, un posible cambio es cambiar el nombre de los íconos
dependientes del estado:
1. Haga clic con el botón derecho en MU CarType en su Biblioteca de clases y haga clic
en Editar íconos.
2. Cambie el nombre del ícono Operacional a Operational1.
3. Aplique cambios y cierre el Editor de iconos.
4. Ejecute su modelo y mire la animación.
Ahora cuando cambia el icono de MU, permanece así hasta el siguiente cambio, que puede cambiar
al icono Esperando (ya que no hemos cambiado el nombre de este icono y el uso de Iconos de estado
todavía está habilitado) o Pintado. Cuando adopta el icono En espera, no cambiará automáticamente
a Ensamblado o Pintado cuando la espera haya terminado, necesitamos definir el comportamiento
deseado por nosotros mismos cuando trabaje con iconos personalizados.

125
Nota: Iconos de padres o hijos
En la tarea anterior le dimos a CarType padre dos íconos nuevos. También podríamos darle a los dos
objetos secundarios (XX y XY) nuevos íconos, si queremos que el ícono dependa del tipo de MU, por
ejemplo (recuerde el GP en la Sección 3.8). Si los íconos del automóvil XY y XX tienen el mismo
nombre y número que los íconos que creamos para el CarType principal, nuestro código en el
método ProcEnd seguirá funcionando mientras que ambas unidades pueden tener diferentes iconos.

¿Sabía que…? Creando tus propios LED


Puede crear sus propios LED que dependen de los atributos que elija. Para hacer esto, haga clic
derecho en el objeto, luego elija Editar panel de visualización. Para obtener más información, nos
referimos al tema de la función de ayuda "Show States with LEDs" de Plant Simulation.

7.9 Asignación B1: Modelado orientada a objetos


En el modelo final del fabricante de automóviles, el enrutamiento de automóviles está
completamente determinado por el objeto ProductionPlan. Esta construcción es
relativamente eficiente y los posibles cambios en el enrutamiento solo deben aplicarse
en un solo lugar. Sin embargo, para mejorar sus habilidades de modelado y
programación, cambia el control de los automóviles dentro de esta asignación. Además,
extiende el modelo con otra máquina e incorpora el uso de procesamiento por lotes.

Asignación B1.1: recree el modelo final del fabricante del automóvil sin el uso de
ProductionPlan o cualquier otra tabla para respaldar las decisiones de enrutamiento. En
su lugar, decida el enrutamiento en cada ramificación y cada estación de procesamiento
haciendo uso de los métodos y los atributos definidos por el usuario de las MU. Verifique

126
que su nuevo modelo sea correcto: use los pasos de depuración presentados en este
capítulo, use controles visuales y compare los tiempos de producción del modelo
modificado con los del modelo original.

El gerente de la empresa de fabricación de automóviles considera un rediseño de su


fábrica. En primer lugar, es necesario agregar una máquina de alta tecnología al final del
proceso de producción (un ciclo adicional entre Assembly y Drain) que aplica un
recubrimiento especial a todos los automóviles. El tiempo de procesamiento de esta
máquina es de 2 minutos. En segundo lugar, se debe agregar una nueva máquina para el
taller de pintura. La nueva máquina proporciona una pintura de mayor calidad, pero
requiere que se procesen lotes de 4 automóviles simultáneamente (el tiempo de
procesamiento por automóvil sigue siendo el mismo). Junto a las nuevas máquinas, el
departamento de investigación y desarrollo ha creado un nuevo tipo de automóvil
llamado XZ. Este nuevo tipo de automóvil también necesita ser ensamblado y necesita
recibir el recubrimiento especial, pero no necesita ser pintado. La tasa de llegada de XZ
es igual a la tasa de llegada de XY.

Asignación B1.2: Cambie el modelo resultante de la Asignación B1.1 para proporcionar


información al gerente sobre cómo estos cambios podrían influir en el proceso de
producción actual. Específicamente, su tarea es:
a. Agregue la nueva máquina al proceso de producción de los tipos de productos
existentes.
b. Cambie el taller de pintura para que solo funcione con lotes de 4 automóviles
(no hay una opción estándar para esto, debe codificarlo usted mismo).
c. Agregue el proceso de llegada del nuevo auto XZ.
d. Ajuste el control de enrutamiento.

Nuevamente verifique su modelo usando depuración y controles visuales. Ejecute el


modelo para determinar los tiempos de rendimiento de los tres automóviles diferentes.

Asignación B1.3: Sugerir una mejora del diseño del sistema en términos de tiempos de
rendimiento. Utilice el modelo resultante de la Asignación B1.2 e implemente los
cambios sin reducir la longitud total de la cinta transportadora, ya que esto se requiere
como espacio intermedio. Proporcione una comparación entre los tiempos de
rendimiento para los diferentes automóviles dentro del sistema existente y mejorado.

Entregables:
• Sus modelos para las tres tareas.
• Los tiempos de producción de todos los tipos de automóviles dentro de los tres
sistemas.
127
• Un diagrama de flujo para la lógica de enrutamiento implementada en la
Asignación B1.2.
• Un diagrama de flujo para el nuevo taller de pintura (el proceso de
procesamiento por lotes).
• Un informe que presenta sus modelos y muestra los resultados y diagramas de
flujo.

128
8 Construyendo un modelo: líneas y trabajadores
En este capítulo continuamos modelando la fábrica, pero en lugar de utilizar los objetos
de enrutamiento personalizados del capítulo anterior (recta, doblez, confluencia y
ramificación), usamos algunos objetos estándar de simulación de planta para
representar las rutas de transporte y las correas.
En este capítulo, primero aprenderá que las MU también pueden contener otras MU y
cómo modelar esto. La segunda sección trata de los objetos Líneas y Transportadores.
Para ser más específicos, le mostraremos cómo puede modelar fácilmente un sistema de
transporte a través de Líneas y Pistas, pero también las diferencias y similitudes entre
Líneas y Pistas. Los siguientes son grupos de Trabajadores y Trabajadores, que agregan
una nueva dimensión a su modelo cuando se trata de situaciones en las que los
humanos están involucrados. Por último, abordaremos el tema de la experimentación
sin el uso del ExperimentManager (consulte el Capítulo 5). Este capítulo finaliza con una
tarea que no solo probará sus habilidades de simulación de plantas, sino que también
requiere experiencia estadística para determinar un período de calentamiento adecuado
y el número de repeticiones.
El modelo final de este capítulo contiene algunas partes típicas, que podría encontrar en
cualquier instalación de producción. Normalmente sería conveniente crear marcos por
separado para cada parte (ver el Capítulo 7), pero para crear un buen modelo 3D, solo
utilizaremos un cuadro para la estación actual en este capítulo. Junto a este Marco,
usaremos otro Marco que funciona como un panel de control. Cada parte de nuestra
instalación de producción contendrá uno o más objetos de Plant Simulation que aún no
hemos explicado. Construirás las siguientes partes:
A. Un almacén, donde las partes de un producto se colocan en una plataforma.
B. Una línea que transporta palets desde el almacén a las estaciones de soldadura.
C. Una pista en la cual los productos son movidos por un vehículo automatizado.
D. Una cadena de montaje donde los trabajadores operan las máquinas.
Su modelo final en este capítulo debe verse de la siguiente manera, con las letras que
hacen referencia a la lista anterior:

129
Temas tratados en este capítulo:
• Tipos de MU: el contenedor y el transportador
• Líneas, pistas y sensores
• Piscinas de trabajadores y trabajadores
• Calendarios de turno
• Modelado 3D con objetos estándar
• Experimentando sin el ExperimentManager

8.1 Configuración del Almacén


Introduciremos varios objetos nuevos en los próximos párrafos. Algunos de estos
objetos ofrecen nuevas funcionalidades, pero es posible que encuentre objetos que
realicen operaciones que ya podría haber modelado, utilizando un enfoque diferente,
por ejemplo, con SingleProcs y Methods. Junto a las funcionalidades de los objetos
básicos, te permiten crear simulaciones 3D sin ningún conocimiento de modelado 3D.

Tarea: Crear el RootFrame


1. Crea un nuevo modelo.
2. Cambie el nombre de RootFrame, que se llama Frame de forma predeterminada, a
ControlPanel.
3. Cree un nuevo Marco y renómbrelo AssemblyStation.
4. Coloque una instancia de AssemblyStation en su ControlPanel. Recuerde: cuando sea posible,
aplique sus cambios solo al objeto en su Biblioteca de clases.
5. Agregue tres métodos al ControlPanel, puede ser conveniente presionar la tecla Ctrl para que no
tenga que seleccionar el objeto Method tres veces.
6. Cambie el nombre de los métodos para restablecer, iniciar y crear objetos.

Nota: Importación de un objeto del modelo tutorial


Para acelerar la construcción del modelo en este capítulo (Sección 8.1-8.3), puede decidir importar el
archivo adjunto "AssemblyStation.obj". Aunque esto ahorra algo de tiempo en la creación de
FrameStation Station, aún necesita realizar todas las tareas de este capítulo (i) para crear el Frame
Control Panel y otros objetos, y (ii) crear las conexiones necesarias entre los dos marcos. Si decide
utilizar este objeto prefabricado, primero elimine su Frame AssemblyStation de la tarea anterior.
Haga clic con el botón derecho en Base en la Biblioteca de clases, seleccione Guardar / Cargar y
Cargar objeto. Seleccione el objeto AssemblyStation. En la ventana que se abre, seleccione
Reemplazar todo, para reemplazar todos los objetos en su Biblioteca de clases por los de la clase
cargada. Nuevamente, coloque una instancia de AssemblyStation en su ControlPanel. El error que
recibe se debe a conexiones no válidas entre ambos marcos. Estas conexiones deben realizarse a lo
largo de las tareas de este capítulo.

Tarea: Crea las MU


1. Duplique la Entidad MU de su Biblioteca de clases y cambie el nombre del duplicado a Motor.
2. Obtenga cinco MU de Engine y cámbieles el nombre a XV, XW, XX, XY y XZ.
3. Cree 16 atributos definidos por el usuario para todos los motores (por lo tanto, para el motor de
MU) con el tipo de datos Hora y los siguientes nombres:

130
4. Duplique el contenedor MU de su biblioteca de clases y cambie el nombre del duplicado a Pallet.

No se preocupe si algunas partes todavía no tienen sentido para usted, las usaremos
más adelante. Primero, sigamos construyendo el Almacén. En el Almacén, las Paletas se
almacenarán, las partes se generarán a partir de una Fuente y las partes se colocarán en
paletas. Le mostraremos cómo puede modelar la situación donde solo está disponible un
número limitado de paletas, como podría ser el caso en las instalaciones de fabricación
de la vida real.
Como algunos pasos son bastante básicos, los explicaremos con menos detalle. Si tiene
problemas con objetos que se han usado anteriormente, como Source, búsquelos en
capítulos anteriores para actualizar su conocimiento. Cuando se trata de ajustes
específicos de un objeto, déjelos como están por defecto, a menos que se indique lo
contrario.

Tarea: Crear el Almacén


1. Agregue los siguientes objetos a Frame AssemblyStation: dos Buffers, una Fuente, una Tienda y
un Ensamble.
2. Agregue los siguientes objetos al ControlPanel: un Método y un TableFile. Cambia el nombre del
Método a NewPart y TableFile a SourceTable.
3. Cambie el nombre y conecte los objetos en su AssemblyStation como se indica a continuación:

4. Establezca el tiempo de permanencia de los búferes en 0 y la capacidad de infinito.


5. Abra PartSource y seleccione la pestaña Atributos. En el modo de operación, desmarque
bloquear (volveremos a esto en la sección 8.4). A continuación, establezca la selección MU en
Porcentaje y configure la Tabla de Origen como Tabla. Utilice ".Models.ControlPanel" como
primera parte de la ruta absoluta (Plant Simulation agrega un * antes de la ruta). También puede
seleccionar la opción de exploración (...), verificar la ruta absoluta y usar el botón Atrás para
navegar a la tabla de origen. Mantenga este procedimiento en mente a lo largo de este capítulo
cuando consulte el Panel de control desde Frame AssemblyStation.
6. Configure el intervalo de la fuente a una distribución exponencial con una media de 3 minutos.
7. Compruebe si SourceTable en su ControlPanel ahora tiene el formato correcto, agregue las MU
a la tabla (por ejemplo, .MUs.XV), y configure la porción de XV a 0.30, XW a 0.25, XX a 0.05, XY a
0.15 y XZ a 0.25.
8. Establezca las Dimensiones X e Y de la Tienda en 100, de modo que tenga una capacidad total de
10,000.
131
9. Ingrese el siguiente código en el Método NewPart:

10. Establezca el método NewPart como control de salida para PartSource.


11. Abra PartOnPallet, vaya a la pestaña Atributos y configure el modo de ensamblaje para
Adjuntar MU. Vaya a la pestaña Tiempos y configure el Tiempo de procesamiento en una
constante de 1 minuto (configuración predeterminada).

Echemos un vistazo a lo que tenemos hasta ahora. PartSource crea las MU adecuadas, y
cada vez que una MU intenta abandonar PartSource, se llama al método Newpart. Este
Método mueve el MU específico al PartBuffer y si quedan paletas, también mueve un
Pallet, indicado por muPart (1), al PalletBuffer. Cuando tanto una paleta como uno de los
motores llegan al objeto PartOnPallet, las piezas específicas se colocan en la paleta. Aún
no hay un sucesor para PartOnPallet, por lo que la paleta con un motor instalado
permanecerá en el PartOnPallet y bloqueará las MU entrantes.

Nota: El objeto Store


El objeto Store es un objeto de almacenamiento pasivo. A diferencia del objeto Buffer, una Tienda no
intenta enviar MUs a su sucesor. Si desea mover MU de la Tienda a otro objeto, debe extraer
activamente. El almacenamiento de MUs se puede hacer simplemente conectándolo a una salida de
otro objeto. El objeto Store es solo una adición al modelo, que podríamos reemplazar por un
PalletBuffer.

Antes de continuar con el modelo, profundicemos en qué es exactamente nuestra paleta


y qué hace. Obtuvimos nuestra paleta del contenedor tipo MU de la biblioteca de clases.
El Contenedor de tipo MU se puede utilizar para modelar cualquier tipo de objeto
"similar a un contenedor", como cajas, tablas, paletas, tipos de embalaje, etc. Se podría
optar por otorgar atributos definidos por el usuario a un contenedor, dejarlo procesar o
almacenarlos al igual que las MU que derivamos de la entidad de tipo MU. La diferencia
más importante, sin embargo, es que los Contenedores tienen la capacidad de
transportar Entidades.
Para transportar Entidades, el Contenedor tiene una cierta capacidad que depende de
los atributos XDim e YDim, al igual que la capacidad de procesamiento de un
ParallelProc. Puede cambiar el XDim y el YDim del contenedor haciendo doble clic en el
contenedor en su biblioteca de clases. Si lo hace, verá la siguiente pantalla:

132
Aquí puede establecer XDim e YDim cambiando la X-dimensión y la Y-dimension
respectivamente, y cambiar la longitud de MU, el ancho de MU, la altura de MU, y más.
Permítanos continuar con nuestro Almacén y poner algunas paletas en nuestra tienda.

Tarea: Crear objetos


1. Agregue una variable de tipo entero a su ControlPanel.
2. Cambie el nombre de la variable a NrPallets y establezca su valor en 10,000.
3. Déle a Pallet MU en su Class Library el atributo definido por el usuario PalletNr. Establezca el
tipo de datos del atributo en entero y su valor estándar en 0.
4. Ingrese el siguiente código en el Método CreateObjects ubicado en el Panel de Control:

5. Ingrese el código en el Restablecimiento de método para que elimine todas las MU cada vez que
se active.
6. Asegúrese de que Method Init llama al método CreateObjects.
7. Para fines de prueba, agregue un drenaje a su Almacén, conéctelo a PartOnPallet y pruebe su
modelo.

Después de la creación de 10.000 motores, la Tienda no tiene ninguna paleta restante y,


por lo tanto, los motores se atascan en PartBuffer y PartSource. Al final de nuestro
proceso, tendremos que devolver las paletas a la tienda, de lo contrario nos quedaremos
sin paletas eventualmente. Nos aseguraremos de que las paletas regresen a la tienda

133
cuando trabajemos en los pasos finales de procesamiento de nuestras instalaciones de
producción.

Nota: Cómo manejar MUs en MUs


Usamos el PartOnPallet para colocar un MU de tipo Engine en el Pallet. También podríamos hacer
esto usando un Método. El comando Mover también funciona para moverse desde o hacia un
contenedor tipo MU. También atributos como Cont y NumMu funcionan igual que antes. Además, si
ahora necesita referirse a un atributo de una MU que se coloca en un contenedor, debe tener
cuidado con la ruta que utiliza. Por ejemplo, si desea acceder a un Atributo ProcTime definido por el
usuario de una MU que se coloca en una paleta, entonces debe usar la ruta: Pallet.cont.ProcTime. Si
una paleta contiene más de una MU, puede usar MuPart (x), donde x representa la posición de la
MU específica en la paleta.

Como puede ver en la imagen del diseño general, que se muestra en la introducción de
este capítulo, las MU pasarán por varias estaciones de procesamiento diferentes. Los
diferentes motores tienen diferentes tiempos de procesamiento para estas estaciones.
Hay diferentes maneras de modelar esto, pero en este caso utilizaremos los atributos
definidos por el usuario que creamos.

Tarea: Asignar tiempos de procesamiento a las MU


1. Cree un TableFile nuevo en su ControlPanel y asígnele el nombre ProcTimes.
2. Establezca los índices de columna y fila a activos.
3. Establezca el número de filas en 7 y el número de columnas en 5.
4. Establezca el tipo de datos de las 5 columnas en enteros.
5. Ingrese lo siguiente:

6. Extienda su Método NewPart agregando las partes faltantes de la imagen siguiente (consulte
también el código en el Apéndice) e intente comprenderlo:

134
Para cada motor, los nombres de atributos que comienzan con PT contienen valores de
los tiempos de procesamiento. Los nombres de atributos que comienzan con WT se
usarán para medir el tiempo de espera en ciertas estaciones, pero esto se hará después
de que creamos las estaciones específicas. En nuestro Método NewPart, el ciclo se
asegura de que se establezca una hora para cada una de las siete estaciones, y usamos
@.Name para asegurarnos de que estamos buscando en la columna derecha para el
Motor específico. El número de TableFile ProcTimes representa la media de la
distribución lognormal, con una desviación estándar de la mitad del valor medio como se
muestra en la tabla. La variable Snr significa número de secuencia y se asegura de que
cada estación tenga su propia secuencia de números aleatorios.

¿Sabía que…?
Discutimos los diferentes tipos de datos en la Sección 3.10. Hay todo tipo de opciones de
transformación que puede usar en Métodos, por ejemplo, obj_to_str. Sin embargo, no existe tal
cosa como obj_to_str para los atributos, pero podemos usar getAttribute y setAttribute como lo
hicimos en la tarea anterior. La declaración getAttribute () devuelve el valor del atributo que solicita
al nombrarlo entre corchetes. Por ejemplo, @.getAttribute ("WTSparkPlug") devuelve el valor del
atributo WTSparkPlug de la MU que activó el Método. Lógicamente, setAttribute establece el
atributo definido para un valor dado. La declaración setAttribute requiere dos parámetros de
entrada, el primero es el nombre del atributo, el segundo es el valor que desea asignar a ese
atributo.

8.2 Objetos de línea


En el capítulo anterior, creamos nuestra propia línea haciendo uso de Frames y
SingleProcs. Plant Simulation también tiene un objeto estándar para modelar una línea,
a saber, los objetos de línea y seguimiento. La línea y la pista tienen muchas similitudes,
la mayor diferencia es que en una línea, las MU pueden moverse por sí mismas mientras
que en una pista generalmente se colocan en un transportador. Esto también nos lleva a
la mayor diferencia entre las MU del tipo Contenedor y las MU del tipo Transportador:
un Transportador se mueve por sí mismo mientras que un Contenedor y una Entidad
avanzan a través del movimiento hacia delante de una Línea. Comenzaremos por crear
una línea simple para la cual, como se dijo, no se necesita un transportista.

Tarea: Crear una línea


1. Agregue un Buffer a Frame AssemblyStation.
2. Cambie el nombre del Buffer a LineBuffer y conecte la entrada de LineBuffer a la salida de
PartOnPallet.
3. Establezca el tiempo de permanencia del LineBuffer en 0 y configure la capacidad en 4.
4. Ahora agregue una Línea haciendo clic en el objeto Línea en su Caja de Herramientas, la
siguiente pantalla debería aparecer:

135
5. Cree una línea horizontal recta de alrededor de 5 metros, haga clic con el botón izquierdo para
comenzar a colocar la línea, haga clic con el botón izquierdo para confirmar el punto final y luego
haga clic con el botón derecho para detener segmentos de línea y cerrar automáticamente esta
pantalla.

Felicidades, has creado tu primera línea, así como así. Si desea continuar con la línea,
podría simplemente haber continuado con otro clic izquierdo o al agregar otros
segmentos.

La línea que acaba de crear se puede editar de la siguiente manera:


• Simplemente arrastrando los cuadrados negros a otra ubicación.
• Hacer doble clic en el objeto Línea y establecer un nuevo valor para la longitud.
• Haga clic derecho en el objeto Línea y elija la opción Segmentos> Agregar.
La última opción es la única que ofrece el mismo rango de opciones que crear una nueva
Línea. Permítanos explorar la opción "Añadir" más. En la pantalla que se titula
"Parámetros de línea / arco", consulte la tarea anterior, puede marcar o desmarcar las
casillas que dicen fija. Si no marca estas casillas, los valores en los campos
correspondientes dependen del movimiento del mouse. Si marca estos recuadros y ha
ingresado un valor específico, haga lo que haga con el mouse, la parte de la línea que

136
dibuje tendrá el valor específico. Las opciones que tiene para los segmentos de Línea
recta son:

• Ángulo tangencial: el ángulo relativo al


segmento de Línea anterior. Va desde -180
hasta 180. Para el primer segmento de Línea,
representa el ángulo con una línea horizontal
de izquierda a derecha. En la figura, la flecha
representa la dirección del segmento de Línea
anterior.
• Longitud de línea: simplemente la longitud de
su segmento de Línea recta.

Para crear un arco, haga lo mismo que con una línea recta (haga clic con el botón
izquierdo en el objeto Línea en su Caja de herramientas, haga clic izquierdo para un
punto inicial y haga clic izquierdo para un punto final), pero mantenga presionada la
tecla Ctrl después de haber elegido un punto de partida. En lugar de líneas rectas, ahora
dibuja arcos, hasta que suelte la tecla Ctrl.
Las opciones que tiene para los arcos son:
• Longitud del arco: la longitud absoluta del segmento Línea.
• Ángulo de curva: el ángulo en grados visto desde el centro del círculo en el que
se coloca el arco.
• Radio: el radio del arco, como si fuera un círculo completo.
Cuando ingresa un valor para la longitud del arco, Plant Simulation ajusta
automáticamente el radio o el ángulo central y viceversa, ya que dependen el uno del
otro. Siempre puedes establecer dos de tres. Mediante el uso creativo de los campos de
entrada y el botón de control, puede crear fácilmente líneas complejas que constan de
varios segmentos de segmentos y arcos rectos.

Tarea: Crear una línea


1. Elimine el segmento de línea que ha creado en la tarea anterior.
2. Elimine el drenaje que ha creado para probar la máquina PartOnPallet.
3. Haga clic en el objeto Línea en la Caja de herramientas.
4. Establezca los siguientes valores fijos (el valor no fijo se ajustará automáticamente):

137
5. Crea la línea que se muestra en la imagen a continuación, usando la tecla Ctrl. La línea contiene
dos segmentos de línea recta y un segmento de arco, como indican los cuadrados negros.

6. Cree otra línea como se muestra en la siguiente imagen, utilizando los mismos valores fijos que
la línea anterior, solo que ahora comience con un ángulo tangencial de 90 grados y vuelva a
establecerlo en 0 después del primer segmento. El número de segmentos de línea recta se muestra
en la figura (números dentro de los cuadrados) y también se indica con cuadrados amarillos. Tenga
en cuenta que podría ser el caso de que después de cada segmento de arco, necesite definir la
longitud del segmento de línea recta nuevamente.

7. Cambie el nombre de su segunda línea a LineRound.


8. Conecte la línea con LineRound.
9. Conecte el inicio y el final de LineRound entre sí.
10. Mueva LineRound para que su extremo se traslape con el final de Line.
11. Restablezca y ejecute su modelo a velocidad media y deténgase cuando ya no queden más MU
en LineRound.

El número de MU que se ajustan a LineRound depende de la longitud de la línea y la


longitud de la paleta de MU. La longitud de la paleta se puede encontrar haciendo doble
clic en ella o presionando F8 (longitud del atributo). Si haces esto, verás que su longitud
es de 1,2 metros. Para verificar la longitud de LineRound, también puede hacer doble clic

138
en ella, o presionar F8 (atributo de longitud). Como LineRound tiene 68.14 metros de
largo, puede contener un máximo de 56 paletas.

Nota: Moviendo Objetos


Al mover objetos con el mouse, los objetos normalmente se adhieren al grid. Si desea mover un
objeto por píxel, que es la cantidad más pequeña posible en Plant Simulation, use las teclas de flecha
de su teclado.

El LineRound ahora funciona casi idéntico a los transportadores en el aeropuerto, la


diferencia es que en nuestra línea no hay personas para recoger su equipaje.
Supongamos que queremos modelar una máquina que recoja las MU de LineRound. En
la siguiente tarea, presentaremos el objeto estándar que mueve las MU cuando se
activan. Plant Simulation tiene la opción de colocar un sensor en algún lugar a lo largo de
una Línea o Pista. Un sensor se activa cuando un MU lo pasa y luego activa un Método.

Tarea: Crear un sensor en una línea


1. Agregue un nuevo Método en su Panel de control y asígnele el nombre SensorCheckLine.
2. Abra LineRound, seleccione la pestaña Controles y haga clic en Sensores (0).

3. Crea un nuevo sensor. Para la posición, elija Longitud si aún no está seleccionada, y configure la
longitud a 42.5 metros.
4. Seleccione el nuevo Method SensorCheckLine como control. LineRound ahora contiene una
barra roja como ya se muestra en la figura de la tarea anterior.
5. Haga clic en Aceptar para aplicar cambios y cerrar la ventana.
6. Agregue un PickAndPlace de la pestaña Flujo de materiales de su Caja de herramientas (o la
carpeta MaterialFlow en su Biblioteca de clases) junto a la línea roja del Sensor en LineRound.
7. Agregue el siguiente comando al Method SensorCheckLine:

139
Nota: Sensores en objetos orientados a la longitud
Los sensores se pueden colocar en todos los objetos orientados a la longitud, como Líneas, Pistas y
TwoLaneTracks. En principio, los sensores funcionan igual en cada uno de esos objetos. Puede optar
por activar un sensor en la parte frontal o posterior de un MU que pase, y si desea que esté siempre
activado o solo cuando el sensor sea el destino de la MU.

¿Sabía que…?
Un único objeto orientado a la longitud puede tener múltiples sensores. Puede crear un Método para
cada sensor, o usar un Método para todos los sensores. Cuando configura un método como control
para un sensor, se formateará de modo que funcione como una función con dos parámetros de
entrada: ID de sensor y frente. El ID de sensor es una variable de tipo entero, y se establece en el
número de ID de sensor del sensor que llama al Método. Al usar esta variable, puede escribir código
que proporcione acciones específicas cuando un MU activa un determinado sensor. La variable Front
es de tipo Boolean, y es verdadera cuando el sensor debe activarse cuando la parte frontal de la MU
pasa el sensor, y viceversa.

El objeto PickAndPlace que se agrega todavía no funciona como pensamos. Después de


mover la MU a PickAndPlace, necesita saber qué hacer con la MU. PickAndPlace necesita
un Método para determinar el Objetivo de una MU que ha recogido. Comenzamos la
siguiente tarea con la creación de dos SingleProcs más que son los posibles destinos de
nuestras MU, una vez recogidas por PickAndPlace.

Tarea: Completando el PickAndPlace


1. Cree dos SingleProcs nuevos y un Buffer nuevo en su Frame AssemblyStation.
2. Establezca el tiempo de Dwell del Buffer en 0 y configure su capacidad en 4.
3. Lugar y nombre en consecuencia:

4. Configure el tiempo de procesamiento de WeldStation1 a Gamma (100, 1.5) y de WeldStation2 a


Gamma (80, 1.25).
5. Cree un nuevo Método en el Panel de control y asígnele el nombre PickAndPlaceDest.
6. Establezca el nuevo Método como Destino para su PickAndPlace, el Objetivo se puede encontrar
en la pestaña Controles.
7. Ingrese el siguiente código en su Método:

8. Haga doble clic en PickAndPlace y haga clic en la casilla junto al botón Angles Table para
desactivar la herencia.
9. Haga clic en el botón Tabla de ángulos e ingrese lo siguiente:

140
10. Establezca el factor de tiempo en 5.
11. Presione OK, restablezca y finalmente ejecute su modelo hasta que Weldstation1 y
Weldstation2 estén llenos.
12. Para una animación más realista, marque la casilla Tiempo real en el EventController. Esta
función permite que la simulación funcione igual de rápido en todo momento en lugar de saltar de
un evento a otro. El tiempo detrás de Tiempo real indica cuánto más rápido debe ejecutarse
preferiblemente la simulación (si lo permiten los tiempos de cálculo requeridos) luego el tiempo
real. Para fines de animación, complete un valor de, por ejemplo, 25. No olvide desactivar esta
funcionalidad cuando realice experimentos para acelerar el tiempo de simulación.

El PickAndPlace que utilizamos también podría modelarse con un SingleProc y un


Método, pero PickAndPlace tiene un atractivo visual más sólido tanto en 2D como en 3D.
Después de que los motores pasaron por las estaciones de soldadura, viajan a través de
nuestras instalaciones de producción en un vehículo automatizado que puede
transportar una paleta a la vez. El vehículo automatizado necesita una pista para seguir
adelante.

Tarea: Crear un seguimiento


1. Cree una Pista alrededor de los objetos que construyó previamente usando el siguiente diseño y
usando la configuración como se menciona en el próximo paso.

2. La Pista comienza con un segmento recto con un ángulo tangencial de 90 grados, todos los
demás segmentos tienen un ángulo tangencial de 0 grados, ver la siguiente figura:

141
3. Cree un Método en el Panel de control y llámelo SensorCheckTrack.
4. Cree un búfer al final de la pista, cambie el nombre a BufferAssemblyLine, establezca el tiempo
de permanencia en 0 y establezca su capacidad hasta el infinito.
5. Cree dos sensores, uno a 1.6 metros desde el principio y otro a 53 metros, y establezca su
Method SensorCheckTrack como control para ambos.
6. Ingrese el siguiente código en SensorCheckTrack (consulte también el código en el Apéndice) e
intente comprenderlo:

La Pista en sí ya está lista, pero faltan dos cosas para que funcione correctamente. Lo
primero que falta es un vehículo para moverse en la Pista. En la Pista, una MU del tipo
Transporter puede moverse por sí misma. En SensorCheckTrack, el @ que activa el
sensor es un MU del tipo Transporter. Al cambiar los atributos detenidos y retrocedidos,
puede controlar el movimiento de la MU. Al igual que con las otras MU usadas hasta
ahora, un Transporter se crea durante una ejecución y no se modela antes de que
comience la simulación. Finalmente, necesitamos un gatillo para reactivar el movimiento
del Transportador.

142
Tarea: Crea un carro
1. Duplique el Transporter MU.
2. Cambie el nombre del duplicado al carro.
3. Agregue la siguiente línea al método CreateObjects:
.MUs.Cart.create (root.AssemblyStation.Track, 1.6)
4. Cree un Método en su Panel de Control y renómbrelo a ExitTrackBuffer.
5. Ingrese el siguiente código:

6. Establezca el método ExitTrackBuffer como control de salida para su TrackBuffer.


7. Restablezca y ejecute su modelo para asegurarse de que Track y Cart funcionen correctamente.

Ahora, cada vez que llamamos a Method Init, se llama al método CreateObjects y se crea
un carro en la pista en el punto de 1,6 metros. Tenga en cuenta que si elige crear una
MU de esta manera, debe elegir un punto que pueda contener la longitud total de la MU
elegida. Si usa una MU de 2 metros de largo en el punto de 1,6 metros, no se creará.

¿Sabía que…?
Si no desea que sus MU giren de acuerdo con la dirección de su objeto orientado a la longitud, puede
desactivarlo en el menú de la Pista o Línea correspondiente.

8.3 La línea de montaje del motor


En esta sección vamos a construir la parte final de nuestra fábrica, a saber, la línea de
montaje para los diversos motores que produce la fábrica. La línea de montaje consiste
en un cinturón de transporte (la línea), varios lugares de trabajo a lo largo de la línea
donde se ensamblan varias partes para los motores y empleados (Trabajadores) que
trabajan en estos lugares de trabajo. Primero, creamos la línea y los lugares de trabajo.

143
Tarea: Comience a construir la línea de montaje
1. Inserte 7 SingleProcs en la AssemblyStation y asígneles los siguientes nombres:
- Batería electrica
- Pistones
- Carburador
- Bujía
- Enfriamiento
- Filtro de aire
- Turbo
Tenga en cuenta que estas estaciones tendrán muchas propiedades y atributos en común. Si
desea trabajar de manera eficiente, puede hacer uso de la herencia.
2. Configure el Tiempo de procesamiento de cada SingleProc como Fórmula y use el atributo
relevante de MU como entrada. Para ElectricalBattery, sería de la siguiente manera:

3. Inserta un objeto Drain y nómbralo Exit.


4. Ahora conectaremos las SingleProcs recién colocadas utilizando Lines.
5. Cree 6 líneas rectas separadas, que tengan las siguientes especificaciones: Longitud = 5 m,
Velocidad = 0.2 m / s, y Capacidad = 2.

6. Crea dos líneas que son una combinación de un segmento curvo y uno recto. Haga clic en el
símbolo de línea de la barra de herramientas y asígnele las siguientes especificaciones:

144
7. Mientras trabaja con Ctrl-Key, cree las dos líneas combinadas como se muestra en la siguiente
figura de la línea de ensamblaje:

Tenga en cuenta que las líneas se deben conectar a SingleProcs, la primera línea también se
debe conectar a BufferAssemblyLine, y la última línea se debe conectar a Exit. Recuerde que
puede rotar objetos físicos usando Ctrl-T.
8. Establezca la velocidad de las dos líneas combinadas a 0.2 m / sy la capacidad a 2.

Ahora hemos vinculado los fundamentos básicos de nuestra línea de montaje. El


siguiente paso es crear los lugares de trabajo y el entorno de trabajo para los
trabajadores que van a armar los motores. Por lo tanto, presentamos los siguientes
objetos relacionados con el trabajo.

Worker. Obrero. El objeto Worker representa a una persona trabajadora que


realiza trabajos en un lugar de trabajo. Puede configurar varios ajustes relacionados con
el trabajador, por ejemplo, sus especialidades (tipo de trabajos que puede realizar) y
capacidad (cuántos trabajos puede realizar).

Workplace. Lugar de trabajo. El objeto Lugar de trabajo es el lugar real en una


estación donde el Trabajador realiza su trabajo. Es posible asignar Workplace a varios

145
objetos de flujo de materiales, como SingleProcs. El trabajador permanece en el lugar de
trabajo mientras realiza un trabajo, y como máximo un trabajador puede permanecer en
el lugar de trabajo en cualquier momento.

WorkerPool. Los trabajadores se crean en el objeto WorkerPool y permanecen en


este objeto cuando no hay trabajos para realizar.

Footpath. Sendero. En el objeto Sendero, los trabajadores se mueven entre el


lugar de trabajo y el WorkerPool. El tiempo requerido para el movimiento (por ejemplo,
caminar entre máquinas) se define por la longitud del Camino y la Velocidad del
trabajador.

Broker. Corredor. El objeto Broker es el intermediario entre los objetos que exigen
un servicio y los objetos que lo suministran. Este objeto asigna los trabajadores a los
diversos lugares de trabajo, dependiendo de sus especialidades, esta asignación se
realiza en función de las reglas definidas por el usuario y no consiste en ninguna forma
de optimización.

Tarea: Crear el Ambiente de Trabajo


1. Inserte un objeto Workplace en cada SingleProc (7 en total).
2. Nómbrelos respectivamente (de acuerdo con el SingleProc ubicado más cercano):
WPElectricalBattery, WPPistons, WPCarburetor, WPSparkplug, WPCooling, WPAirfilter y WPTurbo.
3. Conéctelos a la estación correspondiente haciendo doble clic en el objeto Lugar de trabajo y
debajo de la pestaña Atributos seleccionando la estación correcta (o arrastre el Lugar de trabajo
sobre el SingleProc correspondiente).

4. Inserta un WorkerPool.
5. Para permitir a los trabajadores moverse entre lugares de trabajo y WorkerPool, necesitamos
crear FootPaths.
146
6. Crea 6 FootPath horizontales con una longitud de 5 m.
7. Crea 6 FootPath verticales con una longitud de 5 m.
8. Cree 1 FootPath horizontal con una longitud de 1 m.
9. Conecte FootPaths con Workplaces y WorkerPool como se indica en la figura a continuación.
Tenga en cuenta que los trabajadores deberían poder caminar más allá de los lugares de trabajo
ocupados.

10. Inserta un Broker.


11. Haga doble clic en WorkerPool y configure Broker como Broker para WorkerPool.
12. Debemos indicar que las estaciones de trabajo requieren un Trabajador para el procesamiento
de la MU. En cada estación de trabajo (7 SingleProcs), vaya a la pestaña Importador, establezca el
Importador en Activo e indique que el intermediario es el intermediario que insertó en su Frame.

13. En cada estación de trabajo (7 SingleProcs), vaya a Importador de pestañas y configure los
Servicios de configuración y procesamiento para los Pistones SingleProcs, SparkPlug, Cooling y
AirFilter en Basic con importe 1 (es posible que deba desactivar la herencia para este atributo).

147
14. Haz lo mismo para las otras estaciones, pero luego usa Expert for Service, con la cantidad 1.

Ahora hemos establecido el ambiente de trabajo para nuestros trabajadores y lo único


que falta son los propios trabajadores. En la próxima tarea, vamos a establecer la fuerza
de trabajo para nuestra estación de ensamblaje.

Tarea: Crear la fuerza de trabajo


1. Duplique un Trabajador en la Biblioteca de clases y renómbrelo Ingeniero.
2. Establezca la velocidad de marcha del Ingeniero en 1,38 m / s (haga doble clic en los atributos de
la pestaña).
3. Obtenga dos Trabajadores del Ingeniero en la Biblioteca de Clases y cámbieles el nombre a
Senior y Junior, respectivamente.
4. Cree iconos para el Ingeniero Senior y el Ingeniero Junior que le permita distinguirlos
visualmente. Es posible que deba desactivar la herencia de la imagen. Tenga en cuenta que el
ícono del trabajador tiene múltiples versiones según el estado del trabajador (Operacional, Fallido,
Pausa y Trabajo).
5. Tenemos que indicar qué servicio puede proporcionar el trabajador, que debe indicarse en la
pestaña Atributos del trabajador.
6. Haga doble clic en Senior Worker y haga clic en el botón Servicio en la pestaña Atributos.
7. Indique que el trabajador principal proporciona el servicio experto y básico.

8. Repita los pasos para el trabajador menor, pero declare que solo proporciona el servicio básico.
9. Haga doble clic en WorkerPool y configure CreationTable para generar dos Senior Workers y dos
Junior Workers.
10. Establezca la Eficiencia del Trabajador Senior al 100% y la Eficiencia del Trabajador Junior al
80%.

11. Para permitir que un trabajador trabaje y se mude al lugar de trabajo, debemos indicar qué
servicios son compatibles con el lugar de trabajo.
12. Haga doble clic en el objeto WPElectricalBATtery, haga clic en el botón Servicios admitidos y
agregue el servicio admitido Experto. Haga lo mismo con WPCarburetor y WPTurbo.
13. Dé a las otras estaciones el servicio soportado Básico.
14. Pruebe su modelo y verifique si funciona sin errores.
148
Puede haber notado que algo extraño ocurrirá en la configuración actual de su modelo si
siguió el tutorial correctamente. En un momento determinado, alrededor del día 20
(≈10,000 / (24x60)), se acabarán las Tablas en las que almacena sus Motores. Tendremos
que escribir un método que garantice que las tablas se devuelvan a la tienda donde se
pueden reutilizar.

Tarea: Devolviendo las tablas


1. Inserta un Método en tu Frame Control Panel y cámbiale el nombre a ReturnTables.
2. Inserta el siguiente código:

3. Establezca el Método como el Control de Salida para la línea final (línea después de la estación
Turbo).

A continuación, necesitamos hacer un seguimiento de los tiempos de espera de los


motores en las diferentes estaciones.

Tarea: Determinando el tiempo de espera


1. Inserte dos métodos en su Frame Control Panel y cámbieles el nombre a EntryStation y
ExitStation.
2. Inserta el siguiente código en EntryStation:

3. Inserta el siguiente código en ExitStation:

4. Intente comprender el código de EntryStation y ExitStation. Si no comprende el código, puede


actualizar su conocimiento en el identificador anónimo. en la Sección 4.2.
5. Configure los métodos EntryStation y ExitStation como control de entrada y salida
respectivamente para cada una de las siete estaciones de procesamiento en la línea de ensamblaje
del trabajador. Asegúrese de que el Control de Salida sea activado por la parte posterior de la MU
(de lo contrario, debemos especificar, dentro de Method ExitStation, que la MU debe continuar al
siguiente objeto).

149
La razón por la que necesitamos establecer el control de salida en la parte posterior y no
frontal es que en el último caso Plant Simulation también llama al Método cuando la MU
intenta salir de la estación mientras que su sucesor (Línea) está lleno. En este caso, el
MU espera hasta que haya espacio en el siguiente objeto, sobre el cual se llama
nuevamente al Método, lo que da como resultado un cálculo incorrecto de los tiempos
de espera. Establecer el control de salida en la parte trasera asegura que el Método solo
se invoque cuando la parte posterior del MU sale de la estación, esto solo ocurre cuando
es posible mover el MU a la Línea siguiente.

8.4 Shift Calendars (Calendarios de turno)


Los ShiftCalendars son una forma fácil de incorporar turnos para objetos de flujo de
materiales y trabajadores. Se pueden crear varios cambios por ShiftCalendar y para cada
Tipo de trabajador puede definir qué cambios funcionan. Los objetos también pueden
funcionar en turnos completamente diferentes, pero necesitan un ShiftCalendar
específico por conjunto de turnos para hacerlo. Si un cierto conjunto de máquinas A
trabaja cambia 1, 2 y 3 y el conjunto de máquinas B trabaja cambios 4 y 5, necesita dos
Mayúsculas: uno para los turnos 1, 2 y 3 y uno para los turnos 4 y 5. En las siguientes
tareas se familiarizará con los conceptos básicos del ShiftCalendar. En la siguiente
sección, presentaremos en breve la simulación 3D. En aras de la simplicidad, no
continuaremos al siguiente capítulo con ShiftCalendars o 3D en el modelo, sino que
continuaremos con el modelo tal como está en este momento.

150
Tarea: Crear un calendario de turnos
1. Guarde su modelo actual y cree un archivo guardado por separado para incorporar los cambios
de esta y la siguiente sección.
2. Agregue un ShiftCalendar a su ControlPanel.
3. Haga doble clic en ShiftCalendar, aparecerá la siguiente pantalla:

4. Edite los turnos, para que ambos también cubran los sábados y domingos, simplemente
marcando las casillas correspondientes (es posible que deba desactivar la herencia de este
atributo).
5. Cambie la hora de inicio de Shift-1 a 5:00 y su hora de finalización a 13:00.
6. Haga clic en Aceptar para confirmar los cambios realizados y salga de esta pantalla.

El ShiftCalendar ahora contiene los cambios correctos, pero el modelo todavía no está
siguiendo estos cambios porque necesitamos definir qué objetos funcionan solo dentro
de estos cambios. También tenga en cuenta cómo puede definir Pausas, ingresar una
hora de inicio y una de finalización para su pausa y separarlas con un guión. Si desea
ingresar otra pausa, simplemente agregue un punto y coma y repita los mismos pasos. Si
desea que ShiftCalendar controle un objeto "no trabajador", simplemente puede agregar
este objeto "arrastrando y soltando" a la pestaña de recursos del ShiftCalendar.

Tarea: Create shifts for the Source (Crear turnos para la Fuente)
1. Haz doble clic en tu ShiftCalendar.
2. Haz clic en la pestaña Recursos.
3. Arrastre el origen (desde su modelo, es decir, desde la estación de ensamblaje de cuadro
colocada en el RootFrame) al campo blanco debajo de los objetos. Debe tener un aspecto como
este:

Alternativamente, podría haber definido ShiftCalender en la pestaña Control en el objeto


PartSource.
4. Haga clic en Aceptar para confirmar los cambios realizados y salga de esta pantalla.

151
5. Ejecute el modelo por 10 días. Tenga en cuenta que ahora la fuente solo genera motores
durante los cambios definidos. Al habilitar el Bloqueo en la pestaña Atributos de PartSource, la
fuente generará Motores en todo momento y los almacenará hasta el comienzo de un turno, en el
que se proporcionará un lote de Motores al PartBuffer.

Para controlar los turnos de Trabajadores, ingrese el WorkerPool como objeto en la


pestaña Recursos en el ShiftCalendar. Abra el tipo específico de Trabajador en la
Biblioteca de clases y especifique los cambios que debe realizar el Trabajador. Si un tipo
de Trabajador funciona más de un turno, separe los nombres del turno con un punto y
coma. Si no especifica turnos, un trabajador trabaja cada turno disponible en el
ShiftCalendar que controla su WorkerPool.

Nota:
Cuando haya especificado un turno y este finalice mientras el proceso está en curso, el proceso se
pausará y continuará cuando el recurso requerido (en este caso, un Trabajador) vuelva a estar
disponible. Hasta entonces, la MU está esperando y la máquina estará en el estado En espera de un
exportador, mostrando un LED naranja.

8.5 Modelado 3D
Es posible construir modelos 3D completamente nuevos usando sus propias formas 3D
de MU y otros objetos. Si tiene curiosidad sobre lo que es posible, eche un vistazo al
ejemplo: 3D Carbody (en la página de inicio de simulación de planta seleccione Modelos
de ejemplo> 3D Carbody). En este tutorial, simplemente explicaremos cómo convertir su
modelo 2D existente en un modelo 3D y cómo navegar alrededor de su modelo 3D.

Tarea: Crear un modelo 3D


1. Abra su instancia de AssemblyStation (ubicada en RootFrame).
2. Presione el botón Abrir 2D / 3D y elija Sí en la ventana de diolag que aparece.

3. Ejecute su modelo a una velocidad razonable, para que pueda ver todos los objetos en acción.
Para propósitos de animación, puede ser conveniente activar la opción en tiempo real en
EventController (ver Sección 8.2).

Hay varias formas de navegar alrededor de un modelo 3D, explicaremos cómo hacerlo
utilizando el mouse.
• Para acercar o alejar, simplemente use su rueda de desplazamiento.
• Para navegar por su modelo, mantenga presionado el botón derecho del mouse
y mueva el mouse.

152
• Para cambiar su punto de vista, mantenga presionados ambos botones del
mouse y mueva su mouse.
No es necesario guardar este modelo; Los modelos 3D son mucho más grandes que los
modelos 2D, ya que se crea una Biblioteca 3D completa.

153
8.6 Crear un panel de control para experimentar
Hemos creado un modelo de fabricante de motores de automóviles, pero para ver
cuáles son las configuraciones ideales para la línea de ensamblaje, tenemos que realizar
experimentos. Para gestionar adecuadamente los experimentos, tenemos que
completar el panel de control. En el Capítulo 5, hemos utilizado el ExperimentManager
para realizar experimentos, pero también es posible controlar los experimentos usted
mismo. Aquí controlaremos los experimentos haciendo uso de TableFiles, Variables y
Methods. Si desea actualizar su memoria sobre el uso de TableFiles para rastrear objetos
y escribir datos en ellos, consulte el Capítulo 4. En el Capítulo 9 desarrollaremos más
sobre diferentes técnicas para analizar su modelo y realizar experimentos.
Para propósitos 3D, hemos creado la línea de ensamblaje en un marco, que es una
buena forma de presentar un modelo a un cliente. En este capítulo, mejoraremos aún
más el panel de control, creando supervisión y agregando variables que controlan
diferentes configuraciones. Al final de este capítulo, su panel de control se verá similar a
la siguiente figura:

You can use the Vector Graphics Mode to draw rectangles for organizing your model. You can access this
mode by clicking on Vector Graphics in the Ribbon while you have opened your Frame.

154
Nota:
Mientras que el Modo de gráficos vectoriales está activo, no puede mover ni cambiar objetos. Para
salir del modo de gráficos vectoriales, vaya a un menú diferente en la cinta de opciones. El modo de
gráficos vectoriales le permite dibujar:
• líneas
• elipses
• elipses llenas
• rectángulos
• rectángulos llenos
• cajas de texto
Puede trabajar en varias capas diferentes u objetos de grupo (objetos del modo gráfico vectorial en
este caso) juntos. El modo de gráficos vectoriales es una excelente manera de organizar modelos.

Tarea: Organizar el panel de control


1. Abra su modelo original como resultado del final de la Sección 8.3, tal como se guardó en el
primer paso de la primera tarea de la Sección 8.4 (sin el calendario de turno y la animación 3D).
2. Dibuje los rectángulos requeridos a través del modo de gráficos vectoriales.
3. Agregue los comentarios (disponibles en Caja de herramientas> Interfaz de usuario).
4. Reorganiza los métodos y objetos que has insertado hasta ahora.

Primero, nos aseguraremos de poder seguir el rendimiento de nuestro modelo. Por ese
motivo, agregaremos un Método y TableFiles que podrán almacenar los Atributos
definidos por el usuario de nuestros Motores.

Tarea: Crear el panel de medición de rendimiento


1. Agregue un Método y tres TableFiles a su panel (área Performance Measurement).
2. Cambie el nombre del Método a WritePerformanceData y cambie el nombre de TableFiles a
RunData, ExpResults y AvgExpResults, respectivamente.
3. Agregue dos variables y renómbrelas EngineCreated y EngineFinished respectivamente.
Establezca su tipo de datos en Integer.
4. Agregue el siguiente código a SensorCheckTrack, en algún lugar alrededor del código donde
también establece los atributos del motor (donde el motor está representado por @ .cont.cont
porque se coloca en una paleta en un transportador):

5. Cree 17 columnas en TableFile ExpResults del tipo de datos Real. A continuación, cree un índice
de columna y copie y pegue los siguientes nombres de columna en el índice de columna (fila 0):

6. Dé a cada columna en TableFile RunData el tipo de datos Real.


7. Proporcione a TableFile AvgExpResults el siguiente diseño (tenga en cuenta los tipos de datos):

8. Inserte el siguiente código en el Método WritePerformanceData (consulte también el código en


el Apéndice) e intente comprenderlo:

155
9. Configure el método como control de entrada para la salida de la línea de montaje.

Vamos a simular múltiples repeticiones de varios experimentos. Como vamos a hacer


esto manualmente sin el uso de ExperimentManager (ver Capítulo 5 y 9), debemos
asegurarnos de que aún mantenemos un registro de los datos que queremos utilizar
para analizar las diferentes configuraciones. Esta información se almacenará en TableFile
AvgExpResults. El siguiente panel que vamos a construir es el panel de Factores de
configuración y experimento.

Tarea: Crear el panel de factores de configuración y experimento


1. Agregue un TableFile con el nombre Configurations y un método con el nombre
SetConfiguration al Panel de configuración y factores de experimento.
2. Proporcione a las configuraciones de TableFile el siguiente diseño:

3. Inserte el siguiente código en Method SetConfiguration.

156
4. Inserte 6 variables para la Configuración, con los siguientes nombres y tipos de datos:
- NrReplications (Integer) con configuración 5.
- LineCapacity (Entero) con configuración 2.
- JuniorCost (Entero) con ajuste 500.
- SeniorCost (Entero) con configuración 1000.
- WarmUpLength (Tiempo) con ajuste 1: 00: 00: 00 (1 día).
- RunLength (Time) con ajuste 5: 00: 00: 00 (5 días).
5. Inserta 4 variables para ser usadas como contadores:
- TotalExp (Entero)
- CurrRun (Entero)
- CurrExp (Entero)
- RunCounter (Integer)

Las variables que agregamos tienen los siguientes propósitos:


- NrReplications: configuración de la cantidad total de replicaciones que desea
usar.
- LineCapacity: capacidad de una sola pieza de la línea de montaje.
- JuniorCost: Costo por 24 horas de personal subalterno.
- SeniorCost: costo para 24 horas de personal senior.
- WarmUpLength: Variable en la que puede establecer la duración de
calentamiento de su réplica.
- RunLength: Variable en la que puede establecer la duración de una replicación
completa.
- TotalExp: la cantidad de experimentos que vas a realizar en tu estudio de
simulación. Esto se establece automáticamente dentro de Method
SetConfiguration.
- CurrRun: Contador para la replicación actual en un experimento.
- CurrExp: contador para el experimento actual de tu estudio de simulación.
- RunCounter: Contador para realizar un seguimiento del número de repeticiones
llevadas a cabo hasta el momento.
El código SetConfiguration se usa para definir todas las configuraciones con un máximo
de 7 empleados de un tipo, un mínimo de 2 empleados en total y con al menos un
senior. Experimentar con todas las configuraciones cuesta mucho tiempo y se puede
imaginar que muchas configuraciones simplemente no son factibles.
El último panel que necesitamos configurar es el panel de control de eventos.

Tarea: Crear el panel de control de eventos


1. Agregue dos métodos y cámbieles el nombre Start y EndSim respectivamente.
2. Inserte el siguiente código en el Método EndSim (consulte también el código en el
Apéndice) e intente comprenderlo:

157
3. Inserte el siguiente código en el Inicio del método (consulte también el código en el
Apéndice) e intente comprenderlo:

158
4. Seleccione Inicio> Objetos> Controles en la cinta mientras se encuentra en la ventana de
diálogo de Inicio del método.

5. En el nuevo diálogo, complete el campo Seleccionar.


6. Dale al Método Comienza un nuevo ícono en el que podrás distinguirlo del resto.
7. Ajuste el código de Method Init a lo siguiente:

8. Ajuste el código del Restablecimiento de método a lo siguiente:

159
9. En EventController, pestaña Configuración, desmarque Mostrar informe de resumen para
evitar recibir un informe después de cada duplicación.
10. Ejecute su modelo usando el método de inicio. Para validar su modelo, puede usar los
siguientes números:
a. Experimento 1: AvgAssemblyTime≈1645 y CostConfiguration = 10,000;
b. Experimento 14: AvgAssemblyTime≈695 y CostConfiguration = 15,000;
c. Experimento 27: AvgAssemblyTime≈960 y CostConfiguration = 20,000.

El método EndSim es, al igual que los métodos Init y Reset, un método que se llama bajo
ciertas condiciones del EventController. Se llama a EndSim cuando se alcanza el tiempo
de finalización de la ejecución de simulación. En nuestro caso particular, EndSim
almacenará los datos de una ejecución de simulación en la tabla
AverageExperimentResults e incrementará los contadores hasta que se completen todos
los experimentos.
Hemos establecido para el Método Comenzar el autocontrol. Esto significa que cuando
hagamos un solo clic en este Método, se ejecutará. En nuestro caso particular,
desencadena la creación de configuraciones, inicializa varios contadores, aplica las
configuraciones de la primera configuración y comienza a ejecutar la primera replicación
de la primera configuración. El Método EndSim activa todas las demás repeticiones y
configuraciones.

8.7 Asignación B2: Período de calentamiento, longitud de ejecución y número de


duplicaciones
La empresa de fabricación de automóviles CeeCar Inc. produce una amplia gama de
componentes de automóviles para otros fabricantes de automóviles. Hasta ahora, la
compañía se ha centrado en componentes de automóviles relativamente pequeños,
como motores de arranque, radiadores y carburadores. Pero recientemente decidieron
expandir su negocio hacia la producción de motores de automóviles totalmente
ensamblados. Ya diseñaron la línea de montaje, pero lo contrataron para proporcionar
información sobre el rendimiento que se puede esperar de este sistema. La compañía
proporciona un conjunto de datos de los tiempos interarrivales de los motores de
automóviles sin montar que llegan a la línea de montaje.

160
Asignación B2.1. Ajuste una distribución de probabilidad al conjunto de datos (vea el
archivo adjunto) usando Excel o un programa de hoja de cálculo similar. Siga el
procedimiento que se muestra en el libro de Leyes (2015): la hipótesis de las
distribuciones, la estimación de los parámetros, la comprobación del ajuste con las
parcelas, la gráfica de QQ y la prueba de bondad de ajuste. Luego, use esta distribución
para los tiempos interarrivales en su modelo de simulación (PartSource).

Asignación B2.2. Realice experimentos para respaldar la toma de decisiones para la


gestión de CeeCar Inc. Para configurar los experimentos, debe distinguir entre los
siguientes pasos (consulte las hojas de conferencias):
a. Determine el tipo de simulación usando el libro de la Ley (2015).
b. Calcule el período de calentamiento requerido utilizando el procedimiento
gráfico de Welch (puede usar la tabla RunData para esto, recuerde primero
establecer la variable WarmUpLength en cero). Motive su elección de
configuraciones de sistema para aplicar este enfoque.
c. Elija el número de ejecuciones y la longitud de ejecución, dado un "enfoque de
replicación / eliminación". Tenga en cuenta que, en lo que respecta al intervalo de
confianza, utilice γ = 0.05 (error relativo permitido) y α = 0.05 (1-α = nivel de
confianza).
d. Analice los resultados considerando los diferentes indicadores de rendimiento
de TableFile AvgExpResults y clasifique los resultados de acuerdo con un indicador
combinado de su elección.
e. Para obtener la mejor y la segunda mejor configuración de sistema como
resultado del paso anterior, compare la diferencia en los resultados usando una
prueba t pareada. ¿Es la diferencia significativa?

Asignación B2.3. Para la configuración de su elección, proporcione información sobre la


utilización de máquinas y trabajadores, y produzca un histograma para la distribución de
los tiempos de entrega de los motores.

Asignación B2.4. Para la Asignación B2.2, se ha supuesto el uso de números aleatorios


comunes (CRN). Estudie el modelo para confirmar el uso de CRN y cambie el código para
desactivar CRN. Estudie la relevancia del uso de CRN para comparar ambas
configuraciones de la Asignación B2.2e. ¿Tiene sentido usar CRN aquí? Motiva tu
respuesta.

Asignación B2.5. Escriba un resumen de gestión para este proyecto (máximo 1 A4). Esto
incluye una breve descripción del sistema, las preguntas de investigación planteadas, la
configuración de la investigación y los principales hallazgos.

161
Entregables:
• Modelos y respuestas a las asignaciones B2.1-B2.5 (incluidos los cálculos y la
motivación).
• Un informe que presenta sus modelos, proporcionando las respuestas y la
motivación, y que contiene el resumen de la gestión. En lo que respecta a los
cálculos, puede consultar los modelos de hoja de cálculo. Por favor agregue estas
hojas de cálculo también.

162
9 Construyendo un Modelo: Optimización de Simulación
Este capítulo explicará algunas de las características extendidas de Plant Simulation. En
primer lugar, ajustaremos ligeramente el modelo que ha creado en el Capítulo 8.
Agregaremos algunas restricciones adicionales al modelo, es decir, que los motores solo
pueden continuar en la línea de ensamblaje en un lote predefinido. Además,
ampliaremos la línea de montaje de modo que se puedan procesar dos MU al mismo
tiempo por estación. Esto también significa que agregaremos un lugar de trabajo
adicional a cada estación para procesar dos MU al mismo tiempo.
En la segunda sección de este capítulo, agregaremos el ExperimentManager al modelo.
En el Capítulo 5 ya hemos presentado el ExperimentManager, y en este capítulo
continuaremos desarrollando ese conocimiento.
En la tercera sección, presentaremos el Algoritmo Genético, para el cual Plant Simulation
tiene una herramienta específica, a saber, GAWizard. Elaboraremos los conceptos
básicos de esta herramienta y algoritmo. Usaremos esta herramienta para determinar
cuál será la mejor secuencia para lanzar los productos (dentro del lote) a la línea de
ensamblaje ya que puede recordar que los diferentes tipos de productos requieren
diferentes pasos de procesamiento.
La sección final trata sobre la optimización de la simulación, que es encontrar las
mejores variables de entrada sin considerar cada posibilidad como lo hemos hecho
previamente. En ExperimentManager predefinirá los experimentos que desea llevar a
cabo, lo que no se considera un enfoque de optimización de simulación. El Algoritmo
Genético es típicamente un ejemplo de Optimización de Simulación. Existe una amplia
gama de algoritmos que puede usar para la optimización de simulación. En esta sección
final presentaremos los conceptos básicos de la construcción de su propio algoritmo,
que puede aplicar para encontrar los mejores parámetros de entrada para su modelo. En
la asignación de este capítulo, deberá construir dicho algoritmo.

Temas tratados en este capítulo:


• ExperimentManager
• GAWizard
• Optimización de simulación

9.1 Ajuste del modelo del Capítulo 8


En esta sección, cambiaremos nuestro modelo, de modo que podamos usar
ExperimentManager y GAWizard para realizar ejecuciones, pero también las ejecuciones
personalizadas del capítulo anterior. Además, haremos algunos ajustes en la línea de
ensamblaje e introduciremos el procesamiento por lotes. Algunos códigos escritos para
el modelo en el Capítulo 8 no se aplican para trabajar con ExperimentManager. Por lo
tanto, hacemos que parte de este código sea condicional sobre si realizamos

163
experimentos como lo hicimos en el capítulo anterior o si usamos el ExperimentManager
o GAWizard.
Ahora comenzaremos a hacer ajustes en el ControlPanel para permitir que el modelo
ejecute experimentos de diferentes maneras. Al final de este capítulo, su ControlPanel
podría verse así:

Tarea: Permitir que el modelo ejecute experimentos de diferentes maneras


1. Agregue nueve variables a su ControlPanel y nómbrelas de la siguiente manera:
AvgAssemblyTime (tipo de datos Real), CostConfiguration (tipo de datos Real), TotalProfit (tipo de
datos Real), CustomRun (tipo de datos Boolean), NrJuniors (tipo de datos Integer), NrSeniors (tipo
de datos Entero), Coste de motor (tipo de datos Entero), Ingreso de motor (tipo de datos Entero)
y Nivel de motor (tipo de datos Real).
2. Establezca el valor de EngineCost, EngineRevenue y EngineLead en 373, 400 y 0.1,
respectivamente. EngineLead representa la pérdida de interés de los motores durante el tiempo
de entrega, y se da aproximadamente por el valor promedio de un motor durante el tiempo de
entrega multiplicado por la tasa de interés diaria (1.1 ^ (1/365) -1).
3. Establezca el valor de NrJuniors y NrSeniors ambos en 2.
4. Abra el Método Restablecer.
5. Agregue el siguiente código:

6. Haga que el código que establece la secuencia de números aleatorios sea condicional en el uso
de CustomRun (experimentos sin ExperimentManager o GAWizard):

7. Abra el Método EndSim y agregue el siguiente código justo debajo de la línea que detiene el
EventController:

164
8. Haga todas las líneas de código en EndSim debajo del código recién insertado condicional en
CustomRun de la siguiente manera:

Tenga cuidado de cerrar esta declaración if.


9. La figura del paso anterior también muestra algunas modificaciones a los indicadores de
rendimiento AvgAssemblyTime y CostConfiguration en la tabla AvgExpResults, y la adición de un
nuevo indicador TotalProfit. Agregue estos cambios a su código también. También agregue una
nueva columna a AvgExpResults y asígnele el nombre TotalProfit con el tipo de datos real.
10. Lo último que necesita cambiar en EndSim es reemplazar las 5 líneas de código relacionadas
con la configuración del trabajador (desde la línea WorkerSetting.create hasta la línea
setCreationTable) con lo siguiente:

11. Intente comprender los cambios que ha realizado en el Método EndSim. Para verificar estos
cambios, puede encontrar el código completo del Method EndSim revisado en el Apéndice.
12. Abre el método Start.
13. Agregue el siguiente código sobre la parte que restablece las tablas de experimento:

14. Reemplace las líneas de código relacionadas con el reinicio de los trabajadores (5 líneas) por:

(más adelante en la Sección 9.2, creamos un nuevo Método para inicializar WorkerPool)
15. Cree una copia del Método Comenzar (haga clic derecho en Inicio y luego haga clic derecho
en otro lugar para eliminar la ventana emergente, luego presione Ctrl-C y Ctrl-V).
16. Cambie el nombre de este método a Start2 y cambie su ícono. Este nuevo Método se utilizará
para inicializar los experimentos antes de usar ExperimentManager o GAWizard.
17. Abra el método Start2.
18. Establezca el valor de CustomRun en false y elimine todos los códigos debajo de la línea que
establece el tiempo de finalización del EventController (código para establecer la configuración,
restablecer los Trabajadores e iniciar la simulación). No haremos uso de estos elementos ya que
los llevará a cabo el ExperimentManager o el GAWizard.
19. Agregue el siguiente código al método WritePerformanceData después de las líneas
requeridas para la verificación del código (esta codificación es necesaria para calcular el tiempo
promedio empleado en la línea de ensamblaje por motor):

165
En la tarea anterior, hemos realizado algunos ajustes en los métodos Start y EndSim que
afectan la inicialización de WorkerPool. El WorkerPool debe establecerse antes de llamar
a EventController.Init (por lo tanto, antes de llamar a los métodos de inicialización). En el
capítulo anterior, lo resolvimos configurando WorkerPool para el primer experimento
dentro del Method Start y para todos los experimentos posteriores en el Method
EndSim (por lo tanto, justo antes de ejecutar el siguiente experimento). Esta opción es
menos adecuada para ser utilizada en combinación con el ExperimentManager y el
GAWizard (Secciones 9.2 y 9.3). Por lo tanto, creamos un llamado InitControl, que es un
método que se llama al comienzo de una ejecución de simulación durante la fase de
inicialización, pero antes de que los objetos se inicialicen y antes de que se ejecuten los
métodos de inicialización. Como se indica en la función de ayuda de Simulación de
Planta, esta opción es particularmente adecuada para cambiar la Tabla de Creación de
Trabajadores dentro de WorkerPool.

Tarea: Configurando un InitControl


1. Crea un nuevo Método y llámalo InitControl.
2. Agregue el siguiente código:

3. Abra el EventController.
4. Haga clic en Herramientas> Editar controles.
5. Asigne el método InitControl a Init:

Ahora comenzaremos a hacer ajustes en la AssemblyStation, lo que requiere una


reorganización de los objetos. El modelo final se verá así:

166
Primero agregaremos los SingleProcs y WorkPlaces adicionales.

Tarea: Objetos adicionales


1. Abra la línea de ensamblaje desde la Biblioteca de clases.
2. Copie cada una de las 7 SingleProcs correspondientes a las 7 estaciones de trabajo en la
línea de ensamblaje (Ctrl-C) y péguelas en el mismo cuadro (Ctrl-V) junto a las estaciones
originales (consulte la figura anterior). Conecte las estaciones copiadas de la misma manera
que las estaciones originales.
3. Copie cada lugar de trabajo y colóquelo junto al lugar de trabajo original y asegúrese de que
estén conectados.

4. Cambie el nombre de cada WorkStation copiada a WorkStation1, y de cada WorkPlace


copiado a WorkPlace1. Conecte los WorkPlaces copiados a las estaciones de trabajo copiadas,
por ejemplo, para WPElectricalBattery1:

5. Abra Method ExitStation en su ControlPanel.


6. Agregue el siguiente código después de ObjString: = ?. name; y trata de entenderlo:

No olvide agregar la variable local requerida (entre is y do).


7. Aplique la misma modificación que en ExitStation a EntryStation.
8. Abra el Método NewPart en su Panel de Control.
9. Multiplique por dos la Mu y la Sigma de la distribución LogNormal (lo que da como
resultado valores de parámetro 2 y 1 como máximo). Deberíamos poder manejar el aumento
en los tiempos de procesamiento dado que doblamos la capacidad en cada estación de
trabajo.

Ahora solo necesitamos agregar la restricción de liberar productos en lotes a la línea de


ensamblaje.

Tarea: Liberación de los productos en lotes


1. Haga espacio entre la línea de soldadura y la línea de ensamblaje (vea la figura del modelo
final).
2. Elimine la conexión entre BufferAssemblyLine y Line1.
3. Agregue un Buffer a Frame AssemblyStation y asígnele el nombre BatchBuffer, use una
Capacidad de -1 y un Tiempo de permanencia de 0.
167
4. Conecte el BatchBuffer con la primera línea de la línea de montaje.
5. Agregue cinco variables a Frame AssemblyStation y asígneles el nombre XV, XW, XX, XY y XZ
con el tipo de datos Integer.
6. Agregue el siguiente código al Restablecimiento de método en el Panel de control:

7. Inserte un nuevo Método en el Panel de control y asígnele el nombre CheckBatch.


8. Agregue el siguiente código a CheckBatch (vea también el código en el Apéndice):

Tenga en cuenta que se requiere parte de este código para GAWizard, que se aclarará
en la Sección 9.3.
9. Establezca este Método como Control de entrada para BufferAssemblyLine.
10. Agregue un TableFile al ControlPanel y asígnele el nombre GAProductSequence.
11. Defina para TableFile GAProductSequence el tipo de datos de su primera columna como
String y asígnele el nombre ObjectType.
12. Complete la columna ObjectType posteriormente con los siguientes datos:
- 6 filas que contienen XV
- 5 filas que contienen XW
- 1 fila que contiene XX
- 3 filas que contienen XY
- 5 filas que contienen XZ
13. En la Tarea B2 al final del capítulo anterior, ha cambiado la tasa de llegada de PartSource.
Establezca el tiempo medio entre las llegadas de parte al valor original de 3 minutos.

168
Ahora hemos ajustado nuestro modelo completamente para hacer uso del
ExperimentManager y el GAWizard sobre el que vamos a elaborar en las siguientes
secciones. Pero primero, validemos su modelo.

Tarea: Validar su modelo


1. Para validar su modelo, establezca WarmUpLength en 1 día, RunLength en 10 días y la
cantidad de repeticiones en 5.
2. Valide sus resultados usando una configuración con 4 personas mayores y sin juniors. Para
evitar ejecutar todas las configuraciones, puede cambiar temporalmente la configuración del
conjunto de métodos, cambiando los límites inferior y superior para las variables i y j.
3. Ejecute su modelo presionando el método Inicio y verifique si hay algún error inesperado.
Los resultados para esta configuración deberían ser aproximadamente:
- EngineCreated = 4800 ((86400/180) * 10)
- EngineFinished = 4800 (debe poder procesar todos los motores entrantes)
- AvgAssemblyTime = 4444
- CostConfiguration = 40,000 ((0 * 500 + 4 * 1000) * 10)

9.2 El administrador de experimentos


El ExperimentManager ya se introdujo en el Capítulo 5. Al igual que el modelo de este
capítulo, el modelo del Capítulo 5 tenía contadores, variables de entrada y ciertos
valores de salida. Usted definió sus propios experimentos al establecer diferentes
valores para las variables de entrada en la Sección 5.8. En el caso de un solo factor, con
un número limitado de valores posibles, podría ser fácil definir todos los experimentos
usted mismo. Sin embargo, en el caso de múltiples factores, el número requerido de
experimentos puede crecer muy rápido, especialmente cuando hay una interacción poco
clara entre las variables de entrada, sin mencionar el uso de variables continuas en lugar
de variables discretas. El ExperimentManager puede ayudarte a definir todos los
experimentos requeridos. Hay tres opciones posibles que revisaremos en esta sección.
Pero primero tenemos que agregar el ExperimentManager.

Tarea: Configurando el Administrador de Experimentos


1. Agregue el ExperimentManager a su ControlPanel.
2. Establezca LineCapacity, NrSeniors y NrJuniors como variables de entrada.
3. Configure AvgAssemblyTime y CostConfiguration como Output Values.

El ExperimentManager ahora define la configuración para LineCapacity, NrSeniors y


NrJuniors, y está listo para ser utilizado. Hay varias opciones para esto, que no
demostraremos con todo detalle ya que hablan por sí mismos. Las tres opciones más
interesantes se muestran en la figura a continuación.

169
La opción de Diseño Experimental de Varios Niveles le permite especificar:
• Un límite inferior para el valor de entrada
• Un límite superior para el valor de entrada
• Un tamaño de incremento para cada variable de entrada

Después de hacer clic en Aceptar, el ExperimentManager genera todos los experimentos


posibles dada su entrada. Aparece una ventana emergente que muestra una advertencia
de que se definen nuevos experimentos y que los experimentos anteriores se
sobrescribirán, si ya se han definido los experimentos. El Diseño Experimental Aleatorio
también le permite ingresar un límite inferior y superior, pero no el nivel de incremento,
ya que todos los valores se determinarán al azar dentro de los rangos definidos. El
diseño experimental de dos niveles solo crea experimentos para un valor mínimo y
máximo de cada factor. Este diseño también se denota por un diseño 2k-factorial.

170
9.3 El algoritmo genético
Como se muestra en la sección anterior, los experimentos de varios niveles pueden
conducir rápidamente a una gran cantidad de ejecuciones de simulación. Especialmente
cuando se considera todas las combinaciones posibles de una gran cantidad de factores
de entrada. La cantidad de ajustes alternativos para simular y comparar podría ser
literalmente de cientos de millas. Mediante la aplicación de los llamados Algoritmos
Genéticos (Georgia, EE. UU.), El número absoluto de experimentos llevados a cabo se
reduce a medida que aún se puede encontrar la posibilidad de encontrar buenas
soluciones. GA es una técnica de optimización general basada en biología y una clase
particular de algoritmos de cálculo evolutivo. El origen de este algoritmo es el proceso
de selección natural: las personas que se adaptaron mejor a su entorno, procrean lo
mejor. También puede ayudarnos a decidir qué opciones del sistema simular, así como
también evaluar y comparar sus resultados.
En los próximos párrafos, comenzando por describir los principios de las AG con más
detalle y señalar las características de los problemas adecuados para tratar con las AG.
Posteriormente, ampliamos el modelo que creamos hasta ahora mediante la
implementación de GAWizard of Plant Simulation un nuevo problema de optimización
que surge. En el modelo, nos limitamos a implementar solo un problema de
optimización, aunque GAWizard se puede usar para más tipos de problemas de
optimización, como más adelante.
El algoritmo GA comienza con una población inicial de soluciones. Una solución junto
con el valor de la solución correspondiente se llama individuo. Solo la solución, por lo
tanto, sin valor de solución, se llama cromosoma. El valor de solución de un individuo se
denota por valor de aptitud. La población de individuos. Al considerar los valores de
capacidad de todos los individuos dentro de una generación, el algoritmo realiza todo
tipo de operaciones para crear una nueva generación. Estas nuevas soluciones se
denotan por descendencia, mientras que los individuos de la generación anterior son
indicados por los padres. Obviamente, cuanto mayor es el valor de la capacidad de un
individuo, más posibilidades tiene de reproducirse.

Offspring se forma mediante el uso de varios operadores. A partir de (la mayoría de las
veces) una probabilidad de ocurrencia alta a baja, estos operadores son:
• Selección, cuanto más apropiado sea una solución individual, más veces será
seleccionado para reproducirse.
• Crossover, un intercambio aleatorio entre dos cromosomas para crear
descendencia
• Inversión, invierte la secuencia de un cromosoma dentro de un rango definido
• Mutación, un giro aleatorio dentro de un cromosoma

171
El tamaño de las personas en una generación es limitado. Como resultado, la generación
padre muere y la generación descendiente se está convirtiendo en la nueva generación
principal. La siguiente figura ilustra gráficamente la idea de evolución básica.

Por lo general, el proceso de creación de nuevas generaciones se realiza hasta que se


cumpla una de las siguientes condiciones:
• Se alcanza el umbral de tolerancia
• Ha pasado el número máximo de generaciones
• La cantidad máxima de tiempo computacional ha pasado
• El valor de la aptitud se ha estabilizado

Los GA brindan buenas soluciones para problemas complejos, pero no garantizan que se
encuentre un óptimo global. Los GA son menos adecuados para problemas de
optimización que tienen unos pocos picos estrechos (buenas soluciones) y muchas
172
soluciones con valores de aptitud física casi similares, ya que la aptitud no dirige el
algoritmo hacia los picos en la mayoría de los casos. Por otro lado, GA será efectivo en
situaciones con picos múltiples con valores de aptitud similares. Como se menciona en
los archivos de ayuda de Plant Simulation (Ayuda de referencia de complementos>
Algoritmos genéticos> Algoritmos genéticos y Simulación> Tareas de optimización), los
problemas típicos para los que las GA se consideran un enfoque de solución adecuado se
caracterizan por:
• Espacio de solución complejo y grande, como problemas de optimización
combinatoria
• Características desconocidas del espacio de la solución
• Discontinuidades dentro del espacio de soluciones que no permiten la
optimización matemático-numérica
• Muchas restricciones blandas, que son restricciones que no necesariamente
deben mantenerse, pero que conducen a peores resultados
Ahora que conocemos los conceptos básicos sobre GA y GAWizard, implementaremos
GAWizard en nuestro modelo. La ventana de diálogo de GAWizard tiene la siguiente
interfaz:

En la próxima tarea estableceremos las configuraciones correctas para determinar cuál


es la mejor secuencia para liberar nuestros productos (dentro del lote) a la línea de
montaje.

173
Tarea: Implementando el GAWizard
1. Agregue GAWizard (desde la Biblioteca de clases en Herramientas) al Panel de Control.
2. Los factores de entrada y salida se pueden importar para GAWizard de manera similar a
ExperimentManager. Mantenga presionada la tecla Mayús y arrastre y suelte la tabla
GAProductSequence al GAWizard. Si ahora abrimos la tabla de Secuencia, podemos ver que hay
dos columnas agregadas: Origen y Chrom. La columna Origen consiste en la secuencia de fila
original y la columna Chrom contiene la secuencia que pertenece a un individuo en particular.
Más adelante mostramos que GAWizard cambia esta secuencia.
3. Abra GAWizard y haga clic en Abrir al lado del parámetro Optimización. Se muestra una tabla
que presenta la definición del problema para GAWizard. Esta tabla debe verse de la siguiente
manera:

4. Arrastre y suelte el AvgAssemblyTime al GAWizard (sin mantener presionada la tecla Shift).


Verifique si esta variable se incluye dentro del cálculo de la aptitud abriendo la tabla de cálculo de
la condición física dentro de GAWizard:

5. Abra GAWizard y establezca el número de generaciones en 3, el tamaño de generación en 4 y


el número de observaciones por individuo en 3. Deje la dirección de optimización al mínimo y
presione el botón Aplicar. Tenga en cuenta que establecemos los parámetros de GA
relativamente bajos a propósito para ilustrar la idea. Tenga en cuenta que si obtiene un error que
indica "Directorio HTML incorrecto" después de presionar el botón Aplicar, vaya a la pestaña
Miscelánea y desmarque la casilla antes de "Guardar el informe después de ejecutar el
experimento".
6. GAWizard solo optimiza la secuencia del producto. Necesita configurar los otros factores
experimentales a mano. Establezca el valor de las variables NrJuniors, NrSeniors y LineCapacity en
0, 4 y 2, respectivamente.
7. Primero haga clic en el método Start2 para restablecer los experimentos. A continuación, vaya
a la pestaña Ejecutar de GAWizard, haga clic en Restablecer y luego en Iniciar para comenzar la
optimización. Podrían pasar unos minutos antes de que GAWizard haya terminado.
8. Una vez finalizado GAWizard, un cuadro de diálogo muestra la hora y usted puede analizar el
comportamiento de los parámetros en el informe HTML (presione el botón Mostrar en la pestaña
Evaluar). Debería ver una figura similar a esto:

174
Los mejores parámetros de entrada se establecen en el modelo, la solución correspondiente se
puede encontrar en la tabla GAProductSequence. Si desea volver a la configuración inicial,
simplemente presione el botón Restablecer en GAWizard en la pestaña Ejecutar (la secuencia de
la columna Origen se restaurará).
Podemos detener la ejecución de optimización después de que los individuos de la generación
activa se hayan evaluado por completo y luego modificar la configuración y los parámetros del
objeto GAWizard. De esa manera, podemos decidir después de un tiempo, por ejemplo, agregar
más generaciones o aumentar la probabilidad de un cruce. Para detener la ejecución de
simulación durante la optimización de GA, podemos hacer clic en Detener en la pestaña Ejecutar.
Mientras todavía haya personas evaluadas de la generación investigada actual, el botón muestra
Wait. Cuando finalicen estas evaluaciones, podremos modificar los parámetros y presionar
nuevamente el botón de Comenzar.

¿Sabía que…?
En la primera generación, Plant Simulation evalúa el número de generaciones que ha ingresado en el
asistente como el tamaño de la generación. En cada una de las siguientes generaciones, GAWizard
evalúa el doble de personas. Además, es posible que también necesite varias observaciones para
evaluar los valores de condición física de manera apropiada. Cuando, por ejemplo, utiliza 5
observaciones para evaluar a un individuo y crea 100 generaciones con un tamaño de generación de
30, Plant Simulation tiene que ejecutar 5970 ejecuciones de simulación (5 * (30 + 2 * 30 * 99)).

Como habrás notado, puedes cambiar muchas configuraciones en GAWizard. Los


aspectos modificables no se limitan a establecer el número de generaciones, el tamaño
de las generaciones y las observaciones por individuo solamente. Con respecto a la
salida (definida en el cálculo de la aptitud), puede tener un TableFile definido con sus
factores o crear un Método propio para definir un factor de salida. En TableFile puede
dar pesos de factores de salida. Para los factores de entrada, también puede usar un
TableFile o Method.
Para modificar la configuración de GA, como las reglas de selección, puede abrir
GAWizard, abrir la pestaña Objetos y acceder a GA Control. Si desea ajustar
configuraciones más avanzadas de la GA, puede abrir la pestaña Controles en GAWizard
o presionar la tecla ALT mientras hace doble clic en GAWizard en su Marco. La última
175
opción revela el marco subyacente de GAWizard. Requiere un poco más de comprensión
de cómo funciona la GA, pero para realizar modificaciones debe mirar los objetos
GAAllocation, GAOptimization y GASequence (ocultos en SeqLoc).

¿Sabía que…?
Plant Simulation contiene innumerables ejemplos interesantes sobre cómo trabajar con GAWizard.
Para examinar estos ejemplos, abra Plant Simulation para mostrar la página de inicio. En esta página,
selecciona Ejemplos / Infos debajo del título Iniciando. Desplácese hacia abajo a los ejemplos de
modelado conciso y haga clic en la colección de ejemplos. Elija como categoría Herramientas y
optimización, con como tema Algoritmos genéticos. Varios ejemplos están expuestos allí. Además, en
la pantalla de Ejemplos / Infos, el modelo de optimización de fecha de vencimiento presentado en
Modelos de ejemplo también hace uso de GAWizard. Para sus modelos de simulación, puede
inspirarse con estos ejemplos.

La tarea de optimización que hizo se puede describir como una tarea de secuencia.
GAWizard también se puede usar para tareas de asignación y selección. Cuando arrastra
y suelta objetos en GAWizard, automáticamente sabe qué tipo de tarea debe realizar. En
una tarea de secuencia, se varía una secuencia (almacenada en una lista) para cada
experimento para determinar un óptimo. Además, puede definir restricciones de
posición para cada elemento de la secuencia al ingresar las posiciones permitidas para
cada elemento en la secuencia de objeto GAS en GAWizard. Por ejemplo, puede definir
que el producto X debe ser el primero en la secuencia en todos los casos. Una tarea de
asignación asigna valores numéricos entre los valores mínimo y máximo. Un ejemplo de
este tipo de tareas es la asignación del tamaño del búfer. Puede insertar fácilmente
estos factores de entrada arrastrando y soltando, insertando manualmente a través de
la tabla de parámetros de optimización o configurando su propio Método. La tarea de
optimización de selección funciona casi de manera similar a las tareas de asignación; sin
embargo, ahora existe un número predefinido de factores de entrada alternativos que
no necesariamente tienen valores numéricos, pero que también pueden ser categóricos.
Por ejemplo, puede arrastrar y soltar (con la tecla shift) un objeto Clasificador en
GAWizard y elegir la propiedad de pedido. Luego debe definir los valores posibles que
puede tomar en la tabla de entrada. También se pueden implementar tareas más
avanzadas (optimización combinatoria) como tareas de selección. En última instancia, la
principal ventaja de GAWizard es su amplia aplicabilidad y facilidad de implementación.

¿Sabía que…?
En principio, puede definir tareas de secuencia y asignación como tareas de selección. Esto tiene
ventajas, pero también algunos inconvenientes. Dejamos que usted investigue esta diferencia al
explorar la documentación de ayuda de Plant Simulation. Recomendamos que si tiene tareas (simples)
de secuencia o asignación, debe implementar estas tareas como tales y no como tareas de selección.

176
9.4 Optimización de simulación
En Simulation Optimization, buscamos la mejor configuración de variables
experimentales dado un presupuesto limitado con respecto al tiempo de cálculo. Con
respecto a esto último, queremos gastar nuestro tiempo de computación sabiamente
explorando todo el espacio de búsqueda sin perder demasiado tiempo en
configuraciones no prometedoras.
Hasta este punto, diseñamos tres formas de realizar experimentos:
1. Experimentación utilizando el Método EndSim en combinación con una tabla
Configuraciones.
2. Experimentación con el ExperimentManager.
3. Experimentación con el GAWizard.
En las dos primeras opciones, definimos todos los experimentos de antemano,
independientemente de la calidad de su solución. En la última opción, los experimentos
no están predeterminados, pero la búsqueda se dirige a soluciones prometedoras a lo
largo de las generaciones. Sin embargo, la tercera opción aún asume una longitud de
ejecución igual y la misma cantidad de repeticiones por configuración experimental.
Obviamente, tendría sentido dejar esto depender de la calidad de las soluciones
encontradas hasta ahora. Por ejemplo, una vez que podríamos decir con cierta confianza
que una configuración dada es peor que una configuración evaluada anteriormente,
podríamos dejar de simular esta configuración. Otra cosa que no consideramos hasta
ahora fue optimizar todos los ajustes experimentales simultáneamente. En las dos
primeras opciones, solo variamos la cantidad de trabajadores. En la tercera opción, solo
optimizamos sobre la secuencia de ensamblaje.
En el resto de esta sección, mostramos (i) cómo se puede extender la tercera opción
agregando los factores experimentales restantes, y (ii) cómo se puede usar la primera
opción para determinar la configuración experimental sobre la marcha.

Tarea: Extendiendo el GAWizard


1. Mantenga presionada la tecla Mayús y arrastre y suelte las variables NrJuniors y NrSeniors al
GAWizard.
2. Cambie el valor del objetivo en GAWizard abriendo la tabla en Cálculo de condición física en la
pestaña Definir y reemplazar AvgAssemblyTime con TotalProfit.
3. En la misma pestaña, configure la dirección de optimización en Máximo (confirme con Aplicar).
4. Abra el Método EndSim.
5. Cambie la línea de código para calcular TotalProfit asegurándose de que los valores negativos
se establezcan en cero, utilizando max (0, ...), porque GAWizard no puede manejar valores
negativos.
6. Ejecute GAWizard. Al ejecutar GA durante 10 generaciones, con un tamaño de generación 5 y
observaciones por individuo 5 (confirme con Apply), los resultados podrían ser algo como esto
(tiempo de ejecución de aproximadamente 10 minutos):

177
La experimentación con GAWizard también se puede realizar por etapas. Por ejemplo, al
usar la configuración de la tarea anterior, primero podría realizar una ejecución para,
digamos, 10 generaciones. Luego observe la mejor secuencia resultante de la tabla
GAProductSequence, copie esta secuencia (primera columna) a la memoria, reinicie
GAWizard (la secuencia original se colocará en la tabla) y copie la secuencia de la
memoria. En una segunda etapa, entonces comienzas con una mejor solución inicial.
Además, puede corregir algunos de los valores en un dominio de búsqueda más
pequeño (p. Ej., Número de trabajadores entre 2 y 4).

Tarea: Crear un método de optimización de simulación personalizado


1. Abra el método Inicio.
2. Comente todas las líneas de código que usan el método SetConfiguration o TableFile
Configurations, ya que ya no usamos configuraciones predefinidas.
3. Establezca los valores iniciales para NrJuniors y NrSeniors en el Inicio del método:

4. Cree un nuevo Método y asígnele el nombre SimOpt.


5. Abra el Método EndSim.
6. Elimine todo el código (Ctrl-X) debajo del cálculo de TotalProfit que se hace condicional en
CustomRun y pegue (Ctrl-V) el código en el Método SimOpt. Ahora llame al Method SimOpt
desde el lugar donde eliminó el código, de modo que el código restante para EndSim se vea de la
siguiente manera:

178
En principio, su modelo debería seguir ejecutándose como antes, excepto que comienza con la
configuración inicial dada y que después de ejecutar las réplicas requeridas, utiliza las
Configuraciones de la tabla vacía para establecer la siguiente configuración.
7. Agregue un TableFile y asígnele el nombre SOresults.
8. Dale a la mesa el siguiente formato:

Donde el tipo de datos La tabla de la columna 5 consta de 1 columna del tipo de datos Real.
9. Abra el método Inicio.
10. Agregue código para vaciar la tabla con los resultados de Optimización de simulación
(SOresults.delete) justo debajo del código para vaciar las otras tablas.
11. Agregue el siguiente código a SimOpt justo después de actualizar la tabla AvgExpResults y
trate de comprender su propósito:

12. Cambie el código en SimOpt que establece el número de trabajadores de la siguiente manera:

13. Abra el Restablecimiento de método.


14. Deje que RandomNumbersVariant dependa de la variable RunCounter en lugar de CurrRun:

Este cambio es necesario para evitar el uso de la misma configuración una y otra vez debido al
uso previo de números aleatorios comunes.
15. Establezca la variable TotalExp en el Panel de control en 25.
16. Ejecute su modelo haciendo clic en el método Iniciar.

El procedimiento de optimización de la simulación desarrollado en la tarea anterior es


bastante simplista en el sentido de que genera aleatoriamente la siguiente
configuración, sin considerar el valor de las configuraciones ya ejecutadas. Sin embargo,
el código en SimOpt se puede extender bastante fácilmente para permitir que los
valores de NrJuniors y NrSeniors dependan de resultados anteriores. Por ejemplo,
podemos evaluar los diferentes vecinos de la solución actual al agregar / eliminar un solo
trabajador, luego establecer la mejor configuración como solución actual y repetir el
procedimiento.

179
Otra extensión sería hacer que el número de repeticiones sea variable. Por ejemplo, en
primera instancia, podríamos realizar un número limitado de replicaciones por
configuración. Después de un tiempo podríamos pasar más repeticiones en las
configuraciones más prometedoras para aumentar nuestra confianza en su valor.
Una extensión final es el uso de un criterio de detención flexible. Actualmente, usamos
una configuración fija para la cantidad de configuraciones a considerar (25). Una
alternativa sería dejar que dependa de la convergencia de resultados. Por ejemplo,
cuando las mejoras en los valores de la solución encontrada son limitadas, o no se han
encontrado mejoras durante las ejecuciones de simulación anteriores, podemos decidir
parar.

9.5 Asignación B3: optimización de simulación


En este capítulo, se introdujeron varias formas de realizar experimentos y encontrar
buenas configuraciones. Sin embargo, solo exploramos brevemente su uso sin
considerar todas las opciones disponibles. Además, solo consideramos un conjunto
limitado de factores experimentales. En esta tarea, se le pide que aplique las tres formas
de experimentar, es decir, utilizando el ExperimentManager, el GAWizard y su propio
enfoque de Optimización de Simulación, más extensamente para proporcionar
recomendaciones al fabricante de automóviles CeeCar Inc. con respecto al diseño
óptimo del ensamblaje línea.
Asignación B3.1: utilice el ExperimentManager para realizar experimentos de los
siguientes tipos: diseño experimental de varios niveles (factorial completo), diseño
experimental aleatorio y diseño experimental de dos niveles (diseño factorial 2k). Para el
diseño factorial 2k, use TotalProfit como valor de restablecimiento: el valor para el cual
se calculan los efectos principales y los efectos de interacción bidireccional. Los últimos
efectos se pueden encontrar en ExperimentManager en Herramientas> Análisis de
factores. Compare la utilidad de los tres tipos diferentes de experimentos y defienda
específicamente por qué un análisis 2k-factorial es menos apropiado aquí. Repita el
análisis 2k-factorial utilizando AvgAssemblyTime como valor de restablecimiento y
reflexione sobre los resultados.
Asignación B3.2: use el ExperimentManager en combinación con GAWizard para evaluar
un rango completo de configuraciones experimentales posibles considerando los
factores NrJuniors, NrSenior, LineCapacity y la tasa de llegada de PartSource. La lógica de
variar la tasa de llegada (tiempos interarrivales o motores) es que no está directamente
claro qué configuración daría como resultado el mejor rendimiento: una mayor tasa de
llegada podría resultar en mayores ingresos por la venta de los motores, pero también
en mayores costos para los empleados. y viceversa. Para hacer esto, primero use
180
ExperimentManager para tener una idea de un área de búsqueda prometedora. Use el
área de búsqueda resultante como entrada para GAWizard.
Asignación B3.3: Cree su propio enfoque de Optimización de Simulación extendiendo el
Método SimOpt (posiblemente en combinación con la extensión de los resultados SO de
TableFile y agregando Métodos y TableFiles adicionales). En esta extensión, la decisión
con respecto a la siguiente configuración a considerar (simular) debería depender de los
resultados de configuraciones previamente evaluadas. Opcionalmente, puede incluso ir
más allá al usar un número variable de repeticiones según los valores de las
configuraciones y usar un criterio de detención dinámica, como se menciona al final de
la Sección 9.4.
Asignación B3.4: asesorar a CeeCar Inc. respecto del diseño óptimo de su línea de
ensamblaje, teniendo en cuenta los diferentes criterios que podrían ser relevantes para
su decisión final de inversión. Escriba su análisis y proporcione cifras convincentes para
apoyar a CeeCar Inc. en sus decisiones con criterios múltiples.

Entregables:
• El modelo de la Asignación B3.3.
• Un informe que consiste en una descripción de su enfoque utilizado en las
Asignaciones B3.1-B3.3, la explicación de su enfoque de Optimización de
Simulación de la Asignación B3.3, los resultados de las Asignaciones B3.1-B3.3, y
un análisis en profundidad análisis de los resultados experimentales, respaldado
por tablas y figuras (Asignación B3.4).

181
Apéndice

182
183
184
185
186
187

También podría gustarte