Sie sind auf Seite 1von 48

LENGUAJE DE PROGRAMACION SIMSCRIPT

II.5

TEMA 1: PRINCIPIOS BASICOS DE SIMSCRIPT II.5.

TEMA 2: ESTRUCTURAS DE DATOS DE ALTO NIVEL.

TEMA 3: HERRAMIENTAS PARA LA SIMULACION


DISCRETA.

TEMA 4: HERRAMIENTAS GRAFICAS.

TEMA 5: APLICACIONES A LOS SISTEMAS DE


PRODUCCIÓN.

TEMA 6: SIMULACION DE SISTEMAS MODELADOS CON


REDES DE PETRI.

María A. Martínez Sánchez.


Departamento de Ingeniería de Sistemas y Automática.
Universidad de Málaga
Lenguaje Simscript (Resumen) 1

TEMA 1: PRINCIPIOS BASICOS DE SIMSCRIPT II.5

Contenido:

1. INTRODUCCION.

2. LAS VARIABLES Y SU MANIPULACION.


2.1. Variables enteras, reales y doble precisión.
2.2. Variables alfanuméricas y de texto.
2.3. Matrices.

3. ESTRUCTURAS DE CONTROL DEL FLUJO.


3.1. Estructuras de iteración.
3.2. Estructuras de selección.

4. PROCEDIMIENTOS Y FUNCIONES.

5. CALCULO DE VARIABLES ESTADISTICAS.

6. EJEMPLO: CALCULO DE LA TRAZA DE UNA MATRIZ.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 3

El conjunto de estructuras de datos y control que forman el lenguaje de simulación de sistemas


discretos SIMSCRIPT II.5 se puede clasificar en dos grandes grupos:

• 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.

• De propósito específico: Son aquellos elementos que proporciona SIMSCRIPT II.5


para la construcción de modelos y simulación de sistemas discretos.

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.

Un programa SIMSCRIPT II.5, posee la siguiente estructura:

• Preámbulo: Bloque de definiciones y declaraciones. Contiene sentencias no ejecuta-


bles.

• Programa principal: Es la rutina por la que comienza la ejecución del programa


SIMSCRIPT II.5.

• Bloque de subrutinas: Son los procedimientos y funciones utilizados en el programa


principal, y deberán ser declarados en el preámbulo.

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.

Simscript no distingue entre mayúsculas y minúsculas, por lo que se recomienda que


los operandos propios del lenguaje se escriban en minúsculas (ej: read, and, add, to, print, etc)
para distinguirlos de los elementos introducidos por el programador que se escribirán en letras
mayúsculas.

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

2. LAS VARIABLES Y SU MANIPULACION.

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.

Los tipos de variables proporcionados son:

• Entero (INTEGER)
• Real (REAL)
• Doble precisión (DOUBLE)
• Cadenas(TEXT)
• Alfanuméricos (ALPHA)
• Matrices

2.1 Variables enteras, reales y doble precisión.

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:

• normally, mode is real


• normally, mode is text
• normally, mode is alpha
• normally, mode is undefined

Cuando se utiliza undefined lo que se hace es forzar a que se declaren todas las varia-
bles que se fueran a utilizar.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 5

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>

De esta forma un ejemplo de asignación es let variable = expresión aritmética:

let X = (A+B)*C ó X = (A+B)*C

La lectura desde teclado de variables se realiza mediante la sentencia read:

read <lista de variables>

donde la lista de variables puede ir separadas por comas o por la palabra and. La
salida de resultados por pantalla es mediante print:

print <n> lines with <lista expresiones aritméticas> as follows

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:

print 2 lines with X,Y and X+Y as follows


La suma de ***.** y ***.**
da como resultado ****.**

Además de las constantes que puede definir el usuario, las constantes propias del sistema se

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 6

caracterizan por finalizar con Fde este modo, el número 3, recibe el nombre de SLF, infinito como LQIF
etc.

2.2 Variables alfanuméricas y de texto.

Las primeras son equivalentes al tipo carácter de un lenguaje imperativo convencional,


puede almacenar un solo dígito o una sola letra. Este tipo es una herencia de versiones anteriores
por el mantenimiento de la compatibilidad, incluso puede variar de una implementación a otra.

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.

Un ejemplo del uso de variables tipo texto sería:

Normally mode is text


let AUTOR=”Antonio Machado”
let NOMBRE=AUTOR
erase AUTOR

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.

Normally mode is alpha


let ALFAVAR=”A”
if ALFAVAR <> “0”
subtract QUANTITY from STOCK(ALFAVAR)

donde la variable alfanumérica se ha utilizado como un índice.

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:

• Concatenación: devuelve como resultado las cadenas de texto unidas.


let UNION=concat.f(TEXTO1,TEXTO2,...,TEXTON)

• Manipulación: devuelve en TROZO un texto de LONGITUD comenzando por


INDICE.
let TROZO=substr.f(TEXTO,INDICE,LONGITUD)

• Reconocimiento de patrones: devuelve en ENCONTRADO la posición en TEXTO


donde ha localizado el PATRON. Si no lo encuentra devuelve un cero.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 7

let ENCONTRADO=match.f(TEXTO,PATRON,INDICE.COMIENZO)

• Longitud: da la longitud de la variable o expresión TEXTO.


let LONGITUD=length.f(TEXTO)

2.3. Matrices.

El lenguaje SIMSCRIPT II.5 soporta matrices n dimensionales de un tipo simple dado.


La declaración de matrices es algo distinta a las expuestas hasta ahora, ya que se realiza en dos
fases:

• Declaración del tipo de la matriz y dimensión.

• Reserva de la memoria necesaria para almacenar la matriz.

Una de las formas de especificar la dimensión y tipo de una matriz, es utilizando la


cláusula normally:

normally dimension is <dimensión>

ej: normally, mode is real, dimension is 2


...
define X as array

La otra forma de hacerlo es utilizando define:

define <lista variables> as <n>-dimensional, <tipo> arrays

ej: define MATRIZ1 and MATRIZ2 as 3-dimensional, double arrays

Las cláusulas normally y define pueden aparecer en el mismo programa, no son


incompatibles. No se pueden hacer más de un define de la misma variable.

El segundo paso es reservar la memoria necesaria, esto se realiza dentro de una subru-
tina, no en el preámbulo:

reserve VECTOR(*) as <expr>

reserve TABLA(*,*) as <expr> by <expr>

reserve MATRIZ(*,*,*) as <expr> by <expr> by <expr>

Para liberar la memoria utilizada por las matrices se utiliza UHOHDVH:

release VECTOR(*)

release TABLA(*,*)

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 8

release MATRIZ(*,*,*)

La utilización de los elementos de las matrices es similar a como se hace en el lenguaje


FORTRAN VII, por ejemplo:

read TABLA(I,J)

3. ESTRUCTURAS DE CONTROL DEL FLUJO.

Las estructuras de control se pueden clasificar en:

• Estructuras de iteración.

• Estructuras de selección.

Ambos grupos de estructuras de alteración del flujo de un programa, están basadas en


las expresiones lógicas. Los operandos relacionales que se pueden relacionar son:

Equivalcencia = eq, equal


No igual a <> ne, not equal to
Menor que < lt, less than
Mayor que > gt, greater than
No mayor que <= le, no greater than
No menor que >= ge, no less than

Y los conectores lógicos que se pueden utilizar son: AND, OR y NOT; pudiéndose
emplear los paréntesis.

3.1. Estructuras de iteración.

La estructura fundamental de iteración es la siguiente:

[<Frase de control>]
do
<sentencias>
loop

La frase de control es la que fija la naturaleza del bucle:

• Bucle tipo for:


for VBLE = INICIO to FIN [ by INCREMENTO]
for VBLE back from FIN to INICIO [by DECREMENTO]

• Bucle tipo while:


while <expresión lógica>

• Bucle tipo until:


until <expresión lógica>

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 9

la condición de finalización de los bucles ZKLOH y XQWLO son complementarias y es necesario


tener cuidado de no programar bucles que nunca finalicen.

En los tres tipos de bucle, la condición de terminación se verifica en cada comienzo.

La iteración en bucles se puede alterar con las cláusulas:

with <expresión lógica>

unless <expresión lógica>

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.

ej: for I=1 to 10 with I<>3


do
...
loop

for I=1 to 10 unless I=3


do
...
loop

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.

3.2. Estructuras de selección.

Las dos estructuras de selección de que se dispone son:

• Selección simple (if).

• Selección múltiple (case).

Sus esquemas son:

if <expresión lógica>
<grupo de sentencias>
else
<grupo de sentencias>
always

HOVH se puede sustituir por RWKHUZLVH yDOZD\VporUHJDUGOHVV o HQGLI.

select case <expresión>

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 10

case <lista de constantes>


<sentencias>
case <lista de constantes>
<sentencias>
...
[default
<sentencias>]
endselect

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 “ “)

Lista de constantes puede ser:

• Un grupo de constantes separadas por comas.

ej. 1,2,3 ó "A","B"

• Un intervalo <inicio> to <fin>.

ej. 1 to 3 ó "A" to "G", constante1 to constante2.

la sentencia JRWR permite cambiar directamente el orden de ejecución: ej go to ‘label’

4. PROCEDIMIENTOS Y FUNCIONES.

El funcionamiento de los procedimientos y funciones, es similar a cualquier lenguaje.


Por ello, en este apartado solo se expondrá su sintaxis.

Las rutinas o procedimientos, tendrán el siguiente formato, e irán ubicadas después del
programa principal:

routine <nombre>[giving <vbles entrada>][yielding <vbles salida>]


<sentencias>
return
end

La palabra reservada giving se puede eliminar si se encierran entre paréntesis las


variables de entrada. También se puede sustituir por given, the o this.

La llamada a la función desde la rutina principal es:

call <nombre>[giving <vbles>][yielding <resultados>]

En el preámbulo se puede declarar un prototipo para asegurar que se le pasa a la rutina


en su llamada un número correcto de parámetros:

define <nombre> as a routine given <i> arguments yielding <j> arguments

Las funciones tienen el siguiente formato:

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 11

function <nombre> (<lista variables>)


<sentencias>
return with (<expresión aritmética>)
end

En el preámbulo habrá que declarar la función para indicar a las demás rutinas que
tipo tiene el valor que devuelve:

define <nombre> as a <tipo> function

La llamada a la función se efectúa de la forma habitual:

ej. let A=2*FUNCION(7.5)

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:

GLPI 7$%/$ 

y el número de columnas por:

GLPI 7$%/$ ,

Y su empleo se refleja en el programa siguiente:

IRU, WRGLPI 7$%/$ 

IRU- WRGLPI 7$%/$ ,

OHW7$%/$ ,-  , - 

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:

• Se transmite el puntero del registro en lugar de los valores individuales.

• El tipo y dimensión de la matriz se deben declarar en la rutina.

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  

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 12

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 13

5. CALCULO DE VARIABLES ESTADISTICAS.

SIMSCRIPT II.5 proporciona un predicado que permite el cálculo de estadísticos a par-


tir de una muestra dada. Para ello, se emplea el predicado compute:

compute <lista cálculo> of <expresión aritmética>

donde <lista de cálculo> es :

<variable> as the <estadístico>

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)

de esta forma, en la variable MEDIA queda almacenada al finalizar el bucle la media de


los valores contenidos en el vector MUESTRA y en VARI la varianza.

Estadísticos que se pueden emplear, vienen reflejados en la siguiente tabla:

Estadístico Significado
NUM Número de elementos seleccionados.

SUM Suma

MEAN SUM/NUM (Media)

SSQ Suma de los cuadrados

MSQ SSQ/NUM (Media de cuadrados)

VAR MSQ-MEAN2 (Varianza)

STD SQRT.F(VAR) (Desviación típica)

MAX El mayor de los valores seleccionados.

MIN El menor de los valores seleccionados.

MAX(i) Valor del índice i donde se encontró el máximo.

MIN(i) El valor del índice i donde se encontró el mín-


imo.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 14

6. EJEMPLO:CALCULO DE LA TRAZA DE UNA MATRIZ.

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.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 15

TEMA 2: ESTRUCTURAS DE DATOS DE ALTO NIVEL

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.

4. LOS ATRIBUTOS DEL SISTEMA.

5. CONCEPTOS DE ENTRADA/SALIDA.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 16

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.

2.1. Definición y declaración.

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:

every <entidad> has an <lista de atributos>

donde an se puede sustituir por a, the o some.

ej.

every TRABAJADOR has an EDAD, a NUMERO and a DNI

y para referirse a un determinado atributo de una entidad:

<atributo>(<entidad>)

ej.

EDAD(TRABAJADOR)

La estructura de datos asociada es:

75$%$-$'25

Valor de ('$'

Valor de 180(52

Valor de '1,

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 17

Los atributos se manejarán como las variables comunes.

Las entidades se pueden clasificar en:

• Temporales: Su creación es individual y su existencia puede ser menor que la dura-


ción de la simulación.

• Permanentes: Se crean en grupos y no se destruyen durante el transcurso de la simu-


lación.
En los siguientes apartados, se expondrán los dos tipos de entidades.

2.2. Entidades temporales.

Para la designación de una clase de entidad temporal en el preámbulo, se antepone a la


declaración de entidad la frase:

temporary entities <lista de declaraciones de entidad>

Después de su declaración en el preámbulo, se debe crear dentro del programa


mediante:

create <entidad> called <variable>

donde entidad es una clase de entidad declarada en el preámbulo. Cuando se ejecuta


un create, se reserva un espacio en memoria para la representación de la entidad y se asigna un
puntero a esta memoria mediante variable.

ej. temporary entities


every BARCO has a NOMBRE and a TONELAJE
...
...
create a BARCO called PETROLERO
create a BARCO called CARGUERO

En la variable se almacena un puntero a la zona de memoria donde se encuentran alma-


cenados los atributos de la entidad.

PETROLERO
NOMBRE
TONELAJE
CARGUERO
NOMBRE
TONELAJE

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 18

Otra forma de creación de una entidad es:

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> called <variable>

o bien, si se ha utilizado el segundo método de creación:

destroy <entidad>

Ejemplo:

destroy the BARCO called PETROLERO

2.3. Entidades permanentes.

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:

permanent entities <lista de declaraciones de entidad>

Las entidades permanentes se almacenan colectivamente en matrices de registros indi-


viduales. El número de entidades permanentes que se crean en cada grupo hay que especificarlo,
pudiéndose hacer de dos formas:

• Utilizando la variable global asociada N.<entidad>

• Espeficándose en la misma creación:


create every <entidad>(<número>)

ej. permanent entities


every CASA has a DIRECCION and a CODIGO.POSTAL
...
...
create every CASA(5)

let N.CASA = 5
create every CASA

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 19

la palabra HYHU\ se puede sustituir por HDFK o DOO.

En el caso de las entidades temporales, la variable en la cual se instancia una determi-


nada clase de entidad es un apuntador al registro que contiene los atributos, análogamente el
nombre de una determinada instanciación de una clase de entidad permanente, es un apuntador
a la zona de memoria que contiene el vector de registros con los atributos del grupo.

Las entidades permanentes se referencian por un índice que varia entre 1 y N.<enti-
dad>. en el ejemplo sería:

DIRECCIÓN(1) ...... DIRECCIÓN(5)

CODIGO.POSTAL(1) ...... CODIGO.POSTAL(5)

El almacenamiento en memoria sería:

DIRECCION CODIGO.POSTAL
1 1
2 2
3 3
4 4
5 5

La referencia a una entidad de un grupo se realiza como en las matrices: <entidad>(I);


y la referencia a un atributo como: <atributo>(I).

Las entidades permanentes también también se destruyen colectivamente:

destroy every <entidad>

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:

for {all|each|every} <entidad> ...

y se puede utilizar en combinación con with y unless.

ej. son equivalentes:

A) for every BARCO with EDAD(BARCO) < AÑOS

B) for I = 1 to N.BARCO
with EDAD(I) < AÑOS

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 20

2.4. Definiciones de atributos.

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

De esta forma, los atributos EDAD y TONELAJE son variables adimensionales y de


tipo entero.

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.

EJERCICIO DE ENTIDADES TEMPORALES:

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.

EJERCICIO DE ENTIDADES PERMANENTES:

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.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 21

SOLUCIÓN CON ENTIDADES TEMPORALES

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 22

SOLUCION CON ENTIDADES PERMANENTES

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 23

3. CONJUNTOS.

3.1. Definición y declaración.

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.

ej. every EMPRESA owns a FIJOS and TEMPORALES


every TRABAJADOR may belong to the FIJOS and the TEMPORALES

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.<conjunto>: Apunta al primer miembro.

• L.<conjunto>: Apunta al último miembro.

• N.<conjunto>: Número de elementos en el conjunto.

En el ejemplo, la entidad EMPRESA tendrá los siguientes atributos:

F.FIJOS F.TEMPORALES
L.FIJOS L.TEMPORALES
N.FIJOS N.TEMPORALES

La segunda sentencia, establece que cada entidad de la clase TRABAJADOR puede


pertenecer a los conjuntos denominados FIJOS y TEMPORALES. Esta sentencia también crea de
modo automático para la entidad miembro del conjunto una serie de atributos:

• P.<conjunto>:Apunta a la entidad predecesora en la lista.

• S.<conjunto>:Apunta a la entidad sucesora en la lista.

• M.<conjunto>:Vale 1 si la entidad pertenece a <conjunto>, 0 en caso contrario.

En el ejemplo, la clase de entidad TRABAJADOR tendrá:

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 TRABAJADOR own PEONES, and may belong to the PEONES

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 24

establece que cada trabajador posee un conjunto de trabajadores. Esto corresponde a


modelar que cada trabajador puede tener otros a su cargo.

Se puede establecer una declaración genérica:

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.

ej. every PUERTO owns some BARCOS.ATRACADOS


every BARCO may belong to the BARCOS.ATRACADOS

La entidad propietaria PUERTO tiene sus atributos F.BARCOS.ATRACADOS y L.BAR-


COS.ATRACADOS que apuntan a las entidades miembro primera (BARCO1) y última
(BARCO3) respectivamente; N.BARCOS.ATRACADOS será igual a 3.

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

La entidad miembro BARCO1 no tiene predecesor (P.BARCOS.ATRACADOS = 0) y


S.BARCOS.ATRACADOS apunta a BARCO2 que le sucede lógicamente en el conjunto BAR-
COS.ATRACADOS.

A la última entidad miembro BARCO3 apunta directamente la entidad propietaria


PUERTO y como no tiene sucesor, S.BARCOS.ATRACADO = 0. Para cada BARCO, M.BAR-
COS.ATRACADOS=1.

3.2. Modificación de conjuntos: Almacenar y eliminar.

Cuando comienza el programa, todos los conjuntos declarados se encuentran vacíos.


Las operaciones básicas sobre conjuntos son:

• Almacenar una entidad: file.

• Eliminar una entidad: remove.

El esquema de file puede adoptar dos formas básicas:

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 25

A) file <expresión aritmética> [first | last] in <conjunto>

B) file <expresión aritmética> {before|after} <expresión> in <conjunto>

En ambas, expresión aritmética evalúa el identificador de la entidad, y puede ser tanto


el valor del puntero que direcciona una entidad temporal obtenido mediante una instrucción
create previa, como un número entero que indica una de las N.<entidad> entidades permanen-
tes de un determinado tipo.

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

Análogamente, utilizando after o before como muestra el ejemplo:

create a BARCO called MI.BARCO


file MI.BARCO in BARCOS.ATRACADOS(PUERTO)
create BARCO called TU.BARCO
file TU.BARCO after MI.BARCO in BARCOS.ATRACADOS(PUERTO)

Para la eliminación de entidades de un conjunto:

remove [first|last] <variable entidad> from <conjunto>

remove <expresión aritmética> from <conjunto>

El primer esquema, elimina del conjunto a la entidad apuntada por F.<conjunto> o


L.<conjunto>, asignando a <variable entidad> el puntero con el atributo M.<conjunto> = 0 y
actualizando los punteros del resto de las entidades que permanecen en el conjunto. En el
segundo caso se eliminará del conjunto la entidad referenciada por el resultado de <expresión

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 26

aritmética>.

La utilización de los punteros asociados a las entidades se efectúa de la siguiente


forma:

S.BARCOS.ATRACADOS(S.BARCOS.ATRACADOS(F.BARCOS.ATRACADOS(PUERTO)))

De esta forma, se referencia a la tercera entidad del conjunto.

3.3. Predicados especiales sobre conjuntos.

Sobre los conjuntos existen dos predicados especiales:

1 • Indicador de vacuidad.

El primero se puede utilizar como condición en expresiones lógicas y tiene el formato:

<conjunto is [not] empty>

ej.
if BARCOS.ATRACADOS(PUERTO(1)) is not empty
print 1 line thus
El puerto no está vacio.
always

2 • Iteración sobre sus elementos.

Las entidades permanentes poseen un iterador debido a su naturaleza agrupada. Sobre


las entidades temporales también se puede iterar siempre y cuando se encuentren agrupadas
bajo la estructura de un conjunto:

for each <variable> of <conjunto>

for each <variable> {form|after} <expresión aritmética> of <conjunto>

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.

3.4. Asignación de prioridad.

Los conjuntos definidos hasta el momento son de tipo FIFO, pero se pueden definir con
otro tipo de prioridad:

define <conjunto> as set ranked by [high|low] <atributo>

define <conjunto> as a {FIFO|LIFO} set

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 27

establece un tipo de prioridad ya definida por el sistema.

ej. every PROCESADOR owns a COLA


every PROCESO has a PRIORIDAD and may belongs to COLA
define COLA as a set ranked by PRIORIDAD

cuando no se especifica high o low se entiende que es high (valor por tomado por defecto).

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 28

4. LOS ATRIBUTOS DEL SISTEMA.

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:

the system has <lista de atributos>

son equivalentes las siguientes expresiones:

A) the system has a X and a Y

B) define X and Y as integer variables

aunque su utilidad está en que permite al programa en su totalidad poseer conjuntos


con sus atributos correspondientes. La estructura sería:

the system owns <lista de conjuntos>

ej. the system owns a COLA

Con esto se generan automáticamente las variables F.COLA, L.COLA y N.COLA. En el


caso del empleo de matrices, como es habitual hay que reservar el espacio necesario durante la
ejecución del programa.

ej. normally, mode is integer, dimension is 2


the system owns a TABLA, and has a MATRIZ
...
...
reserve F.TABLA,L.TABLA,N.TABLA, MATRIZ as N by N

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 29

5. CONCEPTOS DE ENTRADA/SALIDA

En este apartado se incluyen algunas estructuras adicionales de control proporcionadas por


SIMSCRIPT así como facilidades de entrada y salida.

5.1. Operaciones de búsqueda.

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

5.2. Sentencias de salida.

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!

muestra todos los atributos de la entidad particular a la que se hace referencia.

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.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 30

5.3. Trabajo con ficheros.

Se realiza en tres fases:

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.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 31

TEMA 3: HERRAMIENTAS PARA LA SIMULACION DISCRETA

Contenido:

1.INTRODUCCION.

2. LOS EVENTOS Y PROCESOS.


2.1. Declaración de evento.
2.2. Aviso de evento (event notice).
2.3. Declaración de proceso.
2.4. Planificación de eventos y procesos.
2.5. Eventos y procesos lanzados simultaneamente.

3. EL MECANISMO DE SIMULACION.
3.1. El mecanismo de temporización.
3.2. El reloj de simulación.

4. COMUNICACION E INTERACCION ENTRE EVENTOS Y PROCESOS.


4.1. Asignación de valores a los atributos.
4.2. Interacción entre procesos.

5. LOS RECURSOS.
5.1. Declaración y creación.
5.2. Petición y liberación de recursos.

6. MODELADO DE FENOMENOS ESTADISTICOS.

7. ANALISIS DE LA SIMULACION.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 32

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:

• Actividades (Elementos que provocan los cambios).

• Entidades (Elementos que sufren los cambios).

Las actividades se deben modelar atendiendo a sus dos características fundamentales:

• Correcto modelado de las características de la actividad.

• Correcta simulación de la secuencia de ejecución de las actividades, para que el orden


de realizarlas dentro del modelo corresponda al orden de las mismas en el sistema
real.

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:

• Ocurren en un determinado instante de tiempo.

• Su duración es instantánea.

Cada uno de los sucesos provoca un cambio en el sistema, y la duración de la actividad


es la diferencia de tiempo existente entre el suceso de comienzo y el de final. Los cambios asocia-
dos a una actividad los provocan los sucesos que la componen, no la propia actividad, de esta
forma, durante la ejecución de una actividad en el intervalo de tiempo existente entre dos suce-
sos no ocurren cambios en el sistema.

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.

En SIMSCRIPT, a una colección de sucesos relacionados se le denomina proceso. Así,


un proceso es una colección de sucesos o eventos separados por un determinado intervalo de
tiempo. Por otra parte para el modelado de las actividades instantáneas (un suceso) SIMSCRIPT
proporciona el concepto de evento.

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 33

eventos, manejando su interacción así como su correcta temporización. El mecanismo de tempo-


rización tanto para procesos y eventos es el mismo.

2. LOS EVENTOS Y PROCESOS.

2.1. Declaración de evento.

Un evento es una rutina o procedimiento al que se le impone esta característica. La


palabra reservada routine se sustituye por event en su declaración. El flujo de control en el
evento sigue el camino ordinario, comienza por el principio de la rutina y la deja cuando se
encuentra con return.

La definición de evento es similar a la de rutina. La forma general de definición de un


evento es la siguiente, donde lista de argumentos son exclusivamente de entrada:

event <nombre> [<lista de argumentos>]

No poseen argumentos de salida, debido a que no son llamados directamente por


otros subprogramas.

HMHYHQW//(*$'$JLYHQ98(/2DQG25,*(1

2.2. Aviso de evento (event notices).

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.

• p.ev.s: Evento predecesor en el conjunto ev.s.

• s.ev.s: Evento sucesor en el conjunto ev.s.

• m.ev.s: Atributo de pertenencia al conjunto ev.s.

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 34

el preámbulo:

event notices include/every <lista de avisos de eventos>

Include se utiliza si no tiene atributos adicionales a los predefinidos y every en caso


contrario
ej. preamble
event notices
include LLEGADA and INFORME.SEMANAL
every TRABAJO has a PRESUPUESTO
define PRESUPUESTO as an integer variable

En el ejemplo anterior se declaran dos avisos de eventos (LLEGADA e


INFORME.SEMANAL) con los atributos definidos por defecto, y un aviso (TRABAJO) que
aparte de tener los atributos predefinidos posee el atributo PRESUPUESTO definido por el usua-
rio. Recordar que event notice debe de ir separada del resto de declaraciones de entidades. El
nombre del aviso de evento tiene que coincidir con el nombre de la rutina de evento que lo
implementa.

2.3. Declaración de proceso.

Una rutina pasa a ser un proceso simplemente con sustituir la palabra routine por pro-
cess en su definición. La forma general será:

process <nombre> [<lista de argumentos de entrada>]

ej. process LLEGADA.TREN given NUM.VAGONES and VIA

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:

processes include <lista de procesos>

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

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 35

2.4. Planificación de eventos y procesos.

La planificación de procesos y eventos consiste en almacenarlos en el conjunto de suce-


sos futuros (ev.s) para su posterior activación en un instante preciso de tiempo de simulación.
Esto se realiza utilizando la orden schedule en el caso de eventos y activate en el caso de proce-
sos:

schedule a <evento> [called <variable>] at <expresión temporal>

activate a <proceso> [called <variable>] at <expresión temporal>

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.

ej. schedule a LLEGADA at TIEMPO.PROGRAMADO

shedule this LLEGADA at TIEMPO.LLEGADA

2.5. Eventos y procesos lanzados simultaneamente.

En la simulación puede ocurrir el caso de eventos o procesos simultáneos. Resolver


estos conflictos es importante en situaciones en que los procesos y eventos interactúan mutua-
mente o con otras entidades del modelo. Para solucionar esto se emplea:

priority order is <lista de procesos o eventos>

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:

break <proceso/suceso> ties by (high|low) <atributo> {, then by (high|low) <atributo>}

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 36

ej. processes
every INFORME has a NOMBRE and a PRIORIDAD
break INFORME ties by high PRIORIDAD

En este ejemplo, si procesos INFORME ocurren en el mismo tiempo de simulación, el


que tenga el atributo PRIORIDAD mayor será el que ocurra en primer lugar.

3. EL MECANISMO DE SIMULACION.

3.1. El mecanismo de temporización.

La simulación en SIMSCRIPT II.5 está controlada por la rutina de temporización, que


se encarga de organizar la ejecución de las rutinas de procesos y eventos en el tiempo de simula-
ción. Todo programa de simulación debe contener la sentencia start simulation, que pasa el con-
trol de la ejecución del programa a la rutina de temporización.

Para que la simulación pueda comenzar es necesario inicializar el sistema utilizando


sentencias ejecutables que determinen el estado inicial y planifiquen al menos una actividad
(proceso o evento). En general, el modelo de simulación tendrá la siguiente forma:

1.- DECLARACIONES.

2.- INICIALIZACION DE VARIABLES, ENTIDADES Y CONJUNTOS.

3.- PLANIFICACION DE ACTIVIDADES (al menos un proceso o evento).

4.- INCLUIR LA SENTENCIA start simulation.

5.- SENTENCIAS DE FINALIZACIÓN.

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.

El conjunto de sucesos futuros en realidad es un vector de conjuntos. Cada subíndice


denota una clase diferente de eventos o procesos. Cada clase tiene asociada la variable global
i.event que denota el subíndice de la misma dentro del vector. La posición de una clase dentro
del vector viene indicada por la prioridad. Al ser cada elemento del vector un conjunto poseerá
los atributos:
María A. Martínez Ingeniería de Sistemas y Automática.
Lenguaje Simscript (Resumen) 37

• f.ev.s: Primer suceso de la clase.

• l.ev.s: último suceso de la clase.

y los sucesos miembros poseen los atributos:

• p.ev.s: Suceso anterior.

• s.ev.s: Suceso posterior.

• 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

Lanzar un evento causa el almacenamiento de un aviso de evento en la clase apropiada


y dentro de ella se clasifica según su atributo time.a. Los eventos afectados por break se almace-
nan mediante una rutina especial.

El número de avisos de evento o procesos almacenados dentro de una clase en un


momento determinado se puede conocer mediante n.ev.s(i.event).

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 38

3.2. El reloj de simulación.

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.

La frase at <expresión temporal> en la sentencia de lanzamiento de eventos o procesos


es la encargada de darle valor al atributo time.a.

ej.

at 0.0: Lanza la actividad al comienzo de la simulación.

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:

schedule an <evento> now

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:

(at|(after|in)) <expresión temporal> [days|minutes|hours|units]

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:

WEEKDAY.F(<exp real>) Devuelve un entero en [0,7].

HOUR.F(<exp real>) Devuelve un entero en [0,23].

MINUTE.F(<exp real>) Devuelve un entero en [0,59].

Como sentencia contraria a la de lanzamiento de un evento o proceso, se encuentra la


sentencia cancel, que borra el correspondiente aviso del conjunto de sucesos futuros sin ejecutar
la rutina de actividad asociada. Su forma es:

cancel this <actividad> [called <variable>]

Si se intenta cancelar una actividad que no posee el correspondiente aviso en el con-


junto de sucesos futuros, la simulación termina inmediatamente devolviendo un error.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 39

4. COMUNICACION E INTERACCION ENTRE EVENTOS Y PROCESOS.

4.1. Asignación de valores a los atributos.

Los eventos y procesos que poseen atributos definidos por el usuario, se le pueden
asignar valores de dos formas:

• Tratándolos como variables globales, es decir, mediante el predicado de asignación


let.

• Mediante la propia sentencia de lanzamiento schedule o activate.

En el caso de utilizar la segunda opción:

(shedule|activate) an <actividad> [called <variable>][giving <expreiones>] at <expresión temporal>

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:

saving the event notice

de esta forma los atributos se pueden acceder dentro de la rutina. El aviso de evento se
puede destruir posteriormente como una entidad temporal

ej. event LLEGADA saving the event notice

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 40

4.2. Interacción entre procesos.

Los procesos representan una actividad que dura un cierto intervalo de tiempo. Para la
simulación de esta duración, se puede emplear:

work <expresión temporal>

wait <expresión temporal>

El proceso donde se encuentra una de estas sentencias queda dormido, es decir, el


aviso de proceso asociado al mismo se vuelve a almacenar en el conjunto de eventos futuros des-
pués de ajustar el valor del atributo time.a al tiempo en que el proceso se reanuda. Mientras un
proceso está dormido, se pueden ejecutar otras actividades (eventos o procesos).

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.

ej. process BARCO


...
if MUELLE <> VACIO
file BARCO in COLA.MUELLE
suspend
always
...

y otro proceso puede contener:

if COLA.MUELLE is not empty


remove first BARCO from COLA.MUELLE
reactivate this BARCO now
else
let MUELLE =VACIO
always
...

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.

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 41

La sentencia seria:

interrupt the/this/the above <proceso> called <variable>

Un proceso que se ha interrumpido se puede reactivar (volver al conjunto de eventos


futuros) mediante resume procedente de otros procesos o rutinas, utilizando el valor del atributo
time.a para determinar el tiempo de work o wait.

resume the/this/the above <proceso> called <variable>

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 42

5. LOS RECURSOS.

5.1. Declaración y creación.

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.

Un recurso se declara en la sección de recursos (resources) del preámbulo. Un recurso


se puede considerar como una entidad permanente con los siguientes atributos predefinidos:

u.<recurso>: Número de unidades disponibles.

q.<recurso>: Conjunto de procesos en espera.

x.<recurso>: Conjunto de procesos que lo utilizan.

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.

5.2. Petición y liberación de recursos.

Un proceso solicita una cantidad de un determinado recurso utilizando la sentencia


request que actúa dando los recursos al proceso, si los tiene disponibles, continuando la ejecu-
ción del mismo por la sentencia siguiente a la petición.

Si la cantidad solicitada no está disponible, el proceso pasa a un estado pasivo, enco-


lándose en la cola de procesos en espera por ese recurso que se encuentra ordenada por alta prio-
ridad. Si en la petición del recurso no se especifica prioridad, se le asigna el valor 0.

El uso de la sentencia request es el siguiente:

resquest <unidades> <recurso> [with priority <prioridad>]

ejemplo:

request 1 trabajador(2) with priority 2

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 43

Un proceso que ha solicitado un cierto número de unidades de un recurso lo puede libe-


rar, aunque no necesariamente todas las unidades a la vez, utilizando la sentencia relinquish. El
número de unidades del recurso que se libera, se añade al total de recursos disponibles para
poder ser utilizados por otros procesos que estén en la cola de espera.

La liberación de recursos:

relinquish <unidades> <recurso>

Ejemplo:

relinquish 1 trabajador(2)

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 44

6. MODELADO DE FENOMENOS ESTADISTICOS.

En la simulación estocástica es necesario disponer de herramientas para el modelado


de sucesos estadísticos. La principal función que realiza este cometido es random.f que genera
una serie de números seudoaleatorios en el intervalo [0.0,1.0] a partir de una semilla dada:

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.

A medida que se van generando los números seudoaleatorios, se van asignando al


registro seed.v, por lo que éste siempre contiene la semilla actual para cada secuencia.

Aparte existen una serie de funciones que modelan las distribuciones estadísticas prin-
cipales. En la siguiente tabla aparecen algunas de ellas:

1) beta.f(e1,e2,i): Genera un número real beta-distribuido.


e1= potencia de X.
e2= potencia de (1-X)
i=semilla.

2) binomial.f(i1,e,i2): Genera un número entero según la distribución binomial.


i1=numero de sucesos independientes.
e=probabilidad de que suceda.
i2=semilla.

3) erlang.f(e,i1,i2):Genera un número real de la distribución de ERLANG.


e=media.
i1=k.
i2=semilla.

4) exponential.f(e,i):Genera un real exponencialmente distribuido.


e=media.
i=semilla.

5) normal.f(e1,e2,i): Genera un real normalmente distribuido.


e1=media.
e2=desviación típica.
i=semilla.

6) poisson.f(e,i):Genera un entero de la distribución de Poisson.


e=media.
i=semilla.

7) uniform.f(e1,e2,i): Genera un real uniformemente distribuido entre e1 y e2.


e1=limite inferior.
e2=limite superior.
i=semilla.
María A. Martínez Ingeniería de Sistemas y Automática.
Lenguaje Simscript (Resumen) 45

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.

Cuando se realiza la simulación de un sistema, lo que se quiere es hacer un estudio de


su comportamiento. Este comportamiento se mide utilizando una serie de medidas estadísticas
generadas como resultado de la simulación. Para la generación de estas salidas se emplean los
predicados accumulate y tally que se declaran en el preámbulo e indican al compilador que
recoja y analice de modo automático los datos asociados en los puntos del programa donde se
producen los cambios.

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:

• Con variables no subindizadas.

• Con atributos de entidades permanentes.

• Con atributos de entidades temporales.

El modo de actuar de ambos es similar, se diferencian en que accumulate introduce el


tiempo de simulación en los cálculos de media, varianza y desviación típica de modo que se pon-
deran los valores según el intervalo de tiempo de simulación que han permanecido en la ejecu-
ción del modelo

Tally y accumulate no pueden actuar sobre una misma variable.

La expresión general es la siguiente:

(accumulate|tally) <variable> as the <estadístico> of <expresión>

{, <variable> as the <estadístico> of <expresión>}

María A. Martínez Ingeniería de Sistemas y Automática.


Lenguaje Simscript (Resumen) 46

La diferencia entre tally y accumulate reside en que el segundo introduce el tiempo de simula-
ción.

Estadístico Tally Accumulate

NUMBER N N

SUM ΣX ΣX *(time.v-Tl)

SUM.OF.SQUARES 2 2
ΣX ΣX *(time.v-Tl)

MEAN SUM/NUMBER SUM/(TIME.V-To)

MEAN.SQUARE SUM.OF.SQUARES/ SUM.OF.SQUARES/


NUMBER (time.v-To)

VARIANCE MEAN.SQUARE- MEAN.SQUARE-


MEAN** MEAN**

STD.DEV SQRT.F(VARIANCE) SQRT.F(VARIANCE)

MAXIMUM Mayor X Mayor X

MINIMUM Menor X Menor X

donde:

Tl: Tiempo de simulación en el que se le asigna el valor actual a una variable acumu-
lada.

To: Tiempo de simulación en el que empieza la acumulación.

María A. Martínez Ingeniería de Sistemas y Automática.

Das könnte Ihnen auch gefallen