Simulink自动化-Matlab脚本自动创建Runnable及mapping

前言

在之前的一篇文章中,介绍了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,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赞哥哥s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值