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 总结

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

>>返回个人博客总目录

  • 28
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值