Bloques funcionales para la programación de controladores
4 noviembre 2020 por Johautt Hernández
En el mundo de la programación de controladores existen diferentes estrategias de programación, cuya finalidad es crear instrucciones secuenciales que permiten al controlador interpretar entradas de una determinada manera, procesarlas y traducirlas en salidas que energizan y regulan el funcionamiento de máquinas específicas o procesos complejos.
La programación en este campo no ha evolucionado mucho, posiblemente porque programar controladores no es una actividad muy común y, por lo tanto, tampoco muy popular. Esto ha generado poca innovación en el sector.
Pienso que algunos de los factores que lo hacen poco popular son los costos de los equipos y las especificaciones técnicas y de seguridad propias de este sector, lo que convierte este tema en algo muy excluyente, al que solo tiene acceso personal técnico muy especializado y, en ocasiones, con amplia experiencia.
Estas estrategias de programación llevan a describir dos tipos principales de lenguaje:
Lenguajes de texto
Los lenguajes de texto, lamentablemente, no han avanzado mucho en el campo de la programación de controladores, muy al contrario de lo que han avanzado en la programación de computadoras y servidores. Por ello, en la programación de controladores suelen considerarse lenguajes de bajo nivel, aun cuando en otros campos existen lenguajes de texto de muy alto nivel que facilitan enormemente el trabajo al programador, incluso más que los lenguajes gráficos con los que se trabaja en este sector.
Todavía se ven en este sector lenguajes de programación con secuencias parecidas al lenguaje ensamblador, lo que los hace más complejos y de poco uso en la actualidad. Algunos subtipos de lenguajes en esta categoría son:
- Lista de instrucciones: muy parecida al lenguaje ensamblador, actualmente es poco usada y solo para aplicaciones pequeñas, debido a su alto nivel de complejidad.
- Texto estructurado: muy parecido al lenguaje PASCAL. Dispone de toda la funcionalidad necesaria para realizar operaciones más complejas, pero aún así no llega a cubrir las expectativas de eficiencia de programación que sí se cubren actualmente en la industria del software informático.
Lenguajes gráficos
Los lenguajes gráficos son considerados en la industria como "lenguajes de alto nivel". Cuentan con una interfaz gráfica que facilita su programación al interconectar elementos entre sí de una manera establecida por las reglas del propio lenguaje.
Estos lenguajes presentan bastantes limitaciones en cuanto a la configuración de parámetros: aunque algunos son reconfigurables desde el mismo proceso o mediante una interfaz de parámetros de la máquina, otros solo son configurables desde la misma interfaz de programación, lo que afecta el dinamismo del proceso. Incluso puede haber casos en que estos parámetros sean fijos y no puedan cambiarse, o en los que los parámetros deseados para realizar una tarea simplemente no existan.
Todo esto obliga a los programadores a resolver la programación del proceso de una manera más compleja, lo que reduce sensiblemente el rendimiento del controlador de forma innecesaria. Algunos subtipos de lenguajes en esta categoría son:
- Diagrama de escaleras: lenguaje muy parecido a la manera en que se configuraban antiguamente los controladores de relés. Presenta un flujo de energía que va de izquierda a derecha en cada escalón, el cual debe sortear una serie de interrupciones representadas por contactos de relés e interruptores accionados manualmente o por variaciones en procesos físicos relacionados con el sistema a controlar. Dicho flujo pasa por bobinas que accionan contactos de relés en este u otro escalón del diagrama, realizando así la lógica requerida para controlar el proceso. Aunque es muy común en PLCs, tiene limitaciones con procesos que manejan variaciones analógicas y requiere herramientas adicionales para la comunicación con otros controladores o con una interfaz de usuario.
- Diagramas de funciones secuenciales: permite especificar procesos de automatización mediante flujos lógicos de forma secuencial. El flujo de las subrutinas que contiene va afectando el valor de las salidas de los controladores y el funcionamiento de las siguientes subrutinas, en función del estado y de las entradas de las subrutinas actuales, ya sean entradas físicas del controlador o entradas anteriores. Estos flujos cambian de dirección según la salida de la subrutina actual, lo que permite activar una u otra subrutina. Es un tipo de lenguaje que proviene del modelo GRAFCET.
- Diagramas de bloques: como su nombre lo indica, utiliza bloques de símbolos lógicos para el funcionamiento del controlador y su interacción con el proceso. Las señales de salida son el resultado de las señales de entrada y la lógica interna del bloque, que puede ser combinatoria, secuencial o una mezcla de ambas, y puede o no estar afectada por parámetros de configuración ajustables en la programación, una interfaz de usuario o la interacción con otros controladores. Estos diagramas son preferidos mayoritariamente por personas acostumbradas a trabajar con circuitos de compuertas lógicas, ya que la simbología utilizada es equivalente. Es ideal para usuarios sin habilidades avanzadas en programación y para procesos de baja complejidad.
Ejemplo de diagrama de bloques funcionales en un entorno de programación de controladores.
En el mundo de la automatización hay muchas maneras de representar los diagramas de bloques, de acuerdo con el fabricante del software de automatización y/o del equipo de control a utilizar. Por lo general, hay bloques básicos que son comúnmente usados. Estos bloques permiten generar operaciones aritmético-lógicas y pueden agruparse dentro de bloques para realizar secuencias de control más complejas. Algunos de estos son:
Bloques aritméticos
Bloques cuyas entradas y salidas son numéricas, ya sea en formato entero o en punto flotante, dependiendo del fabricante del controlador.
- Suma: la señal de salida es la suma aritmética de dos o más señales de entrada.
- Resta: la señal de salida es la resta aritmética de la primera señal de entrada menos una o más de las siguientes señales de entrada.
- Multiplicación: la señal de salida es el resultado de la multiplicación aritmética de dos o más señales de entrada.
- División: la señal de salida es la división aritmética de la primera señal de entrada entre una o más de las siguientes señales de entrada.
- Ganancia o factor: similar a la multiplicación, pero con una sola variable de entrada y un parámetro de configuración generalmente constante. Suele usarse en conjunto con otros bloques para la composición de funciones de transferencia, necesarias para regular las variables de salida de un proceso en función de sus variables de entrada y sus parámetros de regulación.
Bloques lógicos
Bloques cuyas entradas y salidas son lógicas (booleanas). Haciendo analogía con el funcionamiento de un bombillo, un 0 lógico o "false" equivale al bombillo apagado, y un 1 lógico o "true" equivale al bombillo encendido.
- Or: la salida es 1 si alguna de sus entradas es 1. Su complemento, la Nor, invierte la salida con respecto al funcionamiento descrito para la Or.
- And: la salida es 1 solo si todas sus entradas son 1. Su complemento, la Nand, invierte la salida con respecto al funcionamiento descrito para la And.
- Not: de una sola entrada; la salida es 1 si la entrada es 0, y es 0 si la entrada es 1.
- Xor: para dos entradas, la salida es 1 si y solo si una de sus dos entradas es 1. Para más de dos entradas el resultado puede variar según el fabricante, por lo que se debe consultar el manual de bloques funcionales antes de utilizarlo.
- Latch: usado para la lógica set-reset. Tiene una entrada "set" y una entrada "reset". Si set es 1 mientras reset es 0, la salida es 1. Si set es 0 mientras reset es 1, la salida es 0. Si ambas son 0 simultáneamente, la salida no cambia de estado. El comportamiento cuando set y reset son 1 al mismo tiempo debe consultarse en el manual del fabricante y, si es indefinido, debe evitarse ese estado. También debe consultarse el manual para conocer el estado inicial de la salida al encender el controlador.
- Toggle: muy usado para la lógica de encender/apagar con un solo pulsador. La salida cambia de estado (de 0 a 1, o de 1 a 0) solo en la transición de su entrada, dependiendo del fabricante. De lo contrario, se conserva el estado anterior. Al igual que con el Latch, debe consultarse el manual del fabricante para conocer el estado inicial de la salida.
Bloques de temporización
Son similares a los lógicos, pero permiten la conmutación de una salida en función de los parámetros de entrada y de una variable de configuración numérica: el tiempo para el cambio de estado. La siguiente es una descripción genérica; la funcionalidad detallada depende del fabricante.
- Retardo para inicio/conexión: la salida pasa de 0 a 1 un tiempo T después de que su entrada pasa de 0 a 1, si dicha entrada permanece en 1 durante al menos ese tiempo. Si la salida ha alcanzado el estado 1, en cuanto la entrada pase a 0, la salida también será 0.
- Retardo de parada/desconexión: la salida pasa de 1 a 0 un tiempo T después de que su entrada pasa de 1 a 0, si dicha entrada permanece en 0 durante al menos ese tiempo. Si la salida ha alcanzado el estado 0, en cuanto la entrada pase a 1, la salida también será 1.
- Tiempo mínimo encendido: la salida se mantiene en 1 por un tiempo mínimo T después de que la entrada ha pasado de 0 a 1, independientemente de que luego dicha entrada haya pasado de 1 a 0. Si transcurrido ese tiempo la entrada se encuentra en 0, la salida pasa también de 1 a 0.
- Tiempo mínimo apagado: la salida se mantiene en 0 por un tiempo mínimo T después de que la entrada ha pasado de 1 a 0, independientemente de que luego dicha entrada haya pasado de 0 a 1. Si transcurrido ese tiempo la entrada se encuentra en 1, la salida pasa también de 0 a 1.
Representación de bloques de temporización y bloques avanzados en un entorno de automatización.
Otros bloques
Algunos otros bloques son comunes en este tipo de programación:
- Bloque PID: se utiliza para proporcionar un control de lazo proporcional, integral y derivativo (PID). Es útil en la regulación de la dinámica de un proceso. Generalmente tiene las siguientes entradas, parámetros y salidas numéricas:
- Consigna o set-point: valor numérico de entrada que representa el valor deseado de una variable física de un proceso.
- Realimentación: valor numérico de entrada que representa el valor medido de una variable física de un proceso. Este valor es tomado por un instrumento sensor que transforma la variable física del proceso a otro tipo de variable medible por el controlador, proceso conocido como acondicionamiento de señal.
- Salida / output: valor numérico de salida resultado de la ejecución del algoritmo PID. Este valor se envía como salida analógica a un actuador que cambia una variable física del proceso en función de dicho valor, afectando directa o indirectamente la variable que se desea regular.
- Banda proporcional: parámetro o entrada numérica que representa el valor de error necesario para mover la salida de 0 a 100 %. Su efecto es inmediato sobre la salida.
- Tiempo integral: parámetro o entrada numérica que representa el factor del efecto del error (desviación del punto de consigna) a lo largo del tiempo.
- Tiempo derivativo: parámetro o entrada numérica que determina el efecto de la acción derivada en la respuesta del sistema.
- Temporizador (timer): usado para medir el tiempo en que una entrada lógica permanece en 1. Su salida es numérica y representa dicho valor, el cual va cambiando mientras la entrada esté en 1. Un parámetro de configuración de unidad de tiempo (generalmente con opciones de milisegundos, segundos, minutos y horas) determina cada cuánto debe actualizarse dicha salida.
Johautt Hernández Líder de Integración jhernandez@innotica.net LinkedIn
Referencias bibliográficas
- 5 lenguajes de programación para PLC — Seika
- Lenguajes de programación para PLC — IngMecafenix
- Lenguajes de automatización — Autracen
- PLC Logo — Área Tecnología
- Manual de programación del EC-gfxProgram, Distech Controls™.