Re: Problem mit MODBUS
Verfasst: 5. Jan 2020 20:24
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...

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)