Calcul du code de contrôle de bloc
Cette fonction calcule le caractère de contrôle de bloc (BCC) utilisé pour détecter les erreurs de transmission d’un message composé d’un nombre d’octets de données ASCII, défini par s3_Number. Le calcul est réalisé à partir de la zone de 16 bits indiquée par s2_Start et selon la méthode de calcul désignée par s1_Control. Le code de contrôle de bloc (BCC) est sauvegardé dans l’octet de poids faible de la zone de 16 bits désignée par d. (BCC est un octet. L’octet de poids fort de d reste inchangé.)
Entrée
Désigne la méthode de calcul du code BCC :
0 : Addition (SYS_BCC_CALCULATION_METHOD_ADD)
1 : Soustraction (SYS_BCC_CALCULATION_METHOD_SUB)
2 : OU exclusif (SYS_BCC_CALCULATION_METHOD_XOR)
16#A : CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
Zone de 16 bits à partir de laquelle le code BCC est calculé
Indique le nombre d’octets nécessaires au calcul du code BCC
Sortie
Zone de 16 bits de sauvegarde du code BCC
Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_CRC, FP_BCC
Paramétrer le code de contrôle s1_Control
0 : Addition (SYS_BCC_CALCULATION_METHOD_ADD)
1 : Soustraction (SYS_BCC_CALCULATION_METHOD_SUB)
2 : OU exclusif (SYS_BCC_CALCULATION_METHOD_XOR)
16#A : CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
0–F
Si CRC-16 est indiqué comme méthode de calcul, le code ASCII ne peut pas être désigné comme données de conversion.
Si le nombre d’octets défini pour le calcul du code est en dehors de la zone de données spécifiée.
Si le nombre d’octets défini pour le calcul du code est en dehors de la zone de données spécifiée.
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
Start: BOOL:=FALSE;
(*activates the function*)
BCC_Calc_Method: INT:=2;
ASCII_String: STRING[32]:='%01#RCSX0000';
(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
BCC: WORD:=0;
(*result after a 0->1 leading
edge from start: 10#172*)
END_VAR
Un calcul du caractère de contrôle de bloc est exécuté sur ASCII_String lorsque Start devient TRUE. La méthode de calcul est OU exclusif. (Utilisez cette méthode lorsque de larges quantités de données sont transmises).
Comment le BCC est calculé à l’aide du OU exclusif :
bvar_1 |
bvar_2 |
bvar_3 |
![]() |
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
Les bits du code ASCII BIN des deux premiers caractères sont comparés l’un à l’autre pour générer le résultat de l’opération OU exclusif à 8 caractères :
Signal pour comparaison |
Code ASCII BIN |
% |
00100101 |
0 |
00110000 |
Résultat OU exclusif |
00010101 |
Ce résultat est ensuite comparé au code ASCII BIN du caractère suivant, soit "1".
Signal pour comparaison |
Code ASCII BIN |
Résultat OU exclusif |
00010101 |
1 |
00110001 |
OU exclusif suivant |
00100100 |
Et ainsi de suite jusqu’au dernier caractère.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 11 ;
NETWORK_BODY
B(B_F,F70_BCC!,Instance,26,1,34,7,,?DEN?Ds1_Control?Ds2_Start?Ds3_Number?AENO?Cd);
B(B_CONTACT,,Start,3,2,5,4,);
B(B_VARIN,,BCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,Instance,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,BCC,34,3,36,5,);
B(B_VARIN,,ASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,Instance,16,8,21,11,,?DIN?C);
L(16,5,16,7);
L(13,5,16,5);
L(13,5,13,10);
L(13,10,16,10);
L(25,5,25,7);
L(25,5,26,5);
L(26,6,26,10);
L(21,10,26,10);
L(5,3,26,3);
L(1,3,3,3);
L(1,0,1,11);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF start then
F70_BCC( s1_Control:= BCC_Calc_Methode,
s2_Start:= Adr_Of_VarOffs( Var:= ASCII_String,
Offs:= 2),
s3_Number:= LEN( ASCII_String),
d=> BCC);
END_IF;