Stateflow的图形函数应用实例(stateflow function)
使用递归调用和导出图形函数的Stateflow的图形函数应用实例,增加对图形函数的了解。
1.递归调用
如果一种算法的定义如下,则它就是递归的:
对应于某些参数的求值存在一个或多个终止条件;
一个递归步骤根据先前某次值求当前值,递归步骤最终必须收敛与终止条件。
n! = n(n-1)(n-2)...*2*1;
阶乘可以用过循环结构来处理,不过利用递归定义,能够使代码变得更加简洁。阶乘的递归定义如下:
n!={1,n = 0 //终止条件
{n(n-1)! //递归步骤
很显然,可以将阶乘运算的循环结构定义成使用条件判断的选择分支结构。那么根据递归定义,就可以创建求解阶乘的图形函数,如下图所示:
在图形函数中,对输入参数n进行了限制,因为当n大于或者等于21时,阶乘的结果就超出了无符号32位整数的数据范围,所以当n大于或者等于21时,让阶乘的计算结果为0。图形函数的输入/输出参数类型均为unit32,因此调用该图形函数时,参数最好也为uint32。调用图形函数非常简单,在默认转移的条件动作上调用即可,如下图所示:
出现错误
因为函数内定义的变量属性不能是Inherit
修改之后
仿真结果如下图所示
Chart内部图组成如下图所示
注意:在图形函数中使用递归时,递归的层次不宜过多,否则会影响模型的执行效率,同时还有可能出现系统不正常的现象。递归调用能够让代码变得简洁明了,让人一目了然,但是它造成的后果就行降低了代码执行的效率。其实大多数递归问题都可以使用确定次数的for循环结构来处理,尽管代码读起来稍微繁琐一些,但是函数的执行效率却能够得到提高。因此,没有必要将自己的算法一定都写成递归的形式。
2.导出图形函数
要修改递归函数中的变量的值的继承类型不能是inherit,可以修改为double。
可以在模型查看器中修改把matlab2020的action language语言,根据实际的需求改为C语言。
如果要使创建的图形函数能被其他的状态机,即其他的Simulink模型调用,则需要将包含图形函数的Chart块包含在Simulink模块库中。执行Simulink模块库浏览器下File菜单中的New子菜单下的New Library 命令,创建空白的模块库文件,然后将需要增加到模块库中的Stateflow图块拖放到该库文件中,如下图所示:
参考内容
[1] 张威.Stateflow逻辑系统建模[M].西安:西安电子科技大学出版社,2007.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙