[英]How to compare two variables from a java class in jess and execute a rule?
I'm beginner in Jess. 我是杰西的初学者。 I'm trying to compare two variables from a Java class in Jess and trying to execute a rule. 我正在尝试比较Jess中Java类中的两个变量,并尝试执行一条规则。
I have imported cTNumber
and measuredCurrent
(both are integer)form a java class called CurrentSignal
. 我已经从一个名为CurrentSignal
的java类中导入了cTNumber
和measuredCurrent
(均为整数)。 Similarly imported vTNumber
and measuredVoltage
form a java class DERSignal
. 类似地,导入的vTNumber
和measuredVoltage
组成一个Java类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. 现在,我想制定一个规则,如果cTNumber
等于vTNumber
则将measuredCurrent
和measuredVoltage
相乘(均是双measuredVoltage
)以计算功率。
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. 但是Total Generation显示为0。但是我尝试用Java计算并显示了一个数字。 Can anyone please help me to solve this problem. 谁能帮我解决这个问题。 Thank you. 谢谢。
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. 请参阅有关全局变量的Jess手册。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.