FB_SocketReceive
Mit dem Funktionsbaustein FB_SocketReceive können über den TwinCAT TCP/IP Connection Server Daten eines Remote-Clients oder Remote-Servers empfangen werden. Eine Remote-Clientverbindung muss vorher mit dem Funktionsbaustein FB_SocketAccept und eine Remote-Serververbindung mit dem Funktionsbaustein FB_SocketConnect aufgebaut werden. Die Daten können in einem TCP/IP-Netzwerk fragmentiert (in mehreren Paketen) empfangen oder verschickt werden. Es ist also möglich, dass nicht alle Daten auf einmal mit einem Aufruf der Instanz von FB_SocketReceive empfangen werden können. Aus diesem Grund muss die Instanz zyklisch (pollend) in der SPS-Task aufgerufen werden, so lange bis alle benötigten Daten empfangen wurden. Dabei wird eine steigende Flanke, z.B. alle 100ms, an dem bExecute-Eingang erzeugt. Beim Erfolg werden die zuletzt empfangenen Daten in den Empfangspuffer hineinkopiert. Der nRecBytes-Ausgang liefert die Anzahl der zuletzt erfolgreich empfangenen Datenbytes zurück. Wenn beim letzten Aufruf keine neuen Daten gelesen werden konnten, liefert der Funktionsbaustein keinen Fehler und nRecBytes == Null.
Bei einem einfachen Protokoll in dem z.B. ein Nullterminierter String von einem Remote-Server empfangen werden soll, muss der Funktionsbaustein FB_SocketReceive z.B. so oft aufgerufen werden, bis in den empfangenen Daten die Nullterminierung erkannt wurde.
Wenn der Remote-Teilnehmer vom TCP/IP-Netzwerk getrennt wurde (nur auf der Remote-Seite) und der lokale Teilnehmer noch im TCP/IP-Netzwerk hängt, liefert der FB_SocketReceive-Funktionsbaustein keinen Fehler und keine Daten. Der geöffnete Socket existiert immer noch, es werden nur keine Daten empfangen. Die Applikation wird dann möglicherweise endlos auf die restlichen Frame-Datenbytes warten. Es wird empfohlen in der Applikation eine Timeout-Überwachung zu implementieren. Wenn nach einer bestimmten Zeit, z.B. 10 Sekunden, immer noch nicht alle Frame-Datenbytes empfangen wurden, muss die Verbindung geschlossen und neu initialisiert werden. |
VAR_INPUT
VAR_INPUT
sSrvNetId : T_AmsNetId := '';
hSocket : T_HSOCKET;
cbLen : UDINT;
pDest : DWORD;
bExecute : BOOL;
tTimeout : TIME := T#5s;
END_VAR
sSrvNetId: String mit der Netzwerkadresse des TwinCAT TCP/IP Connection Servers. Für den lokalen Rechner (default) kann auch ein Leerstring angegeben werden.
hSocket: Das Verbindungshandle des Kommunikationspartners dessen Daten empfangen werden sollen.
cbLen: Die maximal verfügbare Puffergröße für die zu lesenden Daten in Bytes.
pDest: Die Adresse (Pointer) auf den Empfangspuffer.
bExecute: Über eine positive Flanke an diesem Eingang wird der Baustein aktiviert.
tTimeout: Maximale Zeit, die bei der Ausführung des Funktionsbausteins nicht überschritten werden darf.
VAR_OUTPUT
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrId : UDINT;
nRecBytes : UDINT;
END_VAR
bBusy: Dieser Ausgang wird bei der Aktivierung des Funktionsbausteins gesetzt und bleibt gesetzt, bis eine Rückmeldung erfolgt.
bError: Dieser Ausgang wird, nachdem der bBusy-Ausgang zurückgesetzt wurde, gesetzt, sollte ein Fehler bei der Übertragung des Kommandos erfolgen.
nErrId: Liefert bei einem gesetzten bError-Ausgang die TwinCAT TCP/IP Connection Server Fehlernummer.
nRecBytes: Die Anzahl der zuletzt erfolgreich empfangen Datenbytes.
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
Alle TwinCAT v2.8.0 Versionen und höher | PC oder CX (x86) | TcpIp.Lib ( Standard.Lib; TcBase.Lib; TcSystem.Lib werden automatisch eingebunden ) |
TwinCAT v2.10.0 Build >= 1301 | CX (ARM) |