Ereichbarkeit von Ethernet-Geräten Prüfen

Gibt es evtl. eine möglichkeit ein Ping abzusetzen und bei erfolgreicher Verbindung eine Variable auf true zu setzen?
 
Hi,

ich glaube wir reden etwas an einander vorbei ;-) ich habe bei mir einen Rechner mit TwinCAT, der abfragen soll ob ein anderer Rechner im Netzwerk (TCP/IP) verfügbar ist.

Gruß
Borsti
 
Hi
ich glaube wir reden etwas an einander vorbei ;-) ich habe bei mir einen Rechner mit TwinCAT, der abfragen soll ob ein anderer Rechner im Netzwerk (TCP/IP) verfügbar ist.
Redest du jetzt von einer Soft-SPS oder vom Win-Rechner.

Soweit ich weiß gibt es den Win-Teil und den SPS-Teil.

Oder ist das bei Beckhoff anders ?


Gruß Karl
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

also nochmal ich habe einen Rechner auf dem TwinCAT läuft.
In meinem TwinCAT Programm benötige ich eine Funktion mit der
die Ereichbarkeit eines anderen Rechners im Netzwerk überprüft wird.

Ist der Rechner ereichbar gibt die Funktion True zurück.
 
Zuletzt bearbeitet:
Hallo Borsti87,

das was Du vor hast geht! Du brauchst allerdings den TCP/IP Server von Beckhoff. Damit kann man Daten aus TwinCAT zu anderen TCP/IP Geräten schicken. In dieser Bibliothek gibt es die Funktion SocketConnect womit man eine Verbindung aufbaut. Führst Du diese Funktion aus, und bekommst eine positive Antwort, ist das Gerät erreichbar, andernfalls nicht.

Gruß Scrat
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Borsti87,

ich weiß ja nicht, mit welchen Geräten Du arbeiten möchtest. Verwende einfach den Port, auf dem Du auch eine Antwort auf Deine Daten erwartest.

Gruß Scrat
 
Hi,

ich habe jetzt folgendes:
Code:
VAR_INPUT
    bExecute        : BOOL;
END_VAR
VAR_OUTPUT
    bAccessible: BOOL;
    bUnAccessible: BOOL;
END_VAR
VAR
    RisingEdge : R_TRIG;
    fbConnect : FB_SocketConnect;
    dStep : DWORD;
    iWait : INT;
    fbClose: FB_SocketClose;
END_VAR
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.
 
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 BausteinAUFRUF 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.
 
Zuletzt bearbeitet:
Schreib einfach ein VB.net Programm, dass den Zustand des Netzes abfragt, denn Windows macht das mit Broadcasts für dich, wenn du in einer Domain angemeldet bist. Dieses Programm, kann dann eine Variable in Twincat setzen. Vorlagen für .Net-Programme finden sich zu Hauf im Netz.
 
Zurück
Oben