7.2.4 汽车嵌入式系统Maltlab模型开发技巧
Simulink一般用来表示相对简单的逻辑关系,当涉及复杂逻辑关系时,应该使用Stateflow进行逻辑搭建,Simulink模快为Stateflow模型提供输入信号。而State-flow计算的结果输出并连接至Simulink模块形成系统输出。
7.2.4.1 Simulink使用技巧
1)Simulink中的信号线应尽量避免交叉,如图7-7所示,可使用折线,如无法避免信号线的交叉可用From、Goto等标识。

图7-7 Simulink信号线不应相互穿越交叉
2)如果一个输入信号端口连接多个输出线,分支点应该在交点处显示出来,如图7-8所示。

图7-8 多个信号分支的交点并入或并出(分支点要标清)
3)输入端口一般布置在左边,输出端口一般在右边,如图7-9所示。Simulink执行模型的顺序通常是从左上方开始逐行扫描,到右下方结束。

图7-9 输入输出信号布置方式
4)输入输出端口一般需要命名,而且名字需要和相应的信号名字相一致,如图7-10所示。

图7-10 接口和信号命名需一致
5)并列的信号流应该依据前后、名称等顺序从上到下分布,如图7-11所示。
6)模块如果需要命名,名称应该在模块下方,如图7-12所示。

图7-11 并列信号应从上至下排列

图7-12 模块名称要置于模块下方
7)没有连接的输入、输出或信号线应该去除。如果信号需要保留(比如测试用等),那么信号必须接地或接终端,如图7-13所示。

图7-13 无用信号需要接终端
8)如果创建封装子系统模块,那么封装模块的参数必须在其属性格式字符串中显示,如图7-14所示。
9)模块应根据标识的大小重新制定尺寸。标识上的命名需有可读性。
10)Goto和From只能在一个模块内部使用,尽量不要应用到更大的范围。它们的名称应该和其连接的信号名称一致。
11)信号的名称要和信号的解释分开。如果可能,在上游定义好信号后,下游信号线上尽量使用“<”符号复用信号名以避免出错。
12)信号名称应和信号端口或信号线相邻,不可标识过远,以影响可读性。
13)所有的模型接口,所有的模型输入、输出接口,所有的子系统模型接口和输入输出接口、S函数接口、Stateflow模块和Goto/From模块都必须注明信号名。
14)没有在信号线上命名的输出信号,仅仅适用于无数据储存的输出接口。
15)控制器模型应该由离散的模块建成。
16)If-then-else的结构应该由select模块组成。建议的模板为图7-15所示的方式,也可以使用函数调用的使能模块组成逻辑。

图7-14 遮掩模块的属性格式要显示参数

图7-15 If-then-else逻辑范例
17)Case在Simulink也是由一个大的select组成,它的第一个输入是switch的选项内容,如图7-16所示。同样,也可以使用函数调用的使能模块组成逻辑。

图7-16 Case选择逻辑范例
18)单位的迟滞信号应用(1/z)模块实现,如图7-17所示。

图7-17 单位迟滞信号使用图
19)所有控制算法Simulink和Stateflow模型都需要在一个被调用的子系统中,如图7-18所示。通常,程序代码的操作系统部分是手写的,而将自动生成的代码和手写代码集成时,就需要用到函数调用机制。
20)函数调用子系统需要用事件定义,如图7-19所示。(https://www.daowen.com)
21)标定参数通常用常数模块表示,一般需要在模块颜色上加以区分,如图7-20所示。
所有标定量必须在.m文件中预先定义好,否则Matlab会返回参数没有定义的错误信息。
7.2.4.2 Stateflow使用技巧
1)与状态和跳转相联系的条件或动作需要用线条可视化地联系在一起。
2)Stateflow中图形化的函数名称中应该标明函数的基本功能,而和函数被哪里调用无关。
3)在状态表中,默认的初始动作应该在顶部,而Stateflow必须要有一个默认的动作,如图7-21所示。
4)如果操作的过程涉及多个部分,正确的执行顺序是从上到下。

图7-18 使用函数调用机制

图7-19 被调用函数的定义

图7-20 标定变量的模型示意图

图7-21 Stateflow图形化函数的默认跳转动作
5)一个好的Stateflow图形化函数应该有完整的说明文档,文档可以嵌入与Stateflow相关联的Simulink模型中。
6)状态表中的状态定义,文字应在方框内(包括关键字Entry,During和Exit及其动作)。
7)Stateflow的跳转过程不能和其他状态交叉。
8)Stateflow的输入和输出变量名应该和其在Simulink中的信号名称一致。
9)如果Stateflow中需要进行大量的计算并用到了Simulink的变量时,这些计算应该在一个由Simulink函数调用的子系统中,即Stateflow需要先被封装在Simu- link模块中,再将这个模块加上触发或调用。
10)在不影响实现逻辑功能的基础上,应尽量减少状态的数量。
11)标定变量一般不能在Stateflow中定义,如需要,必须作为stateflow的输入变量。
12)所有事件Event都应在当前或下一个层级内定义。
13)Matlab函数和代码禁止在Stateflow中应用。
14)Stateflow模块中所有的输入、输出、数据和事件都必须命名。
15)Stateflow中的强制使用信号数据类型选项要显性使用(“Use strong data typing”)。
16)Stateflow内部信号和辅助变量都要定义为本地数据“Local Data”。
17)一个有效的跳转通常会有条件和行动两个部分,如图7-22所示。但也有空的跳转,它是有效的,只是没有内容。
18)每个节点,除了最后一个外,都应该有输入和输出,每个节点都必须有一个默认路径,如图7-23所示。

图7-22 Stateflow中的条件和行动示意图

图7-23 节点的输入输出
19)用Stateflow可以实现If-Then-Else的逻辑,如图7-24所示。
If-Then-Else逻辑的另一种表达方式如图7-25所示。
20)用Stateflow实现Switch、Case的逻辑结构如图7-26所示。
21)Stateflow实现的循环逻辑方法如图7-27所示。

图7-24 Stateflow的If-Then-Else逻辑

图7-25 If-Then-Else逻辑的另一种写法
上面只介绍了Matlab/Simulink/Stateflow在汽车嵌入式系统开发使用中的一些基本技巧和注意事项,还有许多内容没有涉及到。