Beispiel - Konfiguration
Beispiel Konfiguration
Anhand eines Programmierbeispiels soll die Funktionalität von FoE verdeutlicht werden. Die folgende Abbildung zeigt den physikalischen Aufbau mit einem embedded PC CX2040 inkl. Netzteil CX2100-0014 und nachfolgend EL2809, EL1004 und EL6695, wobei der Ethernet-Anschluss X001 vom CX-PC mit dem „oberen“ RJ45-Anschluss X1 der bridge-Klemme EL6695 verbunden ist:
Im Systemmanager ist im Weiteren das CoE Objekt 0x1A05 hinzuzufügen, um Empfängerseitig anhand des FoE Info Objektes "Data Bytes Pending" erkennen zu können, ob Daten bzw. eine Datei empfangen wurden. Dazu muss die entsprechende Checkbox in den Prozessdaten aktiviert werden. Gezeigt ist dies in der Abbildung nur für die Sekundärseite, die in diesem Beispiel die Empfängerseite darstellt. Die im TwinCAT Beispielprogramm enthaltene öffentlich zugängliche Variable "ScndFoeBytesToRead" ist mit "Data Bytes Pending" im Weiteren zu verknüpften.
Init – Startup Konfiguration
Entsprechend der Konfigurationsdefinition des Objektes 0xF800 (siehe CoE/Parameterverzeichnis – Profilspezifische Objekte) sind für den Übergang vom Init-State zum PreOp State (I → P) in 0xF800 zwei Werte einzutragen:
- Der Wert 0x4000 in 0xF800:01 (um EoE zu deaktivieren)
- Der Wert 0x0100 in 0xF800:02 (spezieller Modus um auf der EL6695 einen FoE Pufferspeicher zu reservieren)
Im Folgenden ist die Vorgehensweise unter Verwendung der Benutzeroberfläche des Systemmanager (TC3.1) gezeigt; ausgewählter Kartenreiter „Startup“ auf der Primär oder Sekundärseite markierte Klemme oder Box (Terminal oder Box):
Hier ist der Wert 0x4000 (Eintrag: 00 40) für das Objekt 0xF800, Subindex 01 einzutragen, um EoE zu deaktivieren. Dies ist lediglich aufgrund der in diesem Beispiel verwendeten Verbindung von Primär und Sekundärseite der Klemme nötig, da beide Seiten an einem EherCAT-Master angeschlossen sind.
Blockieren des EoE Protokolls unter FoE Das EoE Protokoll ist durch das Setzen von Bit 14 (0x4000) im Objekt 0xF800:01 auf der Klemme zu blockieren, falls die Primärseite und Sekundärseite an einem EtherCAT-Strang angeschlossen ist, da es sonst zu einer Blockierung der Klemme (aufgrund von wiederholten ARP-Ethernet-Requests) kommt. |
Im Weiteren ist der Wert 0x0100 (Eintrag 00 01) für 0xF800:02 einzutragen (Comment = Config 2: Enable FoE Buffer). Ob dies auf Primärseite oder Sekundärseite der Bridge-Klemme EL6695 geschieht ist nicht von Belang, da diese Einstellungen immer auf die jeweils andere Seite mit übernommen werden.
Änderung von Device Config 0xF800 Das Objekt 0xF800 ist auf Primär- oder Sekundärseite konfigurierbar und wird für die jeweils andere Seite stets übernommen. |
Es ist darauf zu achten, dass die richtige Transition ausgewählt ist: P → S muss aus sein, I → P muss aktiviert sein. Nach dem dies erfolgt ist sollte es wie in der nachfolgenden Abbildung gezeigt aussehen:
Erläuterungen zum Programmbeispiel
Dem im Anhang befindlichen Programmbeispiel, dass eine FoE Datenübertragung verdeutlichen soll, liegt das im Folgenden dargestellte Zustandsdiagramm für den Schrieb- und Lesezugriff zugrunde.
Das im Programm definierte bEnabled – Flag ist zur Steuerung des Programms vorgesehen und wird für die Startbedingung bzw. Neustartbedingung verwendet. Dieses Flag kann aufgrund der Zusatzdeklaration AT%I* mit einen „realen“ Eingang einer Eingangsklemme verknüpft werden, um dadurch „von außen“ das Programm z.B. mit einem angeschlossenen Taster (auf +) zu steuern.
- Startbedingung Read: bEnabled muss TRUE sein sein (z.B. extern angeschlossenen Taster betätigen); zusätzlich wird „ScndFoeBytesToRead“ auf eingehende Daten geprüft und muss > 0 sein.
- Neustartbedingung Write: bEnabledmuss wieder FALSE sein (z.B. extern angeschlossenen Taster wieder loslassen).
Das bEnabled–Flag wird zudem innerhalb des Zusandes 1 der „Statemachine“ zum Schreiben der Daten auf TRUE geprüft, wodurch erst dann der Schreibvorgang durch ein OPEN in Gang gesetzt wird.
Das bDataEqual kann aufgrund der Zusatzdeklaration AT%Q* mit einer Ausgangsvariable einer Klemme verknüpft werden, die Digitale Ausgänge bereitstellt. Daran ist zuletzt zu sehen, ob der korrekte Datentransport erfolgte.
Die einzelnen Zustände, State 0 bis 4 sind als iWrState wie folgt Programmiert:
- [iWrState =0]: Durchführung von Initialisierungen:
- Setze FALSE → bDataEqual
- Erzeuge Zufallsdaten in aWrBuffer
- Vorbereitung des Aufrufs des Funktionsblocks für OPEN: Setze FALSE → bExecute
- Setze nächsten Zustand: 1 → iWrState
- [iWrState =1]: Abfrage der Eingangs-Variable bEnabled, ob mit Aufrufs des Funktionsblocks für OPEN begonnen werden soll. Wenn bEnabled = TRUE, dann erfolgt der Aufruf des Funktionsblocks OPEN mit folgenden Parametern:
- EC_MasterNetId_Wr → sNetId
- EL6695_WR_EcAddr → nPort
- 16#12345678 → dwPass
- 1 → eMode (Kennung zum Schreiben)
- TRUE → bExecute
- T#10S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 2 → iWrState; Ist bBusy = TRUE, so erfolgt kein Zustandswechsel. Auf die Behandlung der Fehlerfälle durch das Flag bError des Funktionsblocks OPEN (für Lesen/Schreiben) wird in diesem Beispiel und auch für alle anderen Funktionsblöcke (ACCESS, CLOSE für Lesen/Schreiben) nicht eingegangen.
- Vorbereitung des Aufrufs des Funktionsblocks für ACCESS: Setze FALSE → bExecute
- [iWrState =2]: Es erfolgt der Aufruf des Funktionsblocks ACCESS mit folgenden Parametern:
- fbWrFoeOpen.hFoe → hFoe
- ADR(aWrBuffer) →pBuffer
- TRUE → bExecute
- T#14S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 3 → iWrState
- Vorbereitung des Aufrufs des Funktionsblocks für CLOSE: Setze FALSE → bExecute
- [iWrState =3]: Es erfolgt der Aufruf des Funktionsblocks CLOSE mit folgenden Parametern:
- fbWrFoeOpen.hFoe → hFoe
- TRUE → bExecute
- T#14S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 4 → iWrState
- [iWrState =4]: In diesem Zustand wird lediglich die Eingangs-Variable bEnabled abgefragt ob sie wieder FALSE ist. Dann beginnt das Programm wieder mit dem Anfangszustand:
- Wenn bEnabled = FALSE dann setze nächsten Zustand: 0 → iWrState
Beim nächsten Start werden wieder neue Zufallszahlen erzeugt, die dann beim Vergleich mit den gelesenen Werten wieder übereinstimmen sollten. Hierfür ist das bDataEqual Flag vorgesehen, dass dies kenntlich machen soll, wie im Folgenden zu sehen sein wird.
Das Zustandsdiagramm für den Lesezugriff sieht im Prinzip ähnlich aus und hat im Zustand 4 ein Programmabschnitt für den Datenvergleich der Geschriebenen mit den Gelesenen Werten.
Hierbei sind die einzelnen Zustände, State 0..4 als iRdState wie folgt Programmiert:
- [iRdState =0]: In diesem Zustand wird die Eingangs-Variable bEnabled abgefragt ob sie TRUE ist. Damit beginnt das Programm mit der Abfrage der auf [FoE Info].Data Bytes Pending (Objekt 0x1A05) verknüpften Eingangsvariable „ScndFoeBytesToRead“ um dadurch festzustellen, ob Daten auf der Empfängerseite „vorliegen“:
- Abfrage von ScndFoeBytesToRead wenn bDataEqual = TRUE
- Setze nächsten Zustand: 1 →iRdState wenn ScndFoeBytesToRead = TRUE
- Setze zur Vorbereitung des Aufrufs des Funktionsblocks für OPEN: Setze FALSE → bExecute wenn ScndFoeBytesToRead = TRUE
- [iRdState =1]: Abfrage der Eingangs-Variable bEnabled, ob mit Aufrufs des Funktionsblocks für OPEN begonnen werden soll. Wenn bEnabled = TRUE, dann erfolgt der Aufruf des Funktionsblocks OPEN mit folgenden Parametern:
- EC_MasterNetId_Rd → sNetId
- EL6695_RD_EcAddr → nPort
- 16#12345678 → dwPass
- 0 → eMode (Kennung zum Lesen)
- TRUE → bExecute
- T#10S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 2 → iRdState
- Vorbereitung des Aufrufs des Funktionsblocks für ACCESS: Setze FALSE → bExecute
- [iRdState =2]: Es erfolgt der Aufruf des Funktionsblocks ACCESS mit folgenden Parametern:
- fbRdFoeOpen.hFoe → hFoe
- ADR(aRdBuffer) →pBuffer
- TRUE → bExecute
- T#14S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 3 → iRdState
- Vorbereitung des Aufrufs des Funktionsblocks für CLOSE: Setze FALSE → bExecute
- [iRdState =3]: Es erfolgt der Aufruf des Funktionsblocks CLOSE mit folgenden Parametern:
- fbRdFoeOpen.hFoe → hFoe
- TRUE → bExecute
- T#14S → tTimeout
- Dieser Aufruf wird solange wiederholt, bis eine Abfrage des bBusy – Flags gleich FALSE ist; es erfolgt dann:
- Setze nächsten Zustand: 4 → iRdState
- [iRdState =4]: In diesem Zustand erfolgt zuletzt die Prüfung beider Speicherbereiche wobei das Flag bDataEqual auf TRUE gesetzt wird, falls beide Speicherbereiche gleich sind. Es ist empfehlenswert, dieses Flag als Ausgangsvariable „sichtbar“ zu machen um sie z.B. über eine Ausgangsklemme auf einen Ausgang zu schalten.
- Setze nächsten Zustand: 0 → iRdState
Verwendung der Beispielprogramme Dieses Dokument enthält exemplarische Anwendungen unserer Produkte für bestimmte Einsatzbereiche. Die hier dargestellten Anwendungshinweise beruhen auf den typischen Eigenschaften unserer Produkte und haben ausschließlich Beispielcharakter. Die mit diesem Dokument vermittelten Hinweise beziehen sich ausdrücklich nicht auf spezifische Anwendungsfälle, daher liegt es in der Verantwortung des Anwenders zu prüfen und zu entscheiden, ob das Produkt für den Einsatz in einem bestimmten Anwendungsbereich geeignet ist. Wir übernehmen keine Gewährleistung, dass der in diesem Dokument enthaltene Quellcode vollständig und richtig ist. Wir behalten uns jederzeit eine Änderung der Inhalte dieses Dokuments vor und übernehmen keine Haftung für Irrtümer und fehlenden Angaben. |
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.
- Das EtherCAT-Gerät im Beispiel ist in der Regel. zuvor ihrem vorliegenden System bekannt zu machen. Verwenden Sie nach Auswahl des EtherCAT-Gerätes im „Projektmappen-Explorer“ rechtsseitig den Karteireiter „Adapter“ und Klicken „Suchen...“:
- Überprüfen der NetId: der Karteireiter „EtherCAT“ des EtherCAT-Gerätes zeigt die konfigurierte NetId: .
Diese muss mit den ersten vier Zahlenwerten mit der Projekt‑NetId des Zielsystems übereinstimmen. Die NetId des Projektes kann oben in einem Textfeld der TwinCAT-Umgebung eingesehen werden. Ein pull-down Menü kann durch einen Klick rechts im Textfeld geöffnet werden; dort ist zu jedem Rechnernamen eines Zielsystems die NetId in Klammern angegeben. - Ändern der NetId: mit einem Rechtsklick auf „Gerät EtherCAT“ im Projektmappen-Explorer öffnet sich das Kontextmenü, in dem „Ändern der NetId“ auszuwählen ist. Die ersten vier Zahlen der NetId des Projektes sind einzutragen. die beiden letzten Werte sind in der Regel 4.1.
Beispiel: - NetId des Projektes: myComputer (123.45.67.89.1.1)
- Eintrag per „Change NetId...“: 123.45.67.89.4.1