当前位置:网站首页>2837xd 代码生成——StateFlow(1)
2837xd 代码生成——StateFlow(1)
2022-07-02 06:35:00 【Quikk】
2837xd 代码生成——StateFlow(1)
在Command Window中键入sf可以进入,也可以通过Simulink库中的StateFlow子库进入.
StateFlow有限状态机,再使用matlab时,可能有所感觉:一个简单的if语句或者++操作需要构建的过于复杂。但是引入状态机可以大大减少这种情况。
进入库函数模块可以看到这三个元件都是状态机的模块,一个个学习:先看Chart模块。
1 Chart模块
创建一个新的Chart模块,打开后,右键进入Properties进行设置。
界面左侧是一些Chart中使用的组件:
其中,每个模块之间都只有互斥(只有一个能够执行)和并行的关系。并行关系下右上角会有执行顺序标识。
其中被模块分成了不同的级别,同属于一个模块下的内容是一个级别,如果需要设置并行和互斥关系。在需要设置的级别空白处右键选择Decomposition进行选择并行和互斥关系。
State模块有一些关键字可以进行定义进入和这些模块后执行的动作:
利用上面的知识可以搭建一个简单的模型,看一下流程图的概念。
首先搭建如上图所示的简单模型,s是条件,light是动作结果。这是模拟了开关灯的一个过程,开灯(s=1)很明显需要我们给定,light需要程序进行运行出来相关的结果。此时进入Model Explorer中进行相关的设置。
然后在Simulink中加入相关的外部模块,给定与显示输入输出。
仿真结果如下。改变s的值,可以相应的改变light的值。
将上述流程加以改造,加入事件。Open_switch(Close_Switch),b并在Model Exporer中进行定义。这里要注意定义的输入端口与demux输入应该保持一致。
然后搭建一下电路,Input3是用来激活模块。可以知道这时候,不仅仅要s=1,并且需要上升沿(Open_switch事件设置的触发的上升沿)才能触发light=1。类似数电中的上升沿才能锁存相应的信号。
为了可以更好的书写流程,StateFlow引入了连接节点的概念。点击Parretn可以设置出来以下的多种结构。
也可以自己为连线增加条件,鼠标放置在两个连接点的连线上会自动出来如下标识,默认一个节点多个分支的情况下,会优先执行有条件的那个分支。:
如图,搭建以下分支,等同于C代码:
if (x<0)
y=abs(x);
else
y=x;
在Model Explorer中设置相关的data的属性,给定输入和输出。这里输入给定的是1Hz的正弦波。
现在结合第一个开关灯的状态,若在开灯状态里面存在两个状态(A、B)代表亮度不同。那么我们若在设置了第一次亮度后,肯定不希望下一次开灯亮度又要再次调节。因此这里引入历史节点,即能够记忆最后一次退出的状态,尽管A是默认状态。但这时的状态由上一次退出时的状态决定:
2 模型实例搭建
2.1 汽车状态判断
构建如下的一个汽车状态判断逻辑电路,能够定义上面所产生的事件,进行运行,可以模拟换挡以及启停状态监测:
搭建完成后,可以直接点击运行,这时因为没有定义相关的data和event会弹出一个自动定义的界面,在上面进行相关修改即可快速添加:
构建外围电路,设置相关事件触发的装置运行时,将仿真时长改为inf(无限长),便可以操作观测实验现象:
2.2 媒体播放状态检测
通过流程图可以进行观测媒体播放状态,这个例子引入了历史节点与状态检测,构建如下图所示的chart,可以看到在power_on中的状态转移流程图上有的没有触发条件(即表示任何事情都可以触发)。例如,若现在处于USB状态,若发送Open_CD(Open_Radio)之后都可以触发状态转移。
在状态上右键进去属性(Properties),修改状态输出,便可以在输出端口观测状态情况(布尔变量输出,为1表示在次状态)。
其中加入了历史节点,代表下一次进入power_on模块时,会重新直接进入上一次退出的那个状态。
搭建外部电路如下图所示:
2.3 2837xd流水灯联机调试
首先搭建以下的chart,这里led1和led2都是输出量。直接连接GPIO接口就可。
下图是led1和led2的输出波形图,图中标识的1.2.3.4与上图的执行流程对应。就这样循环3次之后,出循环,然后熄灭等,进入下一个循环。这里测试发现,在状态中会持续一个步长,在节点进行动作(3、4)又会花费一个步长。[步长设置为0.5s],相关参数的设置,请参照博客前面的文章叙述。
程序外围电路图:
这是将一个调试的技巧,下图中SIMULATION和HARDWARE中各自有一个RUN,SIMULINK中的RUN可以不连接硬件,直接跑软件运行结果,也就是也可以方便的调试chart模块输出。HARDWARE中的RUN是生成DSP的代码烧录进入DSP然后运行。
边栏推荐
- TD conducts functional simulation with Modelsim
- BugkuCTF-web24(解题思路及步骤)
- 攻防世界-Web进阶区-unserialize3
- Read Day5 30 minutes before going to bed every day_ All key values in the map, how to obtain all value values
- JDBC review
- Read 30 minutes before going to bed every day_ day3_ Files
- 企业级SaaS CRM实现
- 个人经历&&博客现状
- vs+qt 设置应用程序图标
- Beats (filebeat, metricbeat), kibana, logstack tutorial of elastic stack
猜你喜欢
Mysql 多列IN操作
TD conducts functional simulation with Modelsim
2837xd 代码生成——补充(1)
Timed thread pool implements request merging
图像识别-数据采集
个人经历&&博客现状
2837xd 代码生成——总结篇
Learn combinelatest through a practical example
Creation and jump of activity
Matplotlib swordsman - a stylist who can draw without tools and code
随机推荐
Idempotent design of Internet API interface
Chrome浏览器标签管理插件–OneTab
2837xd 代码生成——补充(2)
Navicat remote connection MySQL reports an error 1045 - access denied for user 'root' @ '222.173.220.236' (using password: yes)
QT信号槽总结-connect函数错误用法
Who is better for Beijing software development? How to find someone to develop system software
hystrix 实现请求合并
Safety production early warning system software - Download safety production app software
DTM distributed transaction manager PHP collaboration client V0.1 beta release!!!
Image recognition - Data Cleaning
BugkuCTF-web24(解题思路及步骤)
Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedd
VIM操作命令大全
int与string、int与QString互转
记录一下初次使用Xray的有趣过程
上班第一天的报错(AWVS卸载不彻底)
Thinkphp5 how to determine whether a table exists
Probability is not yet. Look at statistical learning methods -- Chapter 4, naive Bayesian method
TD联合Modelsim进行功能仿真
Inverter Simulink model -- processor in the loop test (PIL)