# Ereichbarkeit von Ethernet-Geräten Prüfen



## borsti87 (16 April 2011)

Hallo,
wie kann ich via TwinCAT am einfachsten Prüfen ob ein Ethernet Gerät im Netzwerk erreichbar ist?
Gruß
borsti


----------



## borsti87 (17 April 2011)

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


----------



## gravieren (17 April 2011)

Hi

Du benötigst Daten von dem "Netzwerkgerät".

Frage doch mal Daten z.b. mit ModBus ab.
Hierdurch kannst du abfragen ober welche gesendet wurden.


Gruß Karl


----------



## borsti87 (17 April 2011)

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


----------



## gravieren (17 April 2011)

Hi


borsti87 schrieb:


> 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


----------



## borsti87 (17 April 2011)

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.


----------



## Scrat (19 April 2011)

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


----------



## borsti87 (20 April 2011)

Mit welcher Portnummer testet man das den am besten?


----------



## Scrat (20 April 2011)

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


----------



## borsti87 (22 April 2011)

Hi,

ich habe jetzt folgendes:

```
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
```


```
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.


----------



## trinitaucher (22 April 2011)

borsti87 schrieb:


> ```
> RisingEdge(CLK := bExecute);
> 
> IF RisingEdge.Q THEN
> ...



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

```
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.


----------



## borsti87 (22 April 2011)

trinitaucher schrieb:


> m. W. n.




Kann man mit TwinCAT den einen Ping auslösen?


----------



## drfunfrock (22 April 2011)

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.


----------



## trinitaucher (23 April 2011)

borsti87 schrieb:


> Kann man mit TwinCAT den einen Ping auslösen?


Ist mir jetzt nicht bekannt. 
Ein Ping fndet auf IP-Ebene statt. Du müsstest ein IP-Telegramm versenden mit dem Ping als Inhalt. ... google mal.

Was sind das denn nun für PCs auf der Gegenseite? Auch TwinCAT-PCs oder andere?


----------



## borsti87 (23 April 2011)

Der anzupingende Rechner ist ein Linuxserver


----------



## Scrat (23 April 2011)

Und was wichtig ist!
Der TCP/IP-Server muss installiert sein.

Gruß Scrat


----------

