Ping Netzwerkadressen

christoph.87

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Comunity,

ich versuche seit einer weile über SysSockPing eine IP adresse im Hiemnetzwerk anzupingen, leider mag das bis jetzt nicht wirklich. Im Netzt habe ich zwar schon ein paar Anhaltspunkte gefunden, aber nichts in Codesys V3.
Im Endefekt will ich am Schluss nur ein True oder Fals haben wenn die Adesse erreicbar ist.

Hoffe hier kann mir jmd helfen.
Danke schonmal.
MfG Chris




Ping.png
 
Code:
FUNCTION_BLOCK TCP_Check
VAR_INPUT
    TimeOut        : UDINT;            (*TimeOut*)
END_VAR
VAR_OUTPUT
    IP1_NA        : BOOL;                (*Zielsystem 1 nicht erreichbar*)
    IP2_NA        : BOOL;                (*Zielsystem 2 nicht erreichbar*)
    IP3_NA        : BOOL;                (*Zielsystem 3 nicht erreichbar*)
    IP4_NA        : BOOL;                (*Zielsystem 4 nicht erreichbar*)
END_VAR
VAR
    IPAdress_1    : STRING[15];        (*Zielsystem 1 IP-Adresse*)
    IPAdress_2    : STRING[15];        (*Zielsystem 2 IP-Adresse*)
    IPAdress_3    : STRING[15];        (*Zielsystem 3 IP-Adresse*)
    IPAdress_4    : STRING[15];        (*Zielsystem 4 IP-Adresse*)
    ReplyTime_1    : UDINT;            (*Antwortzeit*)
    ReplyTime_2    : UDINT;            (*Antwortzeit*)
    ReplyTime_3    : UDINT;            (*Antwortzeit*)
    ReplyTime_4    : UDINT;            (*Antwortzeit*)
    ANF_CHECK     : TON;
    
    (*Variablen VISU*)
    IP1_NA_VISU : DWORD;
    IP2_NA_VISU : DWORD;
    IP3_NA_VISU : DWORD;
    IP4_NA_VISU : DWORD;            
END_VAR

Code:
(*Prüfintervall*)
IF LEN(IPAdress_1) <> 0 OR
    LEN(IPAdress_2) <> 0 OR
    LEN(IPAdress_3) <> 0 OR
    LEN(IPAdress_4) <> 0 THEN
ANF_CHECK (IN:= NOT ANF_CHECK.Q , PT:=T#2000MS);
END_IF;


(*PING Prüfung der einzelnen Teilnehmer*)
IF LEN(IPAdress_1) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_1, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_1));
    IF ReplyTime_1 >= TimeOut THEN
    IP1_NA := TRUE;
    ELSE IP1_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_2) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_2, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_2));
    IF ReplyTime_2 >= TimeOut THEN
    IP2_NA := TRUE;
    ELSE IP2_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_3) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_3, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_3));
    IF ReplyTime_3 >= TimeOut THEN
    IP3_NA := TRUE;
    ELSE IP3_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_4) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_4, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_4));
    IF ReplyTime_4 >= TimeOut THEN
    IP4_NA := TRUE;
    ELSE IP4_NA := FALSE;
    END_IF;
END_IF;


(*VISU*)
IF IP1_NA THEN
    IP1_NA_VISU := gvl.dwAlarm;
    ELSE IP1_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_1) = 0 THEN
    IP1_NA_VISU := gvl.dwGrey;
END_IF;


IF IP2_NA THEN
    IP2_NA_VISU := gvl.dwAlarm;
    ELSE IP2_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_2) = 0 THEN
    IP2_NA_VISU := gvl.dwGrey;
END_IF;


IF IP3_NA THEN
    IP3_NA_VISU := gvl.dwAlarm;
    ELSE IP3_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_3) = 0 THEN
    IP3_NA_VISU := gvl.dwGrey;
END_IF;


IF IP4_NA THEN
    IP4_NA_VISU := gvl.dwAlarm;
    ELSE IP4_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_4) = 0 THEN
    IP4_NA_VISU := gvl.dwGrey;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das läuft bei mir ganz und gar nicht :/ ich bekomme den Fehler "C0046: Bezeichner 'Ping' nicht definiert" und "C0035: Progammname, Funktion oder Funktionsbausteininstanz an Stelle von 'Ping' erwartet
 
Das läuft bei mir ganz und gar nicht :/ ich bekomme den Fehler "C0046: Bezeichner 'Ping' nicht definiert" und "C0035: Progammname, Funktion oder Funktionsbausteininstanz an Stelle von 'Ping' erwartet
Dann hast Du aber nicht das Beispiel von Azrael666 verwendet oder Dich vertippt, denn bei seinem Beispiel gibt es nichts nur mit Ping. Stell mal das Programm das diese Fehler beim Übersetzen ausgibt hier rein, mal sehen.

Von irgendwas mit Internetzugang gesendet
 
Fehler wahrscheinlich gefunden. Kann das sein das ein neuer Baustein kreiirt wird? Entschuldigt die blöden Fragen ich bin Anfänger :/

Kurz zur Geschichte meines Projektes:

Das ganze soll ein System werden das Spannungen von 8-250V AC/DC messen wird mir verschiedenen Messwandlern, Es sollen 2 Relaiskarten geschalten werden eine mit 8 und eine mit 16 Ausgängen und eben dioe Verfügbarkeit von 12 IP Adressen darstellen. Dazu sollen einige Fehlerzustände aufgezeigt werden. Das ganze wird dann in einem Fahrzeug verbaut das die Einsatzleitung vor Ort darstellt.

Ich bedanke mich jetzt schon bei allen Helfern

Code:
PROGRAM POU
FUNCTION_BLOCK TCP_Check
VAR_INPUT
    TimeOut        : UDINT;            (*TimeOut*)
END_VAR
VAR_OUTPUT
    IP1_NA        : BOOL;                (*Zielsystem 1 nicht erreichbar*)
    IP2_NA        : BOOL;                (*Zielsystem 2 nicht erreichbar*)
    IP3_NA        : BOOL;                (*Zielsystem 3 nicht erreichbar*)
    IP4_NA        : BOOL;                (*Zielsystem 4 nicht erreichbar*)
END_VAR
VAR
    IPAdress_1    : STRING[15];        (*Zielsystem 1 IP-Adresse*)
    IPAdress_2    : STRING[15];        (*Zielsystem 2 IP-Adresse*)
    IPAdress_3    : STRING[15];        (*Zielsystem 3 IP-Adresse*)
    IPAdress_4    : STRING[15];        (*Zielsystem 4 IP-Adresse*)
    ReplyTime_1    : UDINT;            (*Antwortzeit*)
    ReplyTime_2    : UDINT;            (*Antwortzeit*)
    ReplyTime_3    : UDINT;            (*Antwortzeit*)
    ReplyTime_4    : UDINT;            (*Antwortzeit*)
    ANF_CHECK     : TON;
    
    (*Variablen VISU*)
    IP1_NA_VISU : DWORD;
    IP2_NA_VISU : DWORD;
    IP3_NA_VISU : DWORD;
    IP4_NA_VISU : DWORD;            
END_VAR

Code:
IF LEN(IPAdress_1) <> 0 OR
    LEN(IPAdress_2) <> 0 OR
    LEN(IPAdress_3) <> 0 OR
    LEN(IPAdress_4) <> 0 THEN
ANF_CHECK (IN:= NOT ANF_CHECK.Q , PT:=T#2000MS);
END_IF;


(*PING Prüfung der einzelnen Teilnehmer*)
IF LEN(IPAdress_1) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_1, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_1));
    IF ReplyTime_1 >= TimeOut THEN
    IP1_NA := TRUE;
    ELSE IP1_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_2) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_2, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_2));
    IF ReplyTime_2 >= TimeOut THEN
    IP2_NA := TRUE;
    ELSE IP2_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_3) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_3, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_3));
    IF ReplyTime_3 >= TimeOut THEN
    IP3_NA := TRUE;
    ELSE IP3_NA := FALSE;
    END_IF;
END_IF;


IF LEN(IPAdress_4) <> 0 AND ANF_CHECK.Q THEN
SysSockPing(szIPAddress:=IPAdress_4, ulTimeout:=TimeOut , pulReplyTime:=ADR(ReplyTime_4));
    IF ReplyTime_4 >= TimeOut THEN
    IP4_NA := TRUE;
    ELSE IP4_NA := FALSE;
    END_IF;
END_IF;


(*VISU*)
IF IP1_NA THEN
    IP1_NA_VISU := gvl.dwAlarm;
    ELSE IP1_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_1) = 0 THEN
    IP1_NA_VISU := gvl.dwGrey;
END_IF;


IF IP2_NA THEN
    IP2_NA_VISU := gvl.dwAlarm;
    ELSE IP2_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_2) = 0 THEN
    IP2_NA_VISU := gvl.dwGrey;
END_IF;


IF IP3_NA THEN
    IP3_NA_VISU := gvl.dwAlarm;
    ELSE IP3_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_3) = 0 THEN
    IP3_NA_VISU := gvl.dwGrey;
END_IF;


IF IP4_NA THEN
    IP4_NA_VISU := gvl.dwAlarm;
    ELSE IP4_NA_VISU := gvl.dwGreen;
END_IF;
IF LEN(IPAdress_4) = 0 THEN
    IP4_NA_VISU := gvl.dwGrey;
END_IF;

Unbenannt.PNG
 
Was mit gerade auffällt, SysSockPing wird ein Fumktionsbaustein sein und keine Funktion, in Deinem CFC Beispiel nutzt Du den FB aber als wär es eine Funktion, es fehlt oben über der Box der Instanzname, sprich Du hast im Deklarationsteil keine Instanz für den FB deklariert.

Von irgendwas mit Internetzugang gesendet
 
Ich komm einfach nicht weiter :/ oder ich bin einfach zu doof...

wo muss ich diese Codes einfügen? an welchen stellen gebe ich meine IP-Adressen ein? und wie rufe ich diese Funktionen auf?

ich erstelle eine neue POU -> dort füge ich den unteren Code ein das er mir die Variablen erzeugt? oder kopiere ich die Variablen so wie oben geschrieben dorhin?

danach gehe ich in mein Main Task und rufe dort den soeben erstellten Baustein/Funktion auf?

oder stehe ich da jetzt voll auf dem Schlauch? hat jemand ein Funktionierendes Beispiel das ich mal etwas bildlich vor den Augen habe?

Besten Dank schon mal
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du musst meinen Code als POU - Funktionsbaustein erstellen und diesen POU dann in einer Funktion aufrufen.

1. Erstelle einen neuen POU als Funktionsbaustein (ST) mit beliebigem Namen
2. Code in diesen neuen Funktionsbaustein einfügen
3. Neue POU erstellen als Funktion (KOP) mit beliebigem Namen
4. Funktionsbaustein (ST) in der Funktion (KOP) als Instanz aufrufen und Ein-/Ausgänge beschalten bzw. Interne Variablen beschreiben.
5. Funktion (KOP) im zyklischen Haupttask aufrufen

PS: alles unter (*VISU*) im Code, kannst du weglassen, das sind nur Elemente denen ich Farben zugeordnet habe um sie in einer Visualisierung darzustellen.

oder du legst dir eine "Globale Variablenliste" an mit dem Namen Gvl und kopierst diesen Code dort hinein

Code:
{attribute 'qualified_only'}
VAR_GLOBAL
   (*globale VISU-Farben*)
    dwBlue    : DWORD := 16#FF0000FF; //Blue, highly opaque
    dwGreen    : DWORD := 16#FF00FF00; //Green, highly opaque
    dwYellow: DWORD := 16#FFFFFF00; //Yellow, highly opaque
    dwGrey     : DWORD := 16#88888888; //Grey, semitransparent
    dwBlack : DWORD := 16#88000000; //Black, semitransparent
    dwAlarm    : DWORD := 16#FFFF0000; //Red, highly opaque
    dwWhite : DWORD := 16#FFFFFFFF;    //White
END_VAR

PPS: Es muss natürlich auch die Bibliothek "Syssocket" in das Projekt eingebunden sein (ist standardmäßig bei Codesys mit dabei)!
 
Zuletzt bearbeitet:
Vielen Herzlichen Danke Azreal666, ich bin wie gesagt absoluter Neuling auf dem Terant

Soweit hab ich es :))) nur habe ich jetzt noch den Fehler SysSockPing nicht definiert
 
Code.PNG

sollte vorhanden sein?

Nachtrag--> Bibliothek war nicht vorhanden da ich irrtümlich dachte der vorhandene aus RDP reicht aus.

Danke für die Hilfe
 
Zuletzt bearbeitet:
und siehe ;) manchmal sollte man einfach nicht zu kompliziert denken.

Ich hätte da aber gleich noch eine Frage wie bekommt man die 3 Farben in einer Visualisierung dargestellt? DWORD kann ich ja nicht in der Visu darstellen lassen?
 
Doch, du kannst bei jedem Element, wenn es um Farben geht (z.b. Hintergrundfarbe) das DWORD als Variable zuordnen. Dann ändert sich z.b. der Hintergrund je nachdem welcher Wert in dem DWORD steht.

Beispiel:
Textelement -> Farbvariablen -> Normalzustand -> Füllfarbe

dort kommt dann z.b. die Variable "IP1_NA_VISU" rein und dann würde sich das Feld je nach Zustand der Variable Rot, Grün oder Grau werden
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann scheint es so, als habe ich doch noch einen Fehler in meiner Schaltung. --> Ping (Funktionsbaustein) muss für den Zugriff instanziert werden.

Der Baustein funktioniert, die Funktion ist auch beschalten und der aufruf der Funktion erfolgt im PLC_PRG
 
Ja, Funktionsbausteine werden in der Regel instanziert aufgerufen. Wenn du den Baustein im KOP einfügst sollte er dich nach dem Instanznamen fragen
 
Das kann auch nicht gehen. POU ist von Dir als Funktion angelegt worden, da Ping ein FB ist und über mehrere Zyklen läuft kannst Du ihn nicht in einer Funktion einsetzen. Und POU musst Du natürlich auch in einem anderen FB oder Programm dann aufrufen von alleine wird das nicht ausgeführt..
 
Zurück
Oben