基于DBC Signal Group生成Autosar SR接口(1)

news2024/12/29 13:06:58

文章目录

    • 前言
    • 实现方法
      • 结构体在Simulink中的定义
      • SignalGroup提取
    • 总结

前言

在开发Autosar CAN通信模块时,对于Signal Group需要建立对应的Interface,其中的数据类型实际是一个结构体,包含Group中的Signal的数据类型定义。手动建立比较费时间,本文介绍利用Matlab脚本自动生成SignalGroup对应的Interface

实现方法

主要方法通过正则表达式提取DBC中的SignalGroup,生成BUS类型的m脚本,再通过Matlab脚本建立Simulnk模型及端口,建立RTE Port及mapping最后编译生成Arxml。

结构体在Simulink中的定义

在生成BUS之前,首先得清楚BUS的m文件定义

手动建立一个Simulink Bus的数据类型,如下所示:


导出m文件,如下所示:

Bus = Simulink.Bus;
Bus.Description = '';
Bus.DataScope = 'Auto';
Bus.HeaderFile = '';
Bus.Alignment = -1;
Bus.PreserveElementDimensions = false;
saveVarsTmp{1} = Simulink.BusElement;
saveVarsTmp{1}.Name = 'a';
saveVarsTmp{1}.Complexity = 'real';
saveVarsTmp{1}.Dimensions = 1;
saveVarsTmp{1}.DataType = 'single';
saveVarsTmp{1}.Min = [];
saveVarsTmp{1}.Max = [];
saveVarsTmp{1}.DimensionsMode = 'Fixed';
saveVarsTmp{1}.SamplingMode = 'Sample based';
saveVarsTmp{1}.DocUnits = '';
saveVarsTmp{1}.Description = '';
saveVarsTmp{1}(2, 1) = Simulink.BusElement;
saveVarsTmp{1}(2, 1).Name = 'a1';
saveVarsTmp{1}(2, 1).Complexity = 'real';
saveVarsTmp{1}(2, 1).Dimensions = 1;
saveVarsTmp{1}(2, 1).DataType = 'uint8';
saveVarsTmp{1}(2, 1).Min = [];
saveVarsTmp{1}(2, 1).Max = [];
saveVarsTmp{1}(2, 1).DimensionsMode = 'Fixed';
saveVarsTmp{1}(2, 1).SamplingMode = 'Sample based';
saveVarsTmp{1}(2, 1).DocUnits = '';
saveVarsTmp{1}(2, 1).Description = '';
saveVarsTmp{1}(3, 1) = Simulink.BusElement;
saveVarsTmp{1}(3, 1).Name = 'a2';
saveVarsTmp{1}(3, 1).Complexity = 'real';
saveVarsTmp{1}(3, 1).Dimensions = 1;
saveVarsTmp{1}(3, 1).DataType = 'single';
saveVarsTmp{1}(3, 1).Min = [];
saveVarsTmp{1}(3, 1).Max = [];
saveVarsTmp{1}(3, 1).DimensionsMode = 'Fixed';
saveVarsTmp{1}(3, 1).SamplingMode = 'Sample based';
saveVarsTmp{1}(3, 1).DocUnits = '';
saveVarsTmp{1}(3, 1).Description = '';
Bus.Elements = saveVarsTmp{1};
clear saveVarsTmp;

上面的BUS定义了三个数据,对于需要生成的M文件,主要关注的是数据的排列序号,第二和第三个数据定义以saveVarsTmp{1}(x, 1)开头,然后是数据的NameDataType,此处我们没有考虑Dimensions为多维(DBC中都是一维)

此处需要留意的是HeaderFile这个属性,在后面会着重提

SignalGroup提取

Matlab有解析DBC的API函数,但可惜的是,不能解析出SignalGroup,只能解析出Message和其中的Signal。不过,利用正则表达式,提取SiganlGroup也不是难事~

记事本打开DBC,查找Group,可以找到SignalGroup的定义,如下所示:

SIG_GROUP_ 258 TestGroupName 1 : TestGroupSignal1 TestGroupSignal2 TestGroupSignal3 TestGroupSignal4;

上面的定义中,数字表示的是Group所在的message id,后面跟的是Group的名称,再后面跟的是1(目前遇到的都是1,没有查过具体的定义,估计是和信号组复用相关的),再后面跟的就是Signal,最后以分号结尾。

正则表达式提取文本中的SignalGroup信息,m脚本如下:

fid = fopen(dbcfile_name,'r');
file_code = {''};
ct = 1;
while ~feof(fid)
    file_code(ct,1)={fgets(fid)};
    ct=ct+1;        
end
can_signal_group_pattern1 = '(?<=SIG_GROUP_ ).+';%提取信号组信息
can_signal_group  = regexp(file_code,can_signal_group_pattern1,'match');%取信号组信息
can_signal_group(cellfun(@isempty,can_signal_group))=[];%去除空字符串所在行
for i = 1:length(can_signal_group) 
    can_signal_group_name{i} =  regexp(can_signal_group{i},'\S+','match');
end

此处can_signal_group_name包含Group中的元素,按空格分开,例如第一个为ID,第二个为GroupName,第三个为1,第四个为":",后面跟的是Signal

GroupStruct = struct('GroupName',{}, 'ID',{} ,...
    'SignalName',{},'DataType',{});
for i = 1:length(can_signal_group_name) 
    can_signal_group_Struct(i).GroupName =  can_signal_group_name{i}{1}{2};
    can_signal_group_Struct(i).ID =  can_signal_group_name{i}{1}{1};
    can_signal_group_pattern_fen = '.+(?=;)';%用来去除最后一个分号
    can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})} = regexp(can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})},can_signal_group_pattern_fen,'match');
    can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})} = can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})}{1};
    for j = 5:length(can_signal_group_name{i}{1})
        can_signal_group_Struct(i).SignalName{j-4} = can_signal_group_name{i}{1}{j};
    end
end

此处我们已经提取出了SignalGroup中的GroupName,ID,及其中的SignalName。其中还有一个关键信息,就是Signal的数据类型。此处我们利用Matlab自带的函数提取Signal的信息

db = canDatabase(dbcfile_name);
for i = 1:length(can_signal_group_Struct) 
    for j = 1:length(can_signal_group_Struct(i).SignalName) 
        for a = 1:length(db.MessageInfo)
            for b = 1:length(db.MessageInfo(a).SignalInfo)
                if(strncmp(can_signal_group_Struct(i).SignalName{j},db.MessageInfo(a).SignalInfo(b).Name,32))
                    can_signal_group_Struct(i).DataType{j} = db.MessageInfo(a).SignalInfo(b).Class;
                    a=1;
                    b=1;
                    break;
                end
                if(i == length(can_signal_group_Struct) )
                    break;
                end
            end
            if(i == length(can_signal_group_Struct) )
                break;
            end
        end
        if(i == length(can_signal_group_Struct) )
            break;
        end
    end
    if(i == length(can_signal_group_Struct) )
        break;
    end
end

判断Messag的SignalName和Group中的SignalName是否一致,此处只取前32个字节,因为太长会导致DBC报错,Group中的Name也不会全


到此,我们已经提取了生成BUS所需的主要信号。

接下来就是生成M文件,及后面的生成接口模型了,下一次再说吧。

关于HeaderFile,主要是在生成Autosar文件的时候,没有配置该属性的话,会报错找不到对应的Type

总结

本文介绍了DBC中Signal Group的提取,在没接触Autosar软件时,没有用过SignalGroup,Signal成组之后,一方面可以更好的管理,另一方面,为E2E也提供了载体。

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

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

相关文章

2023年中国人防服务需求现状及行业市场规模前景分析[图]

人防服务指利用人发现风险事件&#xff0c;并延迟或阻止风险事件的发生&#xff0c;在自身力量不足的情况下发出应急救援信号&#xff0c;以待做出进一步的反应&#xff0c;制止风险事件的发生或处理已发生的风险事件。人防服务是保安服务公司最基本的业务内容。2022年国内保安…

日常学习收获之----react的ref和wrappedComponentRef的区别

react获取子组件的方式&#xff0c;有ref和wrappedComponentRef。那这两者有什么区别呢&#xff1f; 区别在于是否用了高阶组件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…

中国鞋业品牌步力宝:传统制造业蜕变为资本上市公司的光辉征程

​中国鞋业&#xff0c;作为典型的劳动密集型产业&#xff0c;一直在不断演进。从最初的皮鞋、布鞋、胶鞋、塑料鞋&#xff08;化学鞋&#xff09;四大类鞋&#xff0c;到今天的复杂多样&#xff0c;中国鞋业一直在追求更高的品质和创新。随着社会的进步和科学技术的发展&#…

第二证券:临时停牌一般多久?

随着股票买卖市场的日益开展&#xff0c;股票买卖的监管也越来越严格。而前段时刻&#xff0c;上市公司中多家公司被暂时停牌&#xff0c;此举引起了公众对于暂时停牌时刻的重视。那么&#xff0c;暂时停牌一般多久&#xff1f;本篇文章将从多个视点出发&#xff0c;对这一问题…

迅为RK3568开发板Scharr滤波器算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程\04_OpenCV 开发配套资料\33”目录下&#xff0c;如下图所示&#xff1a; 在 Sobel 算子算法函数中&#xff0c;如果设置 ksize-1 就会使用 3x3 的 Scharr 滤波器。Scharr 算子是 Soble 算子在 ksize…

基于Python和Tkinter的双目相机驱动界面

文章目录 前言准备工作代码分析初始化创建按钮创建图像显示区域创建信息标签启动摄像头捕捉主函数结论效果展示 前言 本文将介绍如何使用Python和Tkinter库来创建一个简单的摄像头应用程序。这个应用程序可以打开摄像头&#xff0c;显示摄像头捕捉的图像&#xff0c;并允许用户…

Nosql redis高可用和持久化

Nosql redis高可用和持久化 1、redis高可用2、redis持久化2.1redis持久化2.2Redis 持久化方法2.3RDB 持久化2.3.1RDB持久化工作原理2.3.2触发条件2.3.3其他自动触发机制2.3.4执行流程2.3.5启动时加载 2.4AOF 持久化2.4.1AOF持久化原理2.4.2开启AOF2.4.3执行流程2.4.4文件重写的…

8+结合10种机器学习算法构建模型,可复现。

今天给同学们分享一篇机器学习的生信文章“Comprehensive machine-learning survival framework develops a consensus model in large-scale multicenter cohorts for pancreatic cancer”&#xff0c;这篇文章于2022年10月25日发表在eLife期刊上&#xff0c;影响因子为8.713。…

小游戏开发者应该如何入局赛道

一、微信小游戏赛道发展史 第一阶段&#xff1a;轻度试水期&#xff0c;2017&#xff5e;2019年 微信小游戏于2017年底上线&#xff0c;初期以轻度休闲为主&#xff0c;例如棋牌、合成消除以及益智相关游戏类型。一是开发门槛不高&#xff0c;产品可以快速上线; 二是大部分厂…

功率信号源在电子测试中的应用有哪些方面

功率信号源在电子测试中有着广泛的应用&#xff0c;可以提供稳定、可调的功率信号&#xff0c;用于各种测量和验证工作。下面西安安泰将介绍功率信号源在电子测试中的几个主要应用方面。 图&#xff1a;ATG-2000系列功率信号源 无线通信测试&#xff1a;功率信号源在无线通信测…

【three.js】结合vue进行开发第一个3d页面

一、创建vue项目 新建一个项目目录&#xff0c;在集成终端打开&#xff0c;输入 npm init vitelatest 回车后&#xff0c;依次输入项目名&#xff0c;选择vue和js开发 然后安装依赖并运行项目 二、安装three 接下来我们开始安装three npm install three 三、Three.js 的…

【Unity3D赛车游戏制作】开始场景搭建——UGUI复合控件Button

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

leetcode 每日一题复盘(10.9~10.15)

leetcode 101 对称二叉树 这道题一开始想是用层序遍历,看每一层是否都对称,遇到一个问题就是空指针(子树为空)无法记录下来,同时会导致操作空指针的问题,因此需要修改入队条件,并用一个标志去表示空指针 vector<int>numv;for(int i0;i<size;i){TreeNode*frontque.fro…

JavaScript ES5实现继承

一、对象和函数的原型 1.认识对象的原型 JavaScript当中每个对象都有一个特殊的内置属性 [[prototype]]&#xff0c;这个特殊的对象可以指向另外一个对象。 那么这个对象有什么用呢&#xff1f; 当我们通过引用对象的属性key来获取一个value时&#xff0c;它会触发 **[[Get…

uni-app:实现页面效果4(echarts数据可视化)

效果 代码 <template><view><view><view class"title">概况</view><view class"line_position"><view class"line1"><view class"item"><view class"one">今日销售…

公众号突破注册操作流程

一般可以注册多少个公众号&#xff1f;众所周知&#xff0c;在2013年前后&#xff0c;公众号申请是不限制数量的&#xff0c;后来企业开始限制申请50个&#xff0c;直到2018年的11月tx又发布&#xff0c;其中个人主体可申请公众号由2个调整为1个&#xff0c;企业主体由50个调整…

Java中树形菜单的实现方式(超全详解!)

前言 这篇文中&#xff0c;我一共会用两种方式来实现目录树的数据结构&#xff0c;两种写法逻辑是一样的&#xff0c;只是一种适合新手理解&#xff0c;一种看着简单明了但是对于小白不是很好理解。在这里我会很详细的讲解每一步代码&#xff0c;主要是方便新人看懂&#xff0…

北邮22级信通院数电:Verilog-FPGA(5)第四第五周实验 密码保险箱的设计

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.密码箱的功能和安全性 显示&#xff1a;…

Qt 对界面类重命名的步骤

有些时候因为一些原因&#xff0c;需要修改Qt中创建的界面类&#xff0c;修改的地方比较多&#xff0c;一定要留意有没有修改完全&#xff0c;否则会出现各种奇怪报错。 比如&#xff0c;将MainWindow界面类名修改为lb_logdisplay 修改步骤&#xff1a; 修改文件名&#xff1a;…