在汽车软件基于autosar开发过程中,在主机厂一般是按功能模块划分给软件开发小组的各个工程师开发维护。在众多功能模块中,有一个功能模块是CAN信号处理模块,其主要功能是连接RTE接口和应用层ASW接口,即把本ECU各个功能模块(eg.BMS开发中SOC等)的信号按照项目的CAN协议(DBC)中定义的信号名、分辨率和偏移量等装载,然后调用RTE接口写进底层CAN寄存器,底层周期性把这心信号发到CAN总线上去;此外把底层传上来的来自其他ECU的CAN信号进行解析,改变ASW能识别的信号名,供给各个ASW使用。在现代的汽车中,CAN信号非常多,所以CAN处理模块在用simulink建模时,接口的变更会引起模型的变化,各个信号的间距、位置等就会发生变化,使模型看起来非常紊乱,而一个个手动拖动信号端口,则耗时巨大,效率比较低,本文介绍通过脚本自动对齐端口,此脚本仅限于对齐端口,由于现在比较忙,更完善的功能还未有时间整理。

硬核干活

先展示效果,再详解实现过程。如图1,初始时模型乱如麻。

图1.对齐前的模型

建立脚本,运行函数后如图2(不是手动对齐的)。

以下是方法原理。

(1)get_param('test/subsystem','PortConnectivity')获取位置信息

在simulink模型中,每个模块都有很多属性,比如端口的位置、大小,子系统的接口数量,位置坐标等。我们首先明确要对齐的对象。在图1的模型中,我们要实现输入端口Inport和subsystem的接口的对齐,因此要获取subsystem接口的位置信息。在MATLAB里,用get_param(Object,Parameter)函数来获取模块属性,其中Object是要获取的对象名,一般是'modelname/blockname',即‘模型名/子系统名’,我这里模型名为“test”,子系统为“subsystem”,因此第一个参数是'test/subsystem',第二个参数是你想要获取的对象的属性参数,对每个模块的属性,请参阅官方help,这里此参数是‘PortConnectivity’,此参数是一个结构体数组,此结构体就包括子系统接口的位置信息。以上步骤得到的需要保存到workspace里,保存名为A的结构体数组。

Inport=find_system('test','SearchDepth',1,'BlockType','Inport')

获取到subsystem的接口位置后,下一步是找到所有的输入输出端口。用find_system(System,Name,Value)函数找到该层级模型下的输入输出端口,对输出端口,用                                                                     find_system('test','SearchDepth',1,'BlockType','Inport')函数,其中('SearchDepth',1)参数表示只找当前层级的模型,('BlockType','Inport')参数表示找输入端口,找到后保存在Inport数组里。对输出端口则用'Outport'代替'Inport',其他不变。

(3)设置Inport/Outport的位置。

获取到需要对齐的对象(Inport/Outport)和对齐的参考点后,下一步就是需要设置Inport/Outport的位置。在simulink中,所有模块都看作是一个矩形方块,因此模块位置是由一个数组决定,即[左坐标,上坐标,右坐标,下坐标],坐标原点是左上角,往右是X轴正方向,往下是Y轴正方向。用                                                                                   set_param(Object,ParameterName,Value,...ParameterNameN,ValueN)函数来设置位置属性,当然,由于有多个端口保存在Inport数组中,因此需要用一个for循环来进行。那怎么对齐呢?因为subsystem模块的接口只是一个坐标点(x,y),根据此坐标点为中心,设置各个端口的位置,就能实现对齐了。运行以下命令:

for i=1:length(Inport)

set_param(Inport{i},'Position',[(A(i).Position(1)-100),(A(i).Position(2)-7),(A(i).Position(1)-70),(A(i).Position(2)+7)]

其中'Position'表示设置Inport{i}的位置属性,而Position的value就是以对应subsystem的接口为中心,设置一定的间距值,以上述代码i=1为例说明,Inport{1}左坐标距离subsystem第一个接口100单位,右坐标距离subsystem第一个接口70单位,上坐标在subsystem第一个接口上方7个单位,下坐标在subsystem第一个接口下方7个单位,这样Inport大小就是长30,高14的椭圆,即默认的大小,且位置也确定下来了。这里A(i)是第一步取到且存下来的结构体数组,.Position即对结构体成员取值Position(1)表示取Position第一个元素,即X坐标,Position(2)表示取第二个元素,即Y坐标。对Outport,因为端口在subsystem的右边,所以X方向需要加偏移距离,Y方向和输入端口一样。

以上就是用脚本自动对齐模型内输入输出端口的方法,也仅有此功能,对于软件开发而言,还有很多可以完善或增加的功能,比如自动添加输入输出端口,自动命名,自动连线,自动设置输入端口的输出数据类型,自动配置端口的autosar属性等等,由于工作繁忙,现阶段还未完善,以后有时间再做优化,以提高开发效率,缩短开发周期。

参考资料:MATLAB help文档