Beispielprogramm 14 (Auslesen der BIC aus dem CoE)
Der Beckhoff Identification Code (BIC) dient der eindeutigen optischen und elektronischen Identifizierung von Beckhoff Produkten und wird ab dem Jahr 2020 kontinuierlich in die laufende Geräte Produktion eingeführt. Siehe dazu auch die Einführungen in Kapitel „Versionsidentifikation von EtherCAT-Geräten“/ „Beckhoff Identification Code (BIC)“. Der BIC enthält mehrere Komponenten, insbesondere die eindeutige BTN.
Der BIC wird bei allen Beckhoff EtherCAT Geräten auch elektronisch im ESI EEPROM gespeichert und kann vom EtherCAT Master (z.B. TwinCAT) dort ausgelesen werden. In der TC3 EtherCAT lib ist dazu ab 2020 eine Auslesefunktion verfügbar.
Eine Teilmenge dieser EtherCAT Geräte sind sog. „intelligente slaves“ mit einem lokalen Microcontroller, der zur Parametrierung ein sog. CoE-Verzeichnis anbietet. Die BIC kann von der Firmware dort im Index 0x10E2 zur Auslesung abgebildet werden. Im Zuge der kontinuierlichen Produktpflege wird diese Funktion nach und nach in den EtherCAT Geräten eingeführt.
Der hier beschriebene Funktionsblock liest beispielhaft alle Einträge aus dem CoE Objekt 0x10E2 und kopiert diese in ein dafür vorgesehenes Strukturvariablen-Feld „patManFactSpecIdCode“. Hierfür liest der Funktionsblock im ersten Schritt die Anzahl der hinterlegten BIC-Einträge und im zweiten Schritt die einzelnen Datensätze ein.
Hinweis zu modularen Geräten: sind in einem EtherCAT-Gerät mehrere zu identifizierende Untergeräte mit sog. Sub-BICs verbaut, trägt 0x10E2:1 den BIC des Hauptgerätes, in den folgenden Indizes stehen die BIC der Untergeräte.
Funktionsblock FB_GET_BIC
Dieser Funktionsblock ist für eine PLC-Umgebung eines TwinCAT 3 Projektes vorgesehen; d.h. es muss zunächst ein Projekt vorhanden sein oder erstellt werden. Siehe weitere Erläuterungen zu Beginn des Kapitels „Beispielprogramme“/ „Vorbereitungen zum Starten des Beispielprogramms (tpzip - Datei/ TwinCAT 3)“.
Die Deklarationen des Funktionsblocks lauten wie folgt:
Eingänge:
userNetId : T_AmsNetId; // NetId of EtherCAT device to be read
userSlaveAddr : UINT; // Address of EtherCAT device to be read
bExecute : BOOL; // Execute fb by rising edge
Ausgänge:
bDone : BOOL; // TRUE = FB Execution done
nNumOfSubIndizies : BYTE; // Number of read BICs via Sub-Ids
// Array with struct of BIC entries:
patManFactSpecIdCode :
ARRAY[0..nMAXINDEXSUBINDIZES] OF POINTER TO T_MAN_FACT_SPEC_ID_CODE; // BICs data
bError : BOOL;
Die Ausführung des Funktionsblocks erfolgt mit einer steigenden Flanke auf den Eingang „bExecute“. Zu übergeben ist die EtherCAT-Adresse „userSlaveAddr“ der Klemme sowie die „userNetId“. Mittels „bDone“ wird die erfolgte Ausführung angegeben (TRUE = erfolgreich ausgeführt). In der unten angegebenen zu definierenden Struktur für den FB sind die Einträge aus dem CoE Objekt 0x10E2 nach erfolgreicher Ausführung in dem Pointer-Feld „patManFactSpecIdCode“ vorhanden. Die Anzahl eingelesener Einträge ist in „nNumOfSubIndizies“ angegeben. Folgende Abbildung zeigt eine gefüllte Struktur mit Testdaten:
Der für FB_GET_BIC benötigte Datentyp lautet:
TYPE T_MAN_FACT_SPEC_ID_CODE:
STRUCT
Article_number :STRING(FB_GET_BIC.aLengthOfDataEntry[0]);
BTN :STRING(FB_GET_BIC.aLengthOfDataEntry[1]);
Article_description :STRING(FB_GET_BIC.aLengthOfDataEntry[2]);
Quantity :STRING(FB_GET_BIC.aLengthOfDataEntry[3]);
Batch_number :STRING(FB_GET_BIC.aLengthOfDataEntry[4]);
ID_serial_number :STRING(FB_GET_BIC.aLengthOfDataEntry[5]);
Variant_number :STRING(FB_GET_BIC.aLengthOfDataEntry[6]);
END_STRUCT
END_TYPE
Mit den hinterlegten Datenlängenangaben in FB_GET_BIC:
aLengthOfDataEntry : ARRAY[0..nNumOfDataIds] OF BYTE := [8, 12, 32, 6, 14, 12, 32];
Der Funktionsblock steht als .tpzip – Datei in dem folgenden Download (als .zip) zur Verfügung und enthält zudem auch die erforderlichen bibliotheks-Referenzen (Tc2_EtherCAT, Tc3_DynamicMemory), die erforderliche Datenstruktur sowie ein Aufruf in MAIN:
PLC_GET_BIC