Controllo di ridondanza ciclico
Questa funzione calcola il CRC16 (Controllo di Ridondanza Ciclico) per tutti i tipi di PLC utilizzando n byte (8 bit) specificati con il parametro NumberOfBytes e l'indirizzo iniziale StartAddress.
Ingresso
Indirizzo iniziale per il calcolo del checksum. Per i PLC che non supportano l'istruzione F70_BCC con il calcolo di CRC16 (FP0, FP5, FP10), l'indirizzo iniziale deve essere nell'area DT o FL.
Il numero di byte (8 bit), ad iniziare da StartAddress, su cui viene eseguito il calcolo di CRC16.
Uscita
Il checksum calcolato, valido unicamente se il flag IsValid è impostato su TRUE.
Flag indicante se il checksum calcolato è valido o meno.
Per i PLC che non supportano l'istruzione F70_BCC con il calcolo di CRC16 (FP0, FP5, FP10), il CRC non è valido:
durante le prime otto scansioni di esecuzione quando viene compilata una tabella interna
se l'area indirizzi della variabile StartAddress non si trova nell'area DT o FL.
Per i PLC che supportano l'istruzione F70_BCC con il calcolo di CRC16, il CRC è sempre valido.
Anziché utilizzare questa istruzione F, si consiglia di utilizzare l'istruzione FP7 corrispondente: FP_CRC Controllo di ridondanza ciclico
A seconda del tipo di PLC, verrà utilizzata una delle due seguenti implementazioni della funzione:
I PLC che supportano l'istruzione F70_BCC con il parametro s1=10 per il calcolo di CRC16 (FP-e, FP-Sigma, FP2, FP2SH, FP10SH) utilizzano F70_BCC direttamente.
Per gli altri PLC (FP0, FP0R, FP3, FP5, FP10) viene richiamato un sottoprogramma che esegue un calcolo di CRC16 esplicito. Per tale sottoprogramma valgono le seguenti restrizioni:
Durante le prime otto scansioni di esecuzione viene compilata una tabella interna. Durante questo tempo il checksum non viene calcolato e l'uscita IsValid rimane FALSE. In seguito, il checksum viene calcolato e l'uscita IsValid viene impostata su TRUE.
StartAddress richiede un indirizzo nell'area DT o FL.
Il numero di passi può aumentare fino a circa 200 se CRC16 è utilizzato come sottoprogramma.
Durante la programmazione, tenete presente che la compilazione della tabella interna e il calcolo del checksum richiedono un certo tempo, specialmente nel caso di grossi volumi di dati.
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
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
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
CRC16(StartAddress := Array1,
NumberOfBytes := ARRAY1_BYTES,
CRC => Array1Crc,
IsValid => CrcIsvalid);