CRC16

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.

Parameter

Eingang

StartAddress (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

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.

NumberOfBytes (INT)

Anzahl der Bytes (8 Bit) über die die Prüfsumme CRC16 beginnend von StartAddress berechnet wird.

Ausgang

CRC (WORD, INT, UINT)

Die berechnete Prüfsumme, die jedoch nur dann gültig ist, wenn der Merker IsValid auf TRUE gesetzt ist.

IsValid (BOOL)

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.

Anmerkungen

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.

Anmerkung
  • 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.

Beispiel

POE-Kopf

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

KOP-Rumpf

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

ST-Rumpf

CRC16(StartAddress := Array1, 
        NumberOfBytes := ARRAY1_BYTES, 
        CRC => Array1Crc, 
        IsValid => CrcIsvalid);

Letzte Änderung am: 2021-07-26Feedback zu dieser SeitePanasonic Hotline