Calcul du caractère de contrôle de bloc
Cette instruction FP calcule le caractère de contrôle de blocs de données (BCC) selon la méthode de calcul spécifiée par s1_Control. Les données sont spécifiées par l’adresse de départ s2_Start et le nombre d’octets n_Bytes. Le BCC est sauvegardé dans la zone de 16 bits spécifiée par d.
Entrée
Méthode de calcul
Adresse de départ
Nombre d’octets
Sortie
Caractère de contrôle de bloc
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)
16#0–16#F
0 : Données binaires (1 octet)
1 : Données ASCII (2 octets)
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
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
bStart: BOOL:=FALSE;
(*activates the function*)
iBCC_Calc_Method: INT:=2;
sASCII_String: STRING[32]:='%01#RCSX0000';
(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
wBCC: WORD:=0;
(*result after a 0->1 leading
edge from start: 10#172*)
END_VAR
Lorsque bStart devient TRUE, un calcul du caractère de contrôle de bloc est exécuté sur sASCII_String. La méthode de calcul est OU exclusif. (Utilisez cette méthode lorsque de larges quantités de données sont transmises).
OU exclusif :
bvar_1 |
bvar_2 |
bvar_3 |
![]() |
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
Les codes binaires 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. Ce résultat est ensuite comparé au code binaire du caractère suivant et ainsi de suite jusqu’au dernier caractère. Le dernier résultat OU exclusif est le caractère de contrôle des blocs de données.
Calcul BCC avec OU exclusif :
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_CONTACT,,bStart,3,2,5,4,);
B(B_VARIN,,iBCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,wBCC,33,3,35,5,);
B(B_VARIN,,sASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,,16,8,21,11,,?DIN?C);
B(B_F,FP_BCC!,,26,1,33,7,,?DEN?Ds1_Control?Ds2_Start?Dn_Bytes?AENO?Cd);
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
Dans cet exemple, Adr_Of_VarOffs_I est utilisée pour créer un offset de 2 mots pour compenser l’en-tête de la chaîne de caractères. Avec LEN, le calcul BCC est exécuté sur l’intégralité de la chaîne de caractères.
IF bStart then
FP_BCC(s1_Control := iBCC_Calc_Method,
s2_Start := Adr_Of_VarOffs( Var:= sASCII_String, Offs:= 2),
n_Bytes := LEN( sASCII_String),
d => wBCC);
END_IF;