CRC16

Contrôle de redondance cyclique

Cette fonction calcule le CRC16 (Cyclic Redundancy Check) pour tous les types d’API en utilisant n octets (8 bits) spécifiés à l’aide du paramètre NumberOfBytes et de l’adresse de départ StartAddress.

Paramètres

Entrée

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

Adresse de départ à partir de laquelle la somme de contrôle est calculée. Pour les automates qui ne prennent pas en charge l’instruction F70_BCC pour le calcul du CRC16 (FP0, FP5, FP10), l’adresse de départ doit être dans la zone DT ou FL.

NumberOfBytes (INT)

Le calcul du CRC16 est effectué en fonction du nombre d’octets (8 bits), en commençant par StartAddress.

Sortie

CRC (WORD, INT, UINT)

La somme de contrôle calculée qui est valide uniquement lorsque le drapeau IsValid est défini sur TRUE.

IsValid (BOOL)

Le drapeau indique si la somme de contrôle est valide ou non.

Pour les automates qui ne prennent pas en charge l’instruction F70_BCC pour le calcul du CRC16 (FP0, FP5, FP10), CRC n’est pas valide :

  • Pendant les huit premières scrutations au cours desquelles un tableau interne est créé

  • Si la zone d’adresses de la variable StartAddress n’est pas dans les zones DT ou FL.

Pour les automates qui prennent en charge l’instruction F70_BCC pour le calcul du CRC16, le CRC est toujours valide.

Remarques

Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_CRC

Suivant le type d’API, utilisez une des deux implémentations de la fonction suivantes :

  • Les automates qui prennent en charge l’instruction F70_BCC avec le paramètre s1=10 pour calculer le CRC16 (FP-e, FP-Sigma, FP2, FP2SH, FP10SH) utilisent F70_BCC directement.

  • Pour les autres automates (FP0, FP0R, FP3, FP5, FP10), un sous-programme permettant de faire un calcul explicite du CRC16 est appelé. Les restrictions suivantes s’appliquent à ce sous-programme :

    • Pendant les huit premières scrutations, un tableau interne est créé. Pendant ce temps, aucune somme de contrôle n’est calculée, et la sortie IsValid reste sur FALSE. Ensuite, la somme de contrôle est calculée, et la sortie IsValid passe à TRUE.

    • StartAddress requiert une adresse dans les zones DT ou FL.

NOTA
  • Le nombre d’étapes peut augmenter jusqu’à environ 200 lorsque le CRC16 est utilisé en tant que sous-programme.

  • En programmant, tenez bien compte du fait qu’un certain temps est nécessaire pour créer un tableau interne et pour calculer la somme de contrôle, en particulier lorsqu’il s’agit d’un large volume de données.

Exemple

En-tête du POU

Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.

	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

Corps en 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

Corps en ST

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

Modifié le : 2021-08-09Commentaires sur cette pageAssistance téléphonique