首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 01:03
  • 2232
  • 6601
blog.csdn.net

文章目录

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

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

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

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

>>返回个人博客总目录

注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/125015771"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top