Simulink自动化-Matlab脚本自动生成Autosar RTE S/R接口及mapping

news2024/11/24 11:57:21

文章目录

  • 前言
  • 设计Excel模板
    • Input/Output属性
    • Sender/Receiver属性
  • Matlab脚本
    • 自动创建Input/Output接口
    • 自动创建RTE Sender/Receiver port
  • 实现效果
    • Excel设置
    • 运行新建Input与Output
    • 运行创建RTE Port及Mapping
  • 总结

前言

在之前的一篇文章中,介绍了Autosar Parameter Port的创建与mapping。基于此思路,本文介绍Autosar RTE中的Sender/Receiver接口在Simulink中的自动创建,及与对应的Simulink Output/Input接口的mapping.我们这里仍采用Excel来管理Interface

设计Excel模板

在开始编写脚本以前,需要设计可行的Excel模板,好的模板格式可以节省部分代码的工作量。

Input/Output属性

首先我们需要在Simulink中创建需要mapping的Input及Output,那我们需要提取出Input/Output接口中的关键信息,Interface名称,数据类型,维度是非常重要的。

在本脚本中只设置了这三个属性,最大最小值,单位等不是很重要,列在Excel中只是为了方便查看。

Sender/Receiver属性

在进行Input/Output与RTE接口的mapping时,我们可以看到几个关键的信息,DataAccessMode-数据的访问模式(一般就用显式或隐式),Port,Element

我们设计Excel如下:

Description不用来作为脚本输入,只是为了描述接口。

Matlab脚本

自动创建Input/Output接口

在创建Input/Output接口之前,需要有一个Autosar的Simulink模型,此处我们通过脚本创建一个Simulink模型,再通过脚本配置模型配置,以达到Autosar的Simulink模型。

clc;
clear;
Excel_Name = 'RTEPort';
Model_Name = 'RTEInterface';
configRef = GenCodeCfg;

modeexist = exist (Model_Name);
if modeexist ~= 2 && modeexist ~= 4
new_system(Model_Name,'model');
attachConfigSet(Model_Name,configRef);
setActiveConfigSet(Model_Name,'RteCfg');
save_system(Model_Name);
end

GenCodeCfg是我从别的项目中导出的模型配置,其实对于Autosar的Simulink模型来说,主要配置SystemTargetFile为autosar.tlc,再将SolverType设置为Fixed-step即可使用Autosar SWC Component功能(在模型中使用Crtl + Shift + C也可以打开此功能,进行mapping)

通过new_system创建模型,通过save_system保存模型。使用exist只是为了验证模型是否已经被创建,否则new_system会报错,也可以通过在模型名中加入时间戳来避免此问题。

在创建Input/Output前,先删除模型中的端口,如下代码所示

open_system(Model_Name);
BlockPaths = find_system(Model_Name,'Type','Block')
for i=1:length(BlockPaths)
    delete_block(BlockPaths(i));
end

读取Excel中的信息,以创建端口

思路:
1.通过xlsread读取excel中的信息

2.通过add_block添加Input模块及对应的属性

3.将新建的模块位置进行排列整齐

具体代码如下所示:

RTEcolumn = {'ModeInterface','DataType','Dimensions',...
    'MinVal','MaxVal','Unit','RTEDataAccessMode','RTEPortName','RTEDataElement','Description'};
[~,Sheet_Cell] = xlsfinfo(Excel_Name)

for sheet_num = 1:length(Sheet_Cell) %遍历当前Excel中的Sheet页
    if strcmpi(Sheet_Cell{sheet_num},'RTEInput')%找到RTEInput表
        [~,~,RTEInput_Parameter]  = xlsread(Excel_Name,Sheet_Cell{sheet_num})%获取RTEInput中的信息
        RTEInput_Parametercolumn_num = size(RTEInput_Parameter,2);%获取列数
        RTEInput_Parameterrow_num = size(RTEInput_Parameter,1);%获取行数
        %获取参数在表中的列数
        for j = 1:RTEInput_Parametercolumn_num
            for jj = 1:length(RTEcolumn)
                if strcmpi(RTEInput_Parameter{1,j},RTEcolumn{jj})
                    RTEInput_Parameter_column_num(j) = jj;%Parameter所在列
                    break;
                else
                    RTEInput_Parameter_column_num(j) = 0;
                end 
                
            end
        end
        for ii = 1:RTEInput_Parametercolumn_num%找不到对应列名称时报错
            if RTEInput_Parameter_column_num(ii) == 0
                    error('not find Parametercolumn:%s',RTEcolumn{ii});
            end
        end
        for j=2:RTEInput_Parameterrow_num
            RTEInput_ParameterName = strcat(Model_Name,'/',RTEInput_Parameter{j,RTEInput_Parameter_column_num(1)});
            handle = add_block('simulink/Sources/In1',RTEInput_ParameterName,'OutDataTypeStr',RTEInput_Parameter{j,RTEInput_Parameter_column_num(2)},...
                'PortDimensions',num2str(RTEInput_Parameter{j,RTEInput_Parameter_column_num(3)}));
           % set_param(handle,name,Parameter{Parameter_column_num,j});
        end
        % 找出外部输入端口
        Output_handles = find_system(Model_Name,'FindAll','on','SearchDepth','1','BlockType','Inport');
        port_pos=get(Output_handles(1),'Position');
        for i=2:length(Output_handles)
            new_pos(1)=port_pos(1);
            new_pos(3)=port_pos(3);
            new_pos(2)=port_pos(2)+15 * i;
            new_pos(4)=port_pos(4)+15 * i;
            set_param(Output_handles(i),'Position',new_pos);
        end

    end
  
end
save_system(Model_Name);

输出端口与输入端口类似,此处不再叙述。

自动创建RTE Sender/Receiver port

跟之前创建Paramter Port类似,只是替换了下API函数

在创建Port前,先删除模型中原有的Port

hModel= Model_Name;
arProps = autosar.api.getAUTOSARProperties(hModel)
slMap = autosar.api.getSimulinkMapping(hModel);
% addPackageableElement(arProps,'ParameterInterface','/Interface','ParameterPort',...
%   'IsService',false);%创建Interface
%删除Receiverport
arPortType = 'DataReceiverPort';
aswcPath = find(arProps,[],'AtomicComponent','PathType','FullyQualified');
rPorts=find(arProps,aswcPath{1},arPortType,'PathType','FullyQualified')
 for ii=1:length(rPorts)
     delete(arProps,rPorts{ii})
 end
 %删除Senderport
arPortType = 'DataSenderPort';
aswcPath = find(arProps,[],'AtomicComponent','PathType','FullyQualified');
sPorts=find(arProps,aswcPath{1},arPortType,'PathType','FullyQualified')
 for ii=1:length(sPorts)
     delete(arProps,sPorts{ii})
 end
%删除Interface
ifPaths = find(arProps,[],'SenderReceiverInterface','PathType','FullyQualified')
for ii=1:length(ifPaths)
    delete(arProps,ifPaths{ii})
end

通过Excel读到的值创建Interface和DataElement,然后对Input和Receiver Port进行mapping

 for ii=2:RTEInput_Parameterrow_num
     RTEName = RTEInput_Parameter{ii,RTEInput_Parameter_column_num(1)};
     RTEPort =  RTEInput_Parameter{ii,RTEInput_Parameter_column_num(8)};
     DataElement = RTEInput_Parameter{ii,RTEInput_Parameter_column_num(9)};
     RTEDataAccessMode =  RTEInput_Parameter{ii,RTEInput_Parameter_column_num(7)};
     addPackageableElement(arProps,'SenderReceiverInterface','/Interface',RTEPort,...
    'IsService',false);
    add(arProps,RTEPort,'DataElements',DataElement);%创建dataElement
    add(arProps,aswcPath{1},'ReceiverPorts',RTEPort,'Interface',RTEPort);%创建port
    %mapping Inport
    mapInport(slMap,RTEName,RTEPort,DataElement,RTEDataAccessMode)

 end

实现效果

Excel设置

运行新建Input与Output


此时,还未创建RTE Port

运行创建RTE Port及Mapping

此时,Autosar RTE Sender/Receiver已自动创建,并成功mapping到了对应的Output/Input

通过这种方式,可以在Excel管理RTE的接口,节省了手动建立Port及Mapping的时间。而且对于数据的访问方式(Implicit or Explicit),也可以很方便的修改

总结

工具或脚本只是为了提高工作效率,在工作中,还是需要有清晰的思路。遇到问题,需要有自己的方法论来解决问题。对于matlab和simulink来说,内置了很多api函数来帮助我们提高开发的效率,多多查看help是一个非常不错的选择。

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

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

相关文章

内网隧道各类协议方法

正+反(了解即可) 正向代理:已控服务器监听端口,通过这个端口形成一个正向的隧道,由代理机器代替主机去访问内网目标。但是内网入口一般处于DMZ区域有防火墙拦截,无法直接进入内网环境。 反向代理:由内网主机主动交出权限到代理机器,然后本地去连接形成反向代理。例如…

吉林优美姿文化:抖音账号怎么做垂直?

其实现在抖音限流看起来是一件很平常的事情,那么在我们抖音运营中,如果出现一些不合规的行为或者怎么样的,都会导致限流,严重的可能还会被限流,那么这时候怎么办呢?跟着吉林优美姿小编来一起看看吧&#xf…

MySql索引简单知识点及事务的分析

目录 索引 什么是MySql索引? 索引的易忽略点 基本操作: 查看索引 创建索引 删除索引 索引在MySql中的数据结构 事务 使用方法 事务的核心特性 隔离性 隔离的常见问题 ***MySql四个隔离级别 📌————本章重点————&#x1f…

微软艰难的2022安全年回顾

©网络研究院 这些是管理员需要了解的 2022 年以来最重要的漏洞和修复。 我们即将结束 2022 年的安全年。只有时间会告诉我们 2023 年会发生什么,但对于 Microsoft 网络的 IT 和安全管理员来说,2022 年是混合攻击、本地 Exchange Server 缺陷和需要…

【Python】向量叉积和凸包 | 引射线法 | 葛立恒扫描法

猛戳!跟哥们一起玩蛇啊 👉 《一起玩蛇》🐍 💭 写在前面:这个系列似乎反响不错, 所以我继续水下去 (bushi)。本篇博客是关于经典的 Cross Product and Convex Hull (向量叉…

最大正方形问题

最大正方形问题 作者:Grey 原文地址: 博客园:最大正方形问题 CSDN:最大正方形问题 题目描述 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。 题目链接见&am…

数字式压力闭环放大器|比例溢流阀闭环控制器

控制不同带压力反馈信号输入(0~10V或4~20mA)比例压力阀、比例溢流阀、比例节流阀、比例插装阀,带位置反馈信号输入比例流量阀等。斜坡上升和下降时间独立调整(0.05~10 s)。10V参考电压输出外部电位器控制。最大驱动电流 0.4~3A,最…

4个月高效学习,我是如何从手工测试做到测试开发的?

向上的路很难走,但一旦踏上去,每一步都算数! 为什么必须转型为测试开发? 不懂开发的手工测试是新时代“文盲” 在移动互联网和大数据时代,为满足市场和业务需求,互联网应用既要实现产品功能快速迭代&…

java字符串中常用的10个方法

文章目录前言一、字符串的构造1.使用常量进行直接赋值构造2.使用new String对象3.使用字符数组进行构造二、字符串的比较1.比较2.equals方法比较3. compareTo方法比较4.compareToIgnoreCase(String str)方法三、字符串的查找1.charAt(int index)方法2.indexOf(String str)方法四…

网络流量分析帮助企业提升OA应用性能(二)

需求简介 某外高桥公司的OA系统是其重要的业务系统,OA系统负责人表示,部分用户反馈,访问OA系统时比较慢。需要通过分析系统看一下实际情况。 信息部已对企业领导定义了独立的组,本次要主动分析领导们的使用体验快慢。如果OA系统…

mmdetection3d S3DIS (持续更新)

Mmdetection3d集成了大量3D深度学习算法,其中很大一部分可以在室内三维数据集S3DIS上运行。本节重点介绍S3DIS数据集及其在mmdetection3d中的预处理程序。 1 S3DIS S3DIS(Stanford Large-Scale 3D Indoor Spaces Dataset )数据集是斯坦福大学…

【R语言】白葡萄酒的EDA分析

白葡萄酒的EDA分析1.项目相关信息1.1 评估标准1.2 项目模板1.3 数据集列表1.4 项目示例1.5 数据选择1.5.1 选择1.5.2 详细数据说明1.5.3 有关项目提交的常见问题2.环境准备2.1 导入相关包2.2 加载数据集2 数据整理2.1 数据评估2.1.1 质量类问题2.1.2 结构性问题2.1 数据清洗2.1…

二叉树的代码实现和详解

树的定义 树是由n(n>1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树具有以下特点: 1.每个结点有零个或多个子结点; 2.没有父…

ROS action简单使用示例

1、为什么要用action 在ros中,大部分情况下的信息我们使用publisher与subscriber的机制来处理,也就是topic的机制。它能处理一些不用带状态返回的数据处理。当涉及到需要数据返回的节点间数据交互时,首选也可以采用servicer的机制进行处理与…

图解Redisson如何实现分布式锁、锁续约?

文章目录一、基础0)Redisson版本说明、案例案例1)Redisson连接Redis的方式2)用到的Redis命令3)用到的lua脚本语义二、源码分析1、RLock获取RLock对象2、加锁流程0)加锁流程图1)加锁到哪台机器2)…

一行代码获取股票、基金数据,并绘制K线图

大家好,今天这篇文章和大家分享一下如何利用Python获取股票、基金数据,并进行可视化,为金融分析&可视化先导篇,欢迎大家学习、点赞、收藏支持。 一、基础准备 环境:python 3.7 需要安装第三方模块:mpl…

Spring源码深度解析:十六、@Aspect方式的AOP下篇 - createProxy

一、前言 文章目录:Spring源码深度解析:文章目录 我们上篇已经分析到了 Spring将已经找到所有适用于当前bean 的Advisor 集合。下面就要创建代理对象了,而代理对象的创建是从 AbstractAutoProxyCreator#createProxy()开始。下面我们就来看看…

Spring Cloud实现Zuul自带的Debug功能

Zuul 中自带了一个 DebugFilter,一开始笔者也没明白这个 DebugFilter 有什么用,看名称很容易理解,它是用来调试的,可是你看它的源码几乎没什么逻辑,就 set 了两个值而已,代码如下所示。 Overridepublic Obj…

流媒体协议分析之webrtc之rtcp

TCP作为RTP控制协议,对于弱网下音视频质量和会话控制具有重要的作用。 1. RTCP Header V:RTCP的版本号,一定等于2; P:如果设置,填充位表示数据包包含末尾的附加填充八位字节,不属于控制信息&am…

CV-对比学习:概述【通过自监督学习,充分挖掘模型从海量无标注数据中学习通用知识的能力】

对比学习从目标来看,是要做在NLP类型类似Bert预训练的事,即通过自监督学习,充分挖掘模型从海量无标注数据中学习通用知识的能力。 大致分类 对比学习目前可大致可分为 基于负例的对比学习方法基于对比聚类的方法基于不对称网络结构的方法基…