Beruflich Dokumente
Kultur Dokumente
II.5
Contenido:
1. INTRODUCCION.
4. PROCEDIMIENTOS Y FUNCIONES.
• De propósito general: Son los elementos que proporciona el lenguaje, que son simila-
res a los proporcionados por otros lenguajes imperativos de propósito general.
En este primer capítulo, se expondrá el primer grupo de ellos, es decir, no se hará men-
ción de ninguna característica de SIMSCRIPT II.5 que lo diferencie de un lenguaje imperativo de
propósito general convencional.
1. INTRODUCCION.
Excepto el programa principal, los otros dos bloques son opcionales, de esta forma un
programa muy simple sería:
main
"Calculo se la suma de dos valores
read X and Y
add X to Y
print 1 line with Y thus
La suma es: ****
stop
end
que como se puede observar, se limita a leer dos valores desde teclado, almacenándolos
en dos variables, calcula después la suma y saca el resultado por pantalla. La primera línea del
ejemplo es simplemente un comentario.
Las variables introducidas por el usuario deben contener al menos una letra o punto, el
resto pueden ser dígitos. Los puntos no establecen distinción, por lo que X, X., X.. representan la
misma variable.
María A. Martínez Ingeniería de Sistemas y Automática.
Lenguaje Simscript (Resumen) 4
En el ejemplo anterior, llama la atención que no se haga mención en ningún lugar del
programa sobre el tipo de las dos variables utilizadas. SIMSCRIPT II.5 proporciona varios tipos
de datos, que por omisión se toma el tipo real. De esta forma, en principio no hace falta declarar
las variables aunque por claridad es conveniente hacerlo. Las declaraciones de variables se pue-
den hacer dentro del preámbulo o bien dentro de las diferentes rutinas que conforman el pro-
grama. De esta forma, cualquier variable declarada dentro del preámbulo será considerada como
global, y en caso contrario, será local a la subrutina en la cual se ha declarado.
• Entero (INTEGER)
• Real (REAL)
• Doble precisión (DOUBLE)
• Cadenas(TEXT)
• Alfanuméricos (ALPHA)
• Matrices
Estos son los tres tipos de variables numéricas que proporciona SIMSCRIPT II.5. En el
preámbulo se puede establecer cualquiera de los dos como el tipo por defecto, o bien establecer
que una determinada variable posee un determinado tipo. Utilizando el ejemplo anterior:
preamble
normally, mode is integer
end
main
read X and Y
add X to Y
print 1 line with Y thus
La suma es: ****
stop
end
No se ha añadido nada nuevo, el predicado normally establece el tipo por defecto para
las variables que se vayan a utilizar a continuación. Así se puede establecer cualquier tipo por
defecto:
Cuando se utiliza undefined lo que se hace es forzar a que se declaren todas las varia-
bles que se fueran a utilizar.
En las declaraciones anteriores, la coma es opcional, así mismo, la palabra LV se puede sustituir
por el signo igual (=).
La otra forma de especificar el tipo de una variable es utilizando la cláusula GHILQH. De esta
forma, en el programa anterior se puede cambiar el preámbulo por el siguiente sin que por ello cambie la
semántica.
preamble
define X and Y as integer variables
end
También se puede utilizar define fuera del preámbulo confiriendo a las variables un
carácter local:
main
define X and Y as integer variables
...
...
stop
end
La asignación de variables se realiza con el predicado let (es opcional) y las expresio-
nes aritméticas pueden estar formadas por los siguientes operandos:
• Exponenciación. **
• Multiplicación. *
• División. /
• Adición. + add <expr> to <vble>
• Sustracción. - substrac <expr> from <vble>
donde la lista de variables puede ir separadas por comas o por la palabra and. La
salida de resultados por pantalla es mediante print:
y las palabras as follows se pueden sustituir por thus o like this. Seguidamente se
expresa en n líneas el formato deseado, dimensionándose los campos numéricos con asteriscos:
Además de las constantes que puede definir el usuario, las constantes propias del sistema se
caracterizan por finalizar con Fde este modo, el número 3, recibe el nombre de SLF, infinito como LQIF
etc.
Las variables de tipo texto son cadenas de caracteres, pero que no hace falta dimensionar. La
asignación, lectura y salida por pantalla de estos tipos se realiza de la misma forma que las variables numé-
ricas, utilizando OHW, UHDG y SULQW respectivamente.
La última línea se utiliza para borrar y opcionalmente se puede hacer también asignando la
cadena nula:
let AUTOR=””
Una variable alfanumérica se puede utilizar en expresiones aritméticas de modo similar a las
variables numéricas.
Aparte de estas operaciones, se proporciona una serie de operaciones adicionales sobre las va-
riables de tipo texto, algunas de las más importantes son:
let ENCONTRADO=match.f(TEXTO,PATRON,INDICE.COMIENZO)
2.3. Matrices.
El segundo paso es reservar la memoria necesaria, esto se realiza dentro de una subru-
tina, no en el preámbulo:
release VECTOR(*)
release TABLA(*,*)
release MATRIZ(*,*,*)
read TABLA(I,J)
• Estructuras de iteración.
• Estructuras de selección.
Y los conectores lógicos que se pueden utilizar son: AND, OR y NOT; pudiéndose
emplear los paréntesis.
[<Frase de control>]
do
<sentencias>
loop
La primera se salta las iteraciones del bucle en las cuales no se cumple la expresión
lógica asociada a with. La cláusula unless por el contrario, no ejecutará las iteraciones en las cua-
les se cumpla la expresión lógica asociada.
En ambos casos, cuando I valga 3 las sentencias del interior del bucle no serán ejecuta-
das. Cuando solamente una sentencia se itera, no hace falta utilizar el paréntesis do...loop.
if <expresión lógica>
<grupo de sentencias>
else
<grupo de sentencias>
always
en la estructura FDVH, si H[SUHVLyQ es numérica, las constantes también lo deben ser. Si H[SUH
VLyQes alfanumérica o texto, las constantes deben ser literadas (entre “ “)
4. PROCEDIMIENTOS Y FUNCIONES.
Las rutinas o procedimientos, tendrán el siguiente formato, e irán ubicadas después del
programa principal:
En el preámbulo habrá que declarar la función para indicar a las demás rutinas que
tipo tiene el valor que devuelve:
La librería de funciones que proporciona Simscript terminan enI, por ejemplo: DEVI, VTUWI,
etc. por ejemplo:
LIDEVI[\!
La función GLPI, devuelve la dimensión de la matriz que tiene como argumento. Por ejemplo,
si TABLA es una matriz, el número de filas se obtendría:
GLPI7$%/$
GLPI7$%/$,
Cuando en la lista de argumentos de entrada a una rutina o función aparece un registro o una
matriz, se le pasa la dirección base para que el programa que la recibe pueda acceder a los valores del inte-
rior de la estructura. Es necesario recordar que:
Todas las funciones en Simscript son recursivas, por ejemplo para obtener el factorial de un
número se calcularía del siguiente modo:
Q Q
Q
Q
SUHDPEOH
QRUPDOO\PRGHLVLQWHJHU
GHILQH)$&725,DVDQLQWHJHUIXQFWLRQ
HQG
PDLQ
SULQWOLQHOLNHWKLV
LQWURGXFLUQXPHURHQWHUR
UHDG,
5(68/7$'2 )$&725,,
SULQWOLQHZLWK5(68/7$'2OLNHWKLV
HOUHVXOWDGRHV
UHDGDV
HQG
IXQFWLRQ)$&725,1
LI1HT
UHWXUQZLWK
RWKHUZLVH
UHWXUQZLWK1
)$&725,1
HQG
Por ejemplo, suponiendo que MUESTRA es un vector que contiene una serie de datos:
for I=1 to N,
compute MEDIA as the mean and VARI as the var of MUESTRA(I)
Estadístico Significado
NUM Número de elementos seleccionados.
SUM Suma
Utilizar una función que devuelva la suma de los elementos de la diagonal principal. La matriz
se lee en el programa main que se encarga de llamar a la función y de mostrar el resultado en la
pantalla.
preamble
define TRAZA as a real function
normally, mode is integer
end
main
define TABLA as 2-dimensional, real array
define VALOR as a real variable
define DIM as a integer variable
read DIM
reserve TABLA(*,*) as DIM by DIM
read TABLA
let VALOR=TRAZA(TABLA(*,*),DIM)
print 1 line with VALOR as follows
La traza de la matriz es: ****.**
release TABLA(*,*)
stop
end
function TRAZA(MATRIZ,N)
define MATRIZ as a real 2-dimensional array
define N as an integer variable
define SUMA as a real variable
for I=1 to N
compute SUMA as the sum of MATRIZ(I,I)
return (SUMA)
end
(MHUFLFLR
Programar una rutina a la que se le pasan como argumentos de entrada tres matrices. Debe multiplicar las
dos primeras y almacenar el resultado en la tercera. La rutina devuelve un código que vale 0 si la multipli-
cación se ha podido realizar, y 1 si hay incompatibilidad en las dimensiones de las matrices que impide su
multiplicación.
Contenido:
1. INTRODUCCION.
2. ENTIDADES Y ATRIBUTOS.
2.1. Definición y declaración.
2.2. Entidades temporales.
2.3. Entidades permanentes.
2.4. Definición de atributos.
3. CONJUNTOS.
3.1. Definición y declaración.
3.2. Modificación de conjuntos: Almacenar y eliminar.
3.3. Predicados especiales.
3.4. Asignación de prioridad.
5. CONCEPTOS DE ENTRADA/SALIDA.
1. INTRODUCCION.
SIMSCRIPT II.5 proporciona una serie de estructuras para el modelado de sistemas dis-
cretos de una forma clara y estructurada. Así, proporciona los siguientes elementos, que serán
tratados en este tema:
• Entidades.
• Atributos.
• Conjuntos.
2. ENTIDADES Y ATRIBUTOS.
Una entidad es una estructura que puede representar a algunos de los elementos del
sistema modelado. Cada entidad posee una serie de atributos que según los valores que tomen
designarán un determinado estado de la entidad. Una entidad, como una primera aproximación
se puede considerar como un registro en el cual cada uno de los campos representa un determi-
nado atributo. La declaración de un tipo de entidad, deberá ir en el preámbulo y se efectuará de
la siguiente forma:
ej.
<atributo>(<entidad>)
ej.
EDAD(TRABAJADOR)
75$%$-$'25
Valor de ('$'
Valor de 180(52
Valor de '1,
PETROLERO
NOMBRE
TONELAJE
CARGUERO
NOMBRE
TONELAJE
create <entidad>
que equivale a: create <entidad> called <entidad>; es decir, se crea una entidad que posee
el mismo nombre que su clase.
Al igual que las matrices, las entidades deben ser destruidas cuando no se vaya a hacer
mas uso de ellas:
destroy <entidad>
Ejemplo:
La principal diferencia con las entidades temporales, es que tanto en su creación como
en su destrucción se hace en grupos. Para designar una entidad como permanente en el preám-
bulo se antepone a su declaración:
let N.CASA = 5
create every CASA
Las entidades permanentes se referencian por un índice que varia entre 1 y N.<enti-
dad>. en el ejemplo sería:
DIRECCION CODIGO.POSTAL
1 1
2 2
3 3
4 4
5 5
Las entidades permanentes tienen sus atributos almacenados como registros con índi-
ces secuenciales. Debido a esta características se pueden utilizar estructuras de iteración que
hace mas cómodo el acceso:
B) for I = 1 to N.BARCO
with EDAD(I) < AÑOS
Hasta ahora, los atributos asociados a las entidades, tomaban como tipo y dimensión
los establecidos por defecto:
preamble
normally, mode is integer, dimension is 0
permanent entities
every BARCO has a EDAD and a TONELAJE
end
Por supuesto, es más interesante establecerle a cada atributo un tipo y una dimensión
individualmente. Para ello, basta con declarar los atributos inmediatamente después a la decla-
ración de la entidad mediante define:
preamble
permanent entities
every BARCO has a NOMBRE and a TONELAJE
define NOMBRE as text variable
define TONELAJE as an integer variable
end
NOTA: Se puede dar el mismo nombre a atributos si se trata de entidades temporales, pero no es posible en el caso de
entidades permanentes. Esto se justifica por el modo B de acceder a los atributos de las entidades permanentes expuesto
anteriormente.
1.- Definir un tipo de entidad temporal BARCO con atributos enteros EDAD y TONE-
LAJE y un atributo tipo texto denominado NOMBRE.
2.- Utilizar un registro donde se almacenan los punteros a las diferentes entidades tipo
BARCO
cuando se crean dentro del programa.
3.- Leer un número entero que defina la cantidad de entidades BARCO que se van a
crear.
4.- Hacer un bucle para la creación de cada BARCO y leer sus atributos.
5.- Leer un entero que represente un número de años y calcular la suma de los tonelajes
de todos
los barcos con edad inferior a los años introducidos, sacando un mensaje por pantalla.
1.- Se trata de resolver el mismo ejercicio pero considerando la entidad BARCO como
permanente.
2.- En este caso, el número de entidades permanentes del tipo BARCO lo obtenemos
leyendo
directamente la variable N.BARCO.
3.- Hacer un bucle para leer los atributos de las diferentes entidades BARCO.
4.- Proceder como en el punto 5 del ejercicio anterior.
preamble
normally mode is integer
temporary entities
every BARCO has an NOMBRE, an EDAD and a TONELAJE
define NOMBRE as a text variable
define V as 1-dimensional array
end
main
print 1 line as follows
introducir numero de barcos:
read N
reserve V(*) as N
for I=1 to N
do
create a BARCO called V(I)
print 1 line with I and V(I) as follows
Introducir nombre, edad y tonelaje del barco *** llamado ********
read NOMBRE(V(I)), EDAD(V(I)), TONELAJE(V(I))
loop
print 1 line as follows
Introducir el tiempo de referencia en años:
read TIEMPO
for I=1 to N
with EDAD(V(I))<TIEMPO
compute SUMA.TNS as the sum of TONELAJE(V(I))
print 2 lines with TIEMPO, SUMA.TNS as follows
Total de tonelaje de los barcos con menos de ** años
es: ************** toneladas.
read as /
for I=1 to N
destroy BARCO called V(I)
release V(*)
end
preamble
normally mode is integer
permanent entities
every BARCO has a NOMBRE, an EDAD and some TONELAJE
define NOMBRE as a text variable
end
main
print 1 line as follows
introducir número de barcos:
read N.BARCO
create every BARCO
for every BARCO
do
print 1 line with BARCO as follows
introducir nombre,edad y tonelaje del barco **********
read NOMBRE(BARCO), EDAD(BARCO), TONELAJE(BARCO)
loop
print 1 line as follows
Introducir el tiempo de referencia en años
read TIEMPO
for every BARCO
with EDAD(BARCO)<TIEMPO
compute SUMA.TNS as the sum of TONELAJE(BARCO)
print 2 lines with TIEMPO,SUMA.TNS as follows
Total de tonelaje de los barcos con menos de ** años es:
***************** toneladas
read as /
destroy every BARCO
end
3. CONJUNTOS.
Las entidades y atributos, son una forma de estructurar datos. Los conjuntos propor-
cionan una forma de organización en un nivel superior. Son listas cuyos componentes son enti-
dades, y que se encuentra subordinada a otra entidad.
La primera sentencia declara una entidad EMPRESA que es propietaria de dos con-
juntos: FIJOS y TEMPORALES. Cada uno de estos conjuntos corresponde a una agrupación
lógica de los trabajadores de una empresa. Esta sentencia no especifica quienes pertenecen a los
distintos conjuntos, solo establece una serie de punteros y atributos para el propietario de los
conjuntos. Por cada conjunto se generan automáticamente los siguientes atributos a la entidad
propietaria:
F.FIJOS F.TEMPORALES
L.FIJOS L.TEMPORALES
N.FIJOS N.TEMPORALES
P.FIJOS P.TEMPORALES
S.FIJOS S.TEMPORALES
M.FIJOS M.TEMPORALES
Se puede establecer una jerarquía más compleja entre entidades. Añadiendo a las dos
sentencias anteriores:
every <entidad> has <atributos>, owns <conjuntos> and may belong to <conjuntos>
Cuando uno de los apuntadores definidos no apunta a ninguna parte, contiene el valor
0.
PUERTO
F.BARCOS.ATRACADOS BARCO1
L.BARCOS.ATRACADOS P.BARCOS.ATRACADOS
S.BARCOS.ATRACADOS BARCO2
N.BARCOS.ATRACADOS
M.BARCOS.ATRACADOS P.BARCOS.ATRACADOS
S.BARCOS.ATRACADOS BARCO3
M.BARCOS.ATRACADOS P.BARCOS.ATRACADOS
S.BARCOS.ATRACADOS
M.BARCOS.ATRACADOS
ej.preamble
permanent entities
every PUERTO owns a BARCOS.ATRACADOS
temporary entities
every BARCO has a NOMBRE
and belongs to a BARCOS.ATRACADOS
define NOMBRE as a text variable
normally mode is integer
end
main
create every PUERTO(2)
read N
PUERTO=1 ‘’Seleccionar el puerto con el que se va a trabajar
for I=1 to N
do
create a BARCO
read NOMBRE(BARCO)
file BARCO first in
BARCOS.ATRACADOS(PUERTO)
loop
...
...
end
aritmética>.
S.BARCOS.ATRACADOS(S.BARCOS.ATRACADOS(F.BARCOS.ATRACADOS(PUERTO)))
1 • Indicador de vacuidad.
ej.
if BARCOS.ATRACADOS(PUERTO(1)) is not empty
print 1 line thus
El puerto no está vacio.
always
y se les puede añadir in reverse order para realizar una iteración desde atrás hacia
delante y combinarse con otras expresiones for, with, unless, while y until.
Los conjuntos definidos hasta el momento son de tipo FIFO, pero se pueden definir con
otro tipo de prioridad:
En el primer caso el orden de los elementos dentro del conjunto viene dado por un
determinado atributo de las entidades pertenecientes al conjunto. Con la segunda declaración se
cuando no se especifica high o low se entiende que es high (valor por tomado por defecto).
Los atributos del sistema se tratan como variables globales cuyo propietario es el pro-
pio sistema. Este concepto sólo se utiliza para realizar una modelización más clara. Su declara-
ción es en el preámbulo y con el siguiente formato:
5. CONCEPTOS DE ENTRADA/SALIDA
Se utilizaILQG junto con los bucles IRU para buscar la primera vez que se cumple un determi-
nado valor especificado.
ej. for I = 1 to N
with X(I)*Y(I) greater than LIMITE,
find MAYOR = the first I
en este ejemplo el bucle finaliza tan pronto como se obtenga un valor que cumple lo especifi-
cado y lo asigna a MAYOR.
Se puede utilizar un LIespecial en combinación con ILQG que indica la condición lógica LIIRXQG/
iIQRQH.
Ej: for I = 1 to N
with A(I)=B
find the first case
if none
N=N+1
A(N)=B
endif
Las sentencias SULQWy ZULWH permiten mostrar el valor de los atributos de las diferentes enti-
dades. Especialmente práctica es la instrucción OLVW que muestra todos los atributos de una entidad sin tener
que hacer una referencia a cada uno de ellos. Son posibles tres formas:
A) OLVWDWWULEXWHVRIHQWLGDG!FDOOHGH[SUHVLyQ!
B) OLVWDWWULEXWHVRIHDFKHQWLGDG!
muestra todos los atributos de todas las entidades que pertenecen a una entidad permanente.
C) OLVWDWWULEXWHVRIHDFKHQWLGDG!LQVHW
muestra los atributos de todas las entidades permanentes o temporales pertenecientes a un con-
junto.
1.- RSHQXQLWXQLGDGOyJLFD!IRULQSXWRXWSXWILOHQDPHLVQRPEUH!
donde unidad lógica es un número comprendido entre 1 y 97. Las unidades lógicas por defecto
son la 5 para entrada y la 6 para salida.
2.- XVHXQLGDGOyJLFD!IRULQSXWRXWSXW
3.- FORVHXQLWXQLGDGOyJLFD!
Ej.
open unit 2 for output file name is “SALIDA”
use 2 for output
....
close unit 2
EJERCICIO 1:
1.- Trabajar con dos entidades temporales, una denominada PUERTO que es propietaria de un conjunto
denominado BARCOS.ATRACADOS, y otra, denominada BARCO que pertenece al conjunto BAR-
COS.ATRACADOS y posee un atributo tipo texto que es el NOMBRE del barco.
2.- Leer por el teclado un número cualquiera de BARCOS e introducirlos en el conjunto BARCOS.ATRA-
CADOS.
3.- Para una ejecución cualquiera, mostrar y analizar los valores de los atributos de las entidades PUERTO
y BARCO.
EJERCICIO 2:
1.- Trabajar con una entidad permanente denominada PUERTO que es propietaria del conjunto BAR-
COS.ATRACADOS y posee un atributo tipo texto denominado CATEGORIA.
2.- La entidad BARCO se define como temporal, pertenece al conjunto BARCOS.ATRACADOS y posee
un atributo tipo texto que es el NOMBRE del barco.
3.- Leer por el teclado los valores de los atributos de las entidades, donde habrá más de una entidad perma-
nente de PUERTO y se introducirán las entidades BARCO en los conjuntos BARCOS.ATRACADOS
asociados a cada una de ellas.
4.- Para una ejecución cualquiera, mostrar y analizar los valores de los atributos de las entidades PUERTO
y BARCO.
Contenido:
1.INTRODUCCION.
3. EL MECANISMO DE SIMULACION.
3.1. El mecanismo de temporización.
3.2. El reloj de simulación.
5. LOS RECURSOS.
5.1. Declaración y creación.
5.2. Petición y liberación de recursos.
7. ANALISIS DE LA SIMULACION.
1. INTRODUCCION.
En los temas anteriores, se han descrito las características y estructuras de alto nivel del
lenguaje SIMSCRIPT II.5. Aparte, posee características adicionales para la simulación de siste-
mas discretos. La simulación de este tipo de sistemas, tiene por objeto el estudio de medidas estadís-
ticas que proporcionan una idea del comportamiento del mismo.
La construcción del modelo de un sistema discreto, implica modelar los dos tipos de
elementos fundamentales que lo componen:
Una actividad dentro de un sistema está delimitada por dos sucesos o eventos instantá-
neos: un suceso de comienzo y otro de final. De esta forma, los sucesos (eventos) son los compo-
nentes más simples de una actividad. Las características más importantes de un suceso son:
• Su duración es instantánea.
Puede darse el caso de desear modelar actividades que no posean una duración apa-
rente, en este caso bastará con un único suceso para modelarlas. En los casos más frecuentes, una
actividad estará formada por una serie de sucesos adicionales a los de comienzo y final de activi-
dad, pudiendo in ter accionar con otras actividades padeciendo o causando interrupciones y
retardos.
Para la realización de un modelo, las partes físicas del sistema (entidades) se pueden
modelar con las estructuras de alto nivel vista en temas anteriores. Las actividades del sistema se
modelan utilizando los conceptos de proceso y evento introducidos en párrafos anteriores. SIM-
CRIPT II.5 proporciona el mecanismo de temporización que organiza la ejecución de procesos y
HMHYHQW//(*$'$JLYHQ98(/2DQG25,*(1
En un programa, pueden coexistir varios tipos de eventos de modo que se pueden rea-
lizar llamadas a cada uno de ellos en diferentes instantes de tiempo. Cada llamada a un evento
tiene asociada una entidad temporal llamada aviso de evento (event notices) utilizada para el
mantenimiento de la información del evento asociado. Como entidad temporal, event notices
posee una serie de atributos predefinidos y pertenece al conjunto de eventos futuros ordenado
por el atributo time.a, los atributos son:
• time.a: Contiene el tiempo de simulación en el cual el evento tiene que acaecer. Los
eventos que tienen que ocurrir se encuentran almacenados ordenados por este atri-
buto en el conjunto de eventos futuros ev.s. El sistema de temporización es el res-
ponsable de ir extrayendo los avisos a ocurrir, ejecutar la rutina asociada al evento y
de actualizar el tiempo de simulación.
• eunit.a: Es la forma en la que el evento será lanzado, como puede ser por ejemplo,
por un dato externo al programa.
Los avisos de eventos, como cualquier otra entidad temporal, puede poseer otros atri-
butos definidos por el usuario y su declaración en el preámbulo debe de estar separada de las
otras entidades que no sean aviso de evento. Para la declaración se utiliza la frase event notice en
el preámbulo:
Una rutina pasa a ser un proceso simplemente con sustituir la palabra routine por pro-
cess en su definición. La forma general será:
Como en el caso de los eventos, asociada a la declaración de proceso, existe una enti-
dad temporal denominada aviso de proceso (process notice) que se almacena también en el con-
junto de sucesos futuros (ev.s). Posee unos atributos predefinidos adicionales a los ya expuestos
en aviso de evento, que sólo tienen sentido en el caso de los procesos.
Todos los procesos se deben declarar en la sección processes del preámbulo. Su decla-
ración es similar a la de eventos:
Si se desea que la entidad aviso de proceso asociada posea atributos definidos por el
usuario, se emplea la cláusula every como en el caso de la declaración de eventos.
ej. processes
include TAREA.MAQUINA,VALIDAR.MAQUINA
every LLEGADA.TREN has VAGONES and a DESTINO
define VAGONES as an integer variable
define DESTINO as a text variable
Estas sentencias crean un aviso de evento o proceso, asigna al atributo WLPHD el valor de
<expresión temporal> y almacena al aviso en el correspondiente conjunto de sucesos futuros. La expresión
temporal debe ser de tipo real. Si se omite la frase FDOOHGYDULDEOH! se crea un aviso de evento con el
mismo nombre que su clase.
6FKHGXOH y DFWLYDWH equivalen al FUHDWH de entidades y como solo se crean una vez, si se desean
almacenar mas veces en el conjunto de eventos futuros, se hace con WKLV, WKH o WKHDERYH sustituyendo a
DQ o D.
Así se establece una prioridad según el orden de aparición en la lista, siendo el primero
en aparecer el más prioritario. Si no aparece ninguna lista de prioridad, se asume la de orden de
declaración en el preámbulo. La prioridad se asigna a la clase, no al proceso o evento en particu-
lar. A la clase se le asignan valores enteros de acuerdo con la prioridad.
La variable global del sistema events.v posee el valor del número total de los diferentes
eventos y procesos declarados. Por otra parte, es posible que dos sucesos o eventos de la misma
clase se den simultaneamente. Este conflicto se resuelve según cual de ellos se lanza antes en el
programa. Este orden preestablecido se puede alterar con la sentencia break en la sección proce-
sos del preámbulo:
ej. processes
every INFORME has a NOMBRE and a PRIORIDAD
break INFORME ties by high PRIORIDAD
3. EL MECANISMO DE SIMULACION.
1.- DECLARACIONES.
Para explicar el mecanismo de simulación, nos vamos a limitar a eventos y avisos de eventos, ya
que los procesos se pueden considerar como una secuencia de eventos que se suceden en un periodo de
tiempo. El mecanismo de temporización extrae el aviso de evento mas inmediato del conjunto de eventos
futuros, actualiza el tiempo de simulación al tiempo indicado por el evento, y pasa el control a la rutina
asociada. Cuando ésta finaliza, devuelve el control a la rutina de temporización que extrae el siguiente
evento del conjunto de sucesos futuros. Este proceso continua hasta que el conjunto de eventos futuros
queda vacío. Cuando esto ocurre el control pasa a la sentencia inmediatamente posterior a la de START
SIMULATION. Dentro de una rutina de evento o proceso, se pueden activar otras actividades. La simula-
ción se puede abortar utilizando la sentencia 6723.
• m.ev.s: Pertenencia.
f.ev.s ...
time.a 0 0 0
eunit.a
p.ev.s
s.ev.s
m.ev.s 1 1
0
1 1
0 0
l.ev.s
El valor actual del tiempo de simulación se mantiene en una variable global de tipo
doble denominada time.v. Al comenzar la simulación, esta variable es nula, y se incrementa en
saltos discretos que representan el paso del tiempo entre eventos. Cada vez que se selecciona un
aviso de evento se actualiza la variable time.v con el valor contenido en time.a. En el caso de
eventos simultáneos el valor de time.v permanece constante.
ej.
at time.v+1.5 :Lanza la actividad transcurridas 1.5 unidades de tiempo a partir del tiempo
actual de simulación.
Otra forma de lanzar un evento sería mediante las palabras now o next (son equivalen-
tes) en sentencia como:
que indica que el evento o proceso ocurrirán tan pronto como se produzca un retorno
del control a la rutina de temporización. En la simulación es interesante jugar con unidades de
tiempo reales (minutos, horas y días). El tipo de unidad de la variable time.v se especifica
mediante la sentencia:
Si se emplea la opción XQLWV, se está utilizando la unidad temporal por defecto en la simulación.
El empleo de DIWHU o LQ tiene el mismo significado que DWWLPHYQ~PHUR. Existen una serie de funciones
de conversión de tiempo:
Los eventos y procesos que poseen atributos definidos por el usuario, se le pueden
asignar valores de dos formas:
ej. preamble
...
processes
every SERVICIO has a SERVIDOR and a CLIENTE,
and may owns a TRANSANCIONES
main o routine
...
activate a SERVICIO giving DEPARTAMENTO(N) and F.CLIENTES
in 5.0 units
El ejemplo asigna los atributos SERVIDOR y CLIENTE, pero deja sin asignar el atributo
TRANSACCIONES. Como en call se puede hacer el uso de paréntesis en vez de giving, pero
nunca se puede utilizar yielding.
De esta forma se pueden pasar parámetros a los eventos o sucesos, pero en el caso de
los eventos existen problemas a la hora de acceder a ellos dentro de la rutina. Los atributos se
encuentran almacenados en la entidad aviso de evento o proceso. Debido a que los eventos son
instantáneos, cuando se producen se saca el aviso y se destruye inmediatamente antes de ejecu-
tar la rutina asociada, por lo que los atributos definidos por el usuario quedan inaccesibles. En el
caso de los procesos no existe este problema, el aviso de proceso tiene el mismo tiempo de vida
que el proceso al cual pertenece. Para evitar este contratiempo en los eventos, se puede añadir en
la declaración la frase:
de esta forma los atributos se pueden acceder dentro de la rutina. El aviso de evento se
puede destruir posteriormente como una entidad temporal
Los procesos representan una actividad que dura un cierto intervalo de tiempo. Para la
simulación de esta duración, se puede emplear:
Cuando vence el tiempo, la ejecución del proceso se reanuda por la sentencia inmedia-
tamente posterior a work o wait. Estas dos sentencias son totalmente equivalentes, sólo se dife-
rencian en el estado atribuido al proceso durante el tiempo de simulación, y se registra en un
atributo especial de la entidad aviso de proceso.
Las sentencias wait y work se utilizan cuando se puede determinar, es decir, se conoce
el tiempo que dura la espera o el trabajo. Se dan muchos casos en que este tiempo no se conoce a
priori, ya que va a depender de la interacción de otras actividades.
Para contemplar estos casos, una rutina de proceso puede suspender su propia activi-
dad mediante suspend, para continuarla sólo si otra actividad la reactiva mediante reactivate. El
estado del proceso suspendido también se encuentra almacenado en uno de los atributos de la
entidad aviso de evento.
Un proceso que se está ejecutando solo se puede suspender así mismo; otra actividad
sólo puede interrumpir a un proceso en estado activo, no en ejecución (en estado wait o work).
Cuando un proceso se interrumpe, el aviso de proceso se borra del conjunto de eventos futuros,
registrando previamente en su atributo time.a el tiempo que resta para completar el wait o work.
La sentencia seria:
5. LOS RECURSOS.
La interacción más común entre procesos es la lucha por los recursos limitados del sis-
tema. Por ello, SIMSCRIPT II.5 proporciona la facilidad resource que incluye la formación auto-
mática de colas de procesos en espera de que el recurso esté disponible y su reactivación cuando
esto ocurre.
ej.
preamble
resources include AUTOPISTA
...
...
end
main
create every AUTOPISTA(1)
let U.AUTOPISTA(1)=1
De esta forma, en la creación se especifica cuantos tipos de ese mismo recurso se desea
tener en el sistema, y posteriormente mediante las sentencias de asignación se especifica cuantas
unidades de cada tipo del mismo recurso se desean.
ejemplo:
La liberación de recursos:
Ejemplo:
relinquish 1 trabajador(2)
random.f(<semilla>)
La función random.f tiene un argumento que es un número que selecciona una de las
secuencias de números aleatorios independientes. Todos los programas Simscript II.5 se iniciali-
zan con 10 secuencias de números seudoaleatorios, para ello el sistema dispone de un registro
seed.v que contiene los primeros elementos de cada secuencia o semillas.
Aparte existen una serie de funciones que modelan las distribuciones estadísticas prin-
cipales. En la siguiente tabla aparecen algunas de ellas:
Las funciones estadísticas se utilizan para generar tiempos en los que deben tener lugar
los eventos o duración de las actividades.
process GENERADOR
until time.v gt TIEMPO.MAXIMO
do
activate a TAREA now
wait exponential.f(media,1) days
loop
end
7. ANALISIS DE LA SIMULACION.
Actúan de modo similar a compute pero poseen un carácter global al estar definidas en
el preámbulo. Se pueden utilizar en los siguientes casos:
La diferencia entre tally y accumulate reside en que el segundo introduce el tiempo de simula-
ción.
NUMBER N N
SUM ΣX ΣX *(time.v-Tl)
SUM.OF.SQUARES 2 2
ΣX ΣX *(time.v-Tl)
donde:
Tl: Tiempo de simulación en el que se le asigna el valor actual a una variable acumu-
lada.