Wago Modbus

Hallo,

nach einigem probieren und diesem Forum ist es mir endlich gelungen auf meine Wago 750-841 per Modbus zuzzugreifen.

ModBus_WriteCoil, also Boolsche Werte gehen einwandfrei.

Leider habe ich es bis jetzt nicht geschafft Real(Temperaturen) Werte zu schreiben, das lesen funktioniert.

Ich benutzte IPSV2 -->Datentyp: Real, Leseadresse: 260, Schreibadresse: 260, Timer: 1000ms

Schreibzugriff --> ModBus_WriteRegisterReal( 16445 , 45.2).
Globale Variable in Codesys definiert Vt0 AT %QD130:REAL;

Verschiedene Schreibadressen habe ich schon ausprobiert, leider ohne Erfolg.
Für einen Tipp wäre ich sehr dankbar :slight_smile:

Gruß

       Uwe

Hallo,
dein Problem ist, dass die Modbus-Adresse 260 zu den PFC-OUT-Variablen gehört und desshalb nur von der WAGO Steuerung geschrieben werden kann.
Wenn du eine Variable in IPS lesen und schreiben möchtest, dann geht das nur mit dem Merkerbereich.
hier findest du ein Beispiel der Merker-Modbus-Adressen http://www.ip-symcon.de/forum/f41/wago-750-841-ip-symcon-6739/index3.html
gruss
Rayk

Hallo Rayk,

vielen Dank für Deine Unterstützung.

Jetzt kann ich schreibend zugreifen. Leider kommen die Werte nicht wie gewünscht.

ModBus_WriteRegisterReal( 16445 ,10); wird zu 0
ModBus_WriteRegisterReal( 16445 ,10.1); wird zu 5.510186e-041

Datentyp: Real
Schreib/Leseadresse = 12288
Globale Variable in Codesys --> Vt0 AT %MD0: REAL;

Gruß
Uwe

hast du das problem schon gelöst?
bekomms nämlich auch nicht hin…
als übergangslösung wird auf der einenseite die temperatur * 100 genommen dann als integer rübergeschickt und da wieder / 100 = nachkommastellen bleiben erhalten, aber schön is das ganze nicht

Christian

anders ist es aber leider nicht möglich …

Dieses Problem hatte ich schon hier das erste Mal damals hat Paresy das behoben.

Leider schleicht sich dieser Fehler immer mal wieder ein, paresy hat nach einem Hinweis dies dann immer schnell behoben.

Auch Anfang Oktober hab ich paresy wieder per PN darauf hingewiesen, leider hat er sich bis heute nicht gemeldet:confused:.

@ColdIce
… es ist möglich.

m-f-a

Hallo zusammen,

bin (noch) blutiger Anfänger in IPS.

Kann mir einer einen Tip geben, wie ich Temperaturen aus der WAGO in Real-Format auslesen kann?
Ich habe z.B. Aussentemperatur global in REAL in MD10 stehen.
Ich komme irgendwie nicht weiter, weil ich noch nicht blicke wie ich einen Befehl „lesend“ in IPS verknüpfe.
Meines Wissens schreibt MBT_WriteRegisterReal ja in die Wago. Ich will aber doch nur was lesen :confused:
Ich habe auch versucht die Temperatur in Integer rüber zu holen… aber funzt irgendwie nicht…

Hätte da jemand eine Idee für mich?

Danke im voraus

@palela

Für das auslesen musst du eine neue Instanz (Modbus -> Modbus Device) anlegen.
Bei Datentyp „Real“ auswählen und dann die Schreib % Leseadresse eintragen, Timer aktivieren und dann sollte es funktionieren:).

Die Adresse ist ModbusOffset + (MD 2) in deinem Fall also 12288+(102) = 12308.

m-f-a

na das hört sich ja nicht ganz so schlecht an, dann hoffen wir mal das es bald ausgebessert wird.

Christian

Hallo m-f-a,

Danke für deinen Tip, das geht so…

Allerdings wieso 12308 ???

Ich glaub, ich muss mir die Doku mal wieder reinziehen…

Hallo nochmal,

nachdem ich nun auch die MODBUS-Adressierung blicke, hab ich das Problem einen Real-Wert zu schreiben. Lesen funktioniert super…

Konfiguration in WAGO Codesys:
Temperatur_Arbeitszimmer_Sollwertverschiebung AT %MD28 : REAL;

Abfrage in IPS:
Instanz Modul: Modbus Adress: Datentyp Real
Adresse lesend / schreibend: 12344

Im beigefügten Screenshot möchte ich den Temperatur Sollwert mit +/-2°C korrigieren. Die Variable existiert adäquat in der SPS (nur lesend). Wenn ich in der SPS einen Wert eintrage, werden die Werte im Webfront entsprechend übernommen und dargestellt, somit stimmt meine Adresszuweisung.
Allerdings funktioniert es nicht den Wert im Webfront per Mausklich ändern zu können. Auch wird der Wert nicht in die SPS übertragen, wenn ich ihn in IPS ändere. Der Wert wird irgendwie nicht gesetzt und zur SPS übertragen.
Im Beispiel stehen -2.0°C in der SPS, die von IPS aus nicht mit 0.5°C überschrieben werden.

Was mache ich falsch? Fehlen noch irgendwelche „Aktualisierungsskripte“???

Im Voraus danke für euere Hilfe.

Du musst in der Variable ein Aktionsskript anlegen und dort mit der PHP Funktion den Wert an die SPS weitergeben:

ModBus_WriteRegisterReal - IP-Symcon :: Automatisierungssoftware


ModBus_WriteRegisterReal($IPS_TARGET, $IPS_VALUE);

paresy

hallo paresy,

wenn ich ein skript


ModBus_WriteRegisterReal($IPS_TARGET, $IPS_VALUE);

verknüpfe, hab ich folgenden Fehler (siehe Anhang)

gibt es irgendwo mehr doku zu dem Thema?

Sorry. So sollte es klappen:


 $o = IPS_GetObject($IPS_VARIABLE);
 ModBus_WriteRegisterReal($o['ParentID'], $IPS_VALUE);

paresy

immer noch kein Erfolg…

Nun erstmal zum Verständnis die Frage:
Ich lege doch eine Modbus-Instanz an mit Lese- und Schreib-Adressen (in meinem Fall 12344 mit entsprechendem %MD28 in der SPS)
Demnach sollte ich doch aus dem Objektbaum heraus den Wert doch manuell „schreiben“ können? Schon da kommt nichts auf der SPS an.

In der SPS stehen -1.0
Versuche ich in der Objektansicht einen Wert (+1.5) manuell zu Schreiben, wird er zwar in der Objektansicht übernommen, aber nicht in die SPS geschrieben.
Der Wert bleibt dann solange in der Objektansicht stehen, bis er wieder mit dem Wert aus der SPS (-1.0) überschrieben wird.

Bevor ich mir die Mühe mache irgendwelche Skripte einzubinden, sollte doch vorerst das reine Schreiben funktionieren, oder liege ich da falsch? :confused:

Versuche ich in der Objektansicht einen Wert (+1.5) manuell zu Schreiben, wird er zwar in der Objektansicht übernommen, aber nicht in die SPS geschrieben.

Wenn du die Variable per Doppelklick öffnen willst, gibt es eine Meldung die du unbedingt lesen solltest. Status Variablen zeigen Werte an. Eine Veränderungen kann nur von einem Skript mit dem passenden Befehl geändert werden.

paresy

Hallo Paresy,

bei mir klappt das schreiben von 32Bit Werten in die Wago auch nicht. (Lesen geht problemlos)
Die Wago liest meiner Meinung nach nur 16Bit Register. Bin mir deshalb auch nicht sicher wie das mit 32Bit Werten DWORD oder REAL funktioniert.

Hier ein paar Beispiele:

MBT_WriteRegisterWord($wago_id,12288,12345);

Schreibt 12345 ins MW0 der Wago → ok

MBT_WriteRegisterDWord($wago_id,12288,12345);

Schreibt 2 ins MD0 der Wago → falsch

MBT_WriteRegisterReal($wago_id,12288,123.45);

Schreibt 2.802597e-0452.802597e-045 ins MD0 der Wago --> falsch

Genau aus diesem Grund verwende ich bisher bei Modbus immer 16Bit Ganzzahlen und schiebe mir anschließend das Komma mit DIV10 wieder auf die passende Kommastelle.

Vielleicht könnte das nochmal jemand überprüfen…

Viele Grüße
MTec

Kann ich so bestätigen. Ich bekomme auch die 2.802597E-045 in die SPS geschrieben.

Wie sind die Real-Werte eigentlich in IPS formatiert?
Bei der Auswahl des Datentyp ist 128Bit signed Real angegeben.
Wird die Realzahl bei „Übertragung“ entsprechend in 32Bit konvertiert?

Hallo,

also der Datetyp Real ist 32Bit in IPS, die Doku und die Beschreibung (128Bit Real) wird von paresy bei der nächsten Version korrigiert.

Der komisch Realwert bei euch kommt davon, dass nur 1 Byte von den nötigen 4 Byte beschrieben wird in den anderen 3 Bytes steht also 0.
Somit ist das ganze wenn man es als REAL interpretiert eine sehr, sehr kleine Zahl (ohne jetzt auf den genauen Aufbau von REAL-Zahlen einzugehen).

Da Paresy den Fehler momentan nicht nachvollziehen kann wird es wohl noch etwas dauern bis das wieder klappt.

m-f-a

Hallo,

das kann man ja auch wie weiter oben beschrieben beim DWORD-Wert sehen. Wollte damit nur sagen, dass generell der 32Bit-Schreibzugriff nicht klappt.
In der gesamten Modbus-Doku von Wago steht nichts über direkten 32Bit Zugriff bzw. das REAL-Format. Meiner Meinung nach müsste das über zwei 16Bit Register zurechtgebogen werden - ist aber nur eine Vermutung…

Viele Grüße
MTec