LabVIEW JKI状态机
LUOBEICE自学LabVIEW
今天看了JKI状态机,《LabVIEW宝典》(P447)里面对于JKI状态机的描述由于本人能力有限没看懂。
看了B站up主“谁动了我的魔方”的演示视频:
看了知乎一个大佬“JackLin”对JKI状态机的详细解释:
https://zhuanlan.zhihu.com/p/160812922
终于弄懂了,谈谈自己对JKI状态机的理解吧。
*JKI状态机模板需要在VIPM里面下载得到,如何使用VIPM下载工具包网上一搜就有了。
下载好之后就有模板了,如下图所示:
左边是一整个JKI状态机模板,右边是模板用到的特有的控件。
*将左边的控件拖到后面板,如下图:
*JKI状态机的本质还是“队列消息状态机+用户界面处理器”的模式,最大的区别就是JKI状态机不是采用枚举来描述状态,而是用规定格式的字符串,用其模板里面自带的队列控件来从字符串里面解析出状态机的各个“状态”,然后像普通状态机一样在各个“状态”之间跳转。其最大的优点是可以通过写入字符串来从外面控制状态机。
*接下来介绍JKI状态机特有的两个控件。
(1) 一个可以理解为“添加状态至队列”,它的作用和“消息入队列”差不多类似。作用是将输入端的三个字符串进行处理(去除三个输入端字符串前面和后面的的换行,空格,制表,回车,具体的程序可以看匹配正则表达式的相关内容)后相连再一起。具体输入输出可以看下面的例子,我自己的理解也在程序框图里面。在JKI状态机中,通过这个函数,我们可以构建自己的“状态“队列。
在实际JKI状态机里面,我们主要就是将“状态”以字符串的形式通过这个控件传递。
(2) 一个可以理解为“解析状态”控件,类似于“消息出队列”。这个控件的具体功能为:从输入字符串中按规定格式解析出一条一条的“状态”。用于进入状态机的不同分支。输入端输入字符串后,该控件将自动去除字符串前面的换行,空格,制表,回车。并有3个输出:1.”current State”,当前状态,即第一行的内容。2:”Remain States”,剩余状态,字符串除了第一行之外剩下的内容。3.”Arguments”,参数,如果第一行字符串还符合特殊的格式,比如中间有”>>“,那将进一步输出”>>”后面的内容作为”Arguments”的内容。可以看下面的例子自己体会,这个程序框图比较复杂,我暂时还没搞得很明白。在JKI状态机中,通过这个函数,就可以从输入的“状态”队列中取出前面的”状态”。
*在大致明白了那两个控件后,我们就比较好理解JKI状态机了。和普通状态机类似,不停地往队列里面写入状态,然后不停地取出状态进行跳转。接下来讲解一个JKI状态机的运行过程(在原有模板上稍加改动),要求实现以下功能:
创建2个数组A和B
状态1:进入欢迎程序
状态2:创建数组
状态3:A+B
状态4:A-B
状态5:B插入到A之后
状态6:结束
右键点击状态机外边框,点击”JKI State Machine Explorer”,将显示状态具体的状态列表,我们可以在里面添加状态,复制状态,查看状态等,下面是我在模板的基础上添加的几种状态。
修改参数:模板提供的一些状态我们最好不要过多的修改,因为里面很多都是一些初始化操作,退出操作,错误处理等状态。我们需要点击“Data:Initialize”这个状态,并根据需求进行修改,这个状态的功能主要是定义内部数据的类型(只是定义类型,数值啥的会在后面填入),这些内部数据是各个状态公用的。由功能需要,我们可以认为两个数组A和B是可以公用的,因此我们在里面添加两个数组。这个状态里面的其他东西我们就不要动它了。注意:这个地方添加数据的时候,一定要命名它的标签,否则以后的“按名称解除捆绑”会出现问题。
接着点击“Macro:Initialize”状态,在这个状态里面,我们可以输入状态机将要执行的顺序,我个人建议模板里面的前三行保留,在后面添加自己的状态。注意:JKI状态机将主要按照这里面的顺序一步一步地执行。
当然,我们在这个界面里面设定的并不一定是最后的执行顺序,因为我们可以在其他状态界面里面通过“状态入队列“来插入一些额外的状态。
使用内部数据:我们可以通过“按名称捆绑“和”按名称解除捆绑“两个函数来使用内部数据。下图中我就创建了两个数组,并将其分别赋值给”数组A“和”数组B”。下下个图从内部数据里面取出“数组A”和”数组B”,进行相关的操作。
*我理解的JKI状态机就是这么多了,我认为重点是要把队列消息状态机的运行模式搞清楚,在此基础上一定要搞清楚其特有的两个控件的实际功能(程序框图可以不用看明白,但功能一定要清楚,可以多输入几个字符串,看看输出到底是怎样的)。这样的话,相信各位对JKI状态机的理解会更上一层楼。