Netzvariablen

e-pappy
2007-07-25
2007-07-26
  • e-pappy - 2007-07-25

    Hallo!

    Hab mal eine Frage: Wenn ich zwischen 2 oder mehreren Controllern (WAGO 841) Variablen austauschen möchte, dann kann ich das ja entweder über diese Querkommunikation oder aber über die Netzvariablen machen, oder?

    Jetzt habe ich nur folgendes Problem: Bei der Querkommunikation müsste ich ja alle Variablen, die ich in meinem Programm verwende und welche keine Hardwareadressen sind, in den Merkerbereich schreiben. Allerdings finde ich das ganz schön mühselig, zumal ich auch Retain-Variablen im Programm benutze, die ebenfalls Speicherplatz aus dem Merkerbereich nutzen und es somit ggf. zu Komplikationen führen kann.

    Einfacher wäre es in dem Fall also mit den Netzvariablen, die zwar den Bus mehr belasten, jedoch diese ganze Arbeit mit dem Merkerbereichen ersparen. Nun habe ich aber teilweise dieselben Variablen in meinen 3 Controllern. Sprich es gibt da eine Variable, die sich xZSP_Aktiv nennt, aber genau denselben Namen auch in den anderen beiden Programmen besitzt.

    Wenn ich hier jetzt die Netzvariablen aktiviere, dann weiß der Controller, der diese Variablen empfängt doch gar nicht, von wem diese Variable jetzt kommt?! Deshalb meine Frage: Muss ich den Variablen eindeutige Namen geben, damit sie im Netzwerk gesendet und empfangen werden können oder kann man dieselbe Variable anhand einer vorangestellten IP identifizieren?

    Für einen kurzen Wink wäre ich sehr dankbar, da ich das in kürze realisieren muss, jedoch noch kein Stück weiter bin, was die Programmierarbeit angeht. Ich muss nämlich 3 Lüftungsanlagen, die bereits programmiert sind, miteinander vernetzen, sodass man von jeder Anlage aus auch die anderen beiden bedienen kann.

     
  • mwatermann - 2007-07-25

    wir nutzen den austausch von netzvariablen ebenfalls, allerdings mit nur 2 controllern.

    die erstellte .exp datei wird eindeutig benannt, zB "Controller1_100_VarTyp.exp".

    dies haben wir so gewählt, damit man hier schon erkennt, welcher controller die dateien/variablen schreibt/sendet (nämlich controller1), welche COB-ID dem netzwerkpaket zugeilt ist (100) und was für variablen sich darin befinden (VarTyp, zB setup werte, sensor werte, etc.).

    fest gelegt haben wir ebenfalls, dass immer nur einer der beiden controller den wert schreibt und der andere liesst. würde controller2 nun auch werte schreiben und nicht empfangen wollen, gibt es bei uns eine zweite netzwerkdatei, die dann zB "Controller2_200_VarTyp.exp" heisst.

    Mit der einstellung "Read&Write" als netzwerkvariable haben wir noch keine erfahrung.

    querkommunikation sagt mir leider gar nichts...

     
  • e-pappy - 2007-07-25

    Aber ihr richtet eure Programme doch sicherlich auch von vorn herein auf diese Netzvariablen ein, oder? Habe nämlich gerade festgestellt, dass wenn ich jetzt nachträglich einige Variablen in eine Globale_Netzvariablenliste einfüge, mir die Variable ja im eigentlichen Programmteil fehlt. Demnach fehlt mir diese Variable auch auf meinem Panel, da hier mit Hilfe dieses Symbolfiles angegeben ist, von wo die Variable gelesen werden soll.

    Also auf dem Controller wo ich Werte lesen möchte, mache ich logischer Weise eine Variablenliste mit dem Haken bei "Lesen". Und auf dem Controller von wo aus ich Werte senden möchte einen Haken bei "Schreiben".

    Sprich, wenn ich auf Controller A jetzt Werte von Controller B einlese, kann ich diese Werte dann auch auf Controller A verändern, so dass sie in Controller B geschrieben werden?

    Und wie verhält sich das denn mit gleichen Variablennamen?

     
  • mwatermann - 2007-07-25

    das wäre dann der fall, wenn häkchen bei lesen UND schreiben wären. dies haben wir aber versucht zu vermeiden. kann also nicht sagen, ob und wie das klappt.

    du musst auf jeden fall sicherstellen, dass immer nur ein controller "bevollmächtigt" ist, die variablen zu ändern. dies könnte durch ein zusätzliches flag in der variablenliste geschehen, welches auf FALSE sein muss, wenn zugriff/änderung der variablen erlaubt ist. dies setzt voraus, dass du für funktionen, die mit diesen variablen ändern, genaue abfragen abarbeitest. hierzu wird sicherlich die funktion (der haken) "transmit only on change" auch hilfreich sein. so kannst du ausserdem deine buslast auf ein minimum reduzieren, wenn du keine zyklische übertragung benötigst.

    da diese netzwerkvariablen listen aber, wie du schon sagtest, global sind, sollten dir diese natürlich auch in deinem normalen programm zur verfügung stehen; >Zitat:
    Habe nämlich gerade festgestellt, dass wenn ich jetzt nachträglich einige Variablen in eine Globale_Netzvariablenliste einfüge, mir die Variable ja im eigentlichen Programmteil fehlt.

    das verstehe ich deshalb nicht...

    edit (glaube jetz hab ich deine letzte frage verstanden):

    doppel-deklaration geht natürlich nicht.

    nehm doch einfach deine im normalen prog deklarierten variablen und schreib die benötigten in die globale netzwerk liste.

     
  • e-pappy - 2007-07-25

    Zitat:
    da diese netzwerkvariablen listen aber, wie du schon sagtest, global sind, sollten dir diese natürlich auch in deinem normalen programm zur verfügung stehen;
    Zitat:
    Habe nämlich gerade festgestellt, dass wenn ich jetzt nachträglich einige Variablen in eine Globale_Netzvariablenliste einfüge, mir die Variable ja im eigentlichen Programmteil fehlt.
    das verstehe ich deshalb nicht...

    Die Variable an sich ist ja auch noch verfügbar, halt nur unter einem anderen Präfix! Sprich, hatte ich vorher eine Variable var1 im PLC_PRG oder einem Unterprogramm. Wenn ich diese Variable jetzt in die Globale Variablenliste verschiebe, dann kan ich aber mit meinem Panel nicht mehr darauf zugreifen. Das Panel wird über ein sogenanntes Symbolfile, dass man aus der Codesys erstellen kann, konfiguriert. Hier steht dann beispielsweise drin PLC_PRG.var1 - demnach befindet sich die var1 im PLC_PRG. Nachdem ich die Variable verschoben habe, befindet sich die Variable aber nicht mehr dort und deshalb kann ich diese dann nicht mehr bedienen.

    Wenn ich jetzt also alle Variablen Netzfähig machen möchte, muss ich zwangsweise auch alle Variablen im Panel ändern.

    Darf man fragen was ihr für Bediengeräte für die WAGO Controller benutzt? Also damit der Endkunde die Anlagen bedienen kann?

     
  • Oberchefe - 2007-07-25

    Wenn die Variable nur in eine Richtung geht kannst Du sie ja ggf. wieder in einem extra Programmteil einer anderen zuweisen, wenn also beispielsweise eine Variable über's Netzwerk gelesen wird und demzufolge im Controller als Globale angelegt werden muß, dann kannst Du im Programm wieder sagen:

    LokaleVariable1:=GlobaleVariable1;
    

    Ich bevorzuge für die Kommunikation mit Bedienpanels (egal bei welcher SPS) einen eigenen Datenbereich. Dieser bekommt dann den Präfix "HMI" im Namen, dann weiß ich jederzeit im Programm ob eine Variable auch vom Bedienpanel aus geändert werden kann oder nicht ohne lange in irgendwelchen Listen nachzuschauen.

    Ich mache mit drei 750-841 Querkommunikation, das Bedienpanel hat nur Zugriff auf einen davon (leider nur eine serielle Schnittstelle). Eingabewerte werden deshalb von diesem Controller auf die beiden anderen verteilt, Anzeigewerte gehen in die andere Richtung. Auch ich habe den Netzwervariablen den Controllernamen (abgekürzt) als Präfix für die jeweiligen Netzwervariablen vorangestellt, so weiß ich jederzeit woher die Werte stammen.

    Empfehlenswert ist auch eine extra Routine für Zuordnungen zu den Netzwerkvariablen, so lassen sich die Verbindungen zu den anderen Controllern später leichter nachvollziehen, also in der Art:

    Variable1:=Controller2_Variable1;
    Controller1_Variable1:=VariableXY;
    

    (wobei der eigene Controller natürlich die Nummer 1 hat)

     
  • mwatermann - 2007-07-26

    @e-pappy:

    haben eigene SPSen auf basis des XC167, ebenso wie eigene HMIs, ebenfalls mit eigenenm controller. der eigentliche controller, der die rechenoperationen übernimmt ist halt über CAN mit dem HMI verbunden. hierzu nutzen wir die netzwerkvariablen.

    wenn du im nachhinein umstellst, müsstest du, da die netzvars global sind, dein "PLC_PRG." vor den betroffenen variablen zuordnungen entfernen.

     
  • e-pappy - 2007-07-26

    @ Oberchefe

    Das mit dem eigenen Programm teil ist eine sehr gute Idee!

    Und da Du soeben erwähnt hast, dass Du drei Controller miteinander gekoppelt hast... Dürfte ich wohl fragen, ob ich mir einmal Deine Programme anschauen darf? Es geht mir dabei auch nicht um den Inhalt, sondern rein um die Kommunikation. also Werte auslesen und anzeigen und Werte verändern...

    @mwatermann

    Eigene HMI's? Wie heißt denn die Firma, bei der Du tätig bist?

     
  • mwatermann - 2007-07-26

    @pappy:

    nennt sich MOBA (mobile automation). machen steuerungen und automatisierung für baumaschinen. im genannten konkreten fall setzen wir einen main controller ein, der sensoren über can liest und berechnungen ausführt und diese über einen 2ten can an das hmi (ebenfall ein eigenständiger controller) schickt. ist also eine codesys applikation pro controller; und hier arbeiten wir halt eben auch mit den netzwerklisten...

    hatten aber auch schon einige stolpersteine in verbindung mit can und codesys... leider ist die canopen einbindung von 3s auch noch alles andere als optimal; sobald wir die libraries einbinden, steigt die zykluszeit um ca. 10ms

     
  • Oberchefe - 2007-07-26

    also hier als Beispiel ein Screenshot vom EG Controller:

    IMG: Netzwerkvariablen.gif

     
  • Oberchefe - 2007-07-26

    für jeden sendenden Controller (also 3 in meinem Fall) gibt's eine Datei zur Variablenkonfiguration. Sollen neue ergänzt werden mache ich dies erst direkt in der Datei mit Notepad. Danach das Programm erst öffnen (alternativ übersetzen), jetzt stehen die Variablen als globale zur Verfügung.

     
  • Oberchefe - 2007-07-26

    und anbei eine dieser 3 Dateien als Beispiel im Anhang

    Wago EG.zip [236 Bytes]

     

Log in to post a comment.