Simulink代码生成(五) Bus信号的代码

最近工作中遇到了一些Bus信号相关的问题,研究发现在不同的配置下,生成的代码也会略有区别。

1 Bus信号概述

通过Bus Creater模块,可以将不同的信号线构建成Bus信号,就像将许多电线捆绑在一起一样。根据虚拟性,可以将Bus信号分为虚拟Bus信号和非虚拟Bus信号。

虚拟Bus信号只是看起来把很多信号合并成了一个,在生成代码的时候,和不用Bus信号是一样的效果。虚拟Bus信号如图所示,由三根平行直线和箭头组成。
在这里插入图片描述
非虚拟信号线在生成代码的时候会生成出结构体。如图所示,由两根直线和虚线组成。
在这里插入图片描述

2 虚拟Bus信号及其代码

打开Simulink,建立如下的简单模型,验证虚拟Bus信号的代码生成。
在这里插入图片描述
可以注意到,模型中把信号数据类型和维度显示出来。由于图中把Bus直接输出给一个Outport模块,虚拟Bus信号必须使用相同的数据类型,不然会报错,如下图所示。

如果是先用Bus Creater生成一个Bus信号,再用一个Bus Selector把信号提取出来,就没有类型相同的限制了。
在这里插入图片描述
然后,Ctrl+B生成一下代码并分析,可以看到输出的Outport模块被定义为一个数组,这也是为什么必须类型相同的原因。
在这里插入图片描述

3 非虚拟Bus信号及其代码

定义非虚拟Bus对象,需要经过一些配置。
1.打开Model Explorer,选中Base Workspace
在这里插入图片描述
2.点击工具栏中的Add——Simulink Bus,添加一个Bus对象。
在这里插入图片描述
3.将Bus的名称重命名为Bus1,右侧的Data Scope选为Exported,Header File写为Exported.h。这个操作是为了把Bus1的结构体定义保存在Exported.h文件中。
在这里插入图片描述
4.打开Launch Bus Editor,进入Bus编辑窗口。在Bus1中添加两个元素,a和a1。a的Datatype设为double,dimenssions为1;a1的Datatype设为single,dimenssions为2。通过该方式验证Bus元素不同类型和维度的情况下也能生成代码。然后点击Apply保存。
在这里插入图片描述
5.接下来回到模型中,双击打开Bus Creater,此时Output data type的下拉框可以选则刚刚新建的Bus1。
在这里插入图片描述
6.选中Bus:Bus1,再勾选下方的Output as nonvirtual bus,这样就可以将这个Bus定义为非虚拟Bus信号了。
在这里插入图片描述
7.把Inport1输入口的数据类型配置为double,和Bus对象的a元素相对应。然后Ctrl+D更新一下,就可以看到不同的数据类型和维度也可以组合成Bus。
在这里插入图片描述
8.然后再Ctrl+B生成一下代码。首先可以观察到生成的代码中有一个Exported.h文件,这个文件就是步骤3中自定义的头文件。再文件中,用typedef创建了一个名为Bus1的结构体类型,其中的成员有double类型的a和single类型的a1[2]。
在这里插入图片描述
打开demo.h,可以看到用Bus1这个结构体类型定义了一个结构体变量Out1,对应模型中的输出端口。
在这里插入图片描述
最后,到demo.c的step函数中可以看到对Out1的赋值操作。非虚拟Bus信号创建了一个结构体。
在这里插入图片描述

4 总结

非虚拟Bus信号生成结构体的情况,应用场景不算很多,只是暂且知道这么一回事儿就行了。

>>返回个人博客总目录