JKI State Machine 讲解
将JKI State Machine 模板拖曳到程序框图中,
如下图,
此模板会默认放置一个OK按钮在前面板中,用于提示用户如何增加一个简单的用户事件去使用此框架。
“Event Structure”,Idle:此分支可以设置用户时间,超时时间设置为-1意味着超时帧永远不会执行,如果要执行超时分支,则需要将此处的超时时间改为0ms或者在更大的数值,同时此框架的 核心是一个事件结构,来控制程序的整体响应。
如果想要加快事件的响应则需要加入一个判断,查是否没有剩余状态(队列中没有工作)。如果是(没有工作),则永远等待事件。否则(如果队列中仍有工作),则检查一次事件(超时为零毫秒)。然后,在构建工作时,您可以交错“检查事件”状态(请注意,我已将“检查事件”字符串添加到状态机的 Case Structure 的“空闲”框架中)。
这段逻辑确保状态机的循环仅在需要执行工作时才执行。否则,它只是在等待事件。
此框架通过拼接连续多个字符串来实现任务的跳转,每一行都是一个单独的状态,例如移位寄存器初始化状态,事件结构控制执行的任务,初始化
新增一个事件及任务
创建一个新的按键“Test”,并在事件结构里复制“OK值改变事件分支”编辑“Test”事件为值改变。
修改New Category 分支下的用户自定义分支名字。
在事件结构里,将跳转状态字符串修改为用户自定义分支的名字。在用户自定义分支里补充用户要执行的任务,同时支持在每个条件分支里跳转。
如有用户需要定义初始化数据, 则需要在此分支里面定义数据的类型及名称并将其捆绑到蔟里。在其他分支里,可以使用按名称解除捆绑函数将数据拿出来使用,经处理后再扔回data蔟里。
同时此框架的错误处理是通过此函数来进行处理的,他可以路由错误接线到任何一个分支里。
使用JKI State Machine Editor
右击状态的条件结构或者事件结构,可以打开编辑器。
点击导航栏里的分支名称可以自动跳转到对应的状态进行编辑,还有另一个功能是在编辑好任务的字符串里,可以进行状态跳转用于检查。
重命名、新建、排序、删除等功能
右击对应的分支可以实现重命名、新建分支功能,请注意,重命名框架将会重命名 JKI 状态机中它的所有实例。
同时拖放树中的框架以重新排序(拖动类别分隔符以移动整个类别)
。
FAQ
框架执行很长时间,不响应事件是什么原因?
如果条件结构框架正在工作,事件结构框架将不会执行(直到条件结构完成并且状态字符串移位寄存器/队列上不再有“工作”(除非通过将“空闲”状态添加到状态字符串队列来明确调用它)。
但是,一旦在案例结构中完成工作,事件(事件结构所注册的事件)仍然会排队等待事件结构处理。
JKI 状态机作为子VI?
- (红色)通过引用访问控件和指示器中的数据会破坏 LabVIEW 的数据流范式,并使代码难以阅读。我的建议是仅将控件和指示器用于从用户那里获取输入或向用户显示信息。无论如何,我都会避免将它们用作存储信息的地方。从实际角度来说,这意味着我倾向于将大量信息存储在移位寄存器的数据簇中,而不是对控件或指示器的值进行“实际工作” 。我使用前面板控件中的值更改事件来更新簇中的信息,并使用 UI:更新指示器状态(或类似状态)在必要时将前面板指示器同步到数据簇。这将前面板对象与其余 VI 的数据和代码分离,但不会破坏数据流或依赖引用。
- (绿色)在状态名称(如“UI: SetDIODisabled >> 2”)中,“2”是一个神奇的数字,这会损害可读性和可维护性。有几种可能的解决方法,不同的人可能会根据个人喜好使用:
- 您可以用更好的参数替换“0”、“1”、“2”,例如“启用”、“禁用”和“灰色”。
- 您可以为每个条件使用单独的状态,并完全取消状态参数。例如,您将有多个状态,称为“UI:禁用 DIO 控件”和“UI:启用 DIO 控件”。
- 您可以将控件的“启用状态”存储在数据集群的元素中,并拥有一个名为“UI:联锁”的状态,该状态使用该信息并采取适当的行动。然后,当您需要禁用或启用控件时,您将在数据集群中设置该元素的值,然后执行“UI:联锁”状态。
(紫色)如果您要为Command输入字符串,我会确保每个可能的 Command 都有一个 VI,并使用状态机作为每个命令的子 VI。这为您提供了一种 API 来调用您的状态机,并避免在调用此状态机的任何代码的框图上(误用)使用裸字符串常量。
JKI状态机与生产者消费者状态机的联系
UI 事件消费者- 在 JKI 状态机中,通过注册包含 JKI 状态机的 VI 前面板上的控件的隐式事件(在编辑事件对话框中)来订阅 UI 事件。
用户(动态)事件生产者- 在 JKI 状态机中,调用生成用户事件来生成(发布)一个或多个用户事件消费者注册接收的事件(使用注册事件功能)。
用户(动态)事件消费者- 在 JKI 状态机中,调用注册事件和动态事件终端来注册 JKI 状态机的事件结构,以订阅由某些用户事件生产者(或可能生成事件的其他位置)生成的用户事件。
如果需要,您还可以使用队列和通知程序,而不是用户(动态)事件,来处理 LabVIEW 在管理 UI 事件和用户事件“队列”方面的限制,例如无法刷新或限制事件“队列”的大小。