Simulink算法建模: 状态机基础


本文研究基本的状态机建模及其生成的代码。状态机是使用Simulink的精髓之一,在实际工程中应用广泛。

1 Simulink中的Chart模块

Chart模块用于描述状态之间的跳转关系,在汽车软件开发过程中经常用到。在状态机中需要定义状态、状态间跳转条件、输入输出及本地变量等。本文会用一个简单的例子来研究状态机建模,并通过生成的代码了解其中的原理。
在这里插入图片描述

2 状态机建模

假如现在有一个需求,车速高于某个值的时候,输出变量为运动状态,低于该值的时候为静止状态。针对该问题第一反应是用if-else条件判断实现,但是也可以用状态机建模来实现。后面演示状态机建模过程。

1)首先拖出一个Chart模块,此时它的两边是没有输入输出接口的;
在这里插入图片描述
2)双击进入Chart,打开它的Model Explorer,添加输入接口为VehicleSpeed,输出接口为MotionState,分别表示输入的信号是车速信息,输出的信号是车辆运动状态;

在这里插入图片描述

此时,Chart模块就会刷新为有一个输入输出口;
在这里插入图片描述
3)接着,需要在Chart内定义状态、状态跳转条件;
在这里插入图片描述
对其中的解释如下:

  • 两个矩形框分别代表Stop和Move两个状态,左上角是状态的名称;
  • 状态框中的en和du表示进入状态和处于状态中时,执行的语句,这里是进入状态时给MotionState赋值对应的常数;
  • 状态之间的箭头表示跳转,方括号内的语句为条状条件,这里是当车速大于一定的值以后由Stop跳转到Move,小于该值从Move跳转会Stop;
  • Stop上方的箭头表示初始时刻默认跳转到Stop中;

4)上一步中的STOP/MOVE/P_VehStopThres这三个变量没有定义过,状态机不知道是什么,所以先在Matlab工作空间定义;
在这里插入图片描述
在工作空间中定义MOVE和STOP为boolen类型,数值分别为1和0;P_VehStopThres定义为single类型,数值为0.5,意为车速超过0.5就判定为运动状态,反之为静止状态;

接着,在Chart模块内定义这三个变量为Parameter参数,继承Simulink中的类型;
在这里插入图片描述
5)最后,设置Chart内的工作语言为C语言,默认为Matlab语言;勾选Execute (enter) Chart At Initialization表示在零时刻初始化状态机;这两个是博主工作习惯,可以根据自己需要来配置;
在这里插入图片描述
至此,Chart模块的建模算是完成了

3 模型仿真

在Chart模块外部添加一个Signal Builder输入模块,一个Scope输出模块。
在这里插入图片描述

Signal Builder输入模块中定义车速,从0到0.9再回到0,预计结果应该是先是静止状态,再运动状态,再静止状态。

在这里插入图片描述
运行模型,得出结果符合预期;
在这里插入图片描述

4 代码生成

将模型的输入输出替换成port口,Ctrl + B生成代码。

1)首先,除了输入输出口对应的全局变量,生成了另一个全局变量demo_DW,储存了当前所在的状态。
在这里插入图片描述
该状态可以取两个枚举量:demo_IN_Move和demo_IN_Stop。

2)在Step函数中,生成了很多条件判断嵌套。其基本思路和状态机中一样,会判断demo_DW,即当前状态,以及状态跳转条件CAN_VehicleSpeed,从而在分支中给出不同的MotionState值输出。
在这里插入图片描述
这段代码比较好看懂,可以自己看看研究一下。

就该案例而言,直接用一个Switch模块判断车速,输出状态更为方便,代码也会更简单。但是如果状态内的执行语句更复杂,或者状态之间的跳转更加复杂,还是应该使用Stateflow状态机来进行建模。这一不仅保证了模型的可读性,状态机形式的策略建模也会大大减少逻辑出错的可能性。

5 总结

本文研究了状态机的建模和代码生成。需要注意其中的配置,以及生成代码中代表状态的全局变量。

>>返回个人博客总目录

### 如何在状态机中使用 Simulink Function 进行建模和仿真 #### 使用 Stateflow 和 Simulink Function 的集成方式 Stateflow 提供了一种图形化的方法来描述事件驱动的状态逻辑以及复杂的决策过程。当需要在状态机内部执行连续时间动态行为或复杂算法时,可以借助于 `Simulink Function` 来实现这些功能[^1]。 #### 创建带有 Simulink Function 的状态机模型 为了创建一个包含 Simulink Function 的状态机: - 打开一个新的 Simulink 模型文件。 - 添加一个 Stateflow 图形到该模型中,在其中绘制所需的状态转移图。 - 在适当的位置放置 Simulink Function 节点,用于表示那些由 C/C++ 或 MATLAB 函数定义的操作。 对于每一个希望调用外部 Simulink 子系统的动作,可以在 Stateflow 中声明对应的 Simulink Function 接口,并指定参数列表以便传递输入输出数据给子系统处理[^2]。 ```matlab % 定义 Simulink Function 输入输出接口 function y = myFunction(u) coder.extrinsic('ssGetInputPortSignal'); y = ssGetInputPortSignal(S,0); ``` 上述代码片段展示了如何在一个 M 文件里定义 Simulink Function 并设置它的 I/O 参数。实际应用中应当根据具体需求调整函数体内的操作细节[^3]。 #### 实现物理量与信号间的转换 考虑到 Simscape 主要负责多域物理系统的模拟,而 Simulink 则更侧重于控制系统的设计;因此如果涉及到物理网络(如液压、机械等),则需特别注意两者间的数据交换机制——即所谓的“物理量”同常规意义上的“信号”的相互转变。这一步骤可通过特定的转换器组件完成,确保整个闭环控制回路能够正常运作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chhttty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值