Beispielprogramm 13 (R/W Signatur der Kalibrierung)

Die Klemme verfügt über einen weiterentwickelten Abgleichmechanismus um u.a. eine individuelle Signatur mit 256 Bytes abzulegen, die aus den Abgleichdaten resultiert. Kundenseitig könnte so eine Kalibrierung mit einer solchen spezifischen Signatur versehen werden, um z.B. eine unbefugte innerbetriebliche Manipulation der Abgleichdaten festzustellen; siehe hierzu auch Kapitel „Kalibrierung/Justage/Abgleich (Hersteller und Anwender)“.

Der im Folgenden beschriebene Funktionsblock kann für eine Umsetzung in TwinCAT auf einer SPS als Basis verwendet werden. Vereinfachend wurde in diesem Beispiel lediglich ein CRC16 verwendet um eine „Signatur“ auf zwei Byte begrenzt zu bedienen. An einer kommentierten Stelle der FB-Implementierung kann ein anderer Signatur‑Algorithmus implementiert werden, der bis zu 256 Byte umfasst.

Der Beispiel-Funktionsblock steht in dem zum Download erhältlichen TwinCAT 3‑Archiv zusammen mit einer Visualisierung zur Verfügung:

downloadlink

Erläuterungen zur Visu „Kalibrierungs_Signatur_RW“

Die Eingangsvariablen der ADS-Adresse und des „InputToggle“ müssen erneut verknüpft werden, falls eine andere Klemme oder Box (als ELM3602) für das Beispiel verwendet wird. Diese ist nach dem Starten des Beispielprogramms in das Feld einzutragen. Alternativ kann sie auch vor dem Start als Initialisierung der Eingangsvariablen „sTerminalTypeIn“ des Funktionsblocks „FB_VisuUpdate“ eingetragen werden:

sTerminalTypeIn      : T_MaxString := 'ELM3602';

Nach dem Programmstart

Von der Visu wird der Funktionsblock „FB_CalibrationSignature“ dann (lesend) aufgerufen, wenn Kanal +/- oder Interface +/- oder „Lese“ betätigt wird und nur dann Schreibend, wenn „Schreibe“ betätigt wird. Falls nach dem Lesen die berechnete und die ausgelesene Signatur übereinstimmen, wird bCmpResult = TRUE (keine Ungleichheit). Nach einem Schreibvorgang bleibt der Eintrag in dem gelesenen CoE erhalten und kann mit dem Lesen überprüft werden (Ein Schreibzugriff verändert den Zustand von bCmpResult nicht).

Beispielprogramm 13 (R/W Signatur der Kalibrierung) 1:
Visu zur Beispiel-Implementierung: Kalibrierungs­-Signatur

Die Variable bError (Visualisierungs-Darstellung: „R/W Fehler“) gibt Auskunft über einen allgemeinen aufgetretenen Fehler beim Zugriff auf die Klemme sowie das nicht-Auffinden einer gespeicherten Information der Klemme (entweder fehlt der Eintrag in den GVL oder die Klemme ist nicht vorhanden).

Erläuterungen zum FB_CalibrationSignature

Das Interface des Funktionsblocks ist wie folgt aufgebaut:

VAR_INPUT
   bInitialize                : BOOL := FALSE; // Ist Initialisiert
   bEnable                    : BOOL := FALSE; // Aktiviere Baustein
   tAmsNetIdArr               : AMSADDR;       // Ads-Adresse der Klemme/ Box
   nIfSlectCoE                : WORD;          // Interface Nummer für das CoE
   nChSelectCoE               : WORD := 1;     // Kanalnummer
   eOption                    : E_CALSIG_OPTIONS; // Zugriff get/set (lese/schreibe)
   stCoEPAIInfoDataCalCnt     : ST_CoE;        // Kal.-Zähler Objekt (EL3751/ ELM3xxx)
END_VAR
VAR_OUTPUT
   bDone                      : BOOL; // Prozedur abgeschlossen
   bCmpResult                 : BOOL; // Signatur-Vergleich: TRUE = Gleich
   nInterfaceUserCalCnt       : WORD; // Wert des Kalibirungszählers
   bError                     : BOOL; // Fehlerfall
   bCancel                    : BOOL; // Abbruch (Fehlerfall)
   nErrorId                   : UDINT;// Fehlernummer (alle Quellen)
   anSigDataOutCoE            : ARRAY[0..(GVL_CoE.nSigLen-1)] OF BYTE; // Signatur gespeichert
   anSigDataOutCalc           : ARRAY[0..(GVL_CoE.nSigLen-1)] OF BYTE; // Signatur berechnet
END_VAR

Zur Initialisierung ist der Variablen „tAmsNetIdArr“ der Instanz des FB die „Net‑Id“ und „Port‑Nr.“ zu übergeben. Zusätzlich ist das CoE Objekt für das Auslesen des Kalibrierzählers per 'stCoEPAIInfoDataCalCnt' zu übergeben, da dieses bei den EL3751/ ELM3xxx Klemmen unterschiedlich ist.

Ein Aufruf erfolgt mit „bEnable := TRUE“ zum Aktivieren und mit Angabe des (für die anzusprechende Klemme gültigen) Interface-Nummer (nIfSlectCoE), des Kanals (nChSelectCoE) sowie für das Lesen der gespeicherten Signatur „eOption := E_CALSIG_OPTIONS.get“ oder zum Schreiben „eOption := E_CALSIG_OPTIONS.set“.

Dannach wird der Funktionsbaustein so lange aufgerufen, bis die Ausgangsvariable „bDone“ = TRUE ist.

Entsprechend der gewählten Option und den berechneten/ gespeicherten Daten der Klemme werden die Ausgänge anSigDataOutCalc, anSigDataOutCoE, nInterfaceUserCalCnt und bCmpResult die entsprechenden Inhalte liefern.

Zum Versuch einen aufgetretenen Fehler im Falle von „bError“ = TRUE zu löschen kann der FB mit „bInit := FALSE“ aufgerufen werden (z.B., wenn die Kanalnummer oder die Interface-Nummer gemäß der angesprochenen Klemme korrigiert wurden. Die „nErrorId“ kann zur Auswertung verwendet werden.

In dem Funktionsblock kann die Signaturberechnung an der folgenden Stelle geändert/ erweitert werden:

// Berechne Signatur
// ============== Anwender Code hier ==============
// Beispiel: einfache CRC:
nCrc := nIfSlectCoE + nChSelectCoE; // Voreinstellung des Startwertes
nCrc := F_DATA_TO_CRC16_CCITT(ADR(aData), nDataLen, nCrc); // Berechne "Signatur"
memset(ADR(anSigDataOutCalc), 16#FF, GVL_CoE.nSigLen);
memcpy(ADR(anSigDataOutCalc), ADR(nCrc), 2); // <- Abhängig von Verschlüsselungsart
// =================================================