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

news2024/9/25 19:24:13

文章目录

  • 前言
  • 设计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,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mujoco安装及urdf转xml方法记录

参考 mujoco210及mujoco-py安装 下载适用于Linux或 OSX的 MuJoCo 2.1 版二进制文件 。 将mujoco210的下载的目录解压到~/.mujoco/mujoco210路径下. 注意:如果要为包指定非标准位置,请使用环境变量MUJOCO_PY_MUJOCO_PATH。 验证是否安装成功&#xff08…

springcloud3 fegin服务超时的配置和日志级别的配置2

一 fegin的概述 1.1 fegin的默认超时时间 默认fegin客户端只等待1秒钟,超过1秒钟,直接会返回错误。 1.2 架构图 1.2.1 说明 1.2.2 启动操作 1.先启动9001,9002 eureka 2.启动9003 服务提供者 3.启动9006消费者 1.3 情况验证 1.3.1 正常默认情…

云端IDE:TitanIDE v2.6.0 正式发布

原文作者:行云创新技术总监 邓冰寒 引言 云原生集成开发环境 TitanIDE v2.6.0 正式发布了,一起来看看都有那些全新的体验吧! TitanIDE 是一款云IDE, 也称 CloudIDE,作为数字化时代研发体系不可或缺的一环,和企业建设…

C++网络编程(一)本地socket通信

C网络编程(一) socket通信 前言 本次内容简单描述C网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节。记录本人C网络学习的过程。 网络通信的Socket socket,即“插座”,在网络中译作中文“套接字”,应…

项目管理必备:如何绘制一份优秀的甘特图?

本文一共分为两部分—— 分享60Excel甘特图模板,简单省事儿分享两种甘特图制作教程,高效快捷 第一部分——60甘特图模板 分享一些项目管理甘特图的模板,省事儿!高效!简单! Excel甘特图表模板自取&#xf…

Laya小游戏开发,laya3D美术篇——1——关于laya自带的几个shader的基础运用讲解。

最近三年,基本上做的都是laya小游戏项目。也就是微信小程序,很多业内同行都觉得laya做小游戏不好用,去用了其他平台,甚至还有些做app游戏的,都不来趟laya这个坑。原因有那么以下几点。laya对于unity的辅助开发&#xf…

STM32的USART发送数据时如何使用TXE和TC标志

8人从A出发去D旅游的故事 STM32的USART发送数据时如何使用TXE和TC标志 TXE为1: TDR里的数据全部移到了移位寄存器,且没有新的数据TDR。 TXE为0: TDR里有数据,未空,则TXE0。 TC为1: 从TDR过来的数据全部被移…

一文上手图数据备份恢复工具 NebulaGraph BR

作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳、更快、更易用的备份恢复工具,去年对其进行了比较大的重构。NebulaGraph BR(以下简称 BR)分为社区版和企业版两个版…

Git学习笔记(五)——分支

一、创建与合并分支创建分支:Git创建一个分支很快,因为除了增加一个指针,改改HEAD的指向,工作区的文件都没有任何变化。合并分支:就是直接把master(其中一条分支)指向dev(另一条分支…

python基础条件循环语句

1、编写代码完成一个名片显示,要求使用取消换行和格式化操作符 # 编写代码完成一个名片显示,要求使用取消换行和格式化操作符name 张三 qq 1234567 phone_num 1234567 com_address 北京print(\n 姓名:%s\n qq:%d\n 手机号:%d\n 公司地址:%s\n %(name ,qq ,phone_num, com_…

忆享科技优化入职培训加强人效管理全面迎接新挑战

-优化入职培训-忆享科技加强人效管理入职培训课程 ✦ KPI系统上线 ✦ 砥砺前行前言许多企业随着自身的不断发展,对于各类人才引进需求也越来越迫切,一批批新员工的加入,公司规模逐渐扩大,给公司带来了全新的血液。但在大量新员工加…

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2,所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件,可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…

lesson8-Linux多线程

Linux线程概念 线程在进程内部执行,是OS调度的基本单位OS是可以做到让进程进行资源的细粒度划分的物理内存是以4kb为单位的我们的.exe可执行程序本来就是按照地址空间的方式进行编译的页表映射 - 详细图 理解线程 线程在进程的地址空间内运行, 进程内部具有多个执行流的,而线程…

【java基础】集合基础说明

文章目录基本介绍Collection接口Iterator和Iterable接口Map接口关于Iterator接口的一些说明框架中的接口具体集合总结基本介绍 集合就是存储用来存储一系列数据的一种数据结构。在这篇文章中会介绍集合的一些基本概念。 Collection接口 集合的基本接口是Collection接口&…

Metabase和Superset 对比分析

Metabse中文社区Metabase和Superset都是排名靠前的开源的数据可视化软件,在技术上有许多相似之处。他们的比较可以帮助用户选择更好的开源平台进行数据可视化。关于Superset 编辑切换为居中添加图片注释,不超过 140 字(可选)Super…

Golang反射源码分析

在go的源码包及一些开源组件中,经常可以看到reflect反射包的使用,本文就与大家一起探讨go反射机制的原理、学习其实现源码 首先,了解一下反射的定义: 反射是指计算机程序能够在运行时,能够描述其自身状态或行为、调整…

智慧赋能,聚力开源——第四届OpenI/O 启智开发者大会开源治理专场顺利举办!

为汇聚国内外知名开源组织共同探讨中国开源生态建设及开源治理相关议题,推进产学研用开源合作,2月24日下午,第四届OpenI/O启智开发者大会在深圳人才研修院智汇中心举办以“构建开源联合体,共建开源生态”为主题的开源治理专场分论…

C++基础了解-17-C++日期 时间

C日期 & 时间 一、C日期 & 时间 C 标准库没有提供所谓的日期类型。C 继承了 C 语言用于日期和时间操作的结构和函数。为了使用日期和时间相关的函数和结构,需要在 C 程序中引用 头文件。 有四个与时间相关的类型:clock_t、time_t、size_t 和 …

opencv识别车道线(霍夫线变换)

目录1、前言2、霍夫线变换2.1、霍夫线变换是什么?2.2、在opencv中的基本用法2.2.1、HoughLinesP函数定义2.2.2、用法3、识别车道3.1、优化3.1.1、降噪3.1.2、过滤方向3.1.3、截选区域3.1.4、测试其它图片图片1图片2图片31、前言 最近学习opencv学到了霍夫线变换&am…

ruoyi对接CAS统一身份认证

暂定逻辑如下:搭建CAS服务器端:项目地址:https://gitee.com/weigang_wu/cas-server-webapp.git项目里有二开的说明文档,如:按照自定义的数据库校验修改如下:首先:修改数据库连接以及查询数据这里…