miércoles, 20 de noviembre de 2013

Operaciones digitales

Funciones de comparación



En CoDeSys se realizan las funciones de comparación mediante un acumulador, lo que significa que primero se carga Operando 1 en el acumulador y luego se realiza la operación de comparación con el Operando 2. El resultado de la operación será de tipo BOOL, pero los valores que se comparan pueden ser del tipo BOOL, BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT, UDINT, REAL, LREAL, TIME, DATE, TIME_OF_DAY, DATE_AND_TIME o STRING.
Ejemplo de comparación en CoDeSys:
      Lógica binaria

Al igual que en las funciones de comparación, las de lógica binaria se realizan en CoDeSys mediante un acumulador. Las operaciones de lógica binaria son:
El tipo y formato de dato de los operandos se comprueban en todos los lenguajes de programación. Con una XOR de más de dos entradas, se va realizando la operación por parejas.

Enmascaramiento de dígitos: La función AND se puede utilizar para el enmascaramiento de dígitos, para así desactivar las posiciones deseadas.
Ejemplo:
Origen                  0110 1111 1010 0110                      En este caso se quieren enmascarar los cuatro
Máscara             0000 0000 0000 1111                      bits de la derecha.
Resultado           0000 0000 0000 0110
Complemento: Con la función OR se pueden realizar operaciones de complemento
Ejemplo:
Origen                  0110 1111 1010 0100                      En este caso se quieren poner a “1” los tres
Máscara             0000 0000 0000 0111                      últimos bits de la derecha.
Resultado           0110 1111 1010 0111                     
Reconocimiento de cambios de valor en una posición determinada: Con una XOR se puede comprobar si ha habido algún cambio de valor en alguna posición.
Ejemplo:
Valor anterior   … 1010  0100
Valor actual       … 0010  0110
XOR                       … 1000  0010                     
AND                      … 0000  0010      (Con AND entre el valor actual y resultado de XOR sólo se
reflejan los cambios 0à1)
AND                      … 1000  0000      (Con AND entre valor anterior y resultado de XOR sólo se
reflejan los cambios 1à0)
Funciones de desplazamiento
-          SHL: Desplazamiento hacia la izquierda. Los bits que se quedan libres a la derecha se rellenan con Cero.
-          SHR: Desplazamiento hacia la derecha. Los bits que se quedan libres a la izquierda se rellenan con Cero.
-          ROR: Rotación hacia la derecha.
-          ROL: Rotación hacia la izquierda.
En CoDeSys se desplazan tantos bits como se indique en IN.
 



  Funciones de conversión
Presentan la forma *_TO_**, donde “*” es el tipo de las variables de entrada y “**” el de las de salida. Es importante tener en cuenta que la conversión desde tipos de datos “mayores” a “menores” (como podría ser desde INT a BYTE) puede ocasionar pérdida de datos.
Los tipos de datos elementales a tener en consideración a la hora de realizar conversiones son:



 Para la conversión de tipo es posible cualquier combinación entre estos tipos de datos.  

Debido a que la representación en BCD no corresponde a un tipo de dato, no existe una operación de conversión desde o a BCD. Para hacer esto hay que recurrir a funciones de la biblioteca. 
Conversión desde y a BOOL: La conversión desde BOOL a un tipo de dato numérico tiene como resultado un 1 cuando el operando es TRUE, y un 0 cuando es FALSE. Al convertir a STRING el resultado será “TRUE” o “FALSE” respectivamente.
La conversión a BOOL da como resultado TRUE cuando el dato de origen es distinto de 0, y FALSE cuando es 0. Al convertir desde STRING será el resultado TRUE cuando el operando es “TRUE”, y en caso contrario será FALSE.
Conversión entre datos de tipo entero: A este tipo de datos pertenecen BYTE, WORD, DWORD, SINT, USINT, INT, UINT, DINT y UDINT. Al convertir desde tipos de datos mayores a menores se pueden perder parte de los datos, y cuando el valor a convertir supera el límite no se tendrá en cuenta los bits más elevados.
Conversión de números reales: Al convertir REAL o LREAL a un entero se redondea hacia arriba o abajo.
Conversión desde TIME o TIME_OF_DAY: Debido a que el tiempo se almacena internamente como DWORD en ms, se convierte este valor. Al convertir desde tipos mayores a menores se pueden perder datos. Al convertir a STRING se obtiene como resultado una cadena de caracteres (del tipo ‘T#12ms’).
Conversión desde DATE y DATE_AND_TIME: Internamente se almacena como DWORD en segundos desde el 1 de enero de 1970, y este es el dato que se convierte. Al convertir desde tipos mayores a menores se pueden perder datos. Al convertir a STRING se obtiene como resultado una cadena de caracteres (del tipo ‘DT#1998-02-13-14:25’).
Conversión desde STRING: El operando de tipo STRING tiene que tener un equivalente en el tipo de dato de destino, o el resultado será 0. Ejemplo:
VAR1 := STRING_TO_BOOL (‘TRUE’); //El resultado es VAR1 := TRUE
VAR2 :=  STRING_TO_WORD (‘abc125’) //El resultado es VAR2 := 0
TRUNC: Con la operación TRUNC sólo se emplea la parte entera de un número real. Ejemplo:
VAR1 := TRUNC (1.9); // VAR1 := 1



 

martes, 12 de noviembre de 2013

Funciones de gestión del programa



Este tipo de funciones son necesarias cuando no se quiere un funcionamiento secuencial del programa. Esto se consigue mediante saltos, bucles u llamadas a bloques.
En el IEC 61131-3 se contemplan los siguientes operadores en IL:
Operador
Modificador
Operando
Significado
JMP
C,N
MARCA
Salto a marca
CAL
C, N
NOMBRE
Llamada a bloque funcional
RET
C,N

Retorno desde bloque funcional
En este caso el modificador “N” indica la negación booleana del operando. El modificador “C” indica que sólo se realiza la acción cuando el resultado es un 1 booleano (o un 0 si lleva el modificador N).
Cualquiera de estas funciones se pueden realizar de forma condicionada o incondicionada
Funciones de gestión en CoDeSys:
Saltos condicionados e incondicionados:
En IL
Orden
Significado
JMP
M001
//Salto incondicionado a la marca M001
LD
JMPC
VAR1
M002
//El salto a la marca M002 sólo se realiza si la variable VAR1 //tiene el valor TRUE
LD
JMPCN
VAR2
M003
/El salto a la marca M003 sólo se realiza si la variable VAR2 //tiene el valor FALSE
En SFC

Llamadas a bloques funcionales o funciones
Al llamar a una función se deben proveer los parámetros de entradas con los operandos correspondientes. El resultado de la función se transferirá con ST a un operando.
En IL
Orden
Significado
RET
//Finalización incondicionada del bloque
LD
RETC
VAR1
//El bloque se finaliza si la variable VAR1
//es igual a TRUE
LD
RETCN
VAR2
//El bloque se finaliza si la variable VAR2
//es igual a FALSE
En SFC

Mecanismo EN/ENO
Las funciones y bloques funcionales en CoDeSys pueden tener una entrada EN (enable), o salida ENO (enable output) en los lenguajes de programación LADDER y CFC. Dependiendo de si en éstos se lee un “1” o un “0”, se habilitará o no que se lleve a cabo la función o que se vuelque el resultado respectivamente. Estos mecanismos se pueden condicionar.