How to compare two variables from a java class in jess and execute a rule?

301 Views Asked by At

I'm beginner in Jess. I'm trying to compare two variables from a Java class in Jess and trying to execute a rule.

I have imported cTNumber and measuredCurrent (both are integer)form a java class called CurrentSignal. Similarly imported vTNumberand measuredVoltage form a java class DERSignal. Now I want to make a rule such that if cTNumber is equal to vTNumber then multiply measuredCurrent and measuredVoltage (Both are double) for calculating power.

I'm trying in this way....

(import signals.*)
(deftemplate CurrentSignal (declare (from-class CurrentSignal)))
(deftemplate DERSignal (declare (from-class DERSignal)))

(defglobal ?*CTnumber* = 0)
(defglobal ?*VTnumber* = 0)
(defglobal ?*VTnumberDER* = 0)

(defglobal ?*measuredCurrent* = 0)
(defglobal ?*measuredVoltage* = 0)
(defglobal ?*measuredVoltageDER* = 0)


(defrule Get-CT-Number

   (CurrentSignal (cTNumber ?m)) 
   (CurrentSignal (measuredCurrent ?c))

=>
    (bind ?*measuredCurrent* ?c)
      (printout t "Measured Current : " ?*measuredCurrent*" Amps"crlf)
    (bind ?*CTnumber* ?m)
      (printout t ?*CTnumber* crlf)
)


(defrule Get-DER-Number

   (DERSignal (vTNumber ?o)) 
   (DERSignal (measuredVoltage ?V))

=>
     (bind ?*measuredVoltageDER* ?V)
       (printout t "Measured Voltage : " ?*measuredVoltageDER* " V" crlf)
    (bind ?*VTnumberDER* ?o)
       (printout t ?*VTnumberDER* crlf)
)


(defrule Power-Calculation-DER-signal

    "Power calculation of DER Bay"

    (test (= ?*CTnumber* ?*VTnumberDER* ))
    =>

  (printout t "Total Generation : " (* ?*measuredCurrent* ?*measuredVoltageDER*) crlf)
)

But the Total Generation is showing 0. But I tried calculating in Java and it's showing a number. Can anyone please help me to solve this problem. Thank you.

1

There are 1 best solutions below

2
On

Why don't you do it all in a single rule?

(defrule Power-Calculation-DER-signal
  (CurrentSignal (cTNumber ?m)(measuredCurrent ?c))
  (DERSignal {vTNumber == ?m} (measuredVoltage ?V))
=>
  (printout t "Total Generation : " (* ?c ?V) crlf)
)

Using globals the way you did is not a good idea. A change does not affect rules. See the Jess manual on globals.

Added later

(reset)
(deftemplate CurrentSignal (slot cTNumber)(slot measuredCurrent))
(deftemplate DERSignal (slot vTNumber)(slot measuredVoltage))
(assert (CurrentSignal (cTNumber 12)(measuredCurrent 10)))
(assert (DERSignal (vTNumber 12) (measuredVoltage 13)))

(defrule Power-Calculation-DER-signal
  (CurrentSignal (cTNumber ?m)(measuredCurrent ?c))
  (DERSignal {vTNumber == ?m} (measuredVoltage ?V))
=>
  (printout t "Total Generation : " (* ?c ?V) crlf)
)
(run)

Jess> (batch voltage.clp )
Total Generation : 130
1