Beispielprogramm R/W CoE
Programmbeschreibung/ Funktion:
Nach Start dieses Programmbeispiels kann durch das Setzen von TRUE der Variablen startRead oder startWrite ein Schreib- oder Lesezugriff auf das CoE Verzeichnis eines bestimmten EtherCAT-Teilnehmers erfolgen.
Hinweise:
- ein EtherCAT-Slave an einem EtherCAT Master mit CoE Verzeichnis ist vorhanden; das Beispielprogramm ist initial für die Verwendung einer Klemme EL3751 konfiguriert;
Aufbau: z.B. IPC/CX + (EK1100) + EL3751 + EL9011 - die AmsNetId des EtherCAT Master ist bekannt (diese ist vor Programmstart in den Code einzutragen und ist i.d.R. unter dem Karteireiter EtherCAT des ETherCAT-Masters zu finden)
- die Adresse des EtherCAT Slave ist ggf. in der Variablendeklaration von userSlaveAddr anzupassen (i.d.R. die Klemme, dessen CoE Verzeichnis angesprochen werden soll, z.B. 1002, 1007, etc.)
- je nachdem welcher EtherCAT Slave verwendet wird, sind entsprechend nIndex für die CoE‑Objekt‑ID sowie nSubIndex für den CoE‑Objekt Sub-Index an den Stellen der Werteübergabe für das Lesen und das Schreiben einzutragen. Die korrekte Datenlänge und Datentyp ist dabei ggf. ebenfalls anzupassen.
- dieses Beispielprogramm führt lediglich Zugriffe auf einen bestimmten Wert durch, der über einen (sub) index eines CoE objektes bestimmt ist. Sollen Zugriffe auf ein komplettes Objekt erfolgen, so sind die entsprechenden Funktionsbausteine FB_EcCoeSdoReadEx und FB_EcCoeSdoWriteEx zu verwenden; siehe ergänzende Dokumentation zur Bibliothek Tc2_EtherCAT unter:
https://infosys.beckhoff.com/
TwinCAT 3 → TE1000 XAE → PLC → Bibliotheken → TwinCAT 3 PLC Lib: Tc2_EtherCAT
→ CoE Interface
Dieses Beispiel schreibt in das CoE Objekt 0x8000 mit dem Sub‑Index 0x16 den Wert 22 und aktiviert damit den Filter 1 mit „IIR Butterw. LP 5th Ord. 1000 Hz“ bzw. liest den internen Temperaturwert der Klemme EL3751 aus dem CoE Objekt 0x9000, Sub‑Index 0x01. Die Programmvariable für das Schreiben hat den Wert bei der Variablendeklaration bereits zugewiesen. Zur Kontrolle kann das Schreiben durch Einsehen des CoE‑Verzeichnisses und das Lesen kann zur Laufzeit durch Betrachtung der Variable für das Lesen (int16Buffer) geprüft werden.
Download: Programmlink
Vorbereitungen zum Starten des Beispielprogramms (tnzip-Datei/TwinCAT 3)
- Nach Klick auf den Download-Button speichern Sie das Zip-Archiv lokal auf ihrer Festplatte und entpacken die *.tnzip-Archivdatei in einem temporären Ordner.
- Wählen Sie die zuvor entpackte .tnzip-Datei (Beispielprogramm) aus.
- Ein weiteres Auswahlfenster öffnet sich: wählen nun Sie das Zielverzeichnis, wo das Projekt gespeichert werden soll.
- Die generelle Vorgehensweise für die Inbetriebnahme der PLC bzw. dem Start des Programms kann u. a. den Klemmen‑Dokumentationen oder der EtherCAT-Systemdokumentation entnommen werden.
Deklaration (ST)
PROGRAM MAIN
VAR
fb_coe_write : FB_EcCoESdoWrite; // Function Block for writing in CoE
fb_coe_read : FB_EcCoESdoRead; // Function Block for reading from CoE
userNetId : T_AmsNetId := 'a.b.c.d.4.1'; // Have to be entered
userSlaveAddr : UINT := 1002; // Have to be entered
startWrite : BOOL := FALSE; // Sign for start writing
startRead : BOOL := FALSE; // Sign for start reading
nState : BYTE := 0; // RW-status
// Example: Read EL3751 PAI Internal Data: Temperature Value
int16Buffer : INT; // Buffer for reading
// Example: Select EL3751 Filter1: 22 = IIR Butterw. LP 5th Ord. 1000 Hz:
uint16Buffer : UINT:=22; // Buffer for writing
bTxPDOState AT%I* : BOOL; // (PDO for synchronization)
END_VAR
Implementierung (ST):
CASE nState OF
0:
IF startWrite THEN
// Prepare CoE-Access: Write value of CoE object/ sub index:
fb_coe_write(bExecute := FALSE);
nState := 1;// Next state for writing
startWrite := FALSE;
END_IF
IF startRead THEN
// Prepare CoE-Access: Read value of CoE object/ sub index:
fb_coe_read(bExecute := FALSE);
nState := 11;// Next state for reading
startRead := FALSE;
END_IF
// ============== COE WRITE ================
1:
// Write entry
fb_coe_write(
sNetId:= userNetId,
nSlaveAddr:= userSlaveAddr,
nSubIndex:= 16#16,
nIndex:= 16#8000,
pSrcBuf:= ADR(uint16Buffer),
cbBufLen:= 2,
bExecute:= TRUE,
tTimeout:= T#1S
);
nState := nState + 1; // Next state
2:
fb_coe_write(); // Execute CoE write until done
IF fb_coe_write.bError THEN
nState := 100; // Error case
ELSE
IF NOT fb_coe_write.bBusy THEN
nState := 0; // Done
END_IF
END_IF
// ============== COE READ =================
11:
// Read entry
fb_coe_read(
sNetId:= userNetId,
nSlaveAddr:= userSlaveAddr,
nSubIndex:= 1,
nIndex:= 16#9000,
pDstBuf:= ADR(int16Buffer),
cbBufLen:= 2,
bExecute:= TRUE,
tTimeout:= T#1S
);
nState := nState + 1; // Next state
12:
fb_coe_read(); // Execute CoE read until done
IF fb_coe_read.bError THEN
nState := 100; // Error case
ELSE
IF NOT fb_coe_read.bBusy THEN
nState := 0; // Done
END_IF
END_IF
100:
; // Error handling..
END_CASE