Simulink之State Flow

打开方式

方式一:在命令窗口输入State Flow或者简写sf就能打开,并且会自动打开State Flow 的Library。从左到右分别是图表、真值表、状态转换表、例子、顺序查看,可以加入到Simulink当中。

方式二:从Simulink Library里面添加State Flow 的元件。

Chart元件使用方法

使用基础

最基础的用法就是用来控制Function-Call Subsystem元件的执行,可以右击在Block Parameter里面设置采样时间,由于Chart元件不是simulink自己的,编译的时候要比较长的时间。

点击进去最开始是空的,点击Model Explorer,可以设置数据、信号或者事件,一个chart里面有一个Model Explorer。

周期触发

新建一个事件,起个名字,选择为output to simulink

添加一个default transition出来,按照下面用将刚才的名字写上去。

这样就实现了周期触发Function-Call Subsystem元件的执行,因为这个Chart元件继承了解算器的采样时间,内部并没有什么条件判断,就可以周期触发。

条件触发

先创造一个data,起名字,设置为input。

新建几个节点,按照逻辑链接起来,让input满足条件的时候才会执行事件。

[]里面的是条件,如果有多行,就要在行尾写上三个点...表示下面还有代码,而且||和&&之类的符号不能写在下一行的开头,必须写在三个点前面,这个Matlab语法决定的。

{}里面的是执行语句

可以两个同时存在或者单独存在

Subchart

有时候在chart里面还要弄多几层,那就拖动个state元件过来,右击按下图设置将state元件变成Subchart.

并行状态

并行状态就是两个状态一起执行,在chart里面用两个state元件。举个例子会比较直观很多,有个人,每天赚100元,花80元,剩下多少钱,先用几个基础元件连起来。

在Model Explorer里面把刚才的默认名字改一改,定个方向,输出值定个初始值。

在chart里面拖两个state元件出来,写上内容,把系统赠送的default transition删掉。

在空白的地方右击decomposition-->parallel将里面的state都设置成并行。

虽然说是并行执行,但在启动的时候还是会有个先后的,这里可以调整个顺序。

运行,仿真出财务自由的康庄大道。

Junction使用方法

是一个节点,让整个图的架构更加整齐,做到横平竖直,不用太多交错或者曲线。需要注意的是如果有多条支路的话就会有标号,由于优先走小标号的支路,所以小标号的支路一定要写上条件,不然就永远走那条小标号的支路了。

状态自转移

从生成的代码里面会比较容易看得出来,用元件in和out才能对生成代码比较友好。里面设置两个输入变量inflow和outflow,一个输出变量flow.

箭头从内而外的是内部自转移,箭头从外而内的是外部自转移。从生成的代码里面可以看到,激活state之后,先执行外部自转移,再执行外部自转移。

Matlab生成的代码有个问题,进入sub chart 的时候不会自动执行里面的动作,所以一般要再sub chart里面加个内部自转移,让它执行一次里面的逻辑,加en,du是没有改善作用的。

en du ex

这三个一般写在state里面,en代表enter,du代表during,ex代表exit。

这个例子有两个输入变量inflow和outflow,两个输出变量flow1和flow2.

在这里我们可以看到,en是在进入state的时候执行的,包括初始化state的时候和从外部自转移重新进入状态的时候。du是内部自转移之前执行的。

看不到ex什么时候执行了,先去掉en和du,再加个状态看看。

这里我们可以看出ex执行时刻有两种,外部自转移执行后,en之前执行,所以在上一个例子当中被en的动作覆盖了。还有就是跳转到其他state的时候。

综上所述,整理下这三个的执行时刻。

en代表enter,在进入state的时候执行:

1、state初始化的时候

2、从外部自转移重新进入状态的时候

du代表during,在state内部自己转移的时候执行:

1、内部自转移之前

ex代表exit,在退出state的时候执行:

1、外部自转移之后,在en之前。

2、跳转到其他state的时候

数据管理

一般用的是Model Explorer窗口,对数据类型非常严格,输出信号必须有初始值。

Matlab认为false和0不一样,true和1不一样。

接口函数

after

在state跳转的时候使用

格式after(N, sec),N是数字,sec可以是毫秒msec,微秒usec,解算器采样时间tick。

有几种写法,用等待10毫秒举例:

1、after(10, msec)

2、[after(10, msec)]

3、[after(10, msec) == true]

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不吃鱼的羊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值