
目录
起因,发现了一个建模中易想当然的错误
做一个demo猜一下结果
混淆的原因分析:
分析具体代码来看看
结尾,为Simulink正名
起因,发现了一个建模中易想当然的错误
stateflow中 state machines和flow chart混用是我们有时候建模过程中不可避免的操作,我相信不少人也是这么用的,在state和flow中间我们一般定义一些简单的原则:假如逻辑需求有出现有限个状态跳转,我们优先使用状态机来建模。同时因为是基于MBD开发,我们并不希望状态机包含过多的实现逻辑,状态机的具体动作我们一般会放在simulink外部实现。流程图不包含状态,只是我们对某一动作,一般是为了做一些简单的逻辑判断,或者是在simulink中比较难以直观体现的流程结构。比如一些选择语句和循环语句(if/else,switch,do,while等),或者是多重判断和循环选择。两者比较大的区别就是state会在每个step都做一个停留,而flow则会在每一个step判断执行到最后一个节点。我们大多数人在建模之初肯定都会先学习一下MAAB(MathWorks Automotive Advisory Board),该文档几乎会规定所有建模中不允许出现的做法。但是,建模的需求千奇百怪,总有一些细节会错过。最近我就遇到了一个以前没有注意到的一个坑。
做一个demo猜一下结果

这是一个很简单的stateflow状态机,总共A,B,C,D四个,输入条件CA,CB,CC,CD,CE,CF,一个输出为a.这里有三个题目:前提条件,我们只运行三个step,也就是保证能到达满足条件的state中。(假如运行四个step,下面的选项就不成立了)
1. 假如CA,CB,CF为true,其他为false,输出为()
A:101
B:101101
C:11101
D:10101
2. 假如CA,CB,CC,CF为true,其他为false,输出为()
A:101
B:101101
C:11101
D:10101
3. 假如CA,CB,CC,CE,CF都为true输出为()
A:101
B:101101
C:11101
D:10101
答案是:D,C,B
如果你都做对了,特别是第二个题目,那说明你对simulink生成代码的规则十分清楚。下面就不用看了。其实坑就是第二个题目。
混淆的原因分析:
除了第二个,其他两个题目都是单一路径,并不会产生歧义。第二个题目中,1和2两个节点同时满足,那会发生什么呢,没错,这里有一个回溯的问题,当节点走到CE发现不满足的时候,节点会退回到CB后的节点,进行第二次优先级低的路径中判断,并会导致不被期望的变量1000被累加上来。

结果就是,从state B中,一个周期内到达state D,并完成了期望值a不被期望的一次意外累加。
其实这个结果以我的经验是比较意外的,我本意理解当到达一个分支节点的时候,simulink应该把它当成一个if_else分支操作,if就是优先级为1的节点,else为优先级为2的节点,应该互不干扰。实际结果不同,说明matlab代码生成有不同的规则。那就把代码生成出来看一下。
分析具体代码来看看


定义和初始化代码很常规,我们单独看一下state A,因为只有CA,所以CA为true就令状态跳转到B。

看一下state B,代码生成过程中引入了中间变量guard1,guard1在初始化开始为false,但只要条件有不满足的路径就变为true。我们注意到,CC这个条件和guard1,CF为并列关系,并不是图形上所示的为优先级关系,当判断CC&CE条件不满足时,会回头执行CF的动作。

这段代码与图形上看到的不同,只有CC这条路径完全为true,中间变量guard1才不会被置1,才不会回头执行CF。这点需要注意。
如何避免类似容易忽略的坑:
其实我原来一直没遇到过这种问题, 这是上周一个供应商产品介绍的时候举的一个例子,然后我就自己试了一下。避免这种问题其实很简单,不要再混用的时候在边传递边执行,有状态机的话执行都放在状态机中,并且分清楚du:,ex:,en:等关键字。基本不会有问题。其实这个逻辑传递条件本身是个多重判断的问题,MAAB中建议我们画成这种结构:

结尾,为Simulink正名
这个例子结尾我们停在状态机里,假如换成这种呢,三个结果会不会不一样?
如果CF和CC都不成立,3个step后a的值?

其实Simulink是MathWorks一个相当成功和成熟的产品,仿真与代码生成已经打磨多年,建模中发现的类似bug的发现不过是我们没有好好看建模规范罢了。
1
2文章来源微信公众号"汽车圈的小混混" 相关内容及相关微信后台回复‘MAAB’领取MAAB规范pdf文档。
最后
以上就是着急纸飞机最近收集整理的关于simulink仿真及代码生成技术入门到精通pdf_Simulink/StateFlow状态机和流程图混用的一个注意事项/坑...的全部内容,更多相关simulink仿真及代码生成技术入门到精通pdf_Simulink/StateFlow状态机和流程图混用内容请搜索靠谱客的其他文章。
发表评论 取消回复