Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual CoDeSys PDF
Manual CoDeSys PDF
CoDeSys
Introducción al sistema de
programación IEC 61131-3
Festo Didactic
Todos los derechos reservados. Ninguna parte de esta publicación puede ser reproducida, almacenada en
sistemas de recuperación o transmitida en cualquier forma o por cualquier medio, ya sea electrónica,
mecánica, fotocopia, grabación o cualquier otro, sin el permiso previo por escrito de la editorial.
Elementos comunes:
o Tipos de datos.
o Variables y declaraciones de datos.
o Configuración (tareas y recursos).
o Unidades de organización de programas (POU).
Lenguajes de programación:
Textuales:
o Listado de instrucciones (IL).
o Texto estructurado (ST).
Gráficos:
o Diagrama de contactos (LD).
o Diagrama de bloques de funciones (FBD).
o Gráfico secuencial funcional (SFC).
En la actualidad existen numerosos entornos de programación IEC que ofrecen diferentes herramientas
tales como sintaxis coloreada, ayuda en línea y verificación en tiempo de diseño entre otras. Estas
características asociadas a la programación no están especificadas en la norma, por lo que los proveedores
de los entornos de programación las utilizan para tratar de diferenciar sus productos. No obstante, no existe
diferencia alguna en lo que respecta a los lenguajes de programación y las características asociadas a ellos.
Las implicaciones técnicas de la norma IEC 61131-3 son altas, dejando bastante espacio para el crecimiento
y la diferenciación. La norma IEC 61131-3 está teniendo un gran impacto en el mundo del control industrial y
éste no se restringe al mercado convencional de los PLC´s. Ahora mismo, se la puede ver adoptada en
aplicaciones para control de movimiento, sistemas distribuidos y sistemas de control basados en PC
(SoftPLC), incluyendo los paquetes SCADA. Y sus áreas de utilización siguen creciendo.
CoDeSys es un entorno de desarrollo completo (IDE –Integrated development system-) para PLC, compatible
con el estándar de programación IEC 61131-3. Su nombre es un acrónimo para Sistema de Desarrollo de
Controladores (Controller Develop System). Permite utilizar funciones de edición y depuración similares a
las ofrecidas por los más avanzados lenguajes de programación de la actualidad.
CoDeSys es desarrollado y distribuido por la empresa alemana de software 3S. La primera versión (1.0) fue
liberada en el año 1994. Actualmente se encuentra disponible la versión 3.0, aunque la más difundida y la
analizada en este documento es la versión 2.3.
o Desarrollo: Consiste en los editores, compiladores y depuradores para proyectos según IEC 61131-3.
Soporta los 5 lenguajes de programación y genera código objeto nativo para múltiples plataformas.
o Sistema en tiempo de ejecución (Runtime): Realiza El ciclo del control, actualiza las I/O, controla la
comunicación con el sistema de desarrollo y es responsable por la generación de proyectos
autoarrancables (Boot project).
Un SoftPLC es un paquete de software diseñado para convertir cualquier sistema embebido o basado en PC
en un PLC. Los sistemas basados en SoftPLC se distinguen de los sistemas de desarrollos clásicos por la
utilización de lenguajes de programación propios del mundo del automatismo.
CoDeSys SP Runtime debe ser implementado para convertir cualquier dispositivo embebido o basado en PC
en un controlador compatible con IEC 61131-3 programable con CoDeSys. La implementación es realizada
por el fabricante del dispositivo en colaboración con 3S, y es totalmente transparente para el usuario final.
CoDeSys SP runtime es escalable, modular, y adaptable a múltiples plataformas de hardware tales como
ARM, PowerPC e Intel 80x86/Pentium entre otras. Se encuentra disponible para sistemas de 8, 16 y 32 bits,
simple o multitarea y para los sistemas operativos VxWorks, Windows CE, QNX y Linux entre otros. Soporta
también estándares tales como OPC y DDE, lo cual le provee una extensa capacidad de integración para
cualquier tipo de aplicación.
CoDeSys es la nueva plataforma de programación adoptada por festo para sus controladores, tales como
CECX, FED-CEC y CPX-CEC entre otros. La elección de este IDE como nueva plataforma de desarrollo tiene
relación con que 3S es uno de los fabricantes de software más importantes en la industria europea de la
automatización, su producto CoDeSys es líder en sistemas de programación independientes del hardware y
es compatible con IEC 61131-3.
CoDeSys provided by Festo se basa en la versión 2.3 de CoDeSys, y le agrega además algunas
funcionalidades específicas tales como:
Tanto la instalación de CoDeSys de 3S como la instalación de CoDeSys provided by festo pueden coexistir
en una misma PC. A lo largo de este documento se utilizará el término CoDeSys para referirse
indistintamente a la versión original de 3S o a la versión de CoDeSys provided by festo.
Instalando CoDeSys
La instalación de CoDeSys es similar a la instalación de cualquier otra aplicación para el sistema operativo
Windows. Al hacer doble clic sobre el instalador se abrirá un asistente que nos guiará a lo largo de todo el
proceso.
La figura 2.4 muestra la pantalla de selección de componentes del asistente de instalación. Es importante
mencionar que la opción CoDeSys Gateway Server quedará seleccionada por defecto, ya que es la
herramienta de comunicación que se utiliza no solo para la obtención de datos desde el controlador sino
también para la comunicación entre CoDeSys y los dispositivos de hardware o sistemas targets.
La plataforma de desarrollo CoDeSys puede ser utilizada para programar una gran variedad de
controladores. Pero para que CoDeSys soporte un determinado hardware, el mismo debe ser previamente
instalado. Esto se logra instalando un paquete de software llamado paquete de soporte de target (TSP o
simplemente target). Los TSP describen en detalles las configuraciones necesarias para controlar una
plataforma de hardware específica con un programa desarrollado en CoDeSys. Las características que se
definen en un TSP incluyen el generador de código (cross-compilador), el mapa de memoria y los módulos
de I/0 entre otros.
Si quiere instalarse un nuevo controlador, debe realizarse mediante su TSP, el cuál es siempre provisto por
el fabricante del hardware, utilizando el programa InstallTarget, el cual es parte integral de la suite de
desarrollo CoDeSys.
La extensión por defecto de un TSP es *.TRG. En caso de que ninguna TSP se encuentre disponible, solo se
dispondrá de la opción ‘None’, y se pasará automáticamente a modo simulación.
De esta manera, el nuevo dispositivo instalado puede ser utilizado tanto para nuevos proyectos como para
modificar la plataforma de hardware en un proyecto ya existente, sin necesidad de modificar la
programación.
Al iniciar CoDeSys por primera vez se presentará la ventana principal, la cual se encuentra dividida en
varias secciones, a saber:
o Barras de menú y herramientas: Similar a cualquier otra aplicación, contienen todas las herramientas
disponibles y los menús de configuración, tanto de la aplicación que se está programando como del
entorno de programación.
o Organizador de objetos: Permite recorrer las diferentes secciones y objetos de un proyecto. Desde
este organizador se puede ir a los programas para su edición, pasar al modo de visualización,
definir tipos de variables y configurar los recursos.
o Ventana de mensajes: En esta ventana se muestran los mensajes de salida del compilador.
o Barra de estado: Permite ver en forma rápida el estado del sistema. Es de gran utilidad cuando se
trabaja en modo online.
Espacio de trabajo
Organizador de objetos
Ventana de mensajes
Barra de estado
Autodeclaración de variables
De acuerdo con el estándar de programación IEC 61131-3, cada variable utilizada en una aplicación de PLC
debe ser declarada. La declaración en CoDeSys debe realizarse manualmente en la parte superior de la
ventada del editor de código, ya sea ingresando la declaración en modo texto o con la ayuda de una tabla.
Sin embargo, es también posible ingresar la variable en el editor de código sin declaración previa alguna. Al
realizar esto, se abrirá una ventana de diálogo (ver figura2.7) la cual permitirá al programador ingresar el
tipo de variable, la dirección IEC y comentarios asociados entre otros datos. Las variables ingresadas de
esta manera serán auto-declaradas y aparecerán automáticamente en la lista de declaración de variables,
en la parte superior del editor.
La sintaxis coloreada es una herramienta muy utilizada en los entornos de programación ya que simplifica
notablemente la lectura del código y la detección de errores de sintaxis. CoDeSys soporta sintaxis coloreada
tanto en el editor de código como en las declaraciones de variables, y los colores utilizados son los
siguientes:
El asistente de entrada puede ser considerado como una de las características más destacadas de la suite
de desarrollo CoDeSys. Al presionar F2 en cualquier situación en la cual se debe ingresar una variable o un
llamado a una función este asistente se abrirá automáticamente y dará acceso a una lista con todas las
posibles entradas, desde variables locales hasta bloque de funciones definidos por el usuario, pasando por
posibilidades tales como bloques de función estándar y variables globales. El árbol de posibilidades puede
ser presentado en forma plana o estar jerárquicamente estructurado.
La ayuda sensible al contexto permite obtener asistencia en forma rápida acerca del objeto específico que
está siendo utilizado, ya sean un operador, una librería o incluso keywords.
Seleccionando la expresión sobre la cual se desea obtener ayuda y presionando la tecla F1 se iniciará
automáticamente el asistente mostrando la ayuda específica de la expresión y, generalmente, brindando
ejemplos acerca de su uso. Presionando la tecla F1 sin haber seleccionado expresión alguna permitirá
acceder directamente a la ayuda global.
CoDeSys permite la generación y ejecución de múltiples tareas. Dependiendo del sistema operativo
ejecutado por el controlador, estas tareas pueden ser prioritarias o no-prioritarias. Debe notarse que las
tareas prioritarias solo pueden ser utilizadas en controladores que ejecutan sistemas operativos multitarea.
El inicio de las tareas también puede ser configurado para que sean realizadas en forma cíclica o disparadas
por eventos.
Para poder acceder a las entradas/salidas físicas del controlador es necesario configurar los módulos
disponibles en él. Para esta tarea, CoDeSys integra una herramienta de configuración la cual puede
encontrarse en la pestaña de recursos del organizador de tareas.
El resultado que se obtiene de la configuración es una imagen de proceso transparente al usuario, en la que
se encontrará disponible la información de las direcciones de las entradas y salidas, ya sea en formato
numérico o simbólico.
Como función adicional, si el PLC es un master CANopen o Profibus DP, puede configurarse el bus de campo
con los archivos EDS (CANopen) o GSD (Profibus). La configuración con AS-interface también es posible.
Cuando se trabaja en modo online la ventana de declaración de variables del editor de código muestra los
valores actuales de las variables del programa que está siendo ejecutado en el controlador y permite
modificarlos. En el caso de variables booleanas el valor es modificado inmediatamente al hacer doble clic
sobre ellas. Para el caso de variables analógicas se abrirá un cuadro de diálogo que permitirá ingresar el
nuevo valor. Sin embargo, con el fin de permitir modificar múltiples variables simultáneamente, los valores
ingresados no serán inmediatamente descargados al controlador hasta que sea ejecutada la orden ‚Escribir
valores‛ del menú online, o la combinación de teclas Ctrl+F7.
CoDeSys también dispone de numerosas opciones de depuración. Una de ellas es el forzado de variables.
Ejecutando el comando ‚Forzar valores‛ (F7) del menú Online, las variables serán reescritas con los valores a
los que sean forzadas en cada nuevo ciclo del PLC. Para liberar las variables debe utilizarse el comando
‚liberar forzado‛ (Shift+F7). Otras herramientas para la depuración del programa es la utilización de
breakpoints y modos de ejecución por pasos o ciclos, los que permiten interrumpir la ejecución del
programa en un punto determinado y ejecutarlo paso por paso, para de esta manera analizar su
funcionamiento.
Para permitir que la aplicación se inicie automáticamente luego de haber iniciado el controlador, debe
utilizarse la opción ‚Crear proyecto de booteo‛ del menú online. Esto generará dos archivos binarios, con
extensión *.PRG y *.CHK respectivamente que serán descargados al controlador. Dichos archivos serán
también almacenados en el directorio del proyecto. CoDeSys no admite el desensamble de los proyectos
descargados, por lo que si se desea tener acceso al código fuente desde el controlador, el mismo debe ser
descargado explícitamente. Al descargar el código fuente se incluyen todos los comentarios y la información
gráfica, la cual se encontrará disponible desde el propio controlador en cualquier momento.
Otra característica importante es la posibilidad de descargar al controlador solo los cambios realizados en el
programa, sin necesidad de detener el controlador o perder el valor de las variables. Debe notarse que la
modificación de cambios no es posible cuando hubo modificación en las tareas, en la configuración de
entrada/salida, o si se incluyeron nuevas librerías en el proyecto.
CoDeSys ofrece la posibilidad de graficar el progreso de las variables. Mediante esta funcionalidad pueden
ser capturados eventos de corta duración y luego visualizados como si se tratara de un osciloscopio con
memoria, permitiendo de esta manera una mejor observación y seguimiento de las variables.
Hasta 20 señales pueden ser muestreadas simultáneamente. Los datos muestreados serán luego
almacenados en el controlador hasta que la alimentación sea interrumpida, y pueden ser también
almacenados en la carpeta del proyecto. Esta funcionalidad puede ser utilizada desde la pestaña de
recursos del organizador de objetos.
CoDeSys ofrece dos posibilidades para proteger el proyecto contra acceso no autorizado. Seleccionando
‚opciones‛ del menú proyectos pueden definirse contraseñas que serán chequeadas antes de abrir o
guardar el proyecto.
Sin embargo, para tener una protección más específica, es posible definir grupos de usuario con permisos
específicos para tener acceso a determinadas partes del proyecto. De esta manera, puede por ejemplo
darse autorización a un usuario para hacer uso de la visualización pero no autorizarlo para alterar la
programación.
La ventana de configuración de contraseñas puede ser hallada con el nombre‚ contraseñas para grupos de
usuarios en el menú proyecto. Aquí se pueden determinar contraseñas para ocho diferentes niveles de
grupos de usuarios.
Luego de haber definido las contraseñas para cada uno de los grupos de usuarios, se debe determinar que
objetos pueden ser utilizados por cada uno de ellos, y definir si el acceso concedido será de solo lectura o
lectura/escritura. Ingresando en el menú proyecto Objeto Propiedades, se podrán definir los accesos
del objeto que se encuentre en primer plano, o de todos los objetos del proyecto.
Fundamentos de comunicación
Para poder comprender como se realiza la comunicación entre CoDeSys y un dispositivo target se debe
analizar el esquema de la figura 2.18, en el cuál se realiza una analogía entre el esquema de
comunicaciones de la suite de desarrollo CoDeSys y la ventana de configuración de los parámetros de
comunicación.
Fig. 2.18: Esquema del sistema de comunicación de CoDeSys Ventana de configuración de parámetros de
comunicación.
Configuración de la comunicación
Todos los parámetros de configuración pueden ser accedidos y modificados desde la opción Parámetros de
comunicación del menú Online. Esta ventana nos mostrará en el lado izquierdo el Gateway y los canales o
dispositivos configurados. En la parte media de la ventana se podrán modificar las opciones de
comunicación específicas de cada dispositivo o canal, mientras que en la parte derecha se podrán editar las
configuraciones ya existentes, eliminarlas o agregar nuevas.
Para configurar la comunicación entre el sistema de desarrollo y el Gateway debe presionarse la tecla
Gateway en el lado derecho de la ventana. Aquí podrá seleccionarse el tipo de conexión que se utilizará para
acceder al Gateway, la dirección y el puerto correspondiente. Para una comunicación básica entre una PC y
un dispositivo target, debe seleccionarse conexión TCP/IP y la dirección localhost (o 127.0.0.1, dirección de
loop interno de la placa Ethernet) en el puerto TCP 1210 (puerto de escucha por defecto del Gateway
server). Existen muchas otras posibilidades de configuración para esta comunicación, pero las mismas
exceden ampliamente el objetivo de este trabajo y por lo tanto no serán tratadas.
La comunicación entre el Gateway y el sistema target es llamada Canal. Para cada dispositivo target que se
utilice se deberá configurar un nuevo canal de comunicación. Para esto se deberá presionar la tecla Nuevo.
Se abrirá un cuadro de diálogo en el cuál es posible seleccionar el nombre que se le asignará al canal y el
dispositivo que se utilizará, pudiendo el mismo ser RS232, TCP/IP, cliente OPC, etc.
Una vez configurada la comunicación y seleccionado el canal adecuado, deberá desmarcarse la opción
Modo Simulación del menú Online para poder comunicarse con el dispositivo target. La comunicación se
hará efectiva al seleccionar la opción login del mismo menú o mediante la combinación de teclas Alt+F8.
La primera vez que se realiza la conexión con el dispositivo target mediante la opción online del menú
online, pueden darse dos situaciones. Una de ellas es que el controlador no se encuentre ejecutando ningún
programa o se encuentre ejecutando un programa diferente, en cuyo caso CoDeSys dará un aviso y
solicitará autorización explícita para realizar la descarga del nuevo programa.
La otra posibilidad es que el controlador se encuentre ejecutando el mismo proyecto que se está tratando
de descargar, en cuyo caso la situación dependerá de si hay diferencias o no entre el proyecto visualizado
en la PC y el controlador.
Si no hay diferencias, el sistema pasara a modo Online sin más, pero en caso de haber diferencias lo
indicará y solicitará una descarga de los cambios, permitiendo de esta manera actualizar el programa que
está siendo ejecutado sin detener la ejecución del ciclo de control. Es importante remarcar que esta opción
no estará habilitada en los casos en los cuales hubo modificación en las tareas, en la configuración de los
módulos de entrada/salida, o si se incluyeron nuevas librerías en el proyecto. En estos casos, se deberá
descargar nuevamente el proyecto completo al controlador.
Otra manera de descargar los cambios realizados es mediante la opción ‚Download‛ del menú online,
la cual solo estará habilitada cuando el sistema se encuentre en modo online y haya modificaciones
disponibles.
Es importante remarcar que al descargar el proyecto de esta manera se está trabajando en la memoria RAM
del dispositivo target, por lo cual si se interrumpe la alimentación del controlador, el programa se borra. Por
otro lado, al descargar el programa mediante la opción Online se está descargando el código compilado, por
lo que no podrá recuperarse el código fuente del programa desde el controlador. La figura
2.23 (1) refleja esta situación.
Como ya se menciono anteriormente el conectarse online con el controlador no garantiza que el proyecto
arranque automáticamente luego de alimentado el controlador. Para lograr esto, la opción ‚Crear proyecto
de booteo‛ del menú online debe ser utilizada en el modo online. Esto generará dos archivos binarios, con
extensión *.PRG y *.CHK respectivamente, los cuáles serán descargados al controlador y almacenados en
memoria EEPROM o Flash.
Al descargar el proyecto de esta manera, el mismo se iniciará automáticamente luego de una interrupción
en la alimentación. Sin embargo, al igual que lo que ocurría con la descarga en modo online, solo está
siendo descargado el código compilado, por lo que el código fuente aún no podrá ser recuperado desde el
controlador. La figura 2.23 (2) refleja esta situación.
Puede darse el caso que el dispositivo target soporte la creación automática de proyectos autoarrancables.
En este caso, cada vez que se realice una conexión online con el controlador, el código compilado se
descargará automáticamente a la memoria EEPROM o Flash del mismo.
Recuperación de proyectos
Como se pudo apreciar en los dos apartados anteriores, el código fuente no será en ningún caso descargado
automáticamente al descargar el programa, por lo que para poder recuperar el mismo desde el dispositivo
target, se lo debe descargar en forma explícita.
Para recuperar el código fuente desde un controlador en el cuál la descarga del mismo fue explícitamente
realizada, bastará con seleccionar la opción ‚abrir‛ del menú file y seleccionar la opción ‚Abrir proyecto
desde el PLC‛.
Seleccionada esta opción, se debe seleccionar el dispositivo target a utilizar y configurar las opciones de
comunicación. Si estos pasos son realizados correctamente, el código fuente será recuperado, junto con los
comentarios y todas las visualizaciones que formaban parte de proyecto original. En la figura 2.23 (3 y 4)
puede verse reflejada esta situación.
Un proyecto CoDeSys contiene todos los objetos del programa del PLC. El proyecto completo es guardado
en un único archivo con extensión *.PRO y los objetos que contiene son las unidades de organización de
programas (POU), los tipos de datos, las visualizaciones y los recursos. Dentro de estas cuatro categorías se
pueden encontrar las variables (locales o globales), las librerías y el código fuente de los programas.
Los tipos de datos son una de las características definidas por el estándar IEC 61131-3. Además de los tipos
de datos estándar, el usuario tiene la posibilidad de definir sus propios tipos de datos. Este tema será
abordado en profundidad en el capítulo 4.
Visualizaciones
La visualización es una representación gráfica de las variables del proyecto que permite no solo ver la
evolución y estado de variables sino también enviar entradas al PLC en modo online utilizando el teclado o
el mouse de una PC. CoDeSys integra todas las herramientas necesarias para poder crear visualizaciones y
utilizarlas para ver y operar las variables del proyecto.
La visualización creada en el sistema de desarrollo es en muchos casos utilizada como la única interfaz de
usuario disponible para controlar y observar el programa de PLC asociado en modo online. Sin embargo, la
máscara de visualización creada puede ser ejecutada en cuatro modos diferentes sin sufrir modificación
alguna. Los posibles modos de visualización son los siguientes:
2 – CoDeSys HMI: CoDeSys HMI es un programa utilizado para mostrar visualizaciones de proyectos en
una PC sin utilizar el sistema de desarrollo completo, y sin necesidad de ninguna capa de comunicación
adicional. Este sistema permite al usuario crear una interfaz de software de bajo costo para la operación
del sistema utilizando las visualizaciones generadas en tiempo de desarrollo.
CoDeSys HMI es ejecutado desde la línea de comando. Por defecto mostrará la visualización llamada
PLC_VISU (Si existiera) en modo pantalla completa. El resto de los elementos de CoDeSys como menús,
organizador de objetos, etc. No se encontrarán disponibles.
4 – Visualización en sistema target: Si el sistema target tiene incorporado una interfaz de visualización,
algún periférico de entrada y soporta la funcionalidad ‚Target visualization‛, los datos de visualización
pueden ser descargados desde el sistema de programación junto con la aplicación al sistema target. La
visualización será presentada entonces directamente desde el sistema target.
Para implementar esta función de visualización debe incluirse en el proyecto la librería SysLibTargetVisu.lib.
Además, el sistema target debe ejecutar un sistema operativo Windows® (NT/2000/CE).
En la pestaña de recursos pueden encontrarse todos los objetos necesarios para configurar y organizar el
proyecto. A lo largo de este documento se presentan y detallan la gran mayoría de estos objetos, por lo que
solo se presentará aquí una breve descripción de los principales. Adicionalmente, otros recursos pueden
encontrarse disponibles dependiendo de la plataforma de hardware utilizada, tal como CNC Program list o
CamEditor entre otros.
Algunas de los objetos principales son los siguientes:
o Variables globales: Configuración de aquellas variables que pueden ser utilizadas a lo largo de todo
el proyecto.
o Configuración de alarmas: Para la configuración y el manejo de las alarmas en el proyecto.
o Administrador de librerías: Permite administrar las librerías que se incluyen en el proyecto.
o Log: Registra las actividades durante las sesiones online.
o Explorador de PLC: Terminal basada en texto para la comunicación con el sistema target a través de
comandos.
o Configuración del PLC: Para la configuración del dispositivo target.
o Graficar variables online: Para presentar la evolución de las variables en forma gráfica.
o Configuración de target: Para la selección y configuración de la plataforma de hardware.
o Configuración de tareas: Para controlar el programa a través de múltiples tareas.
o Administrador de recetas: Para indicar y pre-configurar los valores de las variables, dependiendo del
sistema target y de la configuración realizada.
o Espacio de trabajo: Permite acceder y modificar las opciones generales de configuración del
proyecto.
Un programa CoDeSys según IEC 61131-3 se encontrará dividido en múltiples unidades denominadas POU.
Una POU es una unidad de organización de programa; cada una de ellas consistirá de una declaración de
variables locales y un cuerpo escrito en uno de los lenguajes de programación definidos por la norma IEC
61131-3.
El estándar especifica tres tipos de POU: funciones, bloques de funciones y programas. Una POU puede
llamar a otra POU, pero la recursión no está permitida.
La ejecución del proyecto se inicia con una POU especial llamada PLC_PRG (programa principal, similar al P0
de los controladores de la línea FEC de festo) y es ejecutado cíclicamente. Cada proyecto debe contener este
programa a menos que se configuren tareas que especifiquen un funcionamiento diferente.
Funciones
Una función es una POU que permite múltiples entradas y produce exactamente un elemento de salida al
ser procesada. Es importante notar que las funciones tienen un tipo, por lo cual debe especificarse el mismo
en la declaración. Además, el resultado debe ser asignado a la función, lo que implica que el nombre de la
misma es utilizado como variable de salida. La declaración de una función comienza siempre con la palabra
clave FUNCTION.
o IL:
o ST:
o FBD:
Bloques de funciones
Un bloque de función es una POU que puede tener varios valores de entradas y que entrega uno o más
valores de salida. A diferencia de una función, un bloque de funciones retiene los valores hasta que se la
procesa nuevamente. La declaración de un bloque de funciones comienza con la palabra clave
FUNCTION_BLOCK.
(1) IL: Listado de instrucciones, lenguaje basado en texto definido por IEC 61131-3.
(2) ST: Texto estructurado, lenguaje basado en texto definido por IEC 61131-3.
(3) SFC: Gráfico de flujo secuencial, lenguaje gráfico definido por IEC 61131-3.
Solo los parámetros de entrada y salida pueden accederse desde fuera del bloque de funciones y el acceso
se restringe a la POU en la cual se declaro la instancia, a menos que sea declarada como variable global.
Para utilizar una variable de una copia específica del bloque de funciones se debe utilizar el operador punto
(.) de la siguiente manera:
Nombre_de_la_copia.Nombre_de_la_variable
ST:
FBD:
Fig. 3.11: Ejemplos en varios lenguajes de llamados a una instancia de un bloque de funciones.
Cabe destacar también que si alguna variable del bloque de funciones es declarada como retentiva, la
instancia completa será luego almacenada en el área retentiva de la memoria del controlador.
Por último, analizando las llamadas a los bloques de funciones, se puede ver que difieren de los llamados a
funciones simples en que se puede obtener más de una variable de salida y que las mismas son retenidas
hasta un nuevo llamado, no siendo necesaria una asignación inmediata. La figura 3.11 muestra llamados al
bloque de funciones creado en la figura 3.10 en IL, ST y FBD4.
Un programa es una POU que devuelve múltiples valores durante su ejecución. Los programas son
reconocidos globalmente a lo largo del proyecto y todos los valores son retenidos desde la última ejecución
hasta la siguiente.
No puede haber múltiples instancias de un programa y los programas no pueden ser llamados desde
funciones. Por otra parte, si un programa es llamado y se modifican sus valores, estos permanecerán de
esta manera hasta que el programa sea llamado nuevamente, incluso si se lo llama desde una POU
diferente. Esta es la diferencia con un bloque de funciones, en la cual los valores solo son modificados en la
instancia dada y solo son válidos cuando la misma instancia es llamada nuevamente. La declaración de un
programa comienza con la palabra clave PROGRAM.
Si se desea llamar al programa con parámetros de entrada/Salida, se lo puede hacer de la misma forma que
se haría en un bloque de funciones. Además, todas las variables de un programa pueden ser accedidas
desde la POU que lo ejecutó.
(4) FBD: Diagrama de bloque de funciones, lenguaje gráfico definido por IEC 61131-3.
En CoDeSys pueden utilizarse tipos de datos estándar o definidos por el usuario. Cada nombre de variable o
identificador debe ser asignado a un tipo de dato, indicando de esta manera la cantidad de memoria que
será reservada y el tipo de valores que se podrá almacenar en dicha posición de memoria.
Las variables de tipo BOOL pueden tomar dos posibles valores: Verdadero o
Falso. Se reservan 8 bits de memoria para cada variable de este tipo.
Datos Enteros
En la tabla 4.1 se enumeran los posibles tipos de datos enteros, los rangos de valores que cubren y la
cantidad de memoria que es reservada para cada uno de ellos.
También conocidos como variables de punto flotante, son utilizadas para la representación de números
racionales.
La tabla 4.2 resume los dos tipos de variables que pueden encontrarse dentro de esta clasificación.
Una variable de tipo STRING puede contener cualquier cadena de caracteres. Su tamaño se define en la
declaración, entre paréntesis y a continuación del tipo, y determina la cantidad de memoria a reservar. Sin
embargo, si no es definido al momento de la declaración, el tamaño por defecto que se utilizará será de
80 caracteres. La longitud máxima del string no está limitada en CoDeSys, pero es importante saber que las
funciones para tratamiento de cadenas solo pueden manejar hasta 255 caracteres.
Sintaxis de declaración:
Estos tipos de datos serán internamente tratados como variables del tipo DWORD (32 bits). Los posibles
tipos de datos temporales que pueden presentarse son mostrados en la tabla 4.3.
Arreglos
CoDeSys soporta arreglos de una, dos y hasta tres dimensiones, los cuales pueden ser declarados tanto en
la declaración de la POU como en la lista de variables globales.
Tiempo de desarrollo:
Tiempo de ejecución:
Donde LI1, LI2 son los límites inferiores del rango del campo y LS1, LS2 serán los límites superiores. Estos
límites deben ser valores enteros y deben estar dentro del rango de valores de las variables de tipo DINT.
Cuando se trabaja con arreglos puede definirse una función llamada CheckBounds (Provista por la librería
Check.lib) que permitirá chequear y corregir errores de fuera de rango en los arreglos.
Punteros
Las variables de tipo puntero contienen las direcciones de otras variables o bloques de funciones. Un
puntero puede apuntar a cualquier tipo de datos o bloque de funciones, incluso tipos definidos por el
usuario. Para cargar una dirección al puntero se debe utilizar el operador ADR, mientras que para leer el
contenido de la variable apuntada por el puntero se debe agregar el operador ^ a continuación del nombre.
Sintaxis de declaración:
Se trata de un tipo de variable definida por el usuario, formada por una cantidad de constantes del tipo
strings. Dichas constantes son referenciadas luego como valores de una enumeración. Los valores de una
enumeración son reconocidos en todas las áreas del proyecto, incluso si fueron declaradas dentro de una
POU.
La forma correcta de crear enumeraciones es en el organizador de objetos, bajo la pestaña ‚Tipos de Datos‛.
Luego de ser declarada, las variables del tipo <Identificador> pueden tomar cualquiera de los valores de la
enumeración.
Estructuras
Las estructuras permiten declarar un tipo de variable definido por el usuario que contiene a la vez una
determinada cantidad de otras variables, cada una con su respectivo tipo. Son creadas en el organizador de
objetos bajo la pestaña ‚Tipos De Datos‛, y son reconocidas en todas las áreas del proyecto. Para acceder a
un elemento o variable específica dentro de una variable del tipo estructura se debe utilizar el operador
punto (.).
Sintaxis de declaración:
Como ya se pudo observar en capítulos anteriores, todas las variables deben ser declaradas antes de poder
ser utilizadas. El editor de declaración es utilizado para declarar variables en cada POU, o un apartado
especial en la pestaña de recursos del organizador de objetos para declarar variables de uso global. Las
variables a ser declaradas pueden ser de entrada, salida, entrada/salida, locales, globales, retentivas o
remanentes. En general, la declaración de una variable presenta la siguiente sintaxis:
El nombre de la variable no puede contener espacios, no puede estar duplicado en un mismo ámbito y no
puede ser igual a ninguna palabra clave. Por otra parte, mayúsculas/minúsculas son ignoradas y la longitud
del nombre no tiene limitaciones.
Todas las declaraciones de datos pueden ser inicializadas agregándole al final la cadena ‚:=‛ seguida del
valor inicial. Si las variables no son inicializadas, el valor inicial por defecto será siempre cero.
Fig. 5.1: Opciones de ayuda del editor de declaraciones, a través del menú insertar.
Por otro lado, para brindar mayor soporte al programador y simplificar la tarea de declaración de variables,
CoDeSys permite ver el listado completo de los tipos de datos soportados. Para esto, se debe ir al menú
‚insertar‛ y seleccionar la opción ‚tipo‛.
La declaración de variables puede también ser realizada en forma rápida con la ayuda de la función de auto-
declaración de variables, ya analizada en la sección anterior.
Las palabras claves o Keywords deben ser escritas en letras mayúsculas en todos los editores. Aparecerán
en color azul y no podrán ser utilizadas como variables. Mediante la opción ‚Palabras claves de declaración‛
del ‚menú insertar‛ puede obtenerse un completo listado de las palabras claves que pueden ser utilizadas
en la declaración de variables.
Fig. 5.2: Opciones de ayuda del editor de declaraciones, a través del menú insertar.
Sintaxis de direcciones
El acceso a ubicaciones de memoria individuales es realizado a través del uso de secuencias de caracteres
especiales. Estas secuencias consisten de una concatenación del signo porcentual (%), un prefijo de rango,
un prefijo de tamaño y uno o más números naturales separados por puntos. Las tablas 5.1 y 5.2 muestran
los posibles valores que pueden tomar ambos prefijos y su significado.
De esta manera, si se quiere hacer referencia a la entrada digital Y.Z del controlador se debería utilizar la
secuencia %IXY.Z.
Prefijo Significado
I Entrada
Q Salida
M Ubicación de memoria
Tabla 5.1: Prefijos de rango.
Para vincular una variable a una dirección, se debe utilizar en la declaración la palabra clave AT, asignando
de esta forma una etiqueta a la dirección. Luego, ante cualquier modificación en la dirección de las señales
de entrada o salida, solo deberá modificarse la línea de la declaración y no el programa completo.
Tipos de variables
o Variables de Entrada: Son declaradas entre las palabras claves VAR_INPUT y END_VAR. Son
utilizadas como valores de entrada a la POU. Pueden ser accedidas desde fuera de la POU mediante
el operador punto (.).
o Variables de Salida: Son declaradas entre las palabras claves VAR_OUTPUT y END_VAR. Son
utilizadas como valores de salida de la POU. Pueden ser accedidas desde fuera de la POU mediante
el operador punto (.).
o Variables de Entrada/Salida: Son declaradas entre las palabras claves VAR_IN_OUT y END_VAR. Son
utilizadas como valores de entrada y salida de la POU. Pueden ser accedidas desde fuera de la POU
mediante el operador punto (.).
Las variables remanentes son aquellas variables que pueden retener sus valores ante situaciones
anormales de la ejecución del programa. Las variables remanentes se pueden dividir en dos tipos:
o Variables Retentivas: Se identifican con la palabra clave RETAIN, y mantienen su valor incluso luego
de la desconexión del controlador. Sin embargo, estas variables son reinicializadas cuando se
realiza una nueva descarga del programa.
o Variables persistentes: Se las identifica con la palabra clave PERSISTENT. A diferencia de las
variables retentivas, las variables persistentes mantienen su valor solamente luego de una nueva
descarga del programa, pero no lo hacen ante una desconexión del controlador, ya que no son
almacenadas en el área retentiva de la memoria del controlador.
Si es necesario que una variable sea conservada tanto ante una desconexión como ante una nueva
descarga del programa, se deberían utilizar ambas palabras claves en la declaración (RETAIN PERSISTENT).
Las variables de tipo retentivas son, como es de esperarse, almacenadas en el área retentiva de la memoria
del controlador. Debido a esto es importante destacar los siguientes puntos:
o Si una variable local en un programa es declarada como retentiva, dicha variable será almacenada en
el área retentiva de la memoria. Lo mismo ocurre con las variables globales.
o Si una variable local en un bloque de funciones es declarado como retentiva, la copia completa del
bloque de funciones será almacenado en el área retentiva de la memoria del controlador.
o Si una variable local en una función es declarada como retentiva, no tendrá efecto alguno. La variable
no será almacenada en el área retentiva de memoria. Lo mismo ocurre si es declarada como
persistente.
Las variables locales son declaradas entre las palabras claves VAR y END_VAR en el editor de declaración de
la POU a la cual pertenecen, y son solo válidas en el ámbito de dicha POU. Las variables locales no tienen
conexión externa, por lo que no podrán ser escritas desde fuera de la POU.
Por su parte, las variables globales son declaradas en un apartado especial en la pestaña de recursos del
organizador de objetos, entre las palabras VAR_GLOBAL y END_VAR. Este tipo de variables son reconocidas
a lo largo de todo el proyecto.
Debe notarse que dos variables pueden ser nombradas con igual identificador en caso de tratarse de
diferentes ámbitos. En este caso, dentro de la POU en la cual se repitió el identificador, si no se detalla
mediante el operador punto (.), la variable local es la que tendrá validez por encima de cualquier otra. Esto
se explica gráficamente en la figura 5.5. Incluso en el caso de variables locales y globales, puede utilizarse
el mismo identificador. Sin embargo, dentro de la POU específica, la variable con validez será la local por
encima de la global, por lo que debe tenerse especial cuidado al repetir identificadores de variables.
Constantes
Constantes Binarias
Las constantes binarias son directamente los valores lógicos VERDADERO y FALSO.
Las constantes temporales son generalmente utilizadas para operar los temporizadores de la librería
estándar. Para utilizar una constante de tiempo se debe respetar el siguiente formato:
<Identificador>:= T#<xx>d<xx>h<xx>m<xx>s<xx>ms
Como puede notarse, en la declaración pueden ser incluidos días, horas, minutos, segundos y milésimas de
segundos. Las entradas temporales deben colocarse en orden de acuerdo con la longitud temporal de cada
uno de los campos (por ejemplo días debe ir antes de horas, a la vez que horas deben ir antes de minutos y
minutos antes de segundos). Sin embargo, no es necesario utilizar todos los campos. Por otra parte, deben
respetarse los rangos máximos permitidos de cada uno de los campos, los cuales pueden ser observados en
la tabla 5.3. Debe notarse que estos rangos no serán válidos para el primer campo utilizado en la constante
temporal. Esto se puede ver claramente en la figura 5.6, en la cual se muestran algunos ejemplos de
utilización de constantes temporales.
Campo Rango
Días (d) Ilimitado
Horas (h) 0 – 23
Minutos (m) 0 – 59
Segundos (s) 0 – 59
Milisegundos (ms) 0 – 999
Tabla 5.3: Rango de campos para constantes temporales.
Las constantes numéricas pueden ser expresadas en diferentes sistemas de representación, tales como
binario, octal, decimal y hexadecimal.
En el caso de valores enteros decimales, pueden ser utilizados directamente. En caso de enteros
expresados en una base diferente, debe precederse el valor por la base y el signo numeral, tal como puede
observarse a continuación:
o Número Decimal: 62
o Número Binario: 2#1001_0011 (El guión bajo puede ser utilizado o no)
o Número Octal: 8#67
o Número hexadecimal: 16#A46F
En la figura 5.7 pueden apreciarse ejemplos de constantes numéricas enteras expresados en diferentes
sistemas de representación.
Constantes Reales
Las constantes numéricas reales pueden ser expresadas en formato fraccionario decimal o exponencial.
Independientemente de esto, el símbolo decimal a utilizar sigue los lineamientos del estándar americano,
por lo que se utiliza el punto en lugar de la coma decimal. La figura 5.8 muestra algunos ejemplos de uso.
Textuales:
o Listado de instrucciones (IL).
o Texto estructurado (ST).
Gráficos:
o Diagrama de contactos (LD).
o Diagrama de bloques de funciones (FBD).
o Esquema secuencial de funciones (SFC).
La programación en listado de instrucciones consiste en una serie de instrucciones, cada una de las cuáles
comienza en una nueva línea y contiene un operador y uno o más operandos separados por comas. Este
lenguaje permite una programación rápida y simple cuando el programa es pequeño. Cada operación se
basa en el uso de un registro especial llamado acumulador, de forma similar al lenguaje assembler. Antes
de realizar alguna operación se debe cargar el valor o la variable con la que se quiere operar en el
acumulador. Luego de realizada la operación, el resultado quedará disponible nuevamente en el
acumulador. Antes de la instrucción puede colocarse una etiqueta seguida por dos puntos (:). Los
comentarios se deben encerrar entre asteriscos y paréntesis (Ver figura 6.2) y pueden ocupar una línea
completa o encontrarse al final de una línea de programa. Todos los operadores IEC 61131-3 son
soportados (este tema se profundizará en el módulo 7).
Debe notarse que el lenguaje de listado de instrucciones no soporta la programación estructurada.
También pueden utilizarse modificadores, los cuales modificarán la manera en que un determinado
operador es ejecutado. Los siguientes modificadores pueden ser utilizados en listado de instrucciones:
En la tabla 6.1 pueden verse los operadores que pueden ser afectados por modificadores en IL, y los
posibles modificadores. En el capítulo 7 se dará una explicación detallada de la función de cada uno de los
operadores.
Operador Modificadores
LD N
ST N
AND N
OR N
XOR N
JMP CN
CAL CN
RET CN
ST – Texto Estructurado
La programación en texto estructurado se basa en expresiones. Una expresión es una construcción que
retorna un valor luego de su evaluación, y se compone de operadores y operandos. Un operando puede ser
una constante, una variable, un llamado a una función u otra expresión. La evaluación de expresiones se
realiza a través del procesamiento de operadores de acuerdo a ciertas reglas de prioridad. El operador con
la mayor prioridad es procesado primero, luego el operador con el siguiente nivel de prioridad, y así
sucesivamente hasta que todos los operadores hayan sido procesados. Operadores con igual nivel de
prioridad son procesados de izquierda a derecha. La tabla 6.2 muestra la prioridad de los operadores en ST.
o Condicional IF: Permite verificar una condición booleana y dependiendo de la misma ejecutar
instrucciones.
Sintaxis:
IF <Expresión_Booleana_1> THEN
<Instrucciones_1>
{ELSEIF <Expresión_Booleana_2> THEN
<Instrucciones_2>
.
.
ELSIF <Expresión_Booleana_n> THEN
<Instrucciones_n>
ELSE
<Instrucciones>}
END_IF;
(La parte entre llaves es opcional).
o Instrucción CASE: Esta instrucción permite combinar múltiples instrucciones condicionales en función
de la misma variable y en una única construcción.
Sintaxis:
CASE <Variable> OF
<Valor_1>: <Instrucciones_ 1>
<Valor_2>: <Instrucciones_ 2>
<Valor_3,Valor_4,Valor_5>: <Instrucciones_ 3>
<Valor_6 .. Valor_10>: <Instrucciones_ 4>
...
<Valor_n>: <Instrucciones_n>
ELSE <Instrucciones_else>
END_CASE;
Sintaxis:
Variable :INT;
FOR <Variable> := <V_Inicial> TO <V_Final> {BY <Paso>} DO
<Instrucciones>
END_FOR;
(La parte entre llaves es opcional).
Las instrucciones serán ejecutadas hasta tanto el valor de variable sea mayor al valor V_Final. Esta
condición es verificada antes de ejecutar las instrucciones, por lo que las instrucciones del lazo no serán
nunca ejecutadas si V_Inicial es mayor a V_Final. La variable se incrementa automáticamente luego de cada
ciclo en el valor definido como Paso. Si Paso no se define, se toma 1 como valor por defecto.
o Lazo WHILE:
El lazo WHILE puede utilizarse de manera similar al FOR, con la diferencia de que la condición de salida
puede ser cualquier expresión booleana. Esto significa que mientras se cumpla la condición indicada el lazo
será ejecutado.
Sintaxis:
WHILE <Expresión_Booleana> DO
<Instrucciones>
END_WHILE;
Debe notarse que si la condición booleana es falsa en la primera evaluación, las instrucciones
correspondientes no se ejecutaran nunca. De igual manera, si la condición booleana no toma nunca el valor
falso, se entra en un bucle infinito.
o Lazo REPEAT:
Este bucle se diferencia del WHILE en que la condición de salida es chequeada luego de la ejecución
del lazo. De esta manera, el lazo será ejecutada al menos una vez antes de finalizar su ejecución sin
importar el valor de la condición booleana. Es este lazo las instrucciones se ejecutarán hasta que la
condición booleana retorne el valor VERDADERO. Si la condición booleana nunca toma ese valor, se
generará un bucle infinito.
Las instrucciones WHILE y REPEAT tienen mejores prestaciones que la instrucción FOR dado que no es
necesario conocer de antemano la cantidad de ciclos a ejecutar. Sin embargo, en caso de conocerse dicho
valor es preferible trabajar con el lazo FOR, ya que de esta manera se evita el riesgo de caer en un bucle
infinito.
El esquema secuencial de funciones (SFC) es un lenguaje de programación gráfico que permite describir el
orden cronológico de las diferentes acciones a llevar a cabo en un programa. Es una importante herramienta
para estructurar y ordenar el programa, aunque tiene la desventaja de no poder ser convertido a otro
lenguaje.
Cada una de los pasos tiene acciones asociadas que se llevan a cabo cuando el mismo se encuentra activo.
Dichas acciones son los verdaderos programas. Los pasos están separados por transiciones, las cuales
contienen las condiciones booleanas para la continuación del la secuencia. Si bien CoDeSys soporta una
versión de SFC que está en concordancia con el estándar IEC 61131-3, también ofrece un modo simplificado;
mientras que los pasos IEC contienen flags con calificadores y soportan hasta nueve acciones en un solo
paso, la versión simplificada solo muestra un triángulo negro en la esquina superior derecha del paso y
permite una sola acción en cada paso. Las acciones pueden programarse en cualquiera de los lenguajes IEC,
inclusive en SFC nuevamente.
Para poder utilizar pasos IEC en lugar de pasos simplificados, la librería iecsfc.lib debe ser incluida en el
proyecto. Las acciones asociadas con pasos IEC son mostradas a la derecha del paso, en una caja de dos
partes. Del lado izquierdo se puede ver un calificador, mientras que del lado derecho se muestra el nombre
de la acción. La tabla 6.3 resume los posibles calificadores IEC y su implicancia.
Adicionalmente, es posible asociar a cada paso una acción de entrada y una acción de salida. Una acción de
entrada es ejecutada por única vez apenas el paso se hace activo. Una acción de salida es también
ejecutada una única vez apenas el paso es desactivado. Las acciones de entrada se identifican en cada paso
con una E en la esquina inferior izquierda, mientras que las acciones de salida se identifican con una X en la
esquina inferior derecha.
No almacenar
R La acción es desactivada
Reset
Fig. 6.6: STEP en SFC con acción de entrada (E) y salida (X).
o Ramas alternativas:
Dos o más ramas pueden ser alternativas. Esto significa que cada rama debe comenzar y finalizar con una
transición. Las ramas alternativas pueden contener ramas paralelas e incluso otras ramas alternativas. Una
rama alternativa siempre comienza y finaliza con una línea horizontal. Son evaluadas de izquierda a
derecha; la primera transición con un resultado verdadero habilita la ejecución de su respectiva rama en
detrimento del resto de ellas.
o Ramas paralelas:
Dos o más ramas pueden definirse como paralelas. Cada rama paralela debe comenzar y finalizar con un
paso. Las ramas paralelas pueden contener ramas alternativas y otras ramas paralelas. Una rama paralela
comienza con una doble línea y finaliza con una doble línea o un salto. Al hacerse verdadera la condición
previa a las ramas paralelas, todas las primeros pasos de las ramas paralelas entre sí son ejecutados en
simultaneo. El paso que sigue la línea final de las ramas paralelas se convierte en activo cuando todos los
pasos previos están activos y la condición de transición anterior produce un valor verdadero.
Otra característica de la programación en SFC son las variables implícitas (flags) para consultar el estado de
los pasos, las acciones y la duración de los pasos activos. Estas variables son implementadas por la librería
iecsfc.lib para pasos IEC y directamente por CoDeSys para pasos no-IEC.
El esquema continuo de funciones (CFC) no es un lenguaje de programación en si mismo sino que se trata
de un editor que realiza una implementación particular del editor de FBD, pero no orientado a redes. De esta
manera, la libre ubicación de bloques y conexiones es posible, permitiendo funciones tales como lazos de
realimentación.
Para controlar y modificar el orden de ejecución de los bloques, se utiliza un cuadro gris con un número que
se puede encontrar en la esquina superior derecha de cada uno de los bloques, en donde se muestra el
número de orden de ejecución en el ciclo de control.
LD – Diagrama de escalera
Operadores de asignación
Estos operadores tienen por finalidad la asignación de valores a las variables. Dichos valores pueden
provenir de direcciones, resultados de expresiones, constantes, etc. Este tipo de operadores pueden ser
utilizado para cualquier tipo de datos, ya sea estándar o definido por el usuario.
La forma de asignar variables difiere en función del lenguaje en el cuál se esté programando, si bien los
resultados finales serán siempre los mismos. Debe destacarse que para la programación en LD, la
asignación de variables es válida solamente si se utilizan variables de tipo booleanas.
LD / ST
LD /ST se trata de la asignación mas básica de variables. Su función es la de asignar un valor o el resultado
de una expresión a una variable. En la figura 7.1 se pueden apreciar ejemplos de su uso en los diferentes
lenguajes IEC.
LDN / ST
Con este operador, el valor a ser asignado debe ser en general de tipo booleano (Nótese que no se habla
solamente del tipo de variable BOOL sino que en algunos lenguajes se puede utilizar los tipos WORD, BYTE,
y todos aquellos tipos de datos que almacenen valores binarios o booleanos). El resultado será cargar la
inversa del valor de la primera variable en la segunda. La figura 7.2 muestra ejemplos de su uso en los
diferentes lenguajes IEC.
ST:
IL:
FBD:
LD:
ST:
IL:
LD / S
El valor a ser asignado debe ser en general de tipo booleano. El resultado será cargar el valor verdadero en
la variable de salida si la variable de entrada es también verdadera. Ejemplos de su uso pueden verse en la
figura 7.3.
ST:
IL:
FBD:
ST:
IL:
Similar al caso anterior, el valor a ser asignado debe ser de tipo booleano. El resultado será cargar el valor
falso en la variable de salida si la variable de entrada es verdadera. La figura 7.4 muestra algunos ejemplos
de su uso en los diferentes lenguajes de programación IEC.
MOVE
El operador MOVE permite la asignación de una variable o una constante a otra variable del tipo adecuado.
Puede utilizarse en combinación con la función de habilitación de los editores de LD y CFC, aunque esta
combinación no es posible en FBD. En caso de utilizar dicha combinación, la asignación se hará efectiva
cuando la entrada de habilitación tenga el valor TRUE. La figura 7.5 muestra algunos ejemplos de su uso en
los diferentes lenguajes IEC.
CFC:
IL:
Figura 7.5: Ejemplos de uso del operador ADD en diferentes lenguajes IEC.
Operadores aritméticos
ADD
El operador ADD permite sumar variables de los tipos BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT,
UDINT, REAL y LREAL. También permite sumar dos variables temporales, resultando en un nuevo valor de
tiempo. (Por ejemplo, t#45s + t#50s = t#1m35s). La figura 7.6 muestra algunos ejemplos de su uso en los
diferentes lenguajes de programación IEC.
ST:
IL:
Figura 7.6: Ejemplos de uso del operador ADD en diferentes lenguajes IEC.
MUL
El operador MUL permite multiplicar variables de los tipos BYTE, WORD, DWORD, SINT, USINT, INT,
UINT, DINT, UDINT, REAL and LREAL.
La figura 7.7 muestra algunos ejemplos de su uso en los diferentes lenguajes de programación IEC.
FBD:
ST:
IL:
Figura 7.7: Ejemplos de uso del operador MUL en diferentes lenguajes IEC.
Permite sustraer una variable de otra de los tipos BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT,
UDINT, REAL and LREAL. También permite sustraer una variable temporal de otra, resultando en un nuevo
valor de tiempo. (Por ejemplo, t#1m35s - t#50s = t#45s). La figura 7.8 muestra algunos ejemplos de su uso
en los diferentes lenguajes de programación IEC.
FBD:
ST:
IL:
Figura 7.8: Ejemplos de uso del operador SUB en diferentes lenguajes IEC.
DIV
FBD:
ST:
IL:
Figura 7.9: Ejemplos de uso del operador DIV en diferentes lenguajes IEC.
Permite la división entera de una variable en otra de los tipos BYTE, WORD, DWORD, SINT, USINT, INT, UINT,
DINT, UDINT, o la división entera y fraccionaria de los tipos de datos REAL and LREAL. La figura 7.9 muestra
algunos ejemplos de su uso en los diferentes lenguajes de programación IEC.
Este operador permite obtener el resto de la división entera de dos variables de los tipos BYTE, WORD,
DWORD, SINT, USINT, INT, UINT, DINT, UDINT. La figura 7.10 muestra algunos ejemplos de su uso en los
diferentes lenguajes de programación IEC.
FBD:
ST:
IL:
Figura 7.10: Ejemplos de uso del operador MOD en diferentes lenguajes IEC.
AND
FBD:
ST:
IL:
Figura 7.11: Ejemplos de uso del operador AND en diferentes lenguajes IEC.
Realiza la operación AND lógica bit a bit entre operandos binarios. Estos deben ser del los tipos BOOL,
BYTE, WORD o DWORD.
FBD:
ST:
IL:
XOR
Realiza la operación XOR lógica bit a bit entre operandos binarios. Estos deben ser del los tipos BOOL,
BYTE, WORD o DWORD. Para el caso de tener más de dos entradas, las entradas serán chequeadas en pares
y los resultados particulares comparados nuevamente en pares.
NOT
Realiza la operación NOT lógica bit a bit entre operandos binarios. Estos deben ser del los tipos BOOL, BYTE,
WORD o DWORD.
Este operador realiza la operación de rotación a la izquierda del operando binario, el cual resulta
desplazado en n bits (ej.: SHL (in, n)). Los tipos de datos soportados son BYTE, WORD o DWORD. Los
espacios de la derecha serán completados con cero y los bits sobrantes a la izquierda serán descartados.
Como puede apreciarse en la figura 7.14, a iguales operaciones los resultados serán diferentes para
diferentes tipos de datos, a pesar que las variables de entradas tengan el mismo valor.
SHR
Este operador realiza la operación de rotación a la derecha del operando binario, el cual resulta desplazado
en n bits (ej.: SHR (in, n)). Los tipos de datos soportados son BYTE, WORD o DWORD. Los espacios de la
izquierda serán completados con cero y los bits sobrantes a la derecha serán descartados.
ROR
Este operador realiza la operación de rotación a la derecha del operando binario, el cual resulta desplazado
en n bits (ej.: ROL (in, n)). Los tipos de datos soportados son BYTE, WORD o DWORD. Los espacios de la
izquierda serán completados con los bits sobrantes de la derecha.
SEL
FBD:
ST:
IL:
El operador SEL permite la selección binaria, a través de la cuál una variable podrá tomar uno de los valores
previamente definidos en función del valor de otra variable del tipo binario. El siguiente ejemplo aclarará el
funcionamiento del mismo:
Las variables VX, V1 y V2 pueden ser de cualquier tipo, pero todas ellas deben ser del mismo tipo. La
variable G debe ser una variable binaria. El valor almacenado en la variable Vx será V1 cuando G sea falsa, o
V2 cuando G sea verdadera.
MIN
Este operador retorna el valor mínimo de entre dos valores. Puede ser utilizado con variables de cualquier
tipo.
LIMIT
El operador LIMIT permite limitar el rango de variación de una variable entre un valor mínimo y un valor
máximo, tal como se muestra en la figura 7.23. Se puede trabajar con variables de cualquier tipo. El
siguiente ejemplo despejará dudas:
Donde Min es la variable o el valor límite inferior y MAX es el valor o variable superior. Si el valor de la
variable IN esta en el rango ( MIN < IN < MAX ) entonces la variable OUT tendrá el mismo valor que la variable
IN. Si IN está por encima de MAX, la variable OUT tomará el valor de MAX. Si IN está por debajo de MIN,
entonces la variable OUT tomará el valor de MIN.
Operadores de comparación
GT
GT es un operador booleano que retorna verdadero si el valor del primer operando es mayor al valor del
segundo. Los operandos pueden ser de los tipos BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT,
UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME y STRING.
LE
LE es un operador booleano que retorna verdadero si el valor del primer operando es menor o igual que el
valor del segundo. Los operandos pueden ser de los tipos BOOL, BYTE, WORD, DWORD, SINT, USINT, INT,
UINT, DINT, UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME y STRING.
EQ
EQ es un operador booleano que retorna verdadero si el valor del primer operando es igual al valor del
segundo. Los operandos pueden ser de los tipos BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT,
UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME y STRING.
NE
NE es un operador booleano que retorna verdadero si el valor del primer operando es distinto del valor del
segundo. Los operandos pueden ser de los tipos BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT,
UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME y STRING.
Operadores de direcciones
ADR
Este operador no está definido en el estándar IEC 61131-3. Su función es la de retornar la dirección de su
argumento. Su argumento puede ser una variable de cualquier tipo. Esta dirección puede ser utilizada para
implementar funciones para ser tratadas como punteros, o puede ser utilizada para almacenar su valor de
salida directamente en un puntero. La salida de este operador es siempre una variable del tipo DWORD.
CAL
Este operador es válido para el lenguaje de listado de instrucciones solamente (IL). Permite llamar una
función, un bloque de funciones o un programa. Las variables de entrada de la POU que está siendo llamada
deben colocarse en paréntesis a continuación del nombre de la POU y separadas por comas.
JMP
Este operador puede ser utilizado en los lenguajes de programación IL, FBD y LD, aunque en diferentes
maneras en cada uno de ellos. Su función es la de generar un salto incondicional a una etiqueta dentro de la
misma POU. Las figuras 7.30 a 7.32 muestran ejemplos del uso de este operador en IL, LD y FBD
respectivamente.
RET (RETURN)
RET puede ser utilizado en los lenguajes de programación IL, FBD y LD. Su función es la de interrumpir
prematuramente el ciclo de ejecución. Las figuras 7.30 a 7.32 muestran ejemplos del uso de este operador
en IL, LD y FBD respectivamente.
Figura 7.30: Ejemplos de uso del operador JMP y RET (RETURN) en LD.
Figura 7.32: Ejemplos de uso del operador JMP y RET (RETURN) en FBD.
La llamada a otras POU se debe realizar de manera diferente en cada uno de los lenguajes de programación
IEC 61131-3. En la tabla 7.1 puede verse de manera resumida y a través de ejemplos la manera en la cual se
debe realizar el llamado a otras POU, específicamente programas, funciones y bloques de funciones.
Operadores numéricos
ABS
El operador ABS tiene por función devolver el valor absoluto del operando de entrada. Las posibles
combinaciones de tipos de datos de entrada / Tipos de datos de salida pueden apreciarse en la tabla 7.2,
mientras que la figura 7.33 presenta un ejemplo de su utilización en lenguaje de texto estructurado.
REAL REAL
BYTE INT, REAL, BYTE, WORD,
DWORD, DINT
Tabla 7.2: Posibles combinaciones de tipos de variable de entrada/salida para el operador ABS.
SQRT
Este operador retorna la raíz cuadrada de la variable de entrada. Dicha variable puede ser de los tipos BYTE,
WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT.
La variable de salida debe ser del tipo REAL.
Este operador retorna el logaritmo natural de la variable de entrada. Dicha variable puede ser de los tipos
BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de salida debe ser del tipo
REAL.
LOG
Este operador retorna el logaritmo base diez de la variable de entrada. Dicha variable puede ser de los tipos
BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de salida debe ser del tipo
REAL.
EXP
Este operador retorna la función exponencial ex, donde X es la variable de entrada. Dicha variable puede ser
de los tipos BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de salida debe ser
del tipo REAL.
Este operador retorna el seno de la variable de entrada, la cual debe estar en radianes. Dicha variable puede
ser de los tipos BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de salida debe
ser del tipo REAL.
COS
Este operador retorna el coseno de la variable de entrada, la cual debe estar en radianes. Dicha variable
puede ser de los tipos BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de
salida debe ser del tipo REAL.
TAN
Este operador retorna la tangente de la variable de entrada, la cual debe estar en radianes. Dicha variable
puede ser de los tipos BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de
salida debe ser del tipo REAL.
ASIN
Este operador retorna el arco-seno (función inversa del seno) de la variable de entrada, la cual debe estar en
radianes. Dicha variable puede ser de los tipos BYTE,
WORD, DWORD, INT, DINT, REAL, SINT, USINT, UINT, UDINT. La variable de salida debe ser del tipo REAL.
ACOS
Este operador retorna el arco-coseno (función inversa del coseno) de la variable de entrada, la cual debe
estar en radianes. Dicha variable puede ser de los tipos BYTE, WORD, DWORD, INT, DINT, REAL, SINT, USINT,
UINT, UDINT. La variable de salida debe ser del tipo REAL.
7. 9. 11 ATAN
7. 9. 12 EXPT
Este operador realiza la función potenciación, la exponenciación de una variable con otra variable. El valor
de salida es (variable_1)(variable_2). Las variables de entrada pueden ser de los tipos BYTE, WORD,
DWORD, INT, DINT, REAL, SINT, USINT, UINT,
UDINT. La variable de de salida debe ser del tipo REAL.
FBD:
ST:
IL:
Este tipo de operadores tienen por finalidad convertir variables de un tipo de datos a otro.
Figura 7.38: Asistente de entrada. Listado de los operadores de conversión de tipo disponibles en CoDeSys.
Debe notarse que esta implícitamente prohibido convertir tipo ‚más grandes‛ en tipos ‚más pequeños‛
(como por ejemplo de tipo ENTERO a BYTE). Para estas conversiones se requieren ciertas consideraciones
especiales para no perder información.
Si bien las posibilidades de conversión son muchas, todas ellas utilizan la misma sintaxis y operan de forma
similar. El asistente de entrada será de gran ayuda para ver los tipos de conversiones permitidas. La sintaxis
a utilizar es la siguiente:
<Tipo_de_dato_Variable_1>_TO_< Tipo_de_dato_Variable_2>
7. 10. 1 BOOL_TO
Permite convertir de tipo booleano en cualquier otro tipo. Para tipos numéricos, el resultado será 1 cuando
el operando es VERDADERO y 0 cuando el operando es FALSO. Para tipos STRING, el resultado será la
cadena de caracteres TRUE o FALSE respectivamente.
7. 10. 2 TO_BOOL
Permite convertir de cualquier tipo a tipo booleano. Para tipos numéricos, el resultado será VERDADERO
cuando el operando no es igual a 0. El resultado será falso cuando el operando es 0. Para tipos STRING, el
resultado será VERDADERO cuando el operando es ‘TRUE’, y será FALSO en cualquier otro caso.
Permite convertir de cualquier tipo de número entero en otro tipo de número. Si se realiza una conversión
hacia un tipo de número ‚menor‛ (Menor tamaño del campo), puede perderse información; si el número que
se está convirtiendo excede el rango del tipo de dato de salida, los primeros bytes serán ignorados.
Permite convertir de una variable de tipo REAL o LREAL en un tipo diferente. El valor será redondeado hacia
arriba o hacia abajo hacia el valor más cercano y convertido en el nuevo tipo de variable.
Permite convertir de una variable de tipo TIME o TIME_OF_DAY en un tipo diferente. El tiempo será
almacenado internamente en una variable de tipo DWORD en milisegundos. Este es el valor que será
convertido.
7. 10. 6 STRING_TO
Permite convertir desde una variable del tipo STRING en un tipo de variable diferente. La variable de tipo
STRING debe contener un valor que sea válido en la variable de salida. En cualquier otro caso, el valor de
salida será 0.
7. 10. 7 TRUNC
Este operador permite convertir de variables de tipo REAL en variables de tipo INT. La parte entera de la
variable de entrada será utilizada, descartando la parte irracional.
Una librería es una lista de objetos los cuales pueden ser utilizados en diferentes proyectos. Las librerías
pueden ser generadas por el usuario o pueden ser propias de CoDeSys. También puede darse el caso de
que sean entregadas por el fabricante del hardware, en cuyo caso pueden estar encriptadas.
La librería por defecto que se incluye en todos los proyectos es la librería standard.lib. Esta librería es
propia de CoDeSys y provee funciones básicas tales como temporizadores y contadores entre otras. En este
capítulo se desarrollaran algunas de las funciones más destacadas de la librería standard.lib. Para mayor
información acerca de las funciones disponibles en esta librería debe consultarse la documentación oficial
de CoDeSys.
Otra librería de gran utilidad es la librería util.lib, la cual contiene funciones adicionales tales como
conversiones BCD, funciones matemáticas auxiliares, generadoras de señales y manipuladores para
procesamiento de valores analógicos entre otras. Esta librería no será tratada en este documento, pero
puede obtenerse mayor información en la documentación oficial.
R_TRIG es un bloque de funciones que permite detectar el flanco ascendente de una señal booleana. La
variable de salida será también una variable booleana, y permanecerá en estado FALSO mientras que la
variable de entrada sea falsa. Tan pronto como la señal de entrada pase de FALSO a VERDADERO, la salida
generará un pulso de corta duración indicando la detección del flanco ascendente, permaneciendo
nuevamente en estado FALSO hasta el próximo flanco ascendente de la señal de entrada.
Dado que se trata de un bloque de funciones, debe declararse una variable del tipo R_TRIG en la declaración
del programa, para de esta manera generar la instancia correspondiente.
F_TRIG
Contadores
CTU
Se trata de un bloque de funciones incluido en la librería estándar para realizar cuentas ascendentes. Tanto
las variables de entrada CU y RESET como la variable de salida Q son del tipo BOOL. La variable de entrada
PV y la variable de salida CV son del tipo WORD.
La variable Q será verdadera cuando CV sea mayor o igual que la variable de entrada PV. La figura 8.6
ayudara a aclarar la forma de utilización de este bloque de funciones, mientras que la figura 8.7 muestra la
declaración del bloque de funciones CTU, en el administrador de librerías, en la pestaña recursos del
organizador de objetos.
CTD
CTD es también un bloque de funciones incluido en la librería estándar para realizar cuentas descendentes.
Tanto las variables de entrada CD y LOAD como la variable de salida Q son del tipo BOOL, mientras que la
variable de entrada PV y la variable de salida CV son del tipo WORD.
La variable CV será la encargada de realizar la cuenta descendente, y será inicializada con el valor de la
entrada PV cuando LOAD es verdadera. Por cada flanco ascendente que presenta la variable de entrada CD,
se decrementará la variable de salida CV en una unidad. La variable Q será verdadera cuando CV haya
alcanzado el valor 0.
CTUD
El bloque de funciones CTUD permite realizar cuentas ascendentes y descendentes. Tanto las variables de
entrada CU, CD, RESET y LOAD como la variable de salida QU y QD son del tipo BOOL, mientras que la
variable de entrada PV y la variable de salida CV son del tipo WORD.
Figura 8.9: Ejemplo de utilización del bloque de funciones CTUD de la librería estándar en FBD.
Si la entrada RESET es verdadera, la variable CV será reinicializada a 0. En caso que LOAD este habilitada,
será reinicializada con el valor de la entrada PV. Igual que en el resto de los contadores, la variable que
llevará la cuenta es CV. Cuando LOAD y RESET tienen el valor FALSO, la variable CV será incrementada en 1
por cada flanco ascendente de la entrada CU (Count UP) y decrementada en 1 también por cada flanco
ascendente en la entrada CD (Count Down). La salida QU será verdadera cuando CV sea mayor o igual al
valor especificado en PV, mientras que QD será válida cuando CV será igual a 0.
TP
El bloque de funciones TP es un temporizador que permite generar un pulso de una amplitud definida. IN y
PT son variables de entrada de los tipos BOOL y TIME respectivamente, mientras que Q y ET son las
variables de salidas de los tipos BOOL y TIME respectivamente.
Si la entrada IN es falsa, la salida Q será falsa y ET será 0. Tan pronto como la entrada IN pase al estado
VERDADERO, ET comenzará a ser incrementada en milisegundos hasta alcanzar el valor predefinido en PT y
permanecerá constante luego de esto. La salida Q tomará el valor VERDADERO desde el momento en que IN
toma el valor VERDADERO y hasta que ET alcance el valor de PT. En cualquier otro momento, la salida Q
tomará el valor FALSO. De esta manera, la salida Q estará entregando una señal cuadrada cuyo tiempo en
estado alto será definido por el valor de entrada PT (en milisegundos). La figura 8.18 muestra la secuencia
temporal de funcionamiento del bloque de funciones PT.
El bloque de funciones TON implementa un retardo a la conexión. Las variables IN y PT son variables de
entrada de los tipos BOOL y TIME respectivamente. Las variables Q y ET son variables de salida de los tipos
BOOL y TIME respectivamente. Si la entrada IN es falsa, tanto la salida Q como ET contienen el valor 0. Tan
pronto como IN pasa a estado VERADDERO, se comienza una cuenta de tiempo en milisegundos en la salida
ET hasta que el valor de dicha cuenta sea igual al ajustado en la entrada PT. De esta manera, la salida Q se
encuentra en estado verdadero cuando la entrada IN está en estado VERDADERO y Et es igual a PT. El
siguiente diagrama temporal ayuda a entender el funcionamiento de este temporizador.
El bloque de funciones TOF implementa un retardo a la desconexión. Las variables IN y PT son variables de
entrada de los tipos BOOL y TIME respectivamente. Las variables Q y ET son variables de salida de los tipos
BOOL y TIME respectivamente. Si la entrada IN es verdadera, la salida Q se encontrara en estado
VERDADERO y ET contendrá el valor 0. Tan pronto como IN pasa a estado FALSO, se comienza una cuenta de
tiempo en milisegundos en la salida ET hasta que el valor de dicha cuenta sea igual al ajustado en la
entrada PT. De esta manera, la salida Q se encuentra en estado FALSO cuando la entrada IN está en estado
FALSO y ET es igual a PT. El siguiente diagrama temporal ayuda a entender el funcionamiento de este
temporizador.
SR
El bloque de funciones SR es básicamente un Flip-Flop con entrada de habilitación dominante. Tiene dos
entradas, SET1 y RESET, y una salida, Q1.EL valor de la salida responderá en todo momento a la siguiente
expresión:
Este es, si la entrada SET1 se encuentra activa, la salida será TRUE independientemente del estado de la
entrada RESET. Si la entrada SET1 se encuentra en estado FALSE, el valor de la salida dependerá entonces
de la entrada RESET. Ambas entradas y la salida deben der del tipo BOOL.
RS
El bloque de funciones RS se trata al igual que el anterior de un Flip-Flop con entrada dominante. La
diferencia radica en que la entrada dominante es este caso la entrada de deshabilitación. Presenta dos
entradas, SET y RESET1, y una salida, Q1. EL valor de la salida responderá en todo momento a la siguiente
expresión:
estado FALSE, el valor de la salida dependerá de la entrada SET. Ambas entradas y la salida deben der del
tipo BOOL.
o F11: Compilar.
o http://www.infoplc.net/
o http://www.plcopen.org/
o http://www.3s-software.com/
o http://www.iec.ch