Problem mit MODBUS

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Problem mit MODBUS

Beitrag von violine21 »

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.
MODBUS.jpg
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!
von udo1toni » 5. Jan 2020 20:24
Ups. Der Doppelpunkt nach dem return soll ein Semikolon sein. :)

Also um die Rule mal auseinander zu nehmen:

Code: Alles auswählen

rule "Update Modus"
when
    Item P_Netz changed
then
end
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.

Code: Alles auswählen

P_Netz.state instanceof Number
Wahr, falls der Status vom Typ Number ist

Code: Alles auswählen

if(!(boolean))
Das Ausrufezeichen ist das NOT der DSL, also "wenn nicht wahr..."

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 = 
Definiere eine Konstante strP_Netz vom Typ String (als Objekt)

Code: Alles auswählen

Math::abs(Zahl)
Absolutwert von Zahl (also die Zahl ohne ihr Vorzeichen)

Code: Alles auswählen

.toString
Wandle nach String.

Code: Alles auswählen

Modus.postUpdate(Wert)
Setze das Item auf den Wert

Code: Alles auswählen

(if(0 < P_Netz.state as Number) "Netzeinspeisung: " else "Netzbezug: ")
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

Code: Alles auswählen

(if((P_Netz.state as Number) > 0)
schreiben, da das as Number leider eine niedrigere Priorität als das > hat, obwohl das eher unlogisch erscheint...
Gehe zur vollständigen Antwort
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Problem mit MODBUS

Beitrag von udo1toni »

Hast Du denn auch Channel angelegt?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

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.:

Code: Alles auswählen

Number Input1078     "Input register 1078 [%s]"  { channel="modbus:poller:ada30152:inputRegisters:input1078:number" }
Ich bekomme keinen Wert.

Viele Grüße

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Problem mit MODBUS

Beitrag von udo1toni »

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

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

udo1toni hat geschrieben: 29. Dez 2019 19:48 ... hier darf man nicht einfach nehmen, was man mag...
Das habe ich gemerkt! 8-)
Hab es nun geschafft. Es war eine schwere Geburt ;) Die Register-Dokumentation des Geräts ist sehr "schmal" gehalten.
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

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Problem mit MODBUS

Beitrag von udo1toni »

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 ;)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

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!

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

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

Code: Alles auswählen

Number	P_Netz	"Leistung am Messpunkt"	{channel="modbus:data:7175ff16:number"}
String	Modus	"Flussrichtung[%s]"
Das Item P_Netz kann positive oder negative Werte enthalten.
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")}
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!

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Problem mit MODBUS

Beitrag von udo1toni »

Deine Rule sollte mehr oder weniger so funktionieren:

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
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:

Code: Alles auswählen

"Netzbezug: " + (-P_Netz.state).toString + "W"
wobei openHAB hier liebenswürdigerweise das Typecasting nach Number ergänzt (ein Status ist ein Status, und keine Zahl)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

violine21
Beiträge: 600
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Problem mit MODBUS

Beitrag von violine21 »

Interessante Variante! Mit meinen Programmierkenntnissen aus VB6-Zeiten musste ich mir das mehrmals durchlesen :shock:
Schau bitte mal, ob ich das richtig verstanden habe:

Code: Alles auswählen

if(!(P_Netz.state instanceof Number))
        return:
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.

Code: Alles auswählen

val String strP_Netz = Math::abs(P_Netz.state as Number).toString
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.

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'
Ich habe mir in der Zwischenzeit mit diesem Konstrukt weiter geholfen:

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
Ich weiss nicht, ob mir mein Halbwissen eine funktionierende Funktion vorgaukelt ;)

Besten Dank und schönen Sonntag noch!

Antworten