CRC16

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).

Parámetros

Entrada

StartAddress (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

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.

NumberOfBytes (INT)

Número de bytes (8 bits), a partir de StartAddress, sobre los que se va a aplicar el CRC16.

Salida

CRC (WORD, INT, UINT)

Resultado del cálculo CRC, que solamente es válido si la bandera IsValid está a TRUE.

IsValid (BOOL)

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.

Observaciones

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.

NOTA
  • 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.

Ejemplo

Cabecera de la POU

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

Cuerpo LD

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

Cuerpo en ST

CRC16(StartAddress := Array1, 
        NumberOfBytes := ARRAY1_BYTES, 
        CRC => Array1Crc, 
        IsValid => CrcIsvalid);

Modificado el: 2021-07-14Comentarios sobre esta páginaLínea directa de Panasonic