Zyklische Blockprüfung
Diese Funktion berechnet für alle SPS-Typen die zyklische Blockprüfung CRC16 (Cyclic Redundancy Check) über eine Anzahl von n Bytes (8 Bit), die mit dem Parameter NumberOfBytes und der Anfangsadresse StartAddress spezifiziert werden kann.
Eingang
Beliebige Variable für die Anfangsadresse, ab der die Prüfsumme berechnet wird. Bei SPSen die den Befehl F70_BCC mit möglicher CRC16-Berechnung nicht unterstützen (FP0, FP5, FP10) muss sie im DT- oder FL-Bereich liegen.
Anzahl der Bytes (8 Bit) über die die Prüfsumme CRC16 beginnend von StartAddress berechnet wird.
Ausgang
Die berechnete Prüfsumme, die jedoch nur dann gültig ist, wenn der Merker IsValid auf TRUE gesetzt ist.
Merker, der angibt, ob die berechnete Prüfsumme gültig ist.
Bei SPSen, die den Befehl F70_BCC mit möglicher CRC16-Berechnung nicht unterstützen (FP0, FP5, FP10), ist die CRC-Berechnung nicht gültig:
während der ersten acht Zyklen, in welchen eine interne Tabelle aufgebaut wird
wenn der Adressbereich der Variablen StartAddress nicht im DT- oder FL-Bereich liegt.
Für SPSen, die den Befehl F70_BCC mit CRC16-Berechnung unterstützen, ist die berechnete CRC immer gültig.
Wir empfehlen, anstelle von diesem F-Befehl den entsprechenden FP7-Befehl zu verwenden: FP_CRC
Je nach SPS-Typ wird eine der beiden folgenden Implementierungen der Funktion verwendet:
Auf SPSen, die den Befehl F70_BCC mit dem Parameter s1=10 zur CRC16-Berechnung unterstützen (FP-e, FP-Sigma, FP2, FP2SH, FP10SH), wird direkt der Befehl F70_BCC verwendet
Auf allen anderen SPSen ((FP0, FP0R, FP3, FP5, FP10) wird ein spezielles Unterprogramm aufgerufen, in dem die CRC16-Berechnung explizit ausprogrammiert wurde. Hier gelten folgende Beschränkungen:
Während der ersten acht Ausführungszyklen, in welchen eine interne Tabelle aufgebaut wird. Während dieser Zeit wird keine Prüfsumme berechnet, der Ausgang IsValid bleibt FALSE. Erst danach wird die Prüfsumme korrekt berechnet und der Ausgang IsValid wird auf TRUE gesetzt
StartAddress erfordert eine Adresse in den Bereichen DT oder FL.
Die Anzahl der Schritte kann auf 200 ansteigen, wenn CRC16 als Unterprogramm verwendet wird.
Generell muss der Zeitaufwand für den Aufbau der internen Tabelle und anschließend für die Berechnung der Prüfsumme insbesondere für größere Datenmengen sehr bewusst eingeplant werden.
Im POE-Kopf werden alle Ein- und Ausgangsvariablen deklariert, die für die Programmierung dieser Funktion verwendet werden. Für alle Programmiersprachen wird der gleiche POE-Kopf verwendet.
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);