NEWS
Modbus Lesen und Schreiben auf Wago 750-881 [Gelöst]
-
Hallo
ich bin ganz neu auf IoBroker gestossen. Inzwischen habe ich bereits auch schon so einige Sachen ausprobiert und bin nach einigen Ausprobieren auch erfolgreich gewesen. So habe ich zum Beispiel ESP8266 mit ESPMega per MQTT Protokoll auslesen können. Außerdem kann ich einen Sentron Pac Meßgerät per Modbus ausgelesen.
Allerdings bin ich jetzt auf ein Problem gestoßen das ich bisher einfach nicht lösen kann.
Ich habe bei mir Zuhause mehrere Wago Steuerungen 750-881 in Betrieb. Die Steuerungen kommunizieren untereinander per Modbus.
Jetzt zu meinem Problem:
-
Wie kann ich einen Temperaturwert, den ich per MQTT mit IoBroker auslese per Modbus auf eine WagoSteuerung in die Adresse %MD100 schreiben?
-
Wie kann ich einen Binären Zustand aus der Wago auslesen, z.B. Die Adresse %MX0.4 ?
Ich betreibe den IoBroker auf einem Raspberry 3b+
Plattform: linux
Die Architektur: arm
CPUs: 4
Geschwindigkeit: 1400 MHz
Modell: ARMv7 Processor rev 4 (v7l)
RAM: 927.1 MB
System uptime: 1 T. 23:31:10
Node.js: v8.12.0
NPM: 4.6.1
Adapter zählen: 228
Uptime: 1 T. 23:31:06
Als Adapter benutze ich :
ModBus Version 2.09
MQTT Version 2.03
Es wäre schön wenn mir hier jemand helfen könnte.
Schon mal vielen Dank im Voraus.
-
-
Hallo,
ich gehe mal davon aus, dass die Temperatur via MQTT als Datenpunkt vorliegt. Ich habe mich mit MQTT noch nicht beschäftigt. Als nächstes musst du im Modbus-Adapter unter Holding-Register die Adresse in der Wago anlegen. Das Handbuch listet im Kapitel 12 die Registerbelegung auf. Wenn du also %MD100 beschreiben willst, musst die im ioBroker die Adresse 12488 bei Holding-Register anlegen. Erklärung hierzu:
Laut Handbuch Merker ab 12288 beschreibbar. Da du Double-Werte schreiben willst sind dies immer 2 Register -> MD100 = 200 Register (Word) -> 12288+200 = 12488.
Lesen ist ähnlich: Bei diskrete Eingänge die Adresse 12292 anlegen. Startadresse wieder 12288 + 4 (Merker 0.4).
Man muss hier auf passen, da der Merkerbereich immer bei 12288 anfängt, also %MX0.1 ist ein binärer Merker ist aber genauso im %MW0 und %MD0 vorhanden. Dazu habe ich irgendwo mal eine Exceltabelle gefunden, die ich mal anhänge.
Wenn du alle Datenpunkte angelegt hast musst du dir noch ein Skript schreiben welches bei Änderung der Temperatur diese auf das entsprechende Register schreibt. Geht vielleicht auch eleganter, aber ich bin nicht so der Skriptspezialist. Im https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md#on–-subscribe-on-changes-or-updates-of-some-state steht etwas von
To simply connect two states with each other, write: on('stateId1', 'stateId2'); All changes of stateId1 will be written to stateId2.
Gruß
-
Vielen Dank für deine Tipps.
Das mit dem Lesen klappt auch soweit jetzt, nur mit dem Schreiben hapert es noch.
Das Skript mit dem der wert von MQTT in das Modbus Register geschrieben wird funktioniert, das habe ich mit Blockly erstellt.
IoBroker scheint auch auf das richtige Register in Codesys zuzugreifen, nur überträgt er einfach nicht den Wert obwohl der Wert in der Objektliste auftaucht der geschrieben werden soll.
Vielleicht kann mir ja jemand helfen.
-
Hallo
mal wieder ein Update.
Lesen klappt eigentlich wunderbar, nur Schreiben bereitet mir immer mehr Probleme.
Wenn ich die Adresse 12306 einfach händisch beschreibe wird der Wert sauber übertragen. Lasse ich mein Skript laufen wird mir zwar in der Objektansicht der Wert angezeigt und auch entsprechend aktualisiert (Ansicht Objekte) aber nicht zur Wago übertragen. Es passiert einfach nichts.Der zuletzt händisch übertragene Wert bleibt einfach stehen.
Habe ich einen Denkfehler in meinem Skript (die Multiplikation mit 100 mache ich um die Kommastellen in eine ganze Zahl umzuwandeln, damit ich mit dem Datenformat klarkomme) oder liegt hier ein genereller Fehler vor.
Außerdem kommt bei mir immer mehr die Frage auf was die ganzen Werte die ich in der Spalte "Rolle" einstellen kann für einen Sinn haben?
Also Fragen über Fragen, ich hoffe mir kann jemand helfen.
9326_codesys.jpg
9326_iobroker_instanz.jpg
9326_iobroker.jpg
9326_iobroker_skript.jpg -
Nimm mal den Haken bei CW beim Register 12304 raus.
-
Hallo das hat leider nichts gebracht.
Ich habe jetzt mal alle Adressen auf die ich lesend zugegriffen habe auch mal gelöscht. Auch dann klappt es nicht.
Langsam bin ich am Ende :?
-
Kannst du mal dein Blockly exportieren und hier posten. Ich probier das mal an meinem Testsystem aus.
Gruß
Thomas
-
Also wenn ich den automatisch eingetragenen Wert in der Objektliste anklicke, so das ich ihn editieren könnte, wird er übertragen.
Also sieht es so aus als wenn ich die Übertragung aktivieren müsste.aber wie?????????
-
Hallo
ich habe den Blockly exportiert.
<xml 1999/xmlns="<URL url=" http:/www.w3.org/xhtml"="">http://www.w3.org/1999/xhtml">
<block type="on_ext" id="W0As]a,[q5I,{{RNGICx" x="-312" y="13"><mutation items="1"></mutation>
<field name="CONDITION">ne</field>
<value name="OID0"><shadow type="field_oid" id="K?bn+]ZoWWW]7WdJ,ITS"><field name="oid">mqtt.0.Bad_unten.Bad_unten.Luftfeuchtigkeit</field></shadow></value>
<statement name="STATEMENT"><block type="update" id="RNH(k;~btRWeOed(}lN}"><mutation delay_input="false"></mutation>
<field name="OID">modbus.2.holdingRegisters.12306_test</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE"><block type="math_arithmetic" id="|XBX5G581KA.nBxSoIH4"><field name="OP">MULTIPLY</field>
<value name="A"><shadow type="math_number" id="SRq./}*,tmVXrHBL?1CB"><field name="NUM">1</field></shadow>
<block type="get_value" id="c9mFy}GzM7deCQX5T`~n"><field name="ATTR">val</field>
<field name="OID">mqtt.0.Bad_unten.Bad_unten.Luftfeuchtigkeit</field></block></value>
<value name="B"><shadow type="math_number" id="@JW}_
lm|{yc-mk]=I
%"><field name="NUM">100</field></shadow></value></block></value></block></statement></block><block type="variables_get" id="a,:_/cb)XP]Xo#~c5RYs" x="-13" y="63"><field name="VAR">umrechnung</field></block></xml>
-
Und hier nochmal als Screenshot
9326_blockly.jpg -
So, es funktioniert. Habe mir mal den Code vom Blockly anzeigen lassen und den auf mein Testsystem angepasst.
on({id: 'modbus.0.inputRegisters.0_T_WZ_AI', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; setState("modbus.1.holdingRegisters.770_ID129", (getState("modbus.0.inputRegisters.0_T_WZ_AI").val * 1), true); });
Mir ist aufgefallen, dass beim setState ein "true" dranhängt. Das ist lt. Doku der ack-Wert. Wenn ich das richtig verstehe denkt ioBroker, das der Wert geschrieben wurde. Habe den Code also als neues Skript angelegt und ",true" gelöscht. Damit funktioniert es.
Du musst nicht den Blockly-System-Baustein "aktualisiere" nehmern sondern "steuere". Damit geht es. Ich weiß nicht genau den Unterschied, da kann vllt. einer der anderen Experten weiterhelfen.
Gruß
Thomas
-
Habe die Erklärung für "steuere" und aktualisiere" gefunden
-
Vielen Dank für deine Bemühungen!!!!!!
Genau das war es.
viele Grüße aus dem Norden
Uwe
-
Gern geschehen.
Kannst du den Titel noch um ein [Gelöst] vorne ergänzen.
Gruß aus dem Rheinland
Thomas
-
@stromer66 kannst du mir sagen, welche Konfiguration du genommen hast....bei der Wago und beim IOBroker ? Ich bekomme keine Verbindung zustande...von der Wago aus dem IOBroker kann ich lesen. Aber ich kann nichts auf die Wago schreiben...
Vielen Dank