Descripción del lenguaje

Top  Previous  Next

        Cada una de las instrucciones cumple una simple y rudimentaria función. La mayoría consta de 1 o 2 argumentos y la operación se hace contra el acumulador en la mayoría de los casos. Los argumentos de cada instrucción no son otra cosa que variables o números. Por ejemplo suma: ADD arg. La instrucción ADD sumará el valor del argumento arg al acumulador. El resultado queda en el acumulador.

        La ejecución del programa es circular, por lo que muchas instrucciones se ejecutarán siempre. Para controlar esto se usan saltos e instrucciones condicionales. Por ejemplo, MOVE y CMOV hacen lo mismo (copiar un dato origen → destino), solo que MOVE lo hará incondicionalmente y CMOV solo si el bit 0 del acumulador está en 1.

        Aunque parece ensamblador, no lo es; tiene características de alto nivel. Por ejemplo, es válido escribir MOVE v0, v1 y MOVE 1, v1. La primera copia el valor de v0 en v1, y la segunda asigna el valor 1 a v1. De la misma forma se puede sumar una constante a una variable (ADD v0, v0, 1) o sumar variables (ADD v0, v0, v1). También combina distintos tipos (enteros y largos) en forma transparente, y en caso de posibilidad de pérdida de información (cuando se pasa de largo a entero) emite una advertencia. Solo las de tipo real son menos combinables.

        La dependencia del acumulador es vital para traducir o interpretar el programa en un diagrama de contactos (Ladder, o escalera). En este caso el 'cable' es el acumulador

        Si en el programa usa instrucciones que el PLC no tiene, simplemente recibirá un mensaje de error al momento de compilar. Esta es una forma simple de determinar si la instrucción se puede usar. Es posible "crear" instrucciones (o macros) con la directiva #define.

        Las instrucciones condicionales no usan el acumulador como parte de sus datos, sino como un permiso de ejecución (como la línea de cableado del Ladder). Es necesario consultar cada una en particular, ya que depende de la cantidad de argumentos y la versión de PLC.

  

Ejemplo:

  

Supongamos que en una máquina cuando la puerta está abierta y el motor está en marcha debe encenderse la luz del tablero que indique que la puerta debe cerrarse. Tenemos un sensor NA para la puerta y otro de movimiento para el motor.

  

desc_leng.png

  

  LDN Puerta    ;leemos (invertido -NOT) el

                ;estado del sensor de puerta

  AND MotorM    ;"Y si está el motor en marcha".

                ;Si la puerta está abierta(Puerta =

                ;0) y el motor está en marcha

  ST Luz        ;enciende la luz.

 

Al leer en forma invertida resulta como si el sensor de puerta cerrada fuese NC. Cuando esta está cerrada el acumulador ACC tendrá valor 0 (puerta cerrada = 1, NOT(Puerta) = 0).

        Al hace AND con 0 (0 AND cualquier_cosa = 0) la salida Luz permanecerá desactivada, y por lo tanto la luz del tablero apagada. Ahora si la puerta está abierta (LDN Puerta = 1) y el motor parado (MotorM = 0) sucede lo mismo que el caso anterior (0 AND cualquier_cosa = 0).

        Solo cuando la puerta está abierta (LDN Puerta = 1, si está abierta) y el motor está en marcha (MotorM = 1) la salida que enciende la luz se activará.

 

 

        A partir del CP121 BIOS 1.02 se ha incorporado aritmética de 32bit y punto flotante (real). Por esto es necesario observar el tipo de dato que se está manipulando para no mezclarlos. El tipo de dato depende de como se halla declarado la variable. Para el caso de las constantes se asumirán como 32bit cuando superen los límites de -32768 y 32767. Para real (punto flotante) cuando superan -2147483648 y 2147483647. También se puede escribir como en C: por ejemplo, 1 en real se escribiría 1.0

   

        En el siguiente ejemplo se alterna el estado de un par de salidas, dependiendo de que si el valor de una entrada analógica es mayor o igual a 3500, o igual o menor a 3000.

  

   ;Histéresis - superior

   LD ai0       ;Lee 1º entrada analógica

    GE 3500      ;Compara lectura con el valor 3500

   S q0.0       ;Si la comparación es verdadera,

   R q0.1       ;conecta 1ª salida y desconecta 2ª

   ;Histéresis - inferior

   LD ai0       ;Lee 1º entrada analógica

   LE 3000      ;Compara lectura con el valor 3000

   S q0.1       ;Si la comparación es verdadera,

   R q0.0       ;conecta 2ª salida y desconecta 1ª

   

   END          ;Finaliza para volver a empezar

  

   

       No todas las instrucciones o sus variantes están en todos los PLCs. Se debe pedir el listado (Alt + F1) para inspeccionar las instrucciones disponibles para la versión de BIOS seleccionada.

   

Saltos

   

        Para la sintaxis consultar instrucciones de salto JMP, JMPC, JMPNC, CAL, CALC y CALNC. La combinación de teclas Ctrl + J muestra las etiquetas de destinos de salto detectados. Las terminadas en C (bit 0 del acumulador en 1) y NC (bit 0 del acumulador en 0) tienen esa condición para ejecutarse.

  

Orden de ejecución

  

Con instrucciones el orden es tal como se ve (primero la primera, luego la siguiente, y así hasta llegar a un END). Pero en Ladder es distinto. No hay una regla que se aprecie a simple vista. Pero una cosa es segura: no pasará al siguiente hasta que se resuelva "todo lo conectado".

  

ladder_order.png

  

Cada contacto está numerado con su orden de ejecución. Lo que se nota es que se resuelve progresivamente haciendo un conjunto mas grande. Por ejemplo: 1, 2 y 3 deben estar resueltos antes de incoprporar 4.

Pero con las salidas es distinto. El orden es el que se ve. Entonces, si B fuese un END, C jamás sería ejecutado. O si A requiriera que esté definido B, entonces habría que intercambiarlos para que B se ejecute primero.

  

 

Tips de programación

Descripción del editor.

Lista instrucciones

Ejemplo en Ladder

 

Índice