简体   繁体   English

如何在jess中比较Java类中的两个变量并执行规则?

[英]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类中导入了cTNumbermeasuredCurrent (均为整数)。 Similarly imported vTNumber and measuredVoltage form a java class DERSignal . 类似地,导入的vTNumbermeasuredVoltage组成一个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则将measuredCurrentmeasuredVoltage相乘(均是双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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM