Ping Netzwerkadressen

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)!



Dann hab ich den part falsch verstanden
 
Hast Du nicht, Azrael666 liegt falsch, Ping darf nicht in einer Funktion aufgerufen werden. Funktionen verlieren Ihre Werte beim Beenden wieder, für FBs in Funktionen bedeutet dies, dass sich diese so verhalten als würden sie zum ersten mal gestartet, deswegen funktionieren Flankenbausteine in Funktionen z.B. auch nicht, da der vorherige Wert des Signals nie gespeichert wird.
 
Wenn ich euch nochmal belästigen darf :/.

Alles funktioniert soweit super Ping wird ausgeführt alle werte kommen sauber zurück und werden auch richtig virtualisiert. Jetzt kommt die rafinesse dazu: ich habe eine Virtualisierung mit dem einem Punkt Einstellungen, dort ist zu jeder IP ein Button hinterlegt der bei klicken den INPUT für Ping liefert. Sprich ich will falls nötig die IP Adresse ändern können bzw. erst einmal einen Fixen Wert haben der beim Laden bereits da ist.

kurzes Beispiel zum Verständniss:
Virtualisierung --> Einstellungen --> IP-Adressen --> Gerät 1-12 --> Klick auf Gerät 1 öffnet sich ein Num-Pad mit aktuellen Wert (in meinem Fall "" da ich nicht weis wie ich einen konstanten Wert hinterlege) --> Adresse ändern--> OK--> Adresse wird als String an Baustein gegeben. Nun nach Neustart der Runtime sollte der zuletzt verwendete Wert hier aber drin bleiben oder den Standardwert lesen.

Hintergrund der Geschichte ist. Das ganze läuft in einem Einsatzleitwagen im Roten Kreuz bei dem von 3 Punkten der Status und die Bedienung des Fahrzeuges vonstatten gehen kann und soll. Die Pings helfen hier dem benutzer der kein Computerfreak ist zu sehen ob alles so läuft wie es laufen soll. Eigentliher Punkt ist es 3 Adressen ändern zu können die drin bleiben sollen da diese bei jedem Einsatz eine neue IP zugewiesen bekommen können oder die alte weiter verwendet werden kann.

Danke für eure Mithilfe
 
Na das ist doch eine der leichteren Übungen. :wink:
Einer Variable weist Du bei der Instanzierung so einen Wert zu:
Code:
IPAdress_1 : STRING[15] := '192.168.2.1';
Bei den Buttons musst Du in der Visualisierung unter Eingabekonfiguration das für Dich passende Ereignis auswählen, als Aktion wählst Du dann ST-Code ausführen aus und als Code machst Du dann eine Variablenzuweisung, allerdings musst Du den kompletten Pfad angeben wo die Variable steht. Nehmen wir mal an Dein oberstes Programm heißt Main und in diesem gibt es eine Instanz eines FBs mit dem Instanznamen "IP_Handling" in dem die zu ändernde Variable 'IPAdress_1' steht, dann sähe die auszuführende ST-Zeile so aus:
Code:
MAIN.IP_Handling.IPAdress_1 := '192.168.2.2'
Von diesem Button machst Du jetzt noch zwei Kopien und änderst Die IP entsprechend.
Wenn Du dann mal Lust hast, kannst Du in einer späteren Version, falls die IP als String angegeben wird, ja eine globale Variable (String Array) anlegen, die dann persistent/retain ist, also Ihren Wert nach dem Ausschalten nicht verliert. Über eine andere oder die Selbe Visu-Seite kannst Du in die einzelnen Elemente des Arrays dann individuell eine IP eintragen, dann wird das Ganze noch flexibler. Bei den Buttons wird dann in der ST-Zeile keine feste IP, sondern jeweils ein Element des Arrays angegeben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du nicht, Azrael666 liegt falsch, Ping darf nicht in einer Funktion aufgerufen werden. Funktionen verlieren Ihre Werte beim Beenden wieder, für FBs in Funktionen bedeutet dies, dass sich diese so verhalten als würden sie zum ersten mal gestartet, deswegen funktionieren Flankenbausteine in Funktionen z.B. auch nicht, da der vorherige Wert des Signals nie gespeichert wird.

Da muss ich leider widersprechen. Man kann eine Funktionsbaustein sehr wohl in einer Funktion aufrufen (das Flanken nicht in einer Funktion gehen sollen ist mir auch neu).
Hier ein Bild wie es aussehen sollte :

PingCheck.jpg
 
Da muss ich leider widersprechen. Man kann eine Funktionsbaustein sehr wohl in einer Funktion aufrufen (das Flanken nicht in einer Funktion gehen sollen ist mir auch neu).
Da hast Du mich missverstanden, ich meinte nicht, dass es nicht geht, sondern das es meistens nicht sinnvoll ist. Eine Funktion startet bei jedem Aufruf quasi jungfräulich und weiß nichts mehr von vorherigen Aufrufen, das hat auch Auswirkungen auf in einer Funktion verwendete FBs. In einer Funktion aufgerufene FBs verhalten sich bei jedem Aufruf so, als würden sie das erste Mal aufgerufen und das Selbe gilt für ihre internen Werte, diese haben bei jedem Aufruf wieder Ihre Initialisierungswerte, weswegen, wie von mir erwähnt, z.B. ein Flankenbaustein-FB, in einer Funktion nicht funktioniert. Wie sich das mit FBs verhält die Firmwarefunktionen aufrufen können vermutlich nur die Entwickler sagen, da kann es sein, dass auch FBs die mehrere Zyklen brauchen funktionieren. Sollen bestimmte Variablen oder FBs ihre Werte behalten müssten sie in einer Funktion im Bereich VAR_STAT deklariert werden.
 
Zuletzt bearbeitet:
Da ich ja viel behaupten kann folgt hier mal der Beweis, dass die Verwendung von FBs in Funktionen nicht unbedingt eine der besten Ideen ist. Da ich auf den Code vom originalen R_TRIG FB keinen Zugriff habe, habe ich kurz meinen eigenen geschrieben. Dieser sieht so aus:
Code:
FUNCTION_BLOCK FB_RTRIG
VAR_INPUT
    CLK            : BOOL;
END_VAR
VAR_OUTPUT
    Q            : BOOL;
END_VAR
VAR
    b_OldValue    : BOOL := FALSE;
END_VAR


Q := CLK AND (CLK XOR b_OldValue);
b_OldValue := CLK;

Hier ein Screenshot beim ersten Aufruf dieses FBs wo CLK TRUE ist. Der Baustein ist komplett durchgelaufen.
R_Trig01.png
Hier einer vom zweiten Aufruf.
R_Trig02.png
Wie Du deutlich erkennen kannst ist b_OldValue wieder auf FALSE, weil das sein Initialisierungswert ist, damit würde Q wieder auf TRUE gehen oder besser formuliert, auf TRUE bleiben.

Nachtrag:
Hier mal der selbe FB aus einem FB aufgerufen. Der erste Durchlauf ist noch gleich.
R_Trig03.png
Beim Zweiten ist dann aber ein Unterschied. Hier behält b_OldValue seinen Wert
R_Trig04.png
und Q geht beim zweiten Durchlauf wieder auf FALSE.
R_Trig05.png
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Finde ich irgendwie unlogisch. Der Hauptablauftask ansich ist ja schon eine Funktion. Das würde ja bedeuten, dass die SPS am Ende eines Zyklus sämtliche Variablenwerte auf die Initialwerte setzen würde.
 
Da ich ja viel behaupten kann folgt hier mal der Beweis, dass die Verwendung von FBs in Funktionen nicht unbedingt eine der besten Ideen ist.
Ob ein FB sich erwartungsgemäß verhält (mit "Gedächtnis" über mehrere Aufrufe) hängt nicht davon ab, ob er aus einem FB oder aus einer Function aufgerufen wird, sondern davon, wo die Instanz liegt. In Deinem "Beweis" für das nicht-funktionieren hast Du nicht gezeigt, wo die beobachtete FB_RTRIG-Instanz deklariert ist. So wie Du in Deinem Beitrag #25 eine String-Variable global in Main deklariert hast kannst Du auch eine FB_RTRIG-Instanz global anlegen und wenn die Function diese globale Instanz aufruft, dann funktioniert die auch korrekt (ohne neu initialisieren bei jedem Aufruf).

Damit eine Function sich was merken kann, kann man ihr ein "externes Gedächtnis" via VAR_INOUT mitgeben. Ich weiß jetzt nicht, ob man in Codesys per INOUT auch Instanzen von FB übergeben kann (oder Referenzen auf FB-Instanzen per INPUT oder INOUT), doch wenn das geht, dann könntest Du auch eine (globale oder in einem FB deklarierte) FB_RTRIG-Instanz an die Function übergeben - dann würde die trotz Aufruf aus einer Function korrekt funktionieren.

Übrigens, eine Flankenerkennung muß man nicht so umständlich programmieren, man kann auch einfach "umgangssprachlich" schreiben:
Code:
Q := CLK AND NOT b_OldValue;
b_OldValue := CLK;

Harald
 
Hallo Harald,
Ob ein FB sich erwartungsgemäß verhält (mit "Gedächtnis" über mehrere Aufrufe) hängt nicht davon ab, ob er aus einem FB oder aus einer Function aufgerufen wird, sondern davon, wo die Instanz liegt. In Deinem "Beweis" für das nicht-funktionieren hast Du nicht gezeigt, wo die beobachtete FB_RTRIG-Instanz deklariert ist. So wie Du in Deinem Beitrag #25 eine String-Variable global in Main deklariert hast kannst Du auch eine FB_RTRIG-Instanz global anlegen und wenn die Function diese globale Instanz aufruft, dann funktioniert die auch korrekt (ohne neu initialisieren bei jedem Aufruf).

Damit eine Function sich was merken kann, kann man ihr ein "externes Gedächtnis" via VAR_INOUT mitgeben. Ich weiß jetzt nicht, ob man in Codesys per INOUT auch Instanzen von FB übergeben kann (oder Referenzen auf FB-Instanzen per INPUT oder INOUT), doch wenn das geht, dann könntest Du auch eine (globale oder in einem FB deklarierte) FB_RTRIG-Instanz an die Function übergeben - dann würde die trotz Aufruf aus einer Function korrekt funktionieren.
Stimmt, dass hatte ich vergessen zu erwähnen. Die Deklaration ist jeweils in einer Funktion und einem Funktionsbaustein erfolgt. Übrigens VAR_STAT kann auch helfen den Gedächtnissverlust zu vermeiden.
Übrigens, eine Flankenerkennung muß man nicht so umständlich programmieren, man kann auch einfach "umgangssprachlich" schreiben:
Code:
Q := CLK AND NOT b_OldValue;
b_OldValue := CLK;
Ach Mann, gönn mir doch meine umständliche Lösung. Aber Du hast recht, dass ist eine meiner Schwächen, ich denke manchmal einfach zu kompliziert und übersehe das Naheliegende.

Finde ich irgendwie unlogisch. Der Hauptablauftask ansich ist ja schon eine Funktion. Das würde ja bedeuten, dass die SPS am Ende eines Zyklus sämtliche Variablenwerte auf die Initialwerte setzen würde.
@Azrael666: Da liegst Du leider wieder falsch, das was die Task aufruft ist keine Funktion, sondern ein Programm, zu erkennen (zumindest bei TwinCAT) an der Abkürzung PRG, eine Funktion hätte FUN.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Alos ich wollte hier jetzt keinen Streit anfangen :P
Danke oliver.thonn funktioniert natürlich bestens.

Hat einer von euch erfahrung mit dieser Variable bzw. Funktion?
Code:
CASE iState OF

    0:    (*set the timezone information
          this gc_tziTimeZoneCET variable includes the date for switch to summer and winter time and the
          bias for the timezone for the Central European EU countries*)
        SetTimeZoneInformation(xExecute:= TRUE, tziInfo:= DTU.GlobalConstants.gc_tziTimeZoneCET);
        IF SetTimeZoneInformation.xDone THEN
            SetTimeZoneInformation(xExecute:= FALSE);
            iState:= 1;
        END_IF
        IF SetTimeZoneInformation.xError THEN
            SetTimeZoneInformation(xExecute:= FALSE);
            iState:= 32767;
        END_IF

Ich muss dort doch irgendwo den +1 hinzufügen können
 
@ oliver.tonn

upsela, da hab ich ein bischen Siemenswelt mit Codesys vermischt. Mit Funktion meinte ich natürlich eine Codesys-PRG, bei Siemens gibts ja FCs ohne Gedächnis und FBs mit Instanz-DBs.

Der Funktionsblock wird natürlich nicht in einem Codesys-Funktionsbaustein aufgerufen, sondern in einem Codesys-Programbaustein.

Sry, da hab ich n bischen was durcheinandergewirbelt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat einer von euch erfahrung mit dieser Variable bzw. Funktion?
Code:
CASE iState OF

    0:    (*set the timezone information
          this gc_tziTimeZoneCET variable includes the date for switch to summer and winter time and the
          bias for the timezone for the Central European EU countries*)
        SetTimeZoneInformation(xExecute:= TRUE, tziInfo:= DTU.GlobalConstants.gc_tziTimeZoneCET);
        IF SetTimeZoneInformation.xDone THEN
            SetTimeZoneInformation(xExecute:= FALSE);
            iState:= 1;
        END_IF
        IF SetTimeZoneInformation.xError THEN
            SetTimeZoneInformation(xExecute:= FALSE);
            iState:= 32767;
        END_IF

Ich muss dort doch irgendwo den +1 hinzufügen können
Wofür willst Du wo +1 hinzufügen/addieren?
 
Hallo,

Ich probiere einmahl die frage in Deutsche sprache.

Ich brauche die Somachine 4.3 (codesys based) software und habe in dieses version eine lib syssocket mit die function 'SysSockPing'.

Jetzt functioniert das immer bekommen ich neur die wert 1.



Hello Everyone,

I have the library in my software with the SysSockPing function. I've installed this but when i try to ping to other devices then i allways get a 1 as respond even if the client o r the ip in the network is unused.

Anyone with a remark, information?

SysSockPing bild.PNG
 

Anhänge

  • SysSockPing bild.jpg
    SysSockPing bild.jpg
    27,2 KB · Aufrufe: 13
Zurück
Oben