Documentos de Académico
Documentos de Profesional
Documentos de Cultura
RTUQM 28 - Módulo Lógicas V2 - 0 PDF
RTUQM 28 - Módulo Lógicas V2 - 0 PDF
Módulo Lógicas
Versión 2.0
1 IDENTIFICACIÓN ................................................................................................................................................. 5
2 DESCRIPCIÓN GENERAL................................................................................................................................... 5
10 CONFIGURACIÓN .......................................................................................................................................... 93
10.1 PARÁMETROS DE CONFIGURACIÓN ................................................................................................................... 93
10.1.1 Carpeta General ...................................................................................................................................... 93
10.1.2 Estructuras .............................................................................................................................................. 94
10.1.3 Arrays ...................................................................................................................................................... 94
10.1.4 Variables Globales .................................................................................................................................. 94
10.1.5 Programas ............................................................................................................................................... 94
10.1.6 Bloques Funcionales ............................................................................................................................... 94
10.1.7 Funciones ................................................................................................................................................ 94
10.1.8 Carpeta Archivo INI ................................................................................................................................ 94
10.2 IMPORTACIÓN/EXPORTACIÓN ........................................................................................................................... 94
11 PUNTOS DE SUPERVISIÓN .......................................................................................................................... 95
2 Descripción General
El módulo logicas es un módulo del sistema RTUQM que implementa la funcionalidad de lógica local dentro
de la RTU utilizando el lenguaje ST (Structured Text) de la norma IEC 61131-3 second edition 2003-01.
El módulo lógicas interactúa directamente con el módulo base de datos según se describe más adelante.
Se dispone además de un visualizador grafico que permite mostrar el estado interno del módulo en tiempo
real, dicho visualizador se ejecuta sobre la plataforma Windows.
El sistema RTUQM permite la ejecución de varias instancias del módulo lógicas concurrentemente pero el
sistema limita que exista una única instancia del módulo por archivo de configuración. A estos efectos se
agrega una entrada por archivo de configuración en el directorio “rtuqm/locks”. Si el módulo al arrancar
detecta que ya existe otra instancia ejecutándose con la misma configuración, termina en forma inmediata.
Un subconjunto configurable por el usuario de las variables internas puede definirse como persistente. Esto
implica que los valores almacenados son salvados a memoria no volátil y son recordados aunque la RTU
sea apagada.
Máquina de
Cálculo
Puntos de Salida
Este ciclo se realiza periódicamente. El período puede ser configurado por el usuario o puede hacerse tan
rápidamente como la capacidad de la CPU lo permita.
El módulo realiza sus cálculos con variables. Las mismas pueden obtenerse desde puntos de base de
datos de la RTU o ser internas al módulo. A continuación se resumen todos los tipos de datos soportados
por el PLC para la definición de variables.
• Tipos de datos externos: Corresponde a las estructuras predefinidas por el sistema para manejar
variables de entrada o de salida del PLC que estén asociadas a puntos de BD.
• Entrada Valor DINT desde BD:EI: Variable DINT cuyo valor se obtiene desde
un punto de Entrada Int de BD
• Entrada Valor LREAL desde BD:EF: Variable LREAL cuyo valor se obtiene
desde un punto de Entrada Float de BD
• Entrada Valor BOOL desde BD:EB: Variable BOOL cuyo valor se obtiene
desde un punto de Entrada Bool de BD
• Entrada Valor STRING desde BD:ES: Variable STRING cuyo valor se obtiene
desde un punto de Entrada String de BD
• Salida Valor DINT hacia BD:EI: Variable DINT cuyo valor se exporta hacia un
punto de Entrada Int de BD
• Salida Valor LREAL hacia BD:EF: Variable LREAL cuyo valor se exporta
hacia un punto de Entrada Float de BD
• Salida Valor BOOL hacia BD:EB: Variable BOOL cuyo valor se exporta hacia
un punto de Entrada Bool de BD
• Salida Valor STRING hacia BD:ES: Variable STRING cuyo valor se exporta
hacia un punto de Entrada String de BD
• Salida Comando DINT hacia BD:SI: Comando DINT realizado sobre un punto
de Salida Int de BD
• Salida Comando LREAL hacia BD:SF: Comando LREAL realizado sobre un
punto de Salida Float de BD
• Salida Comando BOOL hacia BD:SB: Comando BOOL realizado sobre un
punto de Salida Bool de BD
• Salida Comando STRING hacia BD:SS: Comando STRING realizado sobre
un punto de Salida String de BD
• Bloques funcionales del sistema: Corresponden a todos los bloques funcionales predefinidos por el
sistema.
o CTU - Contador ascendente
o CTD - Contador descendente
o CTUD - Contador ascendente/descendente
o TP - Temporizador de pulso
o TON - Temporizador de cierre
o TOF - Temporizador de apertura
o BLINK - Temporizador de pulsos repetitivos
o R_TRIG - Detector de flanco ascendente
o F_TRIG - Detector de flanco descendente
o RF_TRIG - Detector de flancos
o SR - Biestable set dominante
o RS - Biestable reset dominante
o GET_DATE_AND_TIME
• Bloques funcionales del usuario: Corresponden a todos los bloques funcionales definidos por el usuario.
Cada vez que el estado de alguna de las variables persistentes cambia se actualiza el archivo de variables
persistentes. Pero por razones de eficiencia, esta actualización no se realiza inmediatamente sino que
periódicamente cada cinco minutos se verifica si hay cambios pendientes y de ser así se actualiza el
archivo completo con el estado de todas las variables persistentes. El archivo también se actualiza, de ser
necesario, cada vez que se detiene el PLC.
NOTAS
1. El nuevo archivo XML de persistencia se empezó a utilizar a partir de la versión 3.0 del módulo. Las
versiones anteriores utilizaban un archivo de persistencia tipo INI de nombre
“/rtuqm/state/<config>_variables.ini”, el cual sólo soportaba variables persistentes de tipos de
datos simples o elementales.
2. Para las versiones de QNX anteriores a la 6.5.0, la librería de XML no está soportada, por lo cual se
sigue utilizando el viejo archivo de persistencia tipo INI y por lo tanto sólo se soportan variables
persistentes de tipos de datos simples o elementales. En el caso de que la configuración contenga
alguna variable persistente de tipo de dato derivado, se genera un error indicando la situación y no
se permite arrancar el PLC.
Las formas utilizadas dependiendo del tipo de variable son las siguientes:
Constante
Variable Interna
Los colores utilizados dependiendo del tipo de valor de las variables son los siguientes:
DATE_AND_
DINT LREAL BOOL STRING TIME
TIME
La base de datos maneja dos tipos básicos de puntos en función de la dirección del flujo de información.
Un punto de estado (en rojo en el diagrama) es un punto adquirido por el hardware mediante un driver que
se envía hacia un centro de control mediante un módulo de protocolo.
Un punto de comando (en verde en el diagrama) es un punto obtenido desde un centro de control mediante
un módulo de protocolo que se envía al hardware mediante un módulo driver.
Centro de control
Hardware
Además la base de datos maneja cuatro categorías de puntos para cada tipo en función del tipo de los
datos intercambiados, las mismas son booleanos, enteros, reales y string.
Sali das
Módulo
Logicas
Centro de control
Hardware
Las variables de entrada del módulo pueden ser puntos de estado o de comando desde el punto de vista de
la base de datos. Esto permite elegir el origen de las variables de entrada al módulo.
Si una variable de entrada debe ser obtenida desde el hardware, la misma se debe configurar como punto
de estado desde la base de datos (en rojo en el diagrama).
Si el punto de entrada debe ser obtenido desde el centro de control, la misma se debe configurar como
punto de comando desde la base de datos (en verde en el diagrama).
Además de lo anterior el PLC maneja cuatro categorías de puntos de entrada según el tipo de datos. Los
mismos son booleanos, enteros, reales y string.
Para resolver esa incertidumbre el módulo dispone del parámetro global Buffer de puntos.
Si dicho parámetro esta en false (valor por defecto) el módulo copia el último valor recibido antes del
comienzo del ciclo y deshecha todos los anteriores.
Si el parámetro Buffer de puntos esta en true entonces se crea una cola de estados para cada variable de
entrada al módulo. Cada vez que se recibe un nuevo valor, el mismo se agrega al final de la cola.
Al inicio de cada ciclo de trabajo del PLC se verifica si hay cambios de estado almacenados en la cola, si
los hay se saca el más antiguo y se copia sobre la variable de entrada.
De esta forma todos los cambios de estados son procesados. Las colas tienen una capacidad máxima de
30 estados por lo cual si se reciben más de 30 estados durante la ejecución de un ciclo de trabajo del PLC,
los estados más antiguos son desechados.
NOTAS
1. El tipo de dato del campo VALUE dependerá del tipo de variable, los posibles valores son: DINT,
LREAL, BOOL y STRING.
2. Los campos RTRIG y FTRIG son actualizados automáticamente por el PLC al inicio de cada ciclo
de trabajo, pero sólo para las variables externas, es decir para las variables asociadas a puntos de
BD. Cuando la estructura es utilizada en la definición de variables internas, dichos campos no son
actualizados por el PLC.
NOTAS
3. El tipo de dato del campo VALUE dependerá del tipo de variable, los posibles valores son: DINT,
LREAL, BOOL y STRING.
4. El campo TRIGGER es actualizado automáticamente por el PLC al inicio de cada ciclo de trabajo, y
luego es reseteado a FALSE al final de cada ciclo, pero sólo para las variables externas, es decir
para las variables asociadas a puntos de BD. Cuando la estructura es utilizada en la definición de
variables internas, el campo no es actualizado por el PLC.
En tra das
Sali das
Módulo
Logicas
Centro de control
Hardware
Las variables de salida del módulo pueden ser puntos de estado o de comando desde el punto de vista de
la base de datos. Esto permite elegir el destino de los puntos de salida del PLC.
Si la variable de salida del módulo debe ser enviada al hardware la misma se debe configurar como punto
de comando hacia la base de datos (en verde en el diagrama).
Si la variable de salida del PLC debe ser enviada al centro de control la misma se debe configurar como
punto de estado hacia la base de datos (en rojo en el diagrama).
Además de lo anterior el PLC maneja cuatro categorías de puntos de salida según el tipo de datos. Los
mismos son booleanos, enteros, reales y string.
NOTAS
1. El tipo de dato del campo VALUE dependerá del tipo de variable, los posibles valores son: DINT,
LREAL, BOOL y STRING.
NOTAS
1. El tipo de dato del campo VALUE dependerá del tipo de variable, los posibles valores son: DINT,
LREAL, BOOL y STRING.
2. El campo TRIGGER es reseteado a FALSE automáticamente por el PLC al final de cada ciclo de
trabajo, pero sólo para las variables externas, es decir para las variables asociadas a puntos de BD.
Cuando la estructura es utilizada en la definición de variables internas, el campo no es actualizado
por el PLC.
Se muestra a continuación un diagrama general del flujo de información en la RTU con el módulo de lógicas
en funcionamiento.
Sali das
Módulo
Logicas
Centro de control
Hardware
En verde se detallan los puntos de comando de base de datos y en rojo los puntos de estado de la misma.
Existen tres unidades de organización de programas (Program Organization Unit o POU) disponibles para el
usuario para la programación del PLC, estas unidades son las funciones, los bloques funcionales y los
programas.
Todas los POUs se configuran o programan utilizando el lenguaje ST (Structured Text) de la norma IEC
61131-3 second edition 2003-01.
El funcionamiento del módulo consiste en ejecutar la lista de programas configurados por el usuario.
NOTAS
1. Los programas se ejecutan en el orden configurado por el usuario.
5.1 Programas
Un programa es la unidad de organización de código de más alto nivel del módulo. En función de los
elementos del lenguaje utilizados, un programa puede ser diagramable (representable gráficamente en el
módulo de visualización) o no. Además para los programas diagramables se permite ocultar partes de los
mismos en función del nivel de acceso del usuario.
NOTAS
1. Estas restricciones sólo se aplican a los programas diagramables. Dentro de las funciones, bloques
funcionales y programas no diagramables, no se aplica ninguna restricción pudiéndose utilizar toda
la potencialidad del lenguaje.
2. Las funciones con resultado o parámetros de tipos de datos derivados (estructuras y arrays) no
son diagramables.
En caso de que no se cumplan las restricciones anteriores, dichas funciones sólo podrán ser utilizadas
dentro de headers no diagramables.
1. Los bloques funcionales con parámetros de tipos de datos derivados (estructuras y arrays) no son
diagramables.
2. La cantidad de parámetros de entrada del bloque funcional debe estar comprendido en el rango 1
a 16.
3. La cantidad de parámetros de salida del bloque funcional debe estar comprendido en el rango 1 a
16.
4. Dentro de headers diagramables, un bloque funcional sólo puede ser inicializado una única vez.
5. Un bloque funcional inicializado dentro de un header diagramable, debe ser utilizado al menos una
vez después de su inicialización dentro del mismo header diagramable, y además entre la
sentencia de inicialización y la primer utilización del bloque funcional sólo se permiten sentencias
de inicialización de otros bloques funcionales.
En caso de que no se cumplan las restricciones anteriores, las sentencias de inicialización de los bloques
funcionales sólo podrán ser utilizadas dentro de headers no diagramables.
Para aclarar la restricción (6) veamos el siguiente ejemplo. Sean dos bloques funcionales B1 y B2 y sus
respectivas instancias fb1 y fb2. Ambos bloques funcionales tienen una entrada IN1 y una salida OUT1,
ambos parámetros de tipo DINT.
fb1(1);
fb2(fb1.out1);
v1 := fb2.out1 + fb1.out1;
Este ejemplo cumple con la restricción (6), y observamos como se muestra correctamente en el diagrama
la utilización del campo “fb1.out” del bloque funcional después de la inicialización del mismo, lo cual
corresponde con el orden real del programa.
Ejemplo 2 (incorrecto):
fb1(1);
fb2(fb1.out1);
v1 := fb1.out1 + fb2.out1;
En este ejemplo el orden de los operandos de la suma está invertido con respecto al ejemplo anterior, y por
lo tanto no cumple con la restricción (6) y no compila. Pero si esta restricción no estuviese entonces el
diagrama generado sería como el mostrado, y por lo tanto se mostraría incorrectamente el campo “fb1.out”
del bloque funcional antes de la inicialización del mismo, lo cual no correspondería con el orden real del
programa.
2. Las sentencias IF, CASE, WHILE, REPEAT y FOR no son diagramables, es decir que sólo se
permiten dentro de headers no diagramables.
5.2 Funciones
Desde el punto de vista de un diagrama, una función es un operador que puede tener varias entradas y una
sola salida. Desde el punto de vista del lenguaje de programación, una función es una unidad de
organización de programa (POU) que al ser ejecutada devuelve exactamente un solo valor, el cual
corresponde al resultado de la función, y opcionalmente varios valores de salida (parámetros de
entrada/salida).
El resultado de las funciones así también como sus parámetros pueden ser de cualquier tipo elemental o
derivado, pero no pueden ser bloques funcionales. Además las funciones no tienen estado interno
persistente entre ejecuciones, esto significa que ejecuciones distintas de una misma función con los
mismos argumentos (parámetros de entrada, parámetros de entrada/salida, y variables globales utilizadas
por la función) devuelven siempre el mismo resultado.
La invocación de una función se realiza como un operando dentro de una expresión del lenguaje. A
continuación se muestra un ejemplo de un programa que invoca a la función del sistema TRUNC para
redondear un valor real a un valor entero.
• Funciones del sistema: Son todas las funciones predefinidas por el sistema.
• Funciones del usuario: Son todas las funciones programadas por el usuario.
• Nombre corto: Campo opcional. Nombre corto de la función para mostrar en los diagramas. Si este
campo está vacío se muestra directamente el nombre de la función.
• Parámetros de Entrada: Campo opcional. Conjunto de variables donde cada variable representa un
parámetro de entrada de la función. Al momento de ejecución de la función cada una de estas variables
se inicializa con el valor del argumento correspondiente especificado en la invocación a la función. Los
argumentos son pasados a la función mediante el mecanismo conocido como “pasaje por valor”, es
decir que lo que se pasa a la función no son los argumentos en sí mismos, sino una copia de sus
valores. Estos argumentos pueden ser valores literales, expresiones, variables o constantes. Dentro del
código de la función los parámetros de entrada se comportan como variables de sólo lectura, es decir
no se permite modificar sus valores. Los parámetros de entrada pueden ser de cualquier tipo elemental
o derivado, pero no pueden ser ni constantes ni bloques funcionales.
• Variables locales: Campo opcional. Conjunto de variables auxiliares utilizadas para los cálculos
internos de la función. Al momento de ejecución de la función estas variables se inicializan con los
valores por defecto. Estas variables son de lectura y escritura. Estas variables pueden ser de cualquier
tipo elemental o derivado, pero no pueden ser bloques funcionales.
• Código de la función: Campo obligatorio. Implementa la lógica de la función. Toda función debe
devolver siempre un resultado. Para ello en tiempo de compilación se controla que todos los caminos
posibles de ejecución de la función devuelvan un resultado. El resultado devuelto por la función se fija
asignando un valor a la variable especial de resultado de la función.
Dentro del código de una función se pueden invocar a otras funciones, ya sean del sistema o del usuario,
pero dichas invocaciones no pueden ser recursivas. Existen dos formas de recursividad, recursividad
Dentro del código de la función, además de poder utilizarse las variables internas de la función, es decir las
variables de entrada, las variables de entrada/salida, las variables locales y la variable especial de resultado
de la función, también se pueden utilizar las variables globales.
Si se utilizan estructuras o arrays complejos, es muy recomendable utilizarlos como variables globales o
pasarlos como parámetros de entrada/salida para evitar generar una copia de sus valores en cada
invocación, y así lograr genera programas más eficientes.
NOTAS
1. Es posible pasar como parámetro de entrada/salida de una función, una variable de sólo lectura o
una constante, en este caso el sistema en tiempo de compilación comprueba que dicho parámetro
no sea modificado por la función, de lo contrario se genera un error de compilación. Pero esta
validación no se puede realizar al momento de compilación de un POU particular, sino que hay que
esperar a compilar la configuración completa.
• Bloques funcionales del sistema: Son todos los bloques funcionales predefinidos por el
sistema.
• Bloques funcionales del usuario: Son todos los bloques funcionales programados por el
usuario.
• Nombre corto: Campo opcional. Nombre corto del bloque funcional para mostrar en los diagramas. Si
este campo está vacío se muestra directamente el nombre del bloque funcional.
• Parámetros de entrada: Campo opcional. Conjunto de variables donde cada variable representa un
parámetro de entrada del bloque funcional. Al momento de ejecución del bloque funcional cada una de
estas variables se inicializa con el valor del argumento correspondiente especificado en la invocación al
bloque funcional. Los argumentos son pasados al bloque funcional mediante el mecanismo conocido
como “pasaje por valor”, es decir que lo que se pasa al bloque funcional no son los argumentos en sí
mismos, sino una copia de sus valores. Estos argumentos pueden ser valores literales, expresiones,
variables o constantes. Dentro del código del bloque funcional los parámetros de entrada se comportan
como variables de sólo lectura, es decir no se permite modificar sus valores, y además el valor de las
mismas se persiste entre ejecuciones del bloque funcional. Los parámetros de entrada pueden ser de
cualquier tipo elemental o derivado, pero no pueden ser ni constantes ni bloques funcionales.
• Parámetros de salida: Campo opcional. Conjunto de variables donde cada variable representa un
parámetro de salida del bloque funcional. Dentro del código del bloque funcional estas variables son de
lectura y escritura y además el valor de las mismas se persiste entre ejecuciones del bloque funcional.
Los parámetros de salida pueden ser de cualquier tipo elemental o derivado, pero no pueden ser ni
constantes ni bloques funcionales.
• Variables locales: Campo opcional. Conjunto de variables auxiliares utilizadas para los cálculos
internos del bloque funcional. Estas variables son de lectura y escritura y además el valor de las
mismas se persiste entre ejecuciones del bloque funcional. Estas variables pueden ser de cualquier tipo
elemental o derivado, y pueden ser también bloques funcionales.
• Código del bloque funcional: Campo opcional. Implementa la lógica del bloque funcional.
Dentro del código del bloque funcional, además de poder utilizarse las variables internas del bloque
funcional, es decir las variables de entrada, las variables de salida y las variables locales, también se
pueden utilizar las variables globales.
Los bloques funcionales de usuario se utilizan de igual forma que los bloques funcionales del sistema. A
continuación se muestra un ejemplo de programa que utiliza el bloque funcional estándar BLINK y el bloque
de usuario BLINK_USR para generar dos pulsos independientes de igual período.
Desde el punto de vista de un diagrama, un operando de entrada se usa para cálculos, pueden ser
variables de entrada, constantes, variables del sistema o campos de bloques funcionales.
Desde el punto de vista de un diagrama, un operando de salida recibe los resultados de los cálculos,
pueden ser variables de salida.
Ante cualquier error de ejecución del PLC se ejecuta la acción preestablecida para el manejo de errores.
Esta acción se configura en el parámetro “Manejo de errores” de la configuración y sólo existen dos
opciones:
• Detener el PLC: Se detiene inmediatamente la ejecución del PLC. Corresponde a la opción por
defecto.
La detención del PLC significa que se detiene la ejecución del ciclo de trabajo del PLC y por lo tanto se
detiene la ejecución de los programas, pero el módulo lógicas continúa funcionando y comunicándose
normalmente con el resto de los módulos de la RTUQM.
• Timeout de watchdog: Este error se produce cuando el ciclo actual del PLC supera un tiempo
máximo preestablecido. Este tiempo es configurable por el usuario en el parámetro de
configuración “Timeout del watchdog” del módulo, y donde el valor cero significa que no se utiliza el
watchdog.
• División por cero: Este error se produce cuando se intenta realizar una operación matemática de
división o módulo y el divisor es cero.
• Tipo de dato no válido: Este error se produce cuando el tipo de dato de un elemento (por ejemplo
una variable, o el resultado de una operación) no corresponde con el tipo de dato esperado. Si bien
este error se detecta en tiempo de compilación, por completitud y por seguridad igual se verifica en
tiempo de ejecución.
• Valor no válido: Este error se produce cuando se detecta un valor no válido. Por ejemplo en la
función ANY_TO_DINT al convertir un STRING a DINT si el valor de texto a convertir no
corresponde a la representación literal de un entero.
• Número de parámetros no válido: Este error se produce cuando se detecta que el número de
operandos de una expresión, o el número de argumentos de una función o bloque funcional no son
válidos. Si bien este error se detecta en tiempo de compilación, por completitud y por seguridad
igual se verifica en tiempo de ejecución.
• Stack no válido: Este error se produce cuando se detecta que el stack de memoria de ejecución
de los POUs no es válido. Corresponde a un error de ejecución interno que podría suceder por
ejemplo debido a falta de memoria.
• Indice no válido: Este error se produce cuando se intenta acceder a un elemento de un array con
un índice de elemento fuera del rango. También se produce cuando el selector de la función del
sistema MUX está fuera de rango.
• Otros errores: Cualquier otro error interno del módulo, como ser por ejemplo falta de memoria.
• DETENIDO: El PLC está detenido. Si bien esto significa que no se está ejecutando ningún programa,
el módulo lógicas continúa funcionando y comunicándose normalmente con el resto de los módulos de
la RTUQM. Este estado se asume automáticamente si al arrancar o reiniciar el módulo se detecta que
no hay una configuración válida o bien no hay ningún programa configurado. También se pasa a este
estado mediante el comando de administración “Detener PLC”.
• NORMAL: Corresponde al modo de funcionamiento normal donde el ciclo de trabajo del PLC se
ejecuta en forma periódica según los parámetros de ejecución configurados. Este estado se asume
automáticamente si al arrancar o reiniciar el módulo se detecta que hay una configuración válida y por
lo menos un programa configurado. También se pasa a este estado mediante el comando de
administración “Ejecutar PLC en modo NORMAL”.
NOTAS
1. Si el módulo lógicas no tiene una configuración válida o bien no hay ningún programa configurado,
entonces el PLC estará siempre en estado DETENIDO no pudiendo conmutar de estado.
2. Cada vez que el PLC cambia su modo de funcionamiento se actualiza automáticamente el estado
del punto de supervisión “PLC_OK”.
Además en este modo de funcionamiento se habilita la ejecución de la sentencia TRACE, la cual permite
generar mensajes de texto con información adicional para la depuración de los POUs. Todos los mensajes
de trace generados pueden verse desde la ventana de terminal del módulo en el Administrador RTUQM.
• Ejecutar PLC en modo NORMAL: Si el PLC estaba detenido, este comando lo arranca y lo ejecuta
en modo NORMAL. Si estaba ejecutándose en modo DEBUG-CICLO-A-CICLO entonces lo pasa a
modo NORMAL continuando la ejecución a partir del estado actual.
• Ejecutar un ciclo del PLC: Este comando sólo está disponible para el funcionamiento DEBUG-
CICLO-A-CICLO y permite ejecutar un ciclo de trabajo del PLC. Una vez ejecutado el ciclo, el PLC
queda pausado automáticamente en espera de un nuevo comando para la ejecución del próximo
ciclo.
El lenguaje de programación utilizado por el módulo constituye un subconjunto del lenguaje ST (Structured
Text) de la norma IEC 61131-3 second edition 2003-01, con algunas restricciones y también algunas
extensiones.
6.1 Identificadores
Un identificador es una cadena de letras, dígitos y caracteres de subrayado, que debe comenzar por una
letra. Los identificadores son insensibles a mayúsculas y minúsculas. Los identificadores no pueden
contener caracteres de espacio ni subrayados múltiples.
Ejemplos:
valor_12
VALOR_12
Valor_12
valor_12
valor12
valor_1_2
6.2 Comentarios
Todo texto delimitado por ciertos caracteres especiales se considera comentarios del usuario dentro del
código de un programa y no son tomados en cuenta para la compilación. Se soportan tres tipos distintos de
comentarios.
NOTAS
1. Los comentarios 2 y 3 son extensiones a la norma. Se agregaron por compatibilidad con los
comentarios utilizados en las expresiones del MIRAGE.
(*
...
(* COMENTARIO NO VALIDO *)
...
*)
Para ello es necesario utilizar tipos distintos, por ejemplo el siguiente comentario sí es válido
/*
...
(* COMENTARIO VALIDO *)
...
*/
Se permite la utilización de los caracteres de subrayado simple “_” intercalados entre los dígitos de un literal
numérico. Dichos caracteres no son significativos en cuanto al valor numérico, simplemente proporcionan
un mecanismo para facilitar la visualización de los datos.
12345
12_345
Los literales enteros pueden estar representados en base decimal o en base 2, 8 o 16. La base se
especifica mediante el número de base y el carácter especial “#”. Los literales decimales pueden estar
precedidos de un signo “+” o “-“, pero los números en base no.
0
-12
12_346
+10
Los literales reales se distinguen por la presencia de un punto decimal obligatorio. Los literales reales sólo
se representan en base decimal. La letra “e” o “E” se utiliza para representar el exponente el cual indica la
potencia entera de 10 por la que se ha de multiplicar el número precedente para obtener el valor
representado. Los literales decimales y sus exponentes pueden estar precedidos de un signo “+” o “-“.
-1.34e-12
1.0E+5
3.0
+1_234.0
Ejemplos:
’’ // cadena vacía
”” // cadena vacía
’Hola’
”Hola”
NOTAS
1. En la norma las comillas simples se utilizan para cadenas de caracteres de un byte y las comillas
dobles para cadenas de caracteres de dos bytes. Nosotros sólo soportamos cadenas de caracteres
de un byte y por compatibilidad con las expresiones del MIRAGE permitimos utilizar indistintamente
ambos delimitadores de strings.
Se permite el desbordamiento del campo más significativo, por ejemplo se permite la notación T#30h_15m,
y además el campo más significativo puede estar precedido de un signo “+” o “-“. El campo menos
significativo puede escribirse en notación real sin exponente.
T#100d_12h_5m_3s_10.5ms
TIME#100.7h
Time#-0.01ms
t#-1M_40S_3ms
time#+3.3h
DT#2013-12-31-23:59:59
DATE_AND_TIME#2013-12-31-23:59:59.123456789
date_and_time#1984-06-25-15:36:55.36
Dt#1984-06-25-15:36:55.36
Tipo Descripción
BOOL Valor booleano de 1 bit. Los posibles valores son FALSE y TRUE.
DINT Número entero con signo de 32 bits. El rango de valores va desde –(2**31) a
(2**31)-1, lo que equivale al rango -2147483648 a 2147483647
LREAL Número real de punto flotante de doble precisión de 64 bits de acuerdo a la
norma IEC 559 (IEEE 754). Consiste en 1 bit de signo, 11 bits de exponente y
52 bits de mantisa.
STRING Cadena de texto de longitud variable con un largo máximo de 255 caracteres,
donde cada carácter se representa con un byte.
TIME Representa una duración de tiempo con precisión de nanosegundos. Es un
valor entero con signo de 64 bits. El rango de valores va desde
T#-106751d_23h_47m_16s_854.775808ms a
T#106751d_23h_47m_16s_854.775807ms
DATE_AND_TIME Fecha y hora del día o marca de tiempo. Es un valor entero con signo de 64 bits
y representa los nanosegundos desde el primero de enero de 1970 UTC. El
rango de valores va desde DT#1970-01-01-00:00:00 a 2106-02-07-06:28:14
UTC.
Tanto los valores internos del tipo DATE_AND_TIME como los valores literales
y los campos componentes de una marca de tiempo se representan siempre
en UTC.
NOTAS
1. Si bien el tipo STRING es de largo variable, para el cálculo del tamaño ocupado por el tipo de dato
siempre se toma el tamaño máximo soportado, el cual corresponde a 255 bytes.
Las estructuras consisten en una agrupación de elementos identificados por sus nombres, donde los
elementos pueden ser de tipos elementales o derivados.
Si bien en la definición de los tipos de datos derivados, además de los tipos elementales se pueden utilizar
a su vez tipos derivados, el lenguaje no permite definiciones recursivas.
Los valores iniciales de los tipos de datos derivados corresponderán a los valores iniciales de sus
componentes de tipos de datos elementales.
El sistema limita el tamaño máximo que puede ocupar una variable a 5KB (5120 bytes). El tamaño de una
variable se calcula a partir de los tamaños de los tipos de datos elementales. Por ejemplo, como el tamaño
del tipo DINT es 4 bytes, entonces una estructura con dos campos de tipo DINT tendrá un tamaño de 8
bytes, y un array de 100 elementos de tipo DINT tendrá un tamaño de 400 bytes. Otro ejemplo, un array de
100 elementos de tipo “Entrada Valor LREAL desde BD:EF” tendrá un tamaño de 1900 bytes.
6.5.1 Arrays
Existen dos formas para la definición de variables de tipo arrays. La forma indirecta es definir el array como
un tipo de dato independiente y luego crear variables de dicho tipo de dato. Y la forma directa, es definir el
array directamente dentro de la definición de la variable.
Dado dos variables de tipo array, independientemente de la forma de definición directa o indirecta, e
independientemente de los nombres de los tipos de datos de los arrays para el caso indirecto, si las
dimensiones de los dos arrays son iguales y el tipo de dato de los elementos de los dos arrays es el mismo,
entonces los dos arrays son equivalentes, es decir puedo asignar el valor completo de un array al otro.
En el siguiente programa de ejemplo se definen cuatro arrays A1, A2, B1 y C1. Donde A1 se define en
forma indirecta mediante el tipo de dato ArrayInt, y el resto se definen en forma directa definiendo el array
directamente en la definición de las variables. Además los arrays A1 y A2 son equivalentes, pero B1 y C1 no
son equivalentes con ninguno. Los tres arrays A1, A2 y B1 son arrays de una única dimensión y tienen 3
elementos cada uno y son de tamaño 12 bytes, mientras que el array C1 es un array de 2 dimensiones con
un total de 20 elementos y un tamaño de 80 bytes.
ANY
ANY_DERIVED
ANY_ELEMENTARY
ANY_NUM
LREAL
DINT
BOOL
STRING
DATE_AND_TIME
TIME
Por ejemplo, el tipo ANY_NUM significa cualquier tipo de dato numérico real o entero, esto significa que si
en una función se indica que un parámetro de entrada es del tipo ANY_NUM, en realidad acepta los tipos
LREAL y DINT.
El tipo ANY_DERIVED representa cualquier tipo de dato derivado, es decir estructuras y arrays, tanto
definidos por el sistema como definidos por el usuario.
Ejemplos:
ANY_TO_DINT(1.6) = 2
ANY_TO_DINT(-1.6) = -2
ANY_TO_DINT (1.5) = 2
ANY_TO_DINT (-1.5) = -2
ANY_TO_DINT (1.4) = 1
ANY_TO_DINT (-1.4) = -1
ANY_TO_DINT (2.5) = 2
ANY_TO_DINT (-2.5) = –2
Ejemplos:
TRUNC(1.6) = 1
TRUNC(-1.6) = -1
TRUNC(1.4) = 1
TRUNC(-1.4) = -1
4. Cuando una entrada o una salida de una función de conversión es del tipo STRING, la cadena de
caracteres representa el literal del dato correspondiente. Ver sección Representación literal de
datos.
Ejemplos:
ANY_TO_DINT(“2#11”) = 3
ANY_TO_DINT(“blabla”) genera un error de ejecución (y la detención del PLC), ya que el texto
“blabla” no corresponde con un literal entero válido.
NOTAS
1. Las funciones aritméticas utilizan los operadores aritméticos estándar.
2. Salvo en la exponenciación, los parámetros de los operadores aritméticos deben ser del mismo
tipo. En la exponenciación A**B el tipo de dato de A es LREAL mientras que el de B es ANY_NUM y
el resultado es del tipo LREAL.
NOTAS
1. ANY_E es la abreviación de ANY_ELEMENTARY.
2. Los parámetros de tipo ANY o ANY_E de una función deben ser del mismo tipo, es decir por
ejemplo si el parámetro IN0 de la función SEL es del tipo DINT, entonces el parámetro IN1 también
debe ser del tipo DINT.
NOTAS
1. El operador aritmético estándar “+” se extiende para aplicarse a datos del tipo STRING. La
expresión A + B, siendo A y B del tipo STRING es equivalente a CONCAT(A, B). Esta extensión no
es parte de la norma, pero la soportamos por compatibilidad con las expresiones del MIRAGE.
NOTAS
1. Las funciones de tiempo utilizan los operadores aritméticos estándar.
NOTAS
1. Si bien el valor devuelto por la función CLOCK_CYCLES se maneja como un tipo de dato TIME, en
realidad no es un valor de duración TIME real sino que representa un contador de los ciclos de la
CPU y constituye un entero de 64 bits sin signo. Como no soportamos este tipo de dato utilizamos
el tipo TIME que también es un entero de 64 bits pero con signo.
2. Las marcas BEGIN y END no son valores de duración TIME reales, sino que corresponden a
valores devueltos por la función CLOCK_CYCLES, y además la marca END debe ser posterior en
el tiempo a la marca BEGIN. El valor devuelto por la función CLOCK_CYCLES_ELAPSED_TIME sí
es un valor TIME real.
Por ejemplo, si A, B, C y D son variables del tipo DINT y tienen respectivamente los valores 1, 2, 3 y 4
entonces la expresión
A + B – C * ABS(D)
(A + B – C) * ABS(D)
Si un operador tiene dos operandos, se evaluará primero el operando de más a la izquierda. Por ejemplo en
la expresión
SIN(A) * COS(B)
se evalúa primero la expresión SIN(A), seguida de la expresión COS(B) y por último se evalúa el producto.
LABEL(”Texto descriptivo”)
Ejemplo:
6.9 Sentencias
Todas las sentencias deben terminarse siempre mediante el carácter “;” (punto y coma).
Normalmente esta sentencia se incluye en los lenguajes de programación simplemente para evitar errores
de compilación cuando el programador introduce separadores de sentencia innecesarios inadvertidamente.
Ejemplo:
A := <expresion>;
NOTAS
1. Las sentencias de asignación de valores de tipos de datos derivados (estructuras y arrays) no son
diagramables, es decir que para los programas diagramables sólo se permiten dentro de headers
no diagramables.
Ejemplo:
• <descripción>: Parámetro de tipo STRING. Texto descriptivo del conjunto de sentencias contenidas en
el header.
2. Las sentencias headers no pueden anidarse, es decir no se puede incluir una sentencia header
dentro de otra.
4. Para un programa no diagramable, si bien la sentencia header está permitida, la misma no tiene
ningún resultado gráfico, es decir sólo se ejecutan las sentencias contenidas dentro de la misma.
Esto permite pasar un programa diagramable a no diagramable sin que haya un error de
compilación.
Ejemplo:
NOTAS
1. El elemento ELSIF es opcional y pueden haber varias ocurrencias del mismo.
2. El elemento ELSE es opcional y sólo puede haber una única ocurrencia del mismo.
Ejemplo:
NOTAS
1. El sistema controla que no haya intersección entre los distinos elementos <elem> de una sentencia
CASE, de lo contrario no compila.
2. El sistema controla que el rango de valores de un elemento <elem> sea válido, es decir que el
primer elemento del rango sea menor o igual que el último, de lo contrario no compila.
3. El elemento ELSE es opcional y sólo puede haber una única ocurrencia del mismo.
Ejemplo:
RETURN;
Donde:
• El elemento <elem> es la variable de control del FOR y corresponde a una variable de tipo DINT.
La sentencia FOR ejecuta repetidamente una secuencia de sentencias mientras una progresión de valores
se asigna a la variable de control <elem> de la sentencia. Inicialmente la variable de control toma el valor
inicial <valor_inicial> y luego en cada iteración su valor aumenta o disminuye en una magnitud igual a
<valor_incremento> hasta exceder el valor final <valor_final>.
El chequeo de la condición de parada se realiza al inicio de cada iteración, por lo cual si inicialmente el valor
de la variable de control excede el valor final, la secuencia de iteraciones nunca se ejecuta.
Ejemplo
El siguiente programa inicializa los elementos de un array A1 con los valores de sus índices. La
inicialización se hace de tres formas distintas pero equivalentes utilizando las sentencias FOR, WHILE y
REPEAT.
WHILE <condición> DO
<conjunto de sentencias>
END_WHILE;
Donde:
• El elemento <condición> corresponde a una expresión tipo BOOL.
La sentencia WHILE ejecuta repetidamente una secuencia de sentencias mientras que la expresión
booleana <condición> sea TRUE.
El chequeo de la condición de parada se realiza al inicio de cada iteración, por lo cual si inicialmente el valor
de la expresión <condición> es FALSE, la secuencia de iteraciones nunca se ejecuta.
REPEAT
<conjunto de sentencias>
UNTIL <condición> END_REPEAT;
Donde:
• El elemento <condición> corresponde a una expresión tipo BOOL.
La sentencia REPEAT ejecuta repetidamente una secuencia de sentencias hasta que la expresión booleana
<condición> sea TRUE.
El chequeo de la condición de parada se realiza al final de cada iteración, por lo cual siempre se ejecutará
al menos una iteración.
Cuando la sentencia EXIT se utiliza dentro de sentencias de iteración anidadas, el EXIT se aplica sólo al
bucle de iteración más interno en el cual está contenida la sentencia EXIT.
Ejemplo
En el siguiente programa si la variable booleana FLAG es FALSE el resultado de la variable SUMA será 8,
mientras que si FLAG es TRUE entonces SUMA será 2.
Las salidas de un bloque funcional instanciado pueden ser usadas en cualquier parte de un programa
referenciándolas como un campo de la variable del bloque funcional.
Por ejemplo, supongamos un bloque funcional con dos parámetros de entrada booleanos y dos parámetros
de salida enteros llamados SAL1 y SAL2 instanciado en la variable de nombre BLOQ1.
La primera utilización del bloque funcional después de su evaluación se toma como un caso especial. En el
diagrama gráfico asociado al programa, la primera utilización corresponde a la salida por defecto conectada
al bloque funcional y puede ser usada en ese contexto como parte de una expresión.
El resto de las asignaciones se dibujan como operadores de entrada.
TRACE(<mensaje>, <lista_parámetros>);
• <mensaje>: Parámetro de tipo STRING. Indica el mensaje de texto a generar. Dentro del texto se
puede utilizar el formato especial “{X}” para referenciar al parámetro “X” de la lista de parámetros
<lista_parámetros>, siendo “X” el índice del parámetro dentro de la lista. Los índices se cuentan a
partir de cero, es decir que el primer parámetro de la lista corresponde al índice cero, el segundo al
índice uno, y así sucesivamente.
NOTAS
1. La sentencia TRACE se comporta como una función con número de parámetros variables, siendo
el primer parámetro de tipo STRING el único obligatorio, y el resto de los parámetros pueden ser de
cualquiera de los tipos de datos elementales soportados.
2. La sintaxis utilizada en la generación del texto del mensaje es similar a la utilizada por la función
String.Format() del C#.
3. La sentencia TRACE se puede utilizar en todos los POUs, y a pesar de no ser una sentencia
diagramable, igual puede utilizarse dentro de un programa diagramable.
Ejemplo:
A continuación se detalla el conjunto de bloques funcionales predefinidos por el sistema. A excepción de los
bloques funcionales BLINK, RF_TRIG y GET_DATE_AND_TIME, el resto corresponden a bloques
funcionales estándar definidos en la norma.
BLINK
BOOL RUN
Diagrama de tiempos
RUN
CYCLE
Parámetros de entrada
Nombre Tipo Descripción
RUN BOOL Habilitación
CYCLE TIME Período del temporizador
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de salida
Funcionamiento
Si la entrada RUN es TRUE entonces la salida Q cambia entre TRUE y FALSE con un ciclo de trabajo del
50% y con un período dado por el valor de la entrada CYCLE, si es OFF la salida queda en FALSE
Ejemplo de uso
Se usa un bloque funcional BLINK instanciado con el nombre BLK1 para cambiar el estado de la variable
interna de tipo BOOL MEM1, con un ciclo de 1 segundo;
TP
BOOL IN Q BOOL
TIME PT ET TIME
Diagrama de tiempos
IN
PT PT PT
PT
ET
Tiempo
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada.
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
TP (IN, PT);
Funcionamiento
Genera en Q un pulso de tiempo constante igual a PT cada vez que detecta un flanco ascendente en la
entrada IN.
Ejemplo de uso
Se usa un bloque funcional TP instanciado con el nombre TP1. Se configura el tiempo de pulso en 500ms.
La entrada a temporizar está dada por la variable interna de tipo BOOL MEM1 y la salida temporizada se
asigna a la variable interna de tipo BOOL MEM2.
TON
BOOL IN Q BOOL
TIME PT ET TIME
Diagrama de tiempos
IN
PT PT PT
PT
ET
Tiempo
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada.
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
Evaluación
Funcionamiento
Copia la entrada IN en la salida Q retardando el flanco ascendente en un tiempo PT.
Ejemplo de uso
Ver el caso del temporizador de pulso.
TOF
BOOL IN Q BOOL
TIME PT ET TIME
Diagrama de tiempos
IN
PT PT PT
PT
ET
Tiempo
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
Funcionamiento
Copia la entrada IN en la salida Q retardando el flanco descendente en un tiempo PT.
Ejemplo de uso
Ver el caso del temporizador de pulso.
R_TRIG
BOOL CLK Q BOOL
Parámetros de entrada
Nombre Tipo Descripción
CLK BOOL Señal de entrada
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de salida
Evaluación
R_TRIG (CLK);
Funcionamiento
Normalmente la salida Q está en FALSE. Si se detecta un flanco ascendente (transición FALSE a TRUE)
en la entrada CLK entonces la salida pasa a TRUE durante un ciclo de PLC.
Ejemplo de uso
Se usa un bloque funcional R_TRIG instanciado con el nombre RT1 para detectar flancos ascendentes en
la variable interna de tipo BOOL MEM1. El flanco detectado se asigna a la variable interna de tipo BOOL
MEM2.
F_TRIG
BOOL CLK Q BOOL
Parámetros de entrada
Nombre Tipo Descripción
CLK BOOL Señal de entrada
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de salida
Evaluación
F_TRIG (CLK);
Funcionamiento
Normalmente la salida Q está en FALSE. Si se detecta un flanco descendente (transición TRUE a FALSE)
en la entrada CLK entonces la salida pasa a TRUE durante un ciclo de PLC.
Ejemplo de uso
Ver el caso del detector de flancos de subida.
RF_TRIG
BOOL CLK Q BOOL
Parámetros de entrada
Nombre Tipo Descripción
CLK BOOL Señal de entrada
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de salida
Evaluación
RF_TRIG (CLK);
Funcionamiento
Normalmente la salida Q está en FALSE. Si se detecta un flanco ascendente o descendente (cualquier
transición entre TRUE y FALSE) en la entrada CLK entonces la salida pasa a TRUE durante un ciclo de
PLC.
Ejemplo de uso
Ver el caso del detector de flancos de subida.
CTU
BOOL CU Q BOOL
BOOL R
DINT PV CV DINT
Parámetros de entrada
Nombre Tipo Descripción
Señal a ser contada. Este campo tiene un detector de flanco
CU BOOL
ascendente
R BOOL Señal de reset de contador
PV DINT Valor máximo
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de valor máximo alcanzado
CV DINT Valor actual de la cuenta
Evaluación
Funcionamiento
Normalmente la salida Q está en FALSE. El valor de CV se va incrementando a cada flanco de subida de
CU. Cuando CV alcanza PV la salida Q pasa a TRUE y CV deja de incrementarse. Un valor TRUE en la
entrada R vuelve CV a cero.
Ejemplo de uso
Se usa un bloque funcional CTU instanciado en una variable de nombre CT1 para contar cambios en la
variable interna de tipo BOOL MEM1 hasta el valor 100. Cuando se alcanza el máximo se pasa a TRUE la
variable interna de tipo BOOL MEM2.
CTD
BOOL CD Q BOOL
BOOL LD
DINT PV CV DINT
Parámetros de entrada
Nombre Tipo Descripción
Señal a ser contada. Este campo tiene un detector de flanco
CD BOOL
ascendente
LD BOOL Señal de preseteo al valor inicial
PV DINT Valor inicial
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de valor cero alcanzado
CV DINT Valor actual de la cuenta
Evaluación
Funcionamiento
Normalmente la salida Q está en FALSE. El valor de CV se va decrementando a cada flanco de subida de
CD. Cuando CV alcanza 0 la salida Q pasa a TRUE y CV deja de decrementarse. Un valor TRUE en la
entrada LD carga el valor de PV en CV.
Ejemplo de uso
Ver el caso del contador ascendente.
CTUD
BOOL CU Q BOOL
BOOL CD
BOOL R
BOOL LD
DINT PV CV DINT
Parámetros de entrada
Nombre Tipo Descripción
Señal de conteo ascendente. Este campo tiene un
CU BOOL
detector de flanco ascendente
Señal de conteo descendente. Este campo tiene un
CD BOOL
detector de flanco ascendente
R BOOL Señal de reset de contador
LD BOOL Señal de preseteo al valor inicial
PV DINT Valor máximo
Parámetros de salida
Nombre Tipo Descripción
QU BOOL Salida de conteo ascendente
QD BOOL Salida de conteo descendente
CV DINT Valor actual de la cuenta
Evaluación
Funcionamiento
Cada flanco ascendente de la señal CU incrementa el contador CV y cada flanco ascendente de la señal
CD la decrementa. CV se incrementa hasta PV y se decrementa hasta 0.
Ejemplo de uso
Ver el caso del contador ascendente.
SR
BOOL S1
BOOL R Q1 BOOL
Parámetros de entrada
Nombre Tipo Descripción
S1 BOOL Entrada SET (dominante)
R BOOL Entrada RESET
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida del elemento biestable
Evaluación
SR (S1, R);
Funcionamiento
La salida Q pasa a TRUE cuando S1 pasa a TRUE y a FALSE cuando R pasa a FALSE. Si S1 y R están en
TRUE la salida está en TRUE, si S1 y R están en FALSE la salida no cambia de estado.
S1 R Q
TRUE FALSE TRUE
FALSE TRUE FALSE
TRUE TRUE TRUE
FALSE FALSE <no varía>
Ejemplo de uso
RS
BOOL S
BOOL R1 Q1 BOOL
Parámetros de entrada
Nombre Tipo Descripción
S BOOL Entrada SET
R1 BOOL Entrada RESET (dominante)
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida del elemento biestable
Evaluación
RS (S, R1)
Funcionamiento
La salida Q pasa a TRUE cuando S pasa a TRUE y a FALSE cuando R1 pasa a FALSE. Si S y R1 están en
TRUE la salida está en FALSE, si S y R1 están en FALSE la salida no cambia de estado.
S1 R Q
TRUE FALSE TRUE
FALSE TRUE FALSE
TRUE TRUE FALSE
FALSE FALSE <no varía>
Ejemplo de uso
Ver el caso del biestable SR.
Si el bloque funcional no puede realizar la conversión o el parámetro de entrada esta fuera de rango, la
ejecución del PLC no se detiene sino que simplemente se inicializan todos los parámetros de salida al valor
cero y se continúa con el procesamiento normal del PLC.
GET_DATE_AND_TIME
MON DINT
DAY DINT
HOUR DINT
MIN DINT
SEC DINT
NSEC DINT
Parámetros de entrada
Nombre Tipo Descripción
IN DATE_AND_TIME Marca de tiempo (en UTC)
Evaluación
GET_DATE_AND_TIME (IN);
Ejemplo de uso
La variable fbDT corresponde a una instancia del bloque funcional GET_DATE_AND_TIME. El programa
separa la marca de tiempo dada por la variable del sistema $Time en sus componentes y luego los vuelve a
unir en la variable auxiliar dt1 mediante la función del sistema SET_DATE_AND_TIME.
Opciones:
-d Debug. El programa se ejecuta en modalidad de debug y level indica el nivel de debug para los
mensajes.
-h Despliega información de uso y termina.
-i Despliega información de la versión y termina.
-f file Archivo de configuración. file es el nombre del archivo de configuración del programa, por defecto
se toma el archivo plc.ini. Si no se especifica la ruta del archivo se toma por defecto el directorio
/rtu/config.
10 Configuración
- Puerto TCP de atención de clientes: Puerto TCP para la atención de los clientes visualizadores de las
lógicas. El valor cero significa que no se atienden clientes. El valor por defecto es 2013.
- Duración (en milisegundos) del ciclo de trabajo del PLC: El valor cero significa que se ejecuta lo más
rápido posible. El valor por defecto es 50 ms.
- Buffer de puntos: Indica si está habilitado el buffer de puntos para los puntos de entrada al PLC. El valor
por defecto es No.
- Timeout del watchdog (en milisegundos): Si el ciclo actual del PLC supera este tiempo se produce un
error de ejecución y se ejecuta la acción preestablecida para el manejo de errores. El valor cero
significa que no se utiliza el watchdog. El valor por defecto es 5000 ms.
10.1.2 Estructuras
Permite configurar las estructuras definidas por el usuario.
10.1.3 Arrays
Permite configurar los tipos de datos array definidos por el usuario.
10.1.5 Programas
Permite configurar los programas del usuario.
10.1.7 Funciones
Permite configurar las funciones del usuario.
10.2 Importación/exportación
El Administrador RTUQM permite realizar operaciones de “drag-and-drop” entre configuraciones del módulo
lógicas, de forma de poder importar o exportar elementos de una configuración a otra.
Los elementos configurables a los cuales se pueden aplicar las operaciones de “drag-and-drop” son los
siguientes:
• Variables globales: Se permite importar una variable global desde otra configuración. Al importar la
variable si el tipo de dato de la misma no existe en la configuración destino, también se importa
automáticamente.
• Bloques Funcionales: Se permite importar un bloque funcional completo desde otra configuración.
Al importar el bloque funcional se importan automáticamente todas las variables internas del bloque
funcional, y también los tipos de datos de las mismas si es que no existen en la configuración
destino. Además si el bloque funcional utiliza funciones u otros bloques funcionales y los mismos no
existen en la configuración destino, también se importan automáticamente.
• Arrays: Se permite importar un tipo de dato array desde otra configuración. Al importar el array si el
tipo de dato de los elementos del mismo no existe en la configuración destino, también se importa
automáticamente.
• Estructuras: Se permite importar una estructura completa desde otra configuración. Al importar la
estructura si los tipos de datos de sus campos no existen en la configuración destino, también se
importan automáticamente.
11 Puntos de supervisión
El módulo registra un conjunto de puntos hacia la base de datos que permiten supervisar su estado de
funcionamiento. Estos puntos se registran a partir de la dirección dada por el parámetro “Dirección de
Supervision” que se encuentra en la carpeta “General” de la configuración.
Dirección
a partir de Tipo Nombre Descripción
DirSupervisión
TRUE si el PLC está ejecutándose en modo
Entrada
0 PLC_OK NORMAL, de lo contrario esta en FALSE. Ver sección
Bool
Modos de funcionamiento.
13 Comandos de terminal
A continuación se describen, en orden alfabético, la sintaxis y la semántica de cada uno de los comandos
de terminal soportados por el módulo. Los mismos pueden ser enviados mediante la carpeta consola de
debug del administrador de RTU o, con el módulo ejecutado desde línea de comandos, directamente desde
el teclado.
Parámetros de entrada
Nombre Tipo Descripción
RUN BOOL Habilitación
CYCLE TIME Período del temporizador
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Señal de salida
Variables Locales
Nombre Tipo Descripción
tBegin TIME Marca de tiempo de inicio del temporizador
tElapsedTime TIME Tiempo transcurrido desde el inicio del temporizador
1
2 if RUN and CYCLE > T#0s then
3 if tBegin = T#0s then
4 // Inicio el temporizador.
5 tBegin := CLOCK_CYCLES();
6 Q := false;
7 else
8 // Calculo el tiempo transcurrido (en nanosegundos)
9 // desde el inicio del temporizador.
10 tElapsedTime := CLOCK_CYCLES_ELAPSED_TIME(tBegin, CLOCK_CYCLES());
11 if tElapsedTime >= (CYCLE / 2) then
12 // Expiró el temporizador entonces conmuto la salida Q
13 // y reincio el temporizador.
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
Variables Locales
Nombre Tipo Descripción
tBegin TIME Marca de tiempo de inicio del temporizador
tElapsedTime TIME Tiempo transcurrido desde el inicio del temporizador
R_TRIG_IN R_TRIG Detector de flanco ascendente en la entrada IN
Indica si se produjo un flanco ascendente durante el pulso actual
bRisingEdge BOOL
del timer
F_TRIG_IN F_TRIG Detector de flanco descendente en la entrada IN
1
2 // Determino si hubo algún flanco ascendente o descendente en la entrada IN
3 R_TRIG_IN(IN);
4 F_TRIG_IN(IN);
5
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
Variables Locales
Nombre Tipo Descripción
tBegin TIME Marca de tiempo de inicio del temporizador
tElapsedTime TIME Tiempo transcurrido desde el inicio del temporizador
R_TRIG_IN R_TRIG Detector de flanco ascendente en la entrada IN
1
2 // Determino si hubo un flanco ascendente en la entrada IN.
3 R_TRIG_IN(IN);
4
5
6 if PT <= T#0s then
7 // Termino el temporizador.
8 tBegin := T#0s;
9 Q := IN;
10 ET := T#0s;
11 return;
12 end_if;
13
14
15 if R_TRIG_IN.Q then
16 // Inicio el temporizador de retardo.
17 tBegin := CLOCK_CYCLES();
18 Q := false;
19 ET := T#0s;
20 elsif IN = true then
21
Parámetros de entrada
Nombre Tipo Descripción
IN BOOL Señal de entrada
PT TIME Período de temporización
Parámetros de salida
Nombre Tipo Descripción
Q BOOL Salida temporizada
ET TIME Tiempo transcurrido
1
2 // Determino si hubo un flanco descendente en la entrada IN.
3 F_TRIG_IN(IN);
4
5
6 if PT <= T#0s then
7 // Termino el temporizador.
8 tBegin := T#0s;
9 Q := IN;
10 ET := T#0s;
11 return;
12 end_if;
13
14
15 if F_TRIG_IN.Q then
16 // Inicio el temporizador de retardo.
17 tBegin := CLOCK_CYCLES();
18 Q := true;
19 ET := T#0s;
20 elsif IN = false then
21
22 if tBegin <> T#0s then
23 // Calculo el tiempo transcurrido (en nanosegundos)
24 // desde el inicio del temporizador.
25 tElapsedTime := CLOCK_CYCLES_ELAPSED_TIME(tBegin, CLOCK_CYCLES());
26 if tElapsedTime >= PT then
27 // Expiró el temporizador entonces lo detengo
28 // y copio la entrada IN en la salida Q.
29 tBegin := T#0s;
30 Q := IN;
31 ET := PT;
32 else
33 // El temporizador todavía no terminó entonces
34 // actualizo el tiempo transcurrido.
35 ET := tElapsedTime;
36 end_if;
37 else
38 // El temporizador ya terminó entonces copio la entrada
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_CLK CLK BOOL Señal de entrada
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q BOOL Señal de salida
Variables locales
Nombre Tipo Descripción
MEM BOOL Memoriza el valor de IN_CLK
1
2 OUT_Q := IN_CLK and not MEM;
3 MEM := IN_CLK;
4
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q BOOL Señal de salida
Variables locales
Nombre Tipo Descripción
MEM BOOL Memoriza el valor de IN_CLK
1
2 OUT_Q := not IN_CLK and MEM;
3 MEM := IN_CLK;
4
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_CLK CLK BOOL Señal de entrada
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q BOOL Señal de salida
Variables locales
Nombre Tipo Descripción
MEM BOOL Memoriza el valor de IN_CLK
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_CU CU BOOL Señal a ser contada
IN_R R BOOL Señal de reset de contador
IN_PV PV DINT Valor máximo
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q BOOL Señal de valor máximo alcanzado
OUT_CV CV DINT Valor actual de la cuenta
Variables locales
Nombre Tipo Descripción
R_TRIG_IN_CU R_TRIG_USR Detector de flanco ascendente en la entrada IN_CU
1
2 R_TRIG_IN_CU(IN_CU);
3
4 if IN_R then
5 OUT_CV := 0;
6 elsif R_TRIG_IN_CU.OUT_Q and (OUT_CV < IN_PV) then
7 OUT_CV := OUT_CV + 1;
8 end_if;
9
10 OUT_Q := (OUT_CV >= IN_PV);
11
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q BOOL Señal de valor cero alcanzado
OUT_CV CV DINT Valor actual de la cuenta
Variables locales
Nombre Tipo Descripción
R_TRIG_IN_CD R_TRIG_USR Detector de flanco ascendente en la entrada IN_CD
1
2 R_TRIG_IN_CD(IN_CD);
3
4 if IN_LD then
5 OUT_CV := IN_PV;
6 elsif R_TRIG_IN_CD.OUT_Q and (OUT_CV > 0) then
7 OUT_CV := OUT_CV - 1;
8 end_if;
9
10 OUT_Q := (OUT_CV <= 0);
11
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_CU CU BOOL Señal de conteo ascendente
IN_CD CD BOOL Señal de conteo descendente
IN_R R BOOL Señal de reset de contador
IN_LD LD BOOL Señal de preseteo al valor inicial
IN_PV PV DINT Valor máximo
Variables locales
Nombre Tipo Descripción
R_TRIG_IN_CU R_TRIG_USR Detector de flanco ascendente en la entrada IN_CU
R_TRIG_IN_CD R_TRIG_USR Detector de flanco ascendente en la entrada IN_CD
1
2 R_TRIG_IN_CU(IN_CU);
3 R_TRIG_IN_CD(IN_CD);
4
5 if IN_R then
6 OUT_CV := 0;
7 elsif IN_LD then
8 OUT_CV := IN_PV;
9 elsif not (R_TRIG_IN_CU.OUT_Q and R_TRIG_IN_CD.OUT_Q) then
10 if R_TRIG_IN_CU.OUT_Q and (OUT_CV < IN_PV) then
11 OUT_CV := OUT_CV + 1;
12 elsif R_TRIG_IN_CD.OUT_Q and (OUT_CV > 0) then
13 OUT_CV := OUT_CV - 1;
14 end_if;
15 end_if;
16
17 OUT_QU := (OUT_CV >= IN_PV);
18 OUT_QD := (OUT_CV <= 0);
19
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_S S1 BOOL Entrada SET (dominante)
IN_R R BOOL Entrada RESET
1
2 OUT_Q := IN_S or (not IN_R and OUT_Q);
3
Parámetros de entrada
Nombre Nombre corto Tipo Descripción
IN_S S BOOL Entrada SET
IN_R R1 BOOL Entrada RESET (dominante)
Parámetros de salida
Nombre Nombre corto Tipo Descripción
OUT_Q Q1 BOOL Salida del elemento biestable
1
2 OUT_Q := not IN_R and (IN_S or OUT_Q);
3