Calcolo del codice di controllo (BCC)
Calcola il codice di controllo (BCC), utilizzato per rilevare gli errori nella trasmissione dei messaggi, di s3_Number byte di dati ASCII a partire dall'area a 16 bit specificata da s2_Start in base al metodo di calcolo specificato da s1_Control. Il codice di controllo (BCC) viene memorizzato nel byte basso dell'area a 16 bit specificata da d. (Il BCC è un byte. Il byte alto di d non cambia.)
Ingresso
Specifica il metodo di calcolo del BCC:
0: Addizione (SYS_BCC_CALCULATION_METHOD_ADD)
1: Sottrazione (SYS_BCC_CALCULATION_METHOD_SUB)
2: Esclusivo OR (SYS_BCC_CALCULATION_METHOD_XOR)
16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
Area a 16 bit iniziale per il calcolo del BCC
Specifica il numero di byte per il calcolo del BCC
Uscita
area a 16 bit per la memorizzazione del BCC
Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_CRC, FP_BCC
Specificazione del codice di controllo s1_Control
0: Addizione (SYS_BCC_CALCULATION_METHOD_ADD)
1: Sottrazione (SYS_BCC_CALCULATION_METHOD_SUB)
2: Esclusivo OR (SYS_BCC_CALCULATION_METHOD_XOR)
16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)
0–F
Se CRC-16 è specificato come metodo di calcolo, non è possibile specificare il codice ASCII per i dati di conversione.
se il numero dei byte specificati per i dati target eccede il limite dell'area dati specificata.
se il numero dei byte specificati per i dati target eccede il limite dell'area dati specificata.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU.La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
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 codice di controllo (BCC) viene eseguito su ASCII_String quando Start passa a TRUE. Il metodo di calcolo è esclusivo OR. (Utilizzare questo metodo nel caso in cui debbano essere trasmesse grandi quantità di dati).
Modalità di calcolo del BCC con l'operazione esclusiva OR:
bvar_1 |
bvar_2 |
bvar_3 |
![]() |
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
I bit del codice ASCII BIN dei primi due caratteri vengono confrontati tra loro per restituire un risultato dell'operazione esclusiva OR di 8 caratteri:
Segno per il confronto |
Codice ASCII BIN |
% |
00100101 |
0 |
00110000 |
Risultato esclusivo OR |
00010101 |
Questo risultato viene quindi confrontato con il codice ASCII BIN del carattere successivo, ossia "1".
Segno per il confronto |
Codice ASCII BIN |
Risultato esclusivo OR |
00010101 |
1 |
00110001 |
OR esclusivo successivo |
00100100 |
E così via fino a raggiungere il carattere finale.
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;