在汽车嵌入式软件开发中,需要正确地配置Simulink的信号和参数,才能生成相应的标定量、输入输出变量和观测量。本文通过一个例子总结笔者工作中所用的配置方法。

1 问题引入

Simulink代码生成(一) Embedded Coder配置这一篇博客中,没有对输入输出信号做任何配置就生成了代码。此时生成的代码表现为结构体的形式,并且是在模块内定义的。
在这里插入图片描述
一个模型的输入信号可能来源于其他模型的输出或者底层软件,因此这样直接在自身代码内部的定义方式显然是不符合实际开发需求的。笔者在工作中是通过配置输入输出信号线对象,即Simulink.Signal对象,生成了特定存储方式的代码。

2 输出信号配置

首先建立一个Simulink模型demo1.slx,并将输出信号线命名为Output1,如图所示。
在这里插入图片描述
在Matlab命令行输入:

>> Output1 = Simulink.Signal;

此时,在右侧的工作区创建了一个名为Output1Signal对象。双击该对象,将其配置如下图:
在这里插入图片描述
其中,Data Type表示其数值类型为single型,Initial Value表示初始值设为10,Storage Class设为ExportToFile表示该变量输出到外部文件,下面的HeaderFile和DefinitionFile表示外部的C文件和头文件。1

然后回到模型demo1.slx,右击Output1信号线,选择Properties打开该信号线的属性窗口。在窗口中勾选Signal name must resolve to Simulink signal object,将该信号线和刚刚定义的Signal对象关联起来2。关联后模型中会出现一个小叉子的图标。
在这里插入图片描述
然后生成代码,打开报告。在demo1.c的step函数中可以看到,输出变量命名为了Output1,而不是之前的Demo_Y.Out的结构体。initialize函数中可以看到,将Output1初始化为了10,与之前配置相吻合。
在这里插入图片描述
那么,这个Output1是在哪儿定义的呢?打开Demo1_Output.c就可以看到Output1的定义了,这与之前的StorageClass配置相吻合。
在这里插入图片描述
然后,在Demo1_Output.h中用extern关键字外部定义了Output1,也就是说其他的模型如果要输入Output1这个变量,代码中只需要包含Demo1_Output.h这个头文件即可。可以注意到,demo.c文件中包含了demo.h头文件,demo1.h头文件中包含了Demo1_Output.h头文件。
在这里插入图片描述

3 输入信号配置

配置输入信号的步骤与输出信号相似,要给信号线命名并关联。但是在Signal对象中要把StorageClass设置为ImportFromFile,并且只需要填入HeaderFile头文件。这里假设Input1是Demo2输出的。
在这里插入图片描述在这里插入图片描述
生成的代码中,demo1_private.h包含Demo2_Output.h头文件。但是不会生成这个头文件,因为这个变量是Import的,属于别的文件中定义的。并且Input1这个变量也不会在initialize函数中初始化。
在这里插入图片描述
在这里插入图片描述

4 观测量配置

观测量和输出信号配置类似,都是输出到外部文件。不过最好在C文件命名上体现其中的是观测量。

5 标定量配置

标定量在汽车软件中是可以被标定工具所修改的,因此需要有volatile关键字修饰。标定量在模型中不是以信号线存在的,而是作为某个模块的参数,常见的是作为Const模块的参数。

如图所示,将Simulink中Const的参数定为一个标定量。
在这里插入图片描述
然后,在Matlab命令行定义一个Parameter对象

>> Calibration1 = Simulink.Parameter;

打开该对象,配置参数信息。
在这里插入图片描述
其中,Value表示代码中的赋值,StorageClass、HeaderFile和DefinitionFile表示存储类型为Volatile和所在文件。

然后,不需要像信号线一样关联对象,直接生成代码。就会多生成标定量的C文件和头文件,其中定义了标定量。
在这里插入图片描述
在step函数中用了这个标定量。如果用标定工具修改了这个量,就会在MCU中生效。
在这里插入图片描述

6 总结

本文只是笔者所用到的对信号线和参数的配置方法。在实际工作中根据不同的项目特点可以进行其他配置。

>>返回个人博客总目录


  1. Signal对象也可以在数据字典里定义。 ↩︎

  2. 也可以通过Matlab脚本批量勾选,详见Matlab技巧(三) 通过脚本获取/修改Simulink信号线参数 ↩︎

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐