Code:
RisingEdge(CLK := bExecute);
IF RisingEdge.Q THEN
bAccessible := FALSE;
bUnAccessible := FALSE;
fbConnect(sRemoteHost:= '192.168.1.123',
nRemotePort:= 12345,
bExecute:= TRUE,
tTimeout:= T#3s);
IF fbConnect.bBusy THEN
IF NOT fbConnect.bError THEN
bAccessible := TRUE;
fbConnect(bExecute:= FALSE);
fbClose(hSocket:= fbConnect.hSocket,
bExecute:= TRUE,
tTimeout:= T#3s);
fbClose(bExecute:= FALSE);
ELSE
bUnAccessible := TRUE;
fbConnect(bExecute:= FALSE);
fbClose(hSocket:= fbConnect.hSocket,
bExecute:= TRUE,
tTimeout:= T#3s);
fbClose(bExecute:= FALSE);
END_IF
END_IF
END_IF
Allerdings bleiben fbConnect und fbClose dauerhaft bBusy und scheinen die Verbindung nicht freizumachen.
Dein Problem ist doch offensichtlich!
Du führst den Baustein einmalig mit steigender Flanke aus. Das Busy vom fbConnect wird in diesem Zyklus noch gesetzt. Da (vermutlich) in diesem ersten Zyklus (noch) kein Error vorliegt, rennst du sofort in den Part
Code:
IF NOT fbConnect.bError THEN
bAccessible := TRUE;
fbConnect(bExecute:= FALSE);
fbClose(hSocket:= fbConnect.hSocket,
bExecute:= TRUE,
tTimeout:= T#3s);
fbClose(bExecute:= FALSE);
und schließt den vermutlich noch nicht einmal geöffneten Port sofort wieder.
Du musst die Abarbeitung der Bausteine erst einmal abwarten und dann erst reagieren.
Der TCP/IP-Baustein greift auf Funktionen außerhalb der TwinCAT Echtzeit zu. Und da dauert die Reaktion schon mal etwas länger.
Allgemein:
Lasst die bedingten Bausteinaufrufe sein!!!!!!!!!!!
Also Baustein
AUFRUF außerhalb jeglicher Bedingung und am besten nur
einmalig pro Instanz pro Zyklus. Steuerung der Ein- und Ausgänge der FBs dann mit den Bedingungen.
Achso, noch zur Fragestellung:
Ist der Port "12345" auf der anderen Seite denn überhaupt erreichbar? Wenn dort keine Applikation reagiert, wirst du vermutlich auch einen Error zurück erhalten. Du testest damit lediglich, ob ein bestimmter TCP-Port im Netzwerk erreichbar ist, aber nicht, ob das Gerät (allgemein) per Ethernet oder TCP/IP erreichbar ist. Das geht nur mit z. B. einem Ping. Und ein Ping findet m. W. n. nur auf der IP-Ebene statt, und nicht auf TCP-Ebene.
Wenn es sich um ein TwinCAT-System handelt, sieht die Sache anders aus. Da kannst du ne simple ADS-Abfrage starten, wenn die Route bekannt ist.