TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS Tutorial sobre SDL Por José Juan Sánchez Manzanares ÍNDICE PARTE 1 (Iniciación a SDL) 1. Introducción a SDL 1.1. Sistema 1.2. Bloque 1.3. Proceso 1.4. Canal 1.5. Señal 1.6. Temporizadores 2. Símbolos en SDL 3. Tutorial “DemonGame” 4. Caso práctico PARTE 2 (SDL Avanzado) 5. Mapeado de C a SDL 5.1. Tipos en C que tienen una Correspondencia Directa 5.2. Tipos en C que no tienen una Correspondencia Directa 5.3. Funciones en C 5.4. Constantes 6. Estructuras y arrays 7. Instancias de procesos 8. El validador 9. El simulador 10. Los sinónimos externos 1 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS PARTE 1: INICIACIÓN A SDL 1. Introducción a SDL El lenguaje SDL es propuesto por el CITT (Comité Consultivo Internacional Telegráfico y Telefónico) en las recomendaciones Z.100 a Z.104. Es un lenguaje orientado a la especificación y descripción del comportamiento de sistemas de telecomunicaciones. El área de aplicación de SDL es la especificación del comportamiento de sistemas que funcionan en tiempo real. Por ejemplo: a) procesamiento de llamadas en sistemas de conmutación b) mantenimiento y tratamiento de fallos en sistemas de telecomunicaciones c) control de sistemas d) funciones de operación y mantenimiento, gestión de redes e) protocolos de comunicación de datos SDL permite elegir entre dos formas sintácticas diferentes para la representación de sistemas: - SDL/GR (Graphical Representation) - SDL/PR (Phrase Representation) SDL/GR es un lenguaje gráfico que permite visualizar la estructura y flujos de control de un sistema y SDL/PR es un lenguaje de programación, mas apropiado para la utilización de herramientas automatizadas. Ambas sintaxis tienen el mismo modelo semántico. La entidad principal en SDL es el sistema (SYSTEM) que se compone de bloques (BLOCKS). Los bloques se conectan entre si y con el entorno (ENVIRONMENT) por medio de canales (CHANNELS). Los canales sirven como medio de transporte de las señales (SIGNALS) entre bloques y con el entorno. Un bloque puede contener varias especificaciones de procesos; un proceso interactúa con otros procesos y con el entorno por medio de las señales. Un proceso es modelado como una máquina de estados finita extendida, lo cual le agrega el uso de variables, parámetros, acciones y temporizadores. 1.1 Sistema Una definición de sistema en SDL es una especificación o descripción de un sistema. Un sistema está separado de su entorno por la frontera del sistema y contiene un conjunto de bloques. La comunicación entre el sistema y el entorno o entre los bloque dentro del sistema sólo puede efectuarse mediante señales. Dentro de un sistema, estas señales son transportadas por canales. Los canales conectan bloques entre sí o con la frontera del sistema. Debe haber por lo menos un bloque dentro del sistema. 2 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS En la siguiente imagen vemos los principales elementos de un sistema. 1.2 Bloque Una definición de bloque es un contenedor para una o más definiciones de proceso de un sistema. La definición de bloque tiene por finalidad agrupar procesos que realizan cierta función. Una definición de bloque proporciona una interfaz de comunicación estática por la cual sus procesos pueden comunicar con otros procesos. Además establece un ámbito para definiciones de proceso. Debe haber al menos un proceso dentro de cada bloque. 3 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS 1.3 Proceso Una instancia de un proceso es una máquina de estados finita extendida. En el modelo se da una transición de un estado a otro siempre que se recibe una señal válida de otro proceso o del entorno. Al recibir la señal, se pueden realizar acciones de manipulación de datos locales al proceso, o enviar señales a otros procesos o al entorno. Después de efectuada la transición la máquina se encontrará en espera en otro estado. Varias instancias del mismo tipo de proceso pueden existir al mismo tiempo y actuar asincrónicamente y en paralelo, entre sí y con otras instancias de un tipo de proceso diferente del sistema. Las señales recibidas por instancias de proceso se denominan señales de entrada, y las señales enviadas a instancias de proceso se denominan señales de salida. Las señales solo pueden ser consumidas por una instancia de proceso cuando ésta se encuentra en un estado. El conjunto de señales de entrada válidas es la unión del conjunto de señales en todos los canales que conducen al proceso y las señales del temporizador. Todos los procesos tienen acceso al tiempo absoluto (NOW) y pueden realizar mediciones de tiempo y temporizador. Cada proceso tiene asociado una única cola de señales de entrada, la cual no se comparte con otros. Además para cada estado hay un conjunto de señales de conservación. Cuando el proceso se encuentra en espera en un estado, la primera señal de entrada cuyo identificador forme parte del conjunto de señales de conservación es extraída de la cola y consumida por el proceso. La manipulación de datos se hace por medio de variables locales a cada proceso. SDL permite la definición de cualquier tipo de datos que se necesite, incluidos tipos de datos compuestos (STRUCT). 1.4 Canal Un canal representa una ruta unidireccional de transporte de señales entre dos bloques o entre un bloque y su entorno. Las señales transportadas por canales se entregan al punto extremo de destino. Las señales llegan al punto extremo de destino de un canal en el mismo orden en que fueron enviadas en el punto origen. Pueden existir varios canales entre los dos mismos puntos extremos. Canales diferentes pueden transportar señales del mismo tipo. Para cada canal tiene que haber una lista de señales que transporta el canal. Por lo menos uno de los puntos extremos del canal tiene que ser un bloque. Si los dos puntos extremos son bloques, estos tienen que ser diferentes. 4 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS La siguiente figura muestra la arquitectura de un sistema SDL. 1.5 Señal Una instancia de señal es un flujo de información entre procesos, siendo también una instanciación de un tipo de señal definido. Por lo menos uno de los puntos extremos de la ruta de señal tiene que ser un proceso. Si los dos puntos extremos son procesos, estos tienen que ser diferentes. La declaración de señales en SDL/GR se representa dentro de un cuadro, encabezado con la etiqueta SIGNAL y junto a ella los nombres de las señales declaradas, de la siguiente forma: 5 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS La siguiente figura muestra la comunicación entre dos procesos mediante el envío de señales. 1.6 Temporizadores Todos los procesos pueden utilizar temporizadores y tienen acceso al tiempo absoluto (NOW), que es común a todos los procesos. Una instancia de temporizador es un objeto, en una instancia de proceso, que puede estar activo o inactivo. Cuando un temporizador inactivo es inicializado (SET), se le asocia un valor de tiempo. Si este temporizador no es reinicializado (RESET), o si no es inicializado de nuevo, antes de que el tiempo de sistema llegue a este valor de tiempo, se aplica a la cola de señales de entrada del proceso una señal con el mismo nombre que el temporizador. La misma acción se efectúa si el temporizador es inicializado con un valor de tiempo menor que NOW. Un temporizador está activo desde el momento de la inicialización hasta el momento del consumo de la señal de temporizador. Cuando un temporizador inactivo es reinicializado, sigue estando inactivo. Cuando un temporizador activo es reinicializado, la asociación con el valor de tiempo se pierde, si hay una señal de temporización correspondiente retenida en la cola de entrada, se suprime y el temporizador pasa a inactivo. La inicialización de un temporizador activo equivale a reinicializarlo e inicializarlo inmediatamente después. 6 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS Sentencias de definición de temporizadores. I. Definición de temporizador: TIMER <nombre_temporizador> Ejemplo: TIMER T. II. Inicialización de temporizador SET (<tiempo_futuro>, <nombre_temporizador>) Ejemplo: Set(now+1, T). III. Reinicializacion de temporizador: RESET (<nombre_temporizador>) Ejemplo: Reset(T); 2. Símbolos en SDL INCLUDE. En el sistema se pueden incluir librerías de SDL. TEXT. Para declaración de variables (DCL) y constantes. ARRANQUE PROCESO: Símbolo inicial con el que comienza el proceso. PARADA PROCESO: La parada causa la detención inmediata de la instancia de proceso que la emite. Esto significa que las señales retenidas en la cola de entrada se descartan y que las variables y temporizadores creados para el proceso y la cola dejaran de existir. Se pondrá para indicar donde termina un proceso (si termina). ESTADO: Un estado representa una condición particular en la cual una instancia de proceso puede consumir una instancia de señal, lo que causa una transición. Si no hay instancias de señal retenidas, el proceso espera en el estado hasta que se reciba una instancia de señal. Cada símbolo de estado debe tener un identificador del estado. CONSERVACION: El símbolo de conservación está asociado a los estados del proceso. Cada símbolo de conservación debe especificar el tipo de señal que conserva o el símbolo * para conservar todas las señales. Las señales conservadas se retienen en la cola de señales en el orden de su llegada. El efecto 7 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS de la conservación es válido solamente para el estado al cual está asociada la conservación. En el estado siguiente, las instancias de señal que han sido conservadas se tratan como instancias de señal normales. ENTRADA: Una entrada permite el consumo de la instancia de señal de entrada especificada. El consumo de la instancia de la señal de entrada pone a la disposición del proceso la información transportada por la señal. A las variables asociadas con la entrada se asignan valores transportados por la señal consumida. Si no hay variable asociada con la entrada para una señal, se descarta el valor. PROCEDIMIENTO: conjunto de instrucciones que son llamadas desde un proceso o procedimiento mediante. Último objeto en el que se puede descomponer un proceso. LLAMADA A UN PROCEDIMIENTO: Permite la ejecución de un procedimiento previamente declaro en un proceso o procedimiento. SALIDA: Los valores transportados por la instancia de señal son los valores de los parámetros efectivos en la salida. Si no hay ningún parámetro en la salida en la definición de señal, la señal transporta el valor indefinido. TAREA: Una tarea puede contener varia sentencias de asignación o especificación de procesos descriptos en algún leguaje de programación. DECISION: Una decisión transfiere el control al trayecto cuya condición contiene el valor dado por la interpretación de la pregunta. Se define un conjunto de respuestas posibles a la pregunta, cada una de las cuales especifica el conjunto de acciones a interpretar para esa elección de trayecto. Si Condicion = true hacer una cosa; si Condicion = false hacer otra cosa. 8 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS CONECTOR: Un conector representa la continuación de un trayecto desde otro conector correspondiente con el mismo número de conecto en la misma área de gráfico de proceso. INICIO PROCEDIMIENTO. Símbolo inicial con el que comienza el procedimiento. FIN PROCEDIMIENTO. Símbolo final con el que termina el procedimiento. 3. Tutorial DEMONGAME Este ejemplo se usa en los ejemplos de la recomendación Z100. Consiste en un juego sencillo, donde el usuario puede generar las señales Newgame, Endgame, Probe y Result. Las 2 primeras señales son para iniciar (ignorada si ya se juega) y terminar (ignorada si no se juega) un juego. Las reglas del juego son sencillas: 1. Un demon, representado por el proceso Demon, cambia el estado del sistema (winning, losing) de vez en cuando. 2. El usuario debe adivinar cuando el estado es winning. 3. Si el usuario prueba (señal Probe) cuando el estado es winning, gana un punto. 4. Si el usuario prueba cuando el estado es losing, pierde un punto. 5. Para ver el marcador el usuario produce la señal Result, contestada por la señal Score, que contiene un parámetro de tipo entero con el resultado actual. La estructura del sistema es la siguiente: i. El sistema DemonGame, compuesto por los bloques i.A. Game Block, que está compuesto de los procesos i.A.1. Main i.A.2. Game i.B. Demon Block, compuesto por el proceso i.B.1. Demon 9 TUTORIAL SOBRE SDL SDT INGENIERÍA DE PROTOCOLOS r- C:\Telelogic\SDL_TTCN_Suite4.3\sdt\examples\demongame\demongame.sdt rw C:\Telelogic\SDL_TTCN_Suite4.3\sdt\examples\demongame\ My first SDL system DemonGame DemonGame GameBlock Main Game DemonBlock Demon r- DemonGame.ssy rrrrr- GameBlock.sbk Main.spr Game.spr DemonBlock.sbk Demon.spr r- DemonGame.msc Other Documents DemonGame i.- SISTEMA 10 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS i.A.- Bloque GameBlock i.A.1.- Proceso Main 11 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS i.A.2.- Proceso Game i.B.- Bloque DemonBlock 12 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS i.B.1.- Proceso Demon ii. Simulación *** FIN TUTORIAL DEMONGAME *** 13 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS 4. Caso Práctico Implemente en SDL los siguientes procesos: - Emisor: Recibe mensajes de largo variable y envía caracteres. Al principio de cada mensaje, envía un STX, y a final un ETX. - Receptor: Recibe caracteres y envía mensajes. Los mensajes recibidos están delimitados por los caracteres STX y ETX. Solución (parcial) al Caso Práctico 14 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS PARTE 2: SDL AVANZADO 5. Mapeado de C a SDL Describimos como representar en SDL los tipos de datos y funciones de C. Se explica por medio de tablas que representan la equivalencia entre ambos tipos. 5.1. Tipos en C con una Correspondencia Directa en SDL La tabla siguiente muestra una lista de tipos en C para los que existe una equivalencia directa en SDL. Tipo C Tipo SDL Definido en el paquete char Carácter Predefined unsigned char Octet Predefined int Integer Predefined short int ShortInt ctypes long int LongInt ctypes unsigned int UnsignedInt ctypes unsigned short int UnsignedShortInt ctypes unsigned long int UnsignedLongInt ctypes float Flota ctypes double Real Predefined void * Voidstar Ctypes void ** Voidstarstar Ctypes char * Charstar Ctypes 5.2. Tipos en C que no tienen una Correspondencia Directa en SDL Para otros tipos de C no existe una correspondencia directa con SDL, y debemos construir un nuevo tipo con syntype o newtype. Ref y Carray son generadores que se definen en el paquete ctypes. 15 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS La siguiente tabla muestra la definición en C de un tipo de datos y su equivalente en SDL. Tipo en C Tipo en SDL typedef x y; syntype y = x endsyntype; typedef x *y; newtype y Ref(x) endnewtype; typedef x y[20]; newtype y Carray(20, x) endnewtype; typedef enum { a, b } x; o alternativamente typedef int x; #define a 0 #define b 1 newtype x literals a, b endnewtype; o alternativamente syntype x = Integer endsyntype; synonym a x = 0; synonym b x = 1; typedef struct { int a; } x; newtype x struct a Integer; endnewtype; typedef struct { int a:2; int b:6; } x; newtype x struct a Integer:2; b Integer:6; endnewtype; typedef union { int a; char b; } x; newtype x /*#UNIONC*/ struct a Integer; b Character; endnewtype; 5.3. Funciones en C Las funciones prototipo en C son mapeadas como procedimientos extenos en SDL. Un procedimiento externo es llamado de la misma forma que un procedimiento normal. Funciones en C Funciones en SDL void func (par1 type1, par2 type2, ..); procedure func; fpar par1 type1, par2 type2, ...; external; type1 func (par1 type1, ..); procedure func; fpar par1 type1, ...; returns type1; external; void func (par1 *type1); procedure func; fpar in/out par1 type1; external; Los parámetros del tipo puntero pueden ser manejados de dos maneras diferentes. Como ejemplo, tomemos el parámetro par1, puntero (*) a un carácter del tipo en la declaración de la función fn: 16 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS En C, esta función se declara como void fn (char *par1); Las dos maneras de traducir esto a SDL son: 1. Uso de un parámetro IN/OUT procedure fn; fpar in/out par1 Character; external; Esta función es llamada por un parámetro que no es puntero. call fn (c); /* c variable of type Character */ 2. Uso de un parámetro IN correspondiente a un puntero: procedure fn; fpar par1 Charstar; external; La función es llamada por un parámetro que es un puntero. call fn (&c); /* c variable of type Character */ call fn (cst); /* cst variable of type Charstar */ En el ejemplo de arriba, &c denota la dirección de la variable c. Con parámetros IN/OUT, solo se permiten variables como parámetros. De esta forma, la segunda forma es menos general. 5.4. Constantes Las constantes en C se expresan usando macros. Pueden ser mapeadas como sinónimos "normales" o como sinónimos externos (external). Consideremos el siguiente ejemplo: #define MAX 1000 En un caso normal, puede ser mapeado como un sinónimo: synonym MAX Integer = 1000; Pero también podemos definirlo como un sinónimo externo: synonym MAX Integer = external; 17 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS 6. Estructuras y Arrays 6.1. Definición y Referenciado de Variables Tipo Array Un array en SDL se define como SYNTYPE Syn = integer CONSTANTS 0:10 ENDSYNTYPE; NEWTYPE Arr ARRAY(Syn, real) ENDNEWTYPE; Donde Syn es el índice del array. Un indice puede ser un tipo de dato discreto, definido en un intervalo cerrado. Los posibles tipos son: Character Boolean Octet Bit Enumeration Syntypes del tipo Integer, carácter, boolean, octect, bit y enumeration. Si A es un array del tipo Arr (DCL Arr A;) Para referenciar un elemento del array A usamos la sintaxis siguiente: A[i], donde i es el índice del tipo definido. 6.2. Definición y Referenciado de Estructuras Para referenciar cada uno de los atributos de una variable del tipo struct (estructura) usamos la siguiente sintaxis. DCL CeldaType x; donde CeldaType es una estructura definida como NEWTYPE CeldaType STRUCT Ocupada Boolean; Peticion Boolean; Datos DatosType; ENDNEWTYPE; Para referenciar a cada uno de los atributos de la variable x del tipo CeldaType usamos la sintaxis siguiente: x!Ocupada x!Peticion x!datos 18 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS 7. Instancias de Procesos Describiremos como obtener el PID de una instancia de un proceso. Los PId simplifican la fase de inicio (arranque) de un sistema SDL, al permitir la comunicación directa entre instancias de procesos (OUTPUT TO). En SDL, la única manera de obtener el PID es usando las funciones básicas Self, Parent, Offspring, o Sender. Tales valores pueden ser pasados como parámetros en señales, in llamadas a procedimientos y en operaciones. Cada instancia de un proceso contiene las siguientes variables implícitas: Self: contiene el PID de la instancia actual Sender: Contiene el PID de la instancia que le ha enviado la ultima señal consumida. Parent: Contiene el PID de la instancia padre (la que crea la instancia actual). Offspring: Contiene el PID de la ultima instancia creada. Para crear una instancia de un proceso usaremos la llamada a create request, que corresponde al símbolo SDL: Después de crearse un proceso, la función del sistema offspring contiene su PID. Debemos almacenar su valor en una variable del tipo PID si queremos después referenciar dicho proceso. DCL pid_proceso PID; // Declaramos la variable del tipo PID pid_proceso:=offspring; // y almacenamos su PID (offspring) Para enviar una señal a un proceso concreto usaremos la sentencia TO: Donde pid_proceso contiene el PID del proceso creado. Un proceso puede enviarle señales a quien lo creo (su padre) con TO parent, donde parent contiene el PID del proceso que lo creo: 19 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS El siguiente ejemplo muestra como el proceso Canal crea N Emisores y como el Canal almacena sus PID en un array de pid (Emisor_ID), para después poder referenciarlos y enviarles señales a cada uno de ellos. process Canal 1(1) NEWTYPE PidArray Array (Integer, Pid) ENDNEWTYPE; TIMER T; DCL Emisor_ID PidArray, i integer := 1, tx_sim integer := 0, G integer := 0, S integer := 0; Creacion de instancias de proceso emisor. El proceso Canal crea 'N_nodos' instancias del proceso Emisor y guarda el PID de cada proceso Emisoren Emisor_ID, que es un array de PID. i:=0; i<N_nodos false true Cuando el proceso Canal emita una señal, debe indicar a que proceso va dirigida. La sintaxis es "señal TO PID". En nuestro caso sera "señal TO Emisor_ID(i)" offspring es una variable de sistema y contiene el valor del ultimo PID creado. El array Emisor_ID recoge ese valor, para que no se pierda Instanciamos la señal T, del tipo TIMER, para que ocurra dentro de un tiempo (now+Ranura). Now es una variable de sistema que recoge el valor del tiempo actual en nuestro sistema. Emisor set(now + RANURA, T) Nueva_Ranura Emisor_ID(i) := offspring T i := i + 1 Emitir_TICs Llamada a procedimientos Leer_Intencion Emitir_Colision Emitir_TICs set(now + RANURA, T) Leer_Intencion Declaracion de los procedientos usados en el proceso Canal Nueva_Ranura Emitir_Colision 20 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS 8. El Validador El validador comprueba que nuestro sistema es consistente, es decir, que no se producen bloqueos y que todas las señales se consumen. Para ello, mediante distintos métodos de evaluación, escanea todos los posibles estados de nuestro sistema, buscando bloqueos, señales no consumidas, …y cualquier otro tipo de inconsistencia. Al igual que en el simulador, debemos establecer el compilador adecuado ‘Microsoft Validation’ antes de compilar la validación. Lo hacemos desde la opción ‘Make’del menú ‘Generate’ del ‘Organizer’. Otro aspecto a tener en cuenta en la validación es la longitud de la cola de señales. Por defecto, su valor es 3. Al ejecutar la validación, si nuestro sistema emite más de 3 señales sin consumirlas, la cola se llenará y el validador mostrará un error. Por eso debemos definir el tamaño de la cola (desde el menú Opcion1) al valor que nosotros consideremos oportuno (número máximo de señales que nuestro sistema puede encolar). 9. El Simulador Para realizar una simulación, lo primero que debemos hacer es seleccionar el compilador que vamos a usar. Para ello debemos seleccionar la opción ‘Make’ del menú ‘Generate’ del ‘Organizer’ y establecer (Set) el compilador ‘Microsoft Simulation’. El compilador “Microsoft Simulation” genera un ejecutable (<sistema>_smc.exe), que como tal, puede ser invocado desde el shell de MS-DOS. También podemos invocar a 21 TUTORIAL SOBRE SDL INGENIERÍA DE PROTOCOLOS este ejecutable (.exe) desde la herramienta gráfica que proporciona Telelogic y realizar trazas (con MSC). Esta última opción es más sencilla, pues proporciona de manera interactiva los comandos a ejecutar. Sin embargo, es menos práctica, sobre todo si queremos ejecutar simulaciones de manera programada (automática). La forma más practica de realizar simulaciones de manera automática es escribiendo los comandos a ejecutar en el fichero de texto siminit.com. Este fichero contendrá los comandos a ejecutar en nuestra simulación, de forma secuencial. siminit.com ==================================== Proceed-Until 10 Examine-Variable(Canal G) Quit 10. Los Sinónimos Externos SDL permite la declaración de variables y sinónimos externos. Esto nos ayudará ejecutar varias simulaciones sin necesidad de modificar los valores de nuestras constantes (o inicialización de variables) en el código fuente, y por lo tanto, tener que recompilar para realizar una simulación con los nuevos valores. Los pasos a realizar son los siguientes: 1. Definir en nuestro sistema los sinónimos de forma externa. Por ejemplo, si queremos definir la probabilidad de carga (PG) del protocolo Aloha de forma externa, deberemos declarar el sinónimo (constante) como sigue: SYNONYM PG Real = External; DCL N integer:=External; // Sinónimo externo // Variable externa 2. Proporcionar esos valores por teclado o fichero. Al ejecutar la simulación, el sistema indicará que proporcionemos el valor de los sinónimos de forma externa, bien desde teclado, o bien desde fichero. Si elegimos introducir el valor por fichero, deberemos tener un fichero con extensión .syn, que contenga una lista de sinónimos y sus valores. Un ejemplo de fichero de sinónimos sería pg.syn: pg.syn ==================================== PG 0.10 Para que nuestro ejecutable (<sistema>_smc.exe) sepa que nuestro fichero de sinónimos se llama ‘pg.syn’, debemos crear la variable de entorno SDTEXTSYNFILE y asignarle como valor el nombre del fichero donde están contenidos los sinónimos (pg.syn, en nuestro ejemplo). En nuestro caso, desde la línea de comandos (desde el command.com) teclearíamos: C:\> set SDTEXTSYNFILE=pg.syn Para el caso de variables externas, debemos asignarles valores mediante la sentencia Assign-Value <variable>:=<valor>, en el fichero siminit.com. 22