Übersicht
Das folgende Beispiel zeigt die Implementierung einer einfachen Peer-to-Peer-Anwendung in der SPS. Es umfasst zwei SPS-Projekte (PeerA und PeerB) sowie eine .NET-Anwendung, die als separater Peer agiert. Alle Peer-Anwendungen senden einen Test-String zu einem Remote-Peer und erhalten gleichzeitig Strings von einem Remote-Peer. Die erhaltenen Strings werden auf dem Bildschirm in einer Messagebox angezeigt. Sie können das Beispiel beliebig nutzen und anpassen.
Systemvoraussetzungen
- TwinCAT 3 Build 3093 oder höher
- TwinCAT 3 Function TF6310 TCP/IP
- Wenn Sie für die Ausführung des Beispiels zwei PCs nutzen, muss TF6310 auf beiden installiert sein.
- Wird das Beispiel auf einem Computer ausgeführt (z. B. PeerA und PeerB laufen in zwei separaten SPS-Laufzeiten), müssen beide SPS-Laufzeiten in separaten Tasks laufen.
- Zum Ausführen des .NET-Beispielclients ist nur .NET Framework 4.0 nötig.
Projektdownloads
Die Sourcen der beiden SPS-Teilnehmer unterscheiden sich nur durch unterschiedliche IP-Adressen der Remote-Kommunikationspartner.
https://github.com/Beckhoff/TF6310_Samples/tree/master/PLC/UDP/Sample01
https://github.com/Beckhoff/TF6310_Samples/tree/master/C%23/SampleClientUdp
Projektbeschreibung
Unter den nachfolgenden Links finden Sie die Dokumentation der einzelnen Komponenten. Ein separater Artikel erklärt Schritt für Schritt, wie die SPS-Beispiele eingerichtet und gestartet werden.
- Integration in TwinCAT und Test (Start der SPS-Beispiel)
- SPS-Teilnehmer A und B (Peer-to-Peer SPS-Applikation)
- .NET-Teilnehmer (.NET-Beispielclient)
Zusätzliche Funktionen der SPS Beispielprojekte
In den SPS-Beispielen werden einige Funktionen, Konstanten und Funktionsbausteine benutzt, die im Folgenden kurz beschrieben werden sollen:
Fifo-Funktionsbaustein
FUNCTION_BLOCK FB_Fifo
VAR_INPUT
new : ST_FifoEntry;
END_VAR
VAR_OUTPUT
bOk : BOOL;
old : ST_FifoEntry;
END_VAR
Hierbei handelt es sich um einen einfachen Fifo-Funktionsbaustein. Eine Instanz von diesem Baustein wird als „Sende-Fifo“ und eine als „Empfangs-Fifo“ benutzt. Die zu sendenden Nachrichten werden in den Sende-Fifo und die empfangenen in den Empfangs-Fifo abgelegt. Die bOk-Ausgangsvariable wird auf FALSE gesetzt, wenn bei der letzten Aktion (AddTail oder RemoveHead) Fehler aufgetreten sind (Fifo leer oder überfüllt).
Ein Fifo-Eintrag besteht aus folgenden Komponenten:
TYPE ST_FifoEntry :
STRUCT
sRemoteHost : STRING(15); (* Remote address. String containing an (Ipv4) Internet Protocol dotted address. *)
nRemotePort : UDINT; (* Remote Internet Protocol (IP) port. *)
msg : STRING; (* Udp packet data *)
END_STRUCT
END_TYPE
LogError-Funktion
FUNCTION LogError : DINT

Die Funktion schreibt eine Meldung mit dem Fehlercode in das Logbuch des Betriebssystems (Event Viewer). Die globale Variable bLogDebugMessages muss zuerst auf TRUE gesetzt werden.
LogMessage-Funktion
FUNCTION LogMessage : DINT

Die Funktion schreibt eine Meldung in das Logbuch des Betriebssystems (Event Viewer), wenn ein neuer Socket geöffnet oder geschlossen wurde. Die globale Variable bLogDebugMessages muss zuerst auf TRUE gesetzt werden.
SCODE_CODE-FUnktion
FUNCTION SCODE_CODE : DWORD

Die Funktion maskiert die niederwertigsten 16 Bits eines Win32-Fehlercodes aus und liefert diese zurück.