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

文章目录

    • 前言
    • 实现方法
      • 结构体在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;endif(i == length(can_signal_group_Struct) )break;endendif(i == length(can_signal_group_Struct) )break;endendif(i == length(can_signal_group_Struct) )break;endendif(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.mzph.cn/news/99453.shtml

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

相关文章

系统架构设计:8 论软件架构风格

目录 一 软件架构风格 1 数据流风格 (1)批处理风格 (2)管道-过滤器风格

C++中使用引用避免内存复制

C中使用引用避免内存复制 引用让您能够访问相应变量所在的内存单元&#xff0c;这使得编写函数时引用很有用。典型的函数声明类似于下面这样&#xff1a; ReturnType DoSomething(Type parameter);调用函数 DoSomething() 的代码类似于下面这样&#xff1a; ReturnType Resu…

基于OpenCV设计的流媒体播放器(RTSP、RTMP)

一、前言 随着互联网的普及和发展,流媒体技术已成为日常生活中不可或缺的一部分。流媒体播放器作为流媒体技术的重要组成部分,其性能和功能直接影响到用户的观影体验。本文介绍使用OpenCV和Qt设计一款流媒体播放器,专门用于播放直播视频流,例如RTSP、RTMP。该播放器只播放…

项目进展(十)-解决ADS1285在调试时出现的问题

一、解决大坑 在项目进展&#xff08;九&#xff09;-完善ADS1285代码这边博客中&#xff0c;看似解决了问题&#xff0c;可以去读数据&#xff0c;但是其实是给自己挖大坑&#xff0c;这边博客就是来填坑的。   首先呢&#xff0c;上篇博客说的是用0x12指令来读取数据&#…

Transformer模型 | Python实现TransformerCPI模型(pytorch)

文章目录 效果一览文章概述程序设计参考资料效果一览 文章概述 Python实现TransformerCPI模型(tensorflow) Dependencies: python 3.6 pytorch >= 1.2.0 numpy RDkit = 2019.03.3.0 pandas Gensim >=3.4.0 程序设计 import torch import numpy as np import random …

Qt QList类和QLinkedList类 详解

一、QList 类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T 是一个指针类型或指针大小的基本类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>将数值直接存储在它的数组当…

WPF中, 如何将控件的触发事件绑定到ViewModel

在DataGrid 等控件中, 有很多这种带闪电符号的触发事件. 如果用传统的事件驱动, 则直接在后台中建立 一个private PropertyChanged(Sender s, EventAgars Args) 即可. 但是如果需要绑定到ViewModel的话? 应该怎么做? 带闪电符号的触发事件 实现viewModel绑定前端触发事件的…

day58:ARMday5,GPIO流水灯实验

汇编指令&#xff1a; .text .global _start _start: 1.设置GPIOE GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[5:4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2.设置PE10、PF10、PE8管脚为输出模式&#xff0c;GPIOE_MODER[21…

常见SQL错误用法案例和总结

1. LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般DBA想到的办法是在type, name, create_time字段上加组合索引。这样条件排序都能有效的利用到索引&#xff0c;性能迅速提升。 SELECT * FROM …

Jenkins+Allure+Pytest的持续集成

一、配置 allure 环境变量 1、下载 allure是一个命令行工具&#xff0c;可以去 github 下载最新版&#xff1a;https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如&#xff1a;F:\allure-2.13.7\bin 环境变量、Path、添加 F:\a…

华为C语言编程规范(2W字总结)

1、代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的&#xff0c;好的代码应当可以像文章一样发声朗诵出来。 目前软件维护期成本占整个生命周期成本的40%~90%。根据业界经验&#xff0c;维护期变更代码的成本&#xff0c;小型…

全栈开发笔记1:首个项目的收获

本文为编程导航实战项目学习笔记。 文章目录 7.跨域问题解决 2023.10.26.项目部署 2023.10.15.统一处理返回值 2023.10.14.开发注册和用户管理 2023.09303.开发登陆注册接口 2023.09.172.数据库设计1.前后端初始化 2023.9.16 7.跨域问题解决 2023.10.2 三种方式&#xff1a; …

用c语言实现静态通讯录

思路&#xff1a; 将代码分成三个模块&#xff0c;头文件contact.h&#xff1a;声明函数&#xff0c;定义结构体 test.c测试类&#xff0c;contact.c用来实现通讯录中的函数功能 1.打印菜单&#xff0c;让用户进行选择 2.定义一个结构体PeoInfo&#xff0c;其中包含联系人的…

OCR让点读笔如虎添翼

点读笔是一种智能学习工具&#xff0c;它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时&#xff0c;点读笔通常会借助OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术。下面将详细介绍点读笔如何利用OCR技术实现文…

【Spring Cloud系统】- Zookeer特性与使用场景

【Spring Cloud系统】- Zookeer特性与使用场景 一、概述 Zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置…

Python的logging模块Demo

Tip&#xff1a;默认情况下&#xff0c;logging模块不会自动地将日志存储到某个特定路径&#xff0c;除非你指定了该路径。你需要创建一个FileHandler&#xff0c;然后为其设置一个文件路径&#xff0c;这样日志就会被写入到该文件中。 以下是一个简单的例子&#xff0c;展示如…

Android开发入门技能(Java)

Android开发入门技能 一些流行的框架和库 安卓开发中有许多主流框架和库&#xff0c;它们可以帮助开发者更轻松地构建功能强大、高效和可维护的应用程序。以下是一些主要的安卓开发框架和库&#xff1a; Android Jetpack&#xff1a;Android Jetpack是官方提供的一套库和工具…

基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基于AlexNet深度学习网络的智能垃圾分类系统概述 4.2、基于AlexNet深度学习网络的智能垃圾分类系统主要原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab20…

【CSS】Tailwind CSS

直接参考 Tailwind CSS 安装提供了四种方式。因为我常用构建工具搭建项目&#xff0c;所以选择 Using PostCSS 。 其中 tailwind.config.js 的配置可以改为&#xff1a; module.exports {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,tsx}],theme: {extend: {},},pl…

在宝塔面板环境下安装nps服务端

在宝塔面板环境下安装nps服务端 一、所需环境二、开始安装三、打开nps控制台四、更改默认账号密码和连接秘钥五、反向代理挂载SSL证书 一、所需环境 阿里云轻应用服务器&#xff08;选择宝塔应用镜像&#xff09;域名&#xff08;最好也是阿里注册的域名&#xff09;对应的ssl…