1 引言
状态机是一种描述系统行为的模型,能够清晰地表示系统中的状态和状态之间的转换关系,从而使得开发者能够更加精确地描述系统行为和逻辑,对于提升系统的正确性和可靠性具有重要的作用。此外,状态机还可以用于分析系统性能、生成测试用例等,具有广泛的应用价值。
MWORKS.Sysplorer 2023a前瞻版基于多领域建模语言Modelica 3.5的状态机语义实现了状态机建模功能,同时支持使用图形界面来构建状态机。在完全兼容Modelica的前提下,MWORKS.Sysplorer 2023a前瞻版对状态机建模易用性、可读性进行了改进,提供了一系列方便快捷、易于操作的图形建模的功能。通过图形界面,用户可以使用拖拽和连接的方式轻松创建状态机的各个状态和状态之间的转换关系,降低建模难度和出错的概率。
MWORKS.Sysplorer 2023a前瞻版具有符合Modelica 3.5的状态机语义、易于使用的图形界面以及与多领域建模的结合等特点,这些特点使得MWORKS.Sysplorer可以更好地满足状态机建模的需求,基本完成了MATLAB/Simulink的Stateflow工具常用功能的替代。
2 状态机简介
首先我们一起了解一下状态机的概念。状态机全称为有限状态自动机(Finite State Machine,FSM),也被称为有限状态机(Finite Automaton,FA)或有限状态转换机(Finite State Transition Machine,FSTM),它不是一个实际的机器设备,而是一种常见的计算模型。
状态机有两大特点,一是离散的,二是有限的,描述事物的有限状态机模型的元素由以下部分组成:
状态(State):表示系统可能处于的状态,可以用方块或圆形表示。
事件(Event):触发状态转移的事件,可以用标签表示。
动作(Action):状态转移时执行的动作,可以用标签表示。
转移(Transition):表示状态之间的转换关系,可以用箭头表示。
FSM 通过定义状态、转移、事件和动作来描述系统的行为,是一种非常有效的行为建模工具。生活中有很多状态机例子,下图为交通信号灯例子,可以通行的时候为绿灯,不能通行的时候为红灯,转换条件为一种状态的持续时间结束,或者主动切换指令。对应到FSM,状态为灯的颜色,转移为通行状态的转换,事件为状态的持续时间结束或主动发送切换指令,动作为颜色的切换。
△ 交通信号灯例子
读至此处,相信大家已经掌握了一些状态机的基础知识了。那么接下来,我们就一起来了解MWORKS/Modelica中的StateMachine建模功能。
3 状态机图形建模
3.1 状态机显示与交互
A. 状态机与状态的构建
支持拖拽式建模是图形建模高易用性的体现,MWORKS.Sysplorer2023a前瞻版提供了SysplorerEmbeddedCoder.StateMachine模型库,内含状态机与状态基础模型,支持拖拽式构建状态机与状态组件。
◎ 拖拽式构建状态机
从SysplorerEmbeddedCoder.StateMachine模型库中,将Chart模型拖拽到图形视图,即可在当前模型中添加一个状态机组件。
△ 拖拽状态机
◎ 拖拽式构建状态
双击状态机组件进入状态机,然后从SysplorerEmbeddedCoder.StateMachine模型库中,将State模型拖拽到图形视图,即可在当前状态机中添加一个状态组件。
△ 拖拽状态
B. 数据管理
MWORKS.Sysplorer提供了纯界面交互的方式实现状态机变量的设置。
在状态机模型中右键点击打开上下文菜单,选择设置状态机变量,即可打开状态机变量设置面板。
△ 状态机变量设置界面图
点击状态机变量面板的左上角绿色【添加变量】按钮,即可在表格中添加数据行,新添加数据行包括了范围、类型、名称、值、端口5个属性。
范围:表明数据的传递属性,包括 Input(从外部输入)、Local(内部数据)、Output(向外部输出)、Parameter(参数)、Constant(常量)。
类型:数据类型包括 Real、Integer、Boolean 三种类型。
名称:状态机变量的名字,须为合法字符。
值:变量的初始值。
端口:当范围选择为 Input、Output 时,会在父层 Chart 组件上产生对应数据类型和数目的端口,此处端口号表示父层排列的顺序,通过端口 Input、Output 可以将状态机与其它组件连接起来共同构成模型来仿真。
△ 状态机端口界面图
3.2 状态显示与交互
A. 初始状态设置
当在同一个状态机中创建多个状态时,根据创建的先后顺序来看:第一个被创建的State左上角是黑色实心,表示其为初始状态,即系统模型运行时第一个被激活的状态。根据设计需求,需要更改初始状态时,单击其它状态左上角的空心圆圈,被选中的状态将变为初始状态,同时原来状态左上角的实心圆圈变为空心圆圈,自动满足同一层次下仅能有一个初始状态的约束条件。
△ 初始化状态设置
B. 状态方程编辑
状态内的动作可以通过状态方程实现。双击状态组件后,会出现可用于编辑状态方程的编辑框,编写完毕单击空白处即可在状态内部显示编辑的动作语句。
△ 双击进入状态编辑框
如果状态方程不符合语法规范,在完成编辑后,状态机的边框会变成红色。
△ 红色状态与正常状态对比图
3.3 转移线显示与交互
A. 转移线的构建
如下图所示:将光标位置移至状态边缘,当光标状态变为“+”时,拖动鼠标,便会自动生成一条转移线;此时,拖动鼠标至状态边缘另一端释放,转移线即可连接到该状态组件。
△ 拖拽生成转移线
转移线可以绘制成折线或光滑的曲线。在拖拽生成转移线过程中,在空白处释放鼠标,则会在此处形成一个锚点;然后将鼠标移动到另一个位置,点击空白处,形成下一个锚点;依次类推,直到点击到目标状态边缘。使用以上方法,即可绘制出经过各个锚点的折线或曲线。
鼠标右键点击转移线,通过勾选【光滑】按钮,可以实现折线和曲线可以互相转化;通过勾选【保持横平竖直】,可以实现转移线的曼哈顿化。
△ 转移线曲线、折线、曼哈顿化
B. 转移线的属性
Modelica转移线的属性包括转移条件、转移优先级、是否即时转移、是否重置状态、是否同步转移,以上属性在转移函数中以函数参数表示。
以上属性可通过交互式属性面板进行设置。双击转移线,或右键点击转移线,选择上下文菜单【属性】,弹出转移线属性对话框。
△ 转移线属性对话框
转移条件:转移条件以文本控件的样式显示在转移线中点上方。在属性对话框输入栏输入转移条件,点击确定后,刷新转移条件文本。支持直接拖拽转移条件文本以改变位置。
△ 转移线条件
转移优先级:对于从同一个状态发出的多个转移,起始端带有数字标记,表示转移线的优先级,数字越小,优先级越高。在属性对话框输入栏输入转移优先级数字,点击确定后,在转移线起始端显示优先级。
△ 转移线优先级数字
即时转移:是否即时转移在转移线上以末端形状区分,即时转移为三角形,非即时转移为菱形。在属性对话框勾选即时转移复选框即可完成设置。
△ 即时转移与非即时转移
是否重置:是否重置在转移线上以末端形状的填充属性区分,重置转移为实心,非重置转移为空心。在属性对话框勾选重置状态复选框即可完成设置。
△ 重置与非重置转移
同步转移:是否同步转移在转移线上以起始端的形状区分,同步转移为一个长方形,非同步转移没有长方形。在属性对话框勾选同步转移复选框即可完成设置。
△ 同步与非同步转移
C. 转移线的状态切换
转移线两端的状态可以快速切换。按住转移线的一端,将其拖拽到另一个状态边缘,则转移线这一段的状态将会切换成新的状态,同时会刷新各条转移线的优先级。
△ 转移线状态切换
3.4 嵌套状态的显示与交互
A. 嵌套状态的构建
Modelica3.5支持状态的嵌套,通过在状态中声明子状态组件实现。MWORKS.Sysplorer支持纯图形化操作,实现状态嵌套。
在状态机模型中,右键点击状态,点击【进入组件】上下文菜单,然后将状态模型SysplorerEmbeddedCoder.StateMachine.State拖拽到新的图形界面,即可实现状态的嵌套。在状态内部,子状态之间的初始状态规则与父层一致,同样是只能有一个初始状态。
△ 进入状态拖拽状态
点击组件导航栏中的上一层或【实例层次结构中后退】按钮,回到上一层,可以看到子状态显示在父状态内部。
△ 嵌套状态显示界面图
B. 嵌套状态的数据管理
与状态机的操作相似,在状态模型内部右键点击打开上下文菜单,选择设置状态变量,即可打开状态变量设置面板。状态内部的变量面板对于状态本身与嵌套状态生效。由于状态没有输入输出端口,因此状态内部的变量范围相对于状态机的变量范围,没有输入和输出,只有常数、参数与内部变量。
△ 状态变量设置面板
4 总结
本文介绍了MWORKS.Sysplorer针对状态机图形化建模需求,基于Modelica语言的状态机语义,实现的一套方便快捷、易于操作的图形建模的功能,并简述了状态机建模相比于传统的使用代码实现功能的优势。
MWORKS.Sysplorer不仅在控制器建模与代码生成领域新增了状态机建模功能,还实现了框图建模、C Caller模块、子系统设计、控制器仿真等许多服务于控制系统建模的常用功能。诸多新功能将于2023年3月随MWORKS.Sysplorer2023a前瞻版正式上线,小伙伴们敬请期待~