Simulink代码生成: 简单状态机及其代码

文章目录

  • 1 Simulink中的Chart模块
  • 2 状态机建模
  • 3 模型仿真
  • 4 代码生成
  • 5 总结

本文研究简单的状态机建模及其生成的代码。

1 Simulink中的Chart模块

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

2 状态机建模

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

1)首先拖出一个Chart模块,此时它的两边是没有输入输出接口的;
Simulink代码生成: 简单状态机及其代码_第2张图片
2)双击进入Chart,打开它的Model Explorer,添加输入接口为VehicleSpeed,输出接口为MotionState,分别表示输入的信号是车速信息,输出的信号是车辆运动状态;

在这里插入图片描述

此时,Chart模块就会刷新为有一个输入输出口;
Simulink代码生成: 简单状态机及其代码_第3张图片
3)接着,需要在Chart内定义状态、状态跳转条件;
Simulink代码生成: 简单状态机及其代码_第4张图片
对其中的解释如下:

  • 两个矩形框分别代表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中的类型;
Simulink代码生成: 简单状态机及其代码_第5张图片
5)最后,设置Chart内的工作语言为C语言,默认为Matlab语言;勾选Execute (enter) Chart At Initialization表示在零时刻初始化状态机;这两个是博主工作习惯,可以根据自己需要来配置;
Simulink代码生成: 简单状态机及其代码_第6张图片
至此,Chart模块的建模算是完成了

3 模型仿真

在Chart模块外部添加一个Signal Builder输入模块,一个Scope输出模块。
Simulink代码生成: 简单状态机及其代码_第7张图片

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

Simulink代码生成: 简单状态机及其代码_第8张图片
运行模型,得出结果符合预期;
Simulink代码生成: 简单状态机及其代码_第9张图片

4 代码生成

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

1)首先,除了输入输出口对应的全局变量,生成了另一个全局变量demo_DW,储存了当前所在的状态。
Simulink代码生成: 简单状态机及其代码_第10张图片
该状态可以取两个枚举量:demo_IN_Move和demo_IN_Stop。

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

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

5 总结

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

>>返回个人博客总目录

你可能感兴趣的:(Simulink代码生成,matlab,simulink)