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:
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).
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
// =================================================