Problem mit MODBUS
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Problem mit MODBUS
Hallo,
ich möchte ein Gerät per Modbus/TCP auslesen.
Ich habe das Modbus-Binding 2.4 installiert. Danach als Thing "Modbus TCP slave" angelegt und die Verbindungsdaten eingetragen.
Zuletzt dann noch das Regular poll - Binding erzeugt und die Modbus-Start-Adresse (1000) und die Länge (78) eingegeben. Per VSC habe ich ein Item erzeugt (siehe Bild). Ich benötige im Moment den Wert aus Register 1078.
Leider bekomme ich keinen Wert in der Sitemap angezeigt.
Ich habe es auch mit der Channel-Bezeichnung vom Modbus TCP Slave versucht, leider auch hier ohne Ergebnis.
Wer kann mir bei der Einrichtung der Modbus-Verbindung helfen?
Besten Dank!
ich möchte ein Gerät per Modbus/TCP auslesen.
Ich habe das Modbus-Binding 2.4 installiert. Danach als Thing "Modbus TCP slave" angelegt und die Verbindungsdaten eingetragen.
Zuletzt dann noch das Regular poll - Binding erzeugt und die Modbus-Start-Adresse (1000) und die Länge (78) eingegeben. Per VSC habe ich ein Item erzeugt (siehe Bild). Ich benötige im Moment den Wert aus Register 1078.
Leider bekomme ich keinen Wert in der Sitemap angezeigt.
Ich habe es auch mit der Channel-Bezeichnung vom Modbus TCP Slave versucht, leider auch hier ohne Ergebnis.
Wer kann mir bei der Einrichtung der Modbus-Verbindung helfen?
Besten Dank!
Ups. Der Doppelpunkt nach dem return soll ein Semikolon sein. 
Also um die Rule mal auseinander zu nehmen:
Der Rahmen der Rule. Zwischen when und then stehen der oder die Trigger. Zwischen then und end steht der Code, der ausgeführt wird, wenn die Rule getriggert wird.
Wahr, falls der Status vom Typ Number ist
Das Ausrufezeichen ist das NOT der DSL, also "wenn nicht wahr..."
Rule beenden
Dieser Schritt (Prüfung auf Type Number) ist essentiell, denn ein Item vom Typ Number kann auch den Status NULL oder UNDEF halten, beide sind nicht vom Typ Number, ein Type Casting (as Number) wird dann eine Nullpointer Exception auslösen.
Definiere eine Konstante strP_Netz vom Typ String (als Objekt)
Absolutwert von Zahl (also die Zahl ohne ihr Vorzeichen)
Wandle nach String.
Setze das Item auf den Wert
Ternärer Operator, falls die Bedingung erfüllt ist, der erste Wert, ansonsten der zweite Wert. Durch die Umstellung (0 < Wert) kann man einmal Klammern sparen. Ansonsten müsste man
schreiben, da das as Number leider eine niedrigere Priorität als das > hat, obwohl das eher unlogisch erscheint...
Gehe zur vollständigen Antwort
Also um die Rule mal auseinander zu nehmen:
Code: Alles auswählen
rule "Update Modus"
when
Item P_Netz changed
then
end
Code: Alles auswählen
P_Netz.state instanceof Number
Code: Alles auswählen
if(!(boolean))
Code: Alles auswählen
return;
Rule beenden
Dieser Schritt (Prüfung auf Type Number) ist essentiell, denn ein Item vom Typ Number kann auch den Status NULL oder UNDEF halten, beide sind nicht vom Typ Number, ein Type Casting (as Number) wird dann eine Nullpointer Exception auslösen.
Code: Alles auswählen
val String strP_Netz =
Code: Alles auswählen
Math::abs(Zahl)
Code: Alles auswählen
.toString
Code: Alles auswählen
Modus.postUpdate(Wert)
Code: Alles auswählen
(if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: ")
Code: Alles auswählen
(if((P_Netz.state as Number) > 0)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit MODBUS
Hast Du denn auch Channel angelegt?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit MODBUS
Hallo Udo,
in der PaperUI habe ich nur das Binding eingerichtet und die beiden Things Modbus TCP slave und Regular poll.
In der Item-Datei unter VSC habe ich Channel angelegt z.B.:
Ich bekomme keinen Wert.
Viele Grüße
in der PaperUI habe ich nur das Binding eingerichtet und die beiden Things Modbus TCP slave und Regular poll.
In der Item-Datei unter VSC habe ich Channel angelegt z.B.:
Code: Alles auswählen
Number Input1078 "Input register 1078 [%s]" { channel="modbus:poller:ada30152:inputRegisters:input1078:number" }
Viele Grüße
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit MODBUS
Nein, in der Items-Datei kannst Du nur Channel verlinken, anlegen musst Du sie aber im Thing. Der korrekte Link zum Channel wird dann auch im Thing angezeigt, hier darf man nicht einfach nehmen, was man mag...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit MODBUS
Das habe ich gemerkt!

Hab es nun geschafft. Es war eine schwere Geburt

Das erste Mal habe ich vom Binding über Thing bis zum Item alles in der PaperUI eingerichtet.
Zur Verwendung in Rules habe ich die Items in einer Datei noch einmal angelegt,
da ich irgendwie mit der Syntax aus den PaperUI-Items keinen Erfolg in den Rules hatte. Ist das normal?
Besten Dank Udo!!!
Viele Grüße
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit MODBUS
Es gibt keinen Unterschied zwischen Items, die in Paper UI und solchen, die über *.items Dateien angelegt wurden. Abgesehen natürlich von der Quelle (und es gibt ein paar Dinge, die nicht über Paper UI angelegt werden können)
Items dürfen natürlich nicht doppelt angelegt werden, aber ich nehme an, das hast Du auch nicht so gemeint
Items dürfen natürlich nicht doppelt angelegt werden, aber ich nehme an, das hast Du auch nicht so gemeint

openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit MODBUS
Ich habe die Items in der PaperUI gelöscht, nachdem ich sie per VSC nochmals angelegt habe.
Was ich merkwürdig finde, ist die Tatsache, das mir VSC bei der Verwendung der PapeUI-Items ständig Fehler in Form roter Wellenlinien ausgibt.
Kann das sein, das der Namens-Syntax der PaperUI-Items in VSC trotz Synchronisation nicht bekannt ist?
Jedenfalls bin ich froh, das es funktioniert!
Besten Dank für Deine Denkanstösse!
Was ich merkwürdig finde, ist die Tatsache, das mir VSC bei der Verwendung der PapeUI-Items ständig Fehler in Form roter Wellenlinien ausgibt.
Kann das sein, das der Namens-Syntax der PaperUI-Items in VSC trotz Synchronisation nicht bekannt ist?
Jedenfalls bin ich froh, das es funktioniert!
Besten Dank für Deine Denkanstösse!
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit MODBUS
Ich habe versucht, die Darstellung des Energiefluss zu verfeinern.
Dabei bin ich auf ein Problem gestossen, das ich trotz Lesen vieler Posts noch immer nicht richtig verstanden habe:
Die Konvertierung von Daten z.B. STRING >>> NUMBER oder NUMBER >>> STRING.
Strings lassen sich sehr gut übertragen aber man kann mit ihnen nicht rechnen.
Folgende Konstellation:
Items
Das Item P_Netz kann positive oder negative Werte enthalten.
In einer Rule übergebe ich das dann an ein Item (Modus) zur Darstellung:
Ich habe versucht, von den negativen Werten das Vorzeichen zu entfernen durch Multiplikation mit -1.
z.B. P_Netz.state * (-1) oder nur P_Netz * (-1)
Leider ohne Erfolg.
Wie muss die Syntax aussehen, damit es funktioniert?
Besten Dank!
Dabei bin ich auf ein Problem gestossen, das ich trotz Lesen vieler Posts noch immer nicht richtig verstanden habe:
Die Konvertierung von Daten z.B. STRING >>> NUMBER oder NUMBER >>> STRING.
Strings lassen sich sehr gut übertragen aber man kann mit ihnen nicht rechnen.
Folgende Konstellation:
Items
Code: Alles auswählen
Number P_Netz "Leistung am Messpunkt" {channel="modbus:data:7175ff16:number"}
String Modus "Flussrichtung[%s]"
In einer Rule übergebe ich das dann an ein Item (Modus) zur Darstellung:
Code: Alles auswählen
//Modus Netzeinspeisung/Netzbezug
if (P_Netz.state > 0)
{Modus.postUpdate("Netzeinspeisung: "+ P_Netz.state + " W")}
else
{Modus.postUpdate("Netzbezug: "+ P_Netz.state +" W")}
z.B. P_Netz.state * (-1) oder nur P_Netz * (-1)
Leider ohne Erfolg.
Wie muss die Syntax aussehen, damit es funktioniert?
Besten Dank!
- udo1toni
- Beiträge: 15248
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Problem mit MODBUS
Deine Rule sollte mehr oder weniger so funktionieren:
Die Konstante strP_Netz wird mit dem Absolutwert des Itemsstatus befüllt.
Der ternäre Operator if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: " sieht etwas unkonventionell aus
klappt aber, wenn er in Klammern steht.
Ansonsten kannst Du natürlich auch den Wert mit -1 multiplizieren, aber Du musst beachten, dass eine Zahl eine Zahl ist. Dass Du den Status einfach so verwenden kannst, liegt nur daran, dass openHAB gnädig ein .toString anhängt, um aus dem Status einen String zu bilden.
In Deiner Formel wäre der negative Wert z.B. so möglich:wobei openHAB hier liebenswürdigerweise das Typecasting nach Number ergänzt (ein Status ist ein Status, und keine Zahl)
Code: Alles auswählen
rule "Update Modus"
when
Item P_Netz changed
then
if(!(P_Netz.state instanceof Number))
return;
val String strP_Netz = Math::abs(P_Netz.state as Number).toString
Modus.postUpdate((if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: ") + strP_Netz +"W")
end
Der ternäre Operator if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: " sieht etwas unkonventionell aus

Ansonsten kannst Du natürlich auch den Wert mit -1 multiplizieren, aber Du musst beachten, dass eine Zahl eine Zahl ist. Dass Du den Status einfach so verwenden kannst, liegt nur daran, dass openHAB gnädig ein .toString anhängt, um aus dem Status einen String zu bilden.
In Deiner Formel wäre der negative Wert z.B. so möglich:
Code: Alles auswählen
"Netzbezug: " + (-P_Netz.state).toString + "W"
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 600
- Registriert: 20. Sep 2019 05:49
Re: Problem mit MODBUS
Interessante Variante! Mit meinen Programmierkenntnissen aus VB6-Zeiten musste ich mir das mehrmals durchlesen
Schau bitte mal, ob ich das richtig verstanden habe:
Hier wird geprüft, ob P_Netz.state einen Wert vom Typ 'Number' beinhaltet? Ist das notwendig? Die Variable ist doch vom Typ 'Number' deklariert.
Ist das nicht der Fall, wird die Rule abgebrochen.
Number wird nach String gewandelt. Ist das so etwas wie 'int_X = (Float::parseFloat(strX))' von String nach Number?
Der Rest ist mir klar.
Leider funktioniert der Code nicht. Der Doppelpunkt nach 'return' wird bemängelt.
Ich habe mir in der Zwischenzeit mit diesem Konstrukt weiter geholfen:
Ich weiss nicht, ob mir mein Halbwissen eine funktionierende Funktion vorgaukelt
Besten Dank und schönen Sonntag noch!

Schau bitte mal, ob ich das richtig verstanden habe:
Code: Alles auswählen
if(!(P_Netz.state instanceof Number))
return:
Ist das nicht der Fall, wird die Rule abgebrochen.
Code: Alles auswählen
val String strP_Netz = Math::abs(P_Netz.state as Number).toString
Der Rest ist mir klar.
Leider funktioniert der Code nicht. Der Doppelpunkt nach 'return' wird bemängelt.
Code: Alles auswählen
2020-01-05 11:02:58.585 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'energieerzeugung.rules' has errors, therefore ignoring it: [65,15]: mismatched input ':' expecting 'end'
Code: Alles auswählen
rule "Update Modus"
when
Item P_Netz changed
then
if (P_Netz.state > 0)
{Modus.postUpdate("Netzeinspeisung: "+ P_Netz.state.toString + " W")}
else
{Modus.postUpdate("Netzbezug: "+ (P_Netz.state.toString.replaceAll("-","") +" W"))}
end

Besten Dank und schönen Sonntag noch!