Chequeo Redundancia Cíclica
Calcula el CRC16 (Cyclic Redundancy Check) para todos los tipos de PLC, de n bytes (8 bits) especificados por los parámetros NumberOfBytes (número de bytes) y StartAddress (posición inicial).
Entrada
Dirección inicial para el cálculo de la comprobación. Para los PLCs que no soportan la instrucción F70_BCC con cálculo de CRC16 (FP0, FP5, FP10), se debe definir un DT o un FL como área de inicio.
Número de bytes (8 bits), a partir de StartAddress, sobre los que se va a aplicar el CRC16.
Salida
Resultado del cálculo CRC, que solamente es válido si la bandera IsValid está a TRUE.
La bandera que indica si el CRC es válido o no.
Para los PLCs que no soportan la instrucción F70_BCC con cálculo CRC16 (FP0, FP5, FP10) el CRC no es válido:
durante los 8 primeros ciclos de scan cuando se están construyendo la tabla interna
si la dirección definida de la variable StartAddress no es un DT o un FL.
Para los PLCs que soportan la instrucción F70_BCC con cálculo CRC16, el CRC siempre es válido.
En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente: FP_CRC
Dependiendo del tipo de PLC, se implementa de forma diferente:
En aquellos PLCs que soportan la instrucción F70_BCC con el parámetro s1=10, se utiliza directamente F70_BCC para calcular el CRC16 (FP-e, FP-Sigma, FP2, FP2SH, FP10SH).
Para el resto de PLCs (FP0, FP0R, FP3, FP5, FP10), se llama a una subrutina que hace el cálculo explícito del CRC16. A la subrutina se aplican las siguientes restricciones:
Durante los 8 primeros ciclos de scan se construye una tabla interna. En estos primeros ciclos no se realiza la comprobación, y la salida IsValid permanece a FALSE. Después, se empieza a calcular la comprobación, y la salida IsValid pasa a TRUE.
StartAddress es una dirección en las áreas de memoria DT o FL.
El número de pasos se puede incrementar en 200 aprox. si se utiliza CRC16 como una subrutina.
A la hora de programar, tener en cuenta que cuando se maneja un gran volumen de datos, construir la tabla internamente y realizar la comprobación puede consumir mucho tiempo.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
VAR
Array1: ARRAY [0..10] OF INT:=[0,1,2,3,4,5,6,7,8,9,10];
ARRAY1_BYTES: INT:=22;
Array1Crc: WORD:=0;
CrcIsvalid: BOOL:=FALSE;
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_F,CRC16!,Instance,10,0,21,4,,?DStartAddress?DNumberOfBytes?CCRC?CIsValid);
B(B_VARIN,,Array1,8,1,10,3,);
B(B_VARIN,,ARRAY1_BYTES,8,2,10,4,);
B(B_VAROUT,,Array1Crc,21,1,23,3,);
B(B_VAROUT,,CrcIsvalid,21,2,23,4,);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
CRC16(StartAddress := Array1,
NumberOfBytes := ARRAY1_BYTES,
CRC => Array1Crc,
IsValid => CrcIsvalid);