docker版jxTMS使用指南:状态机的数据事件

本文讲解4.4版jxTMS中新的有限状态自动机,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容

docker版本的使用,请查看:docker版jxTMS使用指南

4.0版jxTMS的说明,请查看:4.0版升级内容

4.2版jxTMS的说明,请查看:4.2版升级内容

前文我们介绍了【本地数据总线】,4.4版jxTMS中新的有限状态自动机自然而然的就基于本地数总线机制引入了数据事件,即当某设备发送所接收并处理后的数据时,可以基于这些数据来触发状态机事件。

在状态机的定义中,和数据事件相关的是两种语句:

1、数据点事件源

'数据点事件源' VARIABLE ASSIGN msgTargetPattern

如【数据点事件源 es1 = t1.s1.v1】就定义了一个数据点源es1,其是设备【t1.s1】的v1变量。

2、事件

'事件' VARIABLE '来自' VARIABLE valueCheck?
valueCheck的语法是:
'符合' compareStatement
而compareStatement就是前文数据源相关介绍中的校验表达式

如【事件 me1 来自 es1】则当es1只要发送数据,都会触发事件me1。而【事件 me1 来自 es1 符合 >300 and <600】则只有当es1发送数据的数据大于300且小于600时,才会触发事件me1。

好了,我们实际来验证一下。

大家修改一下上篇文章中sm.py文件中的状态机sm1的定义为:

#创建状态机sm1
sm1 = stateMachine('sm1')
#sm1的定义
@sm1.define
def smDefind():
    '''
    初始状态 s0
    数据点事件源 es1 = t1.s1.v1
    事件 me1 来自 es1 符合 >300 and <600
    事件 me2 来自 es1 符合 <=300
    事件 me3 来自 es1 符合 >=600
    状态为 s0 时发生 me1 跃迁到 s0 执行 me1
    状态为 s0 时发生 me2 跃迁到 s0 执行 me2
    状态为 s0 时发生 me3 跃迁到 s0 执行 me3
    '''
    
#添加状态机的三个动作函数:
@sm1.active
def me1(smi,params):
    print(f'sm[{smi._name}] call me1')
@sm1.active
def me2(smi,params):
    print(f'sm[{smi._name}] call me2')
@sm1.active
def me3(smi,params):
    print(f'sm[{smi._name}] call me3')

#生成状态机的实例
smi1 = SMInstance(sm1,name='smi1')
#打开调试模式
smi1.debug(True)

#
#由于我们是在测试,没有设备会主动帮我们注册数据源【t1.s1】并发送数据,所以这两步都得我们自己手动来做
#
#注册数据源
jxLocalDataBus.registerSource('t1','s1')

#发送数据通知:
#根据我们的定义,这应该触发事件me2,使得状态机执行动作me2
d = {'v1':255}
#用不到发送对象,所以可以不给,但在device中送入的就是设备对象自身
jxLocalDataBus.inform(None,'s1',d)

#根据我们的定义,这应该触发事件me1,使得状态机执行动作me1
d = {'v1':555}
jxLocalDataBus.inform(None,'s1',d)

#根据我们的定义,这应该触发事件me3,使得状态机执行动作me3
d = {'v1':755}
jxLocalDataBus.inform(None,'s1',d)

大家保存sm.py,然后运行该文件看下输出结果,就能理解数据事件是怎么用的了。

有了设备主动注册数据源并主动发送自己接收并处理完的数据,我们就可以轻松实现智能硬件控制了,比如改造一下来实现:用jxTMS开发智能转运箱,会更为简洁。

参考资料:

jxTMS设计思想

jxTMS编程手册

下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

如何用jxTMS开发一个功能

下面的系列文章讲述了jxTMS的一些基本开发能力:

jxTMS的HelloWorld

你可能感兴趣的:(jxTMS,docker,python,SaaS,jxTMS)