FB_SocketReceive

FB_SocketReceive 1:

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.

FB_SocketReceive 2:

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)