文章目录
- 前言
- 设计Excel模板
- 编写matlab脚本
- 自动添加Function到Simulink模型
- 自动mapping Function与Runnable
- 总结
前言
在之前的一篇文章中,介绍了Autosar S/R接口的自动创建及mapping,传送门:Simulink自动化-Matlab脚本自动生成Autosar RTE S/R接口及mapping
本文接着介绍在Autosar SWC中必不可少的一个定义,Runnable,即可运行实体,Runnable在生成的代码中实际就是函数。在Simulink中开发SWC时,需要将Function与Runnable进行Mapping。一般一个SWC会有一个Init函数和主函数,主函数需要设置对应的Cycle Time及Function的名称。和之前一样,我们采用Excel来管理SWC的Runnable及对应的调度周期,通过Matlab脚本实现Simulink模型的自动创建,Function函数生成,及Autosar Runnable的生成与mapping.
设计Excel模板
在配置Autosar接口时,Runnable有如下属性:
symbol对应的就是生成的函数名
通过配置EventType配置Runnable触发的属性,确定是初始化还是周期触发,还是通过C/S接口触发,这里目前我们只考虑初始化和周期触发。
由此,我们设计的Excel模板如下:
编写matlab脚本
自动添加Function到Simulink模型
之前我们在设计多个Runnable的时候,使用的Function-call Generator作为输入,但是这样的话在Runnable mapping时显示的是类似Periodic:D1,不方便脚本链接。所以我们使用In1模块,并设置Outputfunctioncall属性为on,这样在Runnable mapping时就会以Exported Function形式进行mapping
在创建Function时,需要区分是初始化函数还是周期函数,通过EventType区分。具体实现脚本如下所示:
for j=2:RTERunnable_Parameterrow_num
RTEInput_ParameterName = strcat(Model_Name,'/',RTERunnable_Parameter{j,RTERunnable_Parameter_column_num(1)});
if strcmpi(RTERunnable_Parameter{j,RTERunnable_Parameter_column_num(3)},'InitEvent')
handle = add_block('simulink/User-Defined Functions/Initialize Function',RTEInput_ParameterName);
delete_line(find_system(Model_Name,'findall','on','Type','Line'));
BlockPaths = find_system(RTEInput_ParameterName,'BlockType','Constant')
for jj=1:length(BlockPaths)
delete_block(BlockPaths(jj));
end
BlockPaths = find_system(RTEInput_ParameterName,'BlockType','StateWriter')
for jj=1:length(BlockPaths)
delete_block(BlockPaths(jj));
end
else
handle = add_block('simulink/Sources/In1',RTEInput_ParameterName,'SampleTime',num2str(RTERunnable_Parameter{j,RTERunnable_Parameter_column_num(5)}),...
'Outputfunctioncall','on');
add_block('simulink/Ports & Subsystems/Function-Call Subsystem',[RTEInput_ParameterName '_call']);
BlockPaths = find_system([RTEInput_ParameterName '_call'],'BlockType','Inport')
for jj=1:length(BlockPaths)
delete_block(BlockPaths(jj));
end
delete_line(find_system(Model_Name,'findall','on','Type','Line','Connected','off'));
BlockPaths = find_system([RTEInput_ParameterName '_call'],'BlockType','Outport')
for jj=1:length(BlockPaths)
delete_block(BlockPaths(jj));
end
RTERunnableName = RTERunnable_Parameter{j,RTERunnable_Parameter_column_num(1)};
RunnableInp = get_param(RTEInput_ParameterName,'PortHandles')
CallTrriger = get_param([RTEInput_ParameterName '_call'],'PortHandles')
add_line(Model_Name,RunnableInp.Outport(1),CallTrriger.Trigger(1),'autorouting','on');
end
end
在创建完Init Function后,对Subsystem中的除初始化之外的模块进行删除。
对于周期性的Runnable,除了创建Inport模块之外,还创建了对应的Function call子系统,并将其与In模块(此处没有调整Function call位置,感觉意义不大)
实现效果如下:
自动mapping Function与Runnable
通过Simulink中集成的Autosar API函数实现自动mapping
open_system(Model_Name);
% Use AUTOSAR property functions
arProps = autosar.api.getAUTOSARProperties(Model_Name);
% Add AUTOSAR initialization and periodic runnables
swc = get(arProps,'XmlOptions','ComponentQualifiedName')
ib = get(arProps,swc,'Behavior')
% Generate Single Arxml file
set(arProps,'XmlOptions','ArxmlFilePackaging','SingleFile');
% Delete runnable
runnables = get(arProps,ib,'Runnables')
for ii=1:length(runnables)
delete(arProps,runnables{ii})
end
%delete events
events = find(arProps,ib,'TimingEvent','PathType','FullyQualified')
for ii=1:length(events)
delete(arProps,events{ii})
end
events = find(arProps,ib,'InitEvent','PathType','FullyQualified')
for ii=1:length(events)
delete(arProps,events{ii})
end
在创建mapping之前,先删除之前的Runnable及Event(Event这个其实配置界面上看不出来,但是需要先删掉,否则会报重复定义)
通过对ArxmlFilePackaging属性的配置,实现生成Arxml时只生成一个。
for num = 2:RTERunnable_Parameterrow_num
RunnableName = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(1)};
RunnableSymbol = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(2)};
%add runnable
add(arProps,ib,'Runnables',RunnableName,'symbol',RunnableSymbol);
% Add AUTOSAR timing event
eventName = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(4)};
eventType = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(3)};
cycTime = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(5)};
if strcmpi(RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(3)},'InitEvent')
add(arProps,ib,'Events',eventName,'Category','InitEvent','StartOnEvent',[ib '/' RunnableName]);
else
add(arProps,ib,'Events',eventName,'Category','TimingEvent','Period',cycTime,...
'StartOnEvent',[ib '/' RunnableName]);
end
end
% Use AUTOSAR map functions
slMap=autosar.api.getSimulinkMapping(Model_Name)
% Map AUTOSAR runnables to Simulink initialize and step functions
for num = 2:RTERunnable_Parameterrow_num
RunnableName = RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(1)};
if strcmpi(RTERunnable_Parameter{num,RTERunnable_Parameter_column_num(3)},'InitEvent')
mapFunction(slMap,'Initialize',RunnableName);
else
mapFunction(slMap,RunnableName,RunnableName);
end
end
先使用add函数在Autosar组件中增加Runnable及Event,然后使用mapFunction函数将Runnable与Function进行mapping.
实现效果:
生成的代码:
对应的Arxml文件:
总结
本文介绍了使用Simulink中的API函数对Autosar SWC中Runnable的自动创建及mapping,对于C/S接口,也有类似的方法实现,后面有时间可以再整理。
若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~ 你的鼓励是对小弟的最大支持~~~ 建了一个WX公众h,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~