ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Stateflow状态机建模:状态转移

Stateflow状态机建模:状态转移 汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市针对Simulink与MBD开发技术形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市感谢粉丝长期以来的支持文章目录1 引入2 转移的语法构成3 默认转移4 输入事件触发转移5 时间事件转移6 转移优先级6 总结1 引入Stateflow中的转移表示系统满足一定条件后从一个状态变化到另一个状态的过程之前的博客《Stateflow状态机建模开关控制LED灯状态》中的Key_Pressed就是满足了按键按下的条件后系统在OFF和ON状态之间转移。本节研究Stateflow中的转移的更多用法。2 转移的语法构成在《Stateflow状态机建模开关控制LED灯状态》中通过转移上的方括号表示转移的条件完整的转移语法包括以下部分[condition]{condition_action}/ transition_action其中各个部分的含义如下condition判断是否允许转移的条件。condition_action条件成立时、在转移之前执行的代码语句。transition_action执行转移动作时执行语句。转移语法中[condition]是最常用的基于条件的转移。如果转移线上没有任何语句则会被判定为没有条件的转移会在下一周期立即转移状态。3 默认转移当一个Chart有多个状态时Stateflow 必须知道在第一次要进入哪个状态。如果没有明确设置Stateflow 会报错。默认转移的图形特征为起点是一个圆点从圆点引出一条线末端的箭头指向某个状态如图所示。在状态机嵌套中一个父状态中的多个子状态也需要有默认转移如图所示。如果Chart模块中没有默认转移则会报错如图所示。默认转移也可以先转移到一个连接点上再有节点判断条件转移到对应的状态上。例如将《Stateflow状态机建模开关控制LED灯状态》中的建模示例改成如下图所示。默认转移经过连接点后首先根据转移1判断Key_Pressed是否满足满足则通过转移1在第一个周期进入ON状态不满足则通过转移2进入OFF状态。注意该建模方式也需要确保Junction节点跳转到状态机的各个转移中有一条是没有条件的如图中的转移2所示否则就相当于没有默认转移也会导致Stateflow报错。4 输入事件触发转移Stateflow状态机会在接收到某个特定事件时从一个状态转移到另一个状态。以《Stateflow状态机建模开关控制LED灯状态》中的开关控制LED灯为例在Chart模块中可以直接定义一个检测上升沿触发的事件再根据该事件触发与否来进行状态转移。首先点击建模工具的Model Explorer在模型浏览器中通过上方的工具栏添加一个事件如图所示。将该事件重命名为Key_Pressed_EventScope选为Input from Simulink表示事件从外部输入。Trigger选为Rising表示检测输入信号的上升沿事件如图所示。在Chart模块中搭建状态及跳转模型用Key_Pressed_Event事件触发跳转如图所示。在Chart模块上方会出现一个上升沿的图标及端口将该端口连接到Pulse_Generator上如图所示。Pulse Generator的参数配置、仿真周期等与《Stateflow状态机建模开关控制LED灯状态》相同。配置完成后运行模型双击Scope模块观察输出结果如图所示。仿真结果中在第3、5、7、9s时Pulse Generator产生上升沿输出的LED_State信号也根据上升沿跳转OFF和ON状态。在第1s时Pulse Generator也产生了上升沿但是由于状态机在先前还未被激活所以第1s时事件激活状态机默认转移到OFF状态。这一点是事件作为转移条件和信号作为转移条件的差别。另外也可以勾选Model Explorer中的Execute chart at initialization在初始化的时候直接激活Chart 模块如图所示。勾选该参数后再仿真Chart模块就会在0时刻被激活在1s时产生事件触发后就从OFF状态转移到ON状态如图所示。5 时间事件转移Stateflow中的时间事件转移是指在状态持续一段时间后自动触发的一种特殊转移方式。例如进入一个状态之后如果经过了几秒钟或者若干个周期就自动跳转到另一个状态。Stateflow中提供了以下几种常用的时间触发函数after(n, time_unit)在进入当前状态 n 个时间单位后触发。before(n, time_unit) 在 n 个时间单位前触发较少使用。duration(x)条件 x 已持续的时间。elapsed(x) 当前状态持续了多久。其中时间单位time_unit为secmsec或tick分别表示秒、毫秒、周期。下文以最常用的after函数为例研究时间事件转移的用法其余函数可参考官方帮助文档。对于《Stateflow状态机建模开关控制LED灯状态》中的开关控制LED灯的例子假如将跳转条件改为按下开关后LED 亮起如果持续3秒钟没有再次按键或者再次按下开关LED 自动熄灭。该需求则可以将《Stateflow状态机建模开关控制LED灯状态》中的状态机模型修改为建立第2个从ON状态到OFF状态的跳转如图所示。第2个跳转条件使用after函数在ON状态维持3s后跳转到OFF状态。Chart模块外的Pulse Generator模块配置参数如图所示模拟按开关。参照本文之前内容将模型配置为固定步长、离散求解器以及运行周期为0.01s。运行模型仿真双击Scope模块可以观察到各个信号如图所示。在1s、6s时刻Pulse Generator模块输出上升沿LED_State从0跳转到1持续3s后再由第二个转移中的after函数条件再跳转回0。注意after等时间事件转移条件中如果以sec或者msec的时间为单位在生成的嵌入式代码中会根据模型的离散仿真周期和after函数中的时间计算出需要延迟的周期数。例如模型运行周期为0.01s转移条件为[after(3,sec)]代码中会用一个变量作为计数器计数到300后执行跳转。6 转移优先级在状态机建模中可能存在一个状态有多个向其他状态的转移如图所示。Stateflow会按照转移优先级依次判断转移条件执行第一个满足条件的转移。转移优先级体现为转移上的数字通过右键点击数字在Execution Order中可以修改转移优先级顺序如图所示。在Stateflow状态机建模中需要关注优先级避免出现不符合预期的跳转顺序。6 总结本文详细研究了状态转移的诸多细节在工程实践中需要更多地注意。返回个人博客总目录
返回列表