1726_使用Python从dbc文件中提取simulink建模数据定义

news2024/9/28 9:22:11

全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com)

使用dbc文件建模完成CAN通讯是一种比较高效的开发模式,不过在建模的过程中dbc文件中描述的数据需要自己去定义。使用文本编辑工具打开dbc文件可以看到,实际上dbc文件是一个可以进行语义解析的文本。这样,通过脚本语言便可以轻松的实现simulink建模所需要的数据定义。

以下面的dbc文件为例,简单做一下尝试。首先定义dbc文件中定义两个消息帧,以及消息帧相关的部分变量。出于示例的简单,只定义了8位和16位的数据。具体的dbc文件文本如下:

VERSION ""

NS_ :

       NS_DESC_

       CM_

       BA_DEF_

       BA_

       VAL_

       CAT_DEF_

       CAT_

       FILTER

       BA_DEF_DEF_

       EV_DATA_

       ENVVAR_DATA_

       SGTYPE_

       SGTYPE_VAL_

       BA_DEF_SGTYPE_

       BA_SGTYPE_

       SIG_TYPE_REF_

       VAL_TABLE_

       SIG_GROUP_

       SIG_VALTYPE_

       SIGTYPE_VALTYPE_

       BO_TX_BU_

       BA_DEF_REL_

       BA_REL_

       BA_DEF_DEF_REL_

       BU_SG_REL_

       BU_EV_REL_

       BU_BO_REL_

       SG_MUL_VAL_

BS_:

BU_:

BO_ 2147486754 Message2: 8 Vector__XXX

BO_ 2147486753 Message1: 8 Vector__XXX

 SG_ message_var3_16bit : 55|16@0+ (1,0) [0|0] "" Vector__XXX

 SG_ message_var2_16bit : 39|16@0+ (1,0) [0|0] "" Vector__XXX

 SG_ message_var2_8bit : 31|8@0+ (1,0) [0|0] "" Vector__XXX

 SG_ message_var1_16bit : 15|16@0+ (1,0) [0|0] "" Vector__XXX

 SG_ test_flag : 7|8@0+ (1,0) [0|0] "" Vector__XXX

BA_DEF_ SG_  "SigType" ENUM  "Default","Range","RangeSigned","ASCII","Discrete","Control","ReferencePGN","DTC","StringDelimiter","StringLength","StringLengthControl";

BA_DEF_ SG_  "GenSigEVName" STRING ;

BA_DEF_ SG_  "GenSigILSupport" ENUM  "No","Yes";

BA_DEF_ SG_  "GenSigSendType" ENUM  "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";

BA_DEF_ BO_  "GenMsgFastOnStart" INT 0 100000;

BA_DEF_ SG_  "GenSigInactiveValue" INT 0 0;

BA_DEF_ BO_  "GenMsgCycleTimeFast" INT 0 3600000;

BA_DEF_ BO_  "GenMsgNrOfRepetition" INT 0 1000000;

BA_DEF_ SG_  "GenSigStartValue" INT 0 10000;

BA_DEF_ BO_  "GenMsgDelayTime" INT 0 1000;

BA_DEF_ BO_  "GenMsgILSupport" ENUM  "No","Yes";

BA_DEF_ BO_  "GenMsgStartDelayTime" INT 0 100000;

BA_DEF_ BU_  "NodeLayerModules" STRING ;

BA_DEF_ BU_  "ECU" STRING ;

BA_DEF_ BU_  "NmJ1939SystemInstance" INT 0 15;

BA_DEF_ BU_  "NmJ1939System" INT 0 127;

BA_DEF_ BU_  "NmJ1939ManufacturerCode" INT 0 2047;

BA_DEF_ BU_  "NmJ1939IndustryGroup" INT 0 7;

BA_DEF_ BU_  "NmJ1939IdentityNumber" INT 0 2097151;

BA_DEF_ BU_  "NmJ1939FunctionInstance" INT 0 7;

BA_DEF_ BU_  "NmJ1939Function" INT 0 255;

BA_DEF_ BU_  "NmJ1939ECUInstance" INT 0 3;

BA_DEF_ BU_  "NmJ1939AAC" INT 0 1;

BA_DEF_ BU_  "NmStationAddress" INT 0 255;

BA_DEF_ BO_  "GenMsgSendType" ENUM  "cyclic","NotUsed","IfActive","NotUsed","NotUsed","NotUsed","NotUsed","NotUsed","noMsgSendType";

BA_DEF_ BO_  "GenMsgRequestable" INT 0 1;

BA_DEF_ BO_  "GenMsgCycleTime" INT 0 3600000;

BA_DEF_ SG_  "SPN" INT 0 524287;

BA_DEF_  "DBName" STRING ;

BA_DEF_  "BusType" STRING ;

BA_DEF_  "ProtocolType" STRING ;

BA_DEF_ BO_  "VFrameFormat" ENUM  "StandardCAN","ExtendedCAN","reserved","J1939PG";

BA_DEF_DEF_  "SigType" "Default";

BA_DEF_DEF_  "GenSigEVName" "Env@Nodename_@Signame";

BA_DEF_DEF_  "GenSigILSupport" "Yes";

BA_DEF_DEF_  "GenSigSendType" "NoSigSendType";

BA_DEF_DEF_  "GenMsgFastOnStart" 0;

BA_DEF_DEF_  "GenSigInactiveValue" 0;

BA_DEF_DEF_  "GenMsgCycleTimeFast" 0;

BA_DEF_DEF_  "GenMsgNrOfRepetition" 0;

BA_DEF_DEF_  "GenSigStartValue" 0;

BA_DEF_DEF_  "GenMsgDelayTime" 0;

BA_DEF_DEF_  "GenMsgILSupport" "Yes";

BA_DEF_DEF_  "GenMsgStartDelayTime" 0;

BA_DEF_DEF_  "NodeLayerModules" "";

BA_DEF_DEF_  "ECU" "";

BA_DEF_DEF_  "NmJ1939SystemInstance" 0;

BA_DEF_DEF_  "NmJ1939System" 0;

BA_DEF_DEF_  "NmJ1939ManufacturerCode" 0;

BA_DEF_DEF_  "NmJ1939IndustryGroup" 0;

BA_DEF_DEF_  "NmJ1939IdentityNumber" 0;

BA_DEF_DEF_  "NmJ1939FunctionInstance" 0;

BA_DEF_DEF_  "NmJ1939Function" 0;

BA_DEF_DEF_  "NmJ1939ECUInstance" 0;

BA_DEF_DEF_  "NmJ1939AAC" 0;

BA_DEF_DEF_  "NmStationAddress" 254;

BA_DEF_DEF_  "GenMsgSendType" "noMsgSendType";

BA_DEF_DEF_  "GenMsgRequestable" 1;

BA_DEF_DEF_  "GenMsgCycleTime" 0;

BA_DEF_DEF_  "SPN" 0;

BA_DEF_DEF_  "DBName" "";

BA_DEF_DEF_  "BusType" "CAN";

BA_DEF_DEF_  "ProtocolType" "J1939";

BA_DEF_DEF_  "VFrameFormat" "J1939PG";

BA_ "DBName" "ECUTstInf";

BA_ "VFrameFormat" BO_ 2147486754 3;

BA_ "VFrameFormat" BO_ 2147486753 3;

编写Python脚本,首先数据的解析。完成一个M脚本,脚本会通过对MATLAB Workspace中的数据模板进行拷贝修改完成数据定义。

脚本如下(其中Excel写入变量信息表的功能可以去掉):

#!/usr/bin/python

################################################################################

# Grey 2016.03.02

# Update : add the function to gnerate M script for data import.

# Grey  2016.03.01

# generate variables list according to dbc file.

# Inupt : dbc file name as a string, excel file name as a string.

# Output : An excel file : variables list file

#

import re

from xlwt import Workbook

def GetVarList(dbc_file,var_list,model_name):

       data_c_file       = model_name + '_Data.c'

       data_head_file    = model_name + '_Data.h'

       fid               = open('var_import.m','w')

       book              = Workbook()

       sheet_result      = book.add_sheet('variables')

       data_type_dict    = {2:'uint8',8:'uint8',12:'uint16',16:'uint16'}

       text_lines        = open(dbc_file,'r')

       regexp_var        = re.compile(r'SG_\s+(\w+)\s+.*\|(\w+)@')

       var_detail        = re.compile(r'SG_.*\((\S+),(\S+)\).*\[(\S+)\|(\S+)\].*\"(\S*)\"')

       index_col_num     = 0

       var_name_col_num  = 1

       data_type_col_num = 2

       raw_num           = 0

       sheet_result.write(raw_num,index_col_num,'index')

       sheet_result.write(raw_num,var_name_col_num,'variable name')

       sheet_result.write(raw_num,data_type_col_num,'data type')

       for each_line in text_lines:

              line_info  = each_line.strip()

              if line_info.startswith('SG_ '):

                     search_result     = regexp_var.search(line_info)

                     var_detail_result = var_detail.search(line_info)

                     try:

                            raw_num += 1

                            var_name      = search_result.group(1)

                            data_index    = int(search_result.group(2))

                            data_type     = data_type_dict[data_index]

                            factor_value  = var_detail_result.group(1)

                            bias_value    = var_detail_result.group(2)

                            min_value     = var_detail_result.group(3)

                            max_value     = var_detail_result.group(4)

                            unit_str      = var_detail_result.group(5)

                            sheet_result.write(raw_num,index_col_num,raw_num)

                            sheet_result.write(raw_num,var_name_col_num,var_name)

                            sheet_result.write(raw_num,data_type_col_num,data_type)

                            if data_type   == 'uint8':

                                   fid.write("%s = copy(base_8bit);\n" % var_name)

                                   fid.write("%s.DataType = \'fixdt(0,8,%s,%s)\';\n" %(var_name,factor_value,bias_value))

                                   fid.write("%s.Min = %s;\n" % (var_name,0))

                                   fid.write("%s.Max = %s;\n" % (var_name,255))

                                   fid.write("%s.DocUnits = \'%s\';\n" % (var_name,unit_str))

                                   fid.write("%s.RTWInfo.CustomAttributes.DefinitionFile = '%s';\n" % (var_name,data_c_file))

                                   fid.write("%s.RTWInfo.CustomAttributes.HeaderFile = '%s';\n" % (var_name,data_head_file))

                            elif data_type == 'uint16':

                                   fid.write("%s = copy(base_16bit);\n" % var_name)

                                   fid.write("%s.DataType = \'fixdt(0,16,%s,%s)\';\n" %(var_name,factor_value,bias_value))

                                   fid.write("%s.Min = %s;\n" % (var_name,0))

                                   fid.write("%s.Max = %s;\n" % (var_name,65535))

                                   fid.write("%s.DocUnits = \'%s\';\n" % (var_name,unit_str))

                                   fid.write("%s.RTWInfo.CustomAttributes.DefinitionFile = '%s';\n" % (var_name,data_c_file))

                                   fid.write("%s.RTWInfo.CustomAttributes.HeaderFile = '%s';\n" % (var_name,data_head_file))

                            #print("%s factor : %s\t bias : %s\tMin : %s\tMax : %s\tUnit : %s" % \

                            #(var_name,factor_value,bias_value,min_value,max_value,unit_str))

                     except:

                            print("ERROR:%s" % line_info)

       book.save(var_list)

       fid.close()

       print("Process Done! Please refer to excel file %s" % var_list)

      

GetVarList('test.dbc','temp.xls','DbcTst')

运行脚本,生成如下内容的M文件:

message_var3_16bit = copy(base_16bit);

message_var3_16bit.DataType = 'fixdt(0,16,1,0)';

message_var3_16bit.Min = 0;

message_var3_16bit.Max = 65535;

message_var3_16bit.DocUnits = '';

message_var3_16bit.RTWInfo.CustomAttributes.DefinitionFile = 'DbcTst_Data.c';

message_var3_16bit.RTWInfo.CustomAttributes.HeaderFile = 'DbcTst_Data.h';

message_var2_16bit = copy(base_16bit);

message_var2_16bit.DataType = 'fixdt(0,16,1,0)';

message_var2_16bit.Min = 0;

message_var2_16bit.Max = 65535;

message_var2_16bit.DocUnits = '';

message_var2_16bit.RTWInfo.CustomAttributes.DefinitionFile = 'DbcTst_Data.c';

message_var2_16bit.RTWInfo.CustomAttributes.HeaderFile = 'DbcTst_Data.h';

message_var2_8bit = copy(base_8bit);

message_var2_8bit.DataType = 'fixdt(0,8,1,0)';

message_var2_8bit.Min = 0;

message_var2_8bit.Max = 255;

message_var2_8bit.DocUnits = '';

message_var2_8bit.RTWInfo.CustomAttributes.DefinitionFile = 'DbcTst_Data.c';

message_var2_8bit.RTWInfo.CustomAttributes.HeaderFile = 'DbcTst_Data.h';

message_var1_16bit = copy(base_16bit);

message_var1_16bit.DataType = 'fixdt(0,16,1,0)';

message_var1_16bit.Min = 0;

message_var1_16bit.Max = 65535;

message_var1_16bit.DocUnits = '';

message_var1_16bit.RTWInfo.CustomAttributes.DefinitionFile = 'DbcTst_Data.c';

message_var1_16bit.RTWInfo.CustomAttributes.HeaderFile = 'DbcTst_Data.h';

test_flag = copy(base_8bit);

test_flag.DataType = 'fixdt(0,8,1,0)';

test_flag.Min = 0;

test_flag.Max = 255;

test_flag.DocUnits = '';

test_flag.RTWInfo.CustomAttributes.DefinitionFile = 'DbcTst_Data.c';

test_flag.RTWInfo.CustomAttributes.HeaderFile = 'DbcTst_Data.h';

在MATLAB的Workspace中定义8位以及16位的数据定义模板,然后执行M文件。

数据定义模板:

运行后,Workspace中已经生成dbc中的数据定义,只需要把这些数据保存成mat文件即可保存使用。

后续,提供使用这个示例中的dbc文件进行建模的方法。

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

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

相关文章

中国生物科技公司【Advanced Biomed】申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于台湾台南的生物科技公司【Advanced Biomed】近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码为(AD…

git的本地分支如何关联远程分支,比如github,gitlab,码云等

文章目录 1. 文章引言2. 本地分支如何关联远程分支2.1 远程有分支2.2 远程无分支 3. 总结 1. 文章引言 今天发布某版本的项目,准备创建个v0point1分支,后期如果修改该版本,直接在该分支上修改即可。 首先,使用git branch v0point…

SeaFormer实战:使用SeaFormer实现图像分类任务(一)

文章目录 摘要安装包安装timm安装mmcv安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译:https://blog.csdn.net/m0_47867638/article/details/130437649?spm1001.2014.3001.5501 官方源码:https://github.com/fu…

Vue2 创建 Vite 项目,新手教学

关于vite Vite是一种快速的现代化构建工具,可以显著提高Web应用程序的开发效率和性能。 以下是一些Vite的好处: 快速的冷启动:Vite使用原生ES模块解析器,在冷启动时会非常快速,不需要像Webpack一样构建整个应用程序。…

Linux输入输出重定向

目录 Linux输入输出重定向 Linux中的默认设备 输入输出重定向定义 输入输出重定向操作符 实用形式 标准输入、标准输出、标准错误 输出重定向案例 案例1 --- 输出重定向(覆盖) 案例2 --- 输出重定向(追加) 案例3 --- 错误…

chatgpt赋能python:Python中向上取整函数详解

Python中向上取整函数详解 对于Python中的向上取整运算,大家一定不会感到陌生。在FPython中,我们通常使用math.ceil()函数来对数值进行向上取整。本文将为大家详细介绍Python中的向上取整函数,以及如何在实践中应用。 什么是向上取整&#…

被黑客攻击了?无所谓,我会拔网线。。。

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 最近老是有粉丝问我,被黑客攻击了,一定要拔网线吗?还有…

C/S客户端核服务端-简单收发

一、程序 首先上程序 client端的程序 #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <sys/socket.h> #include <sys/type…

keep-alive 是 Vue 内置的一个组件,被用来缓存组件实例。

文章目录 简介注意点使用 keep-alive 有以下优缺点优点缺点 简介 keep-alive 是 Vue 内置的一个组件&#xff0c;被用来缓存组件实例。 使用 keep-alive 包裹动态组件时&#xff0c;被包裹的组件实例将会被缓存起来&#xff0c;而不会被销毁&#xff0c;直到 keep-alive 组件…

LSM零知识学习一、概念与框架机制

本文内容参考&#xff1a; LSM(Linux Security Modules)框架原理解析_lsm框架_pwl999的博客-CSDN博客 LSM相关知识及理解-布布扣-bubuko.com 一文了解Linux安全模块&#xff08;LSM&#xff09; - 嵌入式技术 - 电子发烧友网 在此特别致谢&#xff01; 一、什么是LSM LSM全…

HiFB 与Linux Framebuffer的对比

引言 HiFB和Linux Framebuffer是两种不同的图形缓冲区技术&#xff0c;它们在处理计算机图形显示方面有着重要的作用。以下是对这两种技术的简短定义&#xff1a; HiFB&#xff08;High-performance Intelligent FrameBuffer&#xff09;&#xff1a;HiFB是华为推出的一种高性…

Socket(五)

文章目录 1. 日志2. 如何记录日志 1. 日志 服务器要在无人看管的情况下运行很长时间&#xff0c;通常需要在很久以后对服务器中发生的情况进行调试&#xff0c;这很重要。由于这个原因&#xff0c;建议在存储服务器日志&#xff0c;至少要存储一段时间的日志。日志中通常希望记…

ARM微架构与程序编写

目录 1.流水线 2.指令流水线 3. 多核处理器​编辑 4. 工程搭建 4.1为Keil软件配置编译工具链 5.程序编写 5.1 数据处理指令 5.2 带标志位的加法ADC ADDS 5.3 跳转指令B\BL 5.4 单寄存器内存访问 5.5 批量寄存器内存访问 5.6 满减操作 1.流水线 2.指令流水线 3.…

算法基础学习笔记——⑭欧拉函数\快速幂\扩展欧几里得算法\中国剩余定理

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨欧拉函数 &#x1f353;求欧拉函数 : &#x1f353;筛法求欧拉函数 : ✨快速幂 ✨扩展欧几里得算法 ✨中国剩余定理 前言&#xff1a;算法学习笔记记录日常分享&#xff0c;需要的看哈O(∩_∩)O&#…

chatgpt赋能python:Python中的倒序输出方法

Python中的倒序输出方法 在Python中&#xff0c;倒序输出是一个经常用到的操作。倒序输出可以用于字符串、列表、元组等数据类型&#xff0c;帮助我们更方便地处理数据。 字符串的倒序输出 对于字符串&#xff0c;我们可以使用字符串切片的方法倒序输出。例如&#xff0c;我…

十二、Vben之Vue3+vite跨域代理地址实现

在vue2中使用proxy进行跨域的原理是:将域名发送给本地的服务器(启动vue项目的服务,loclahost:8080),再由本地的服务器去请求真正的服务器。 代码如下: 1.在proxy中设置要访问的地址,并重写/api为空的字符串,这里如果不重写,会相当于在代理的地址上默认加了/api,所以…

chatgpt赋能python:Python中安装jieba分词器

Python中安装jieba分词器 介绍 中文分词是文本挖掘中非常重要的一个环节&#xff0c;而jieba是Python中最受欢迎的中文分词器之一。jieba分词器是基于汉语词汇库进行分词&#xff0c;并支持多种分词模式&#xff0c;可以满足不同场景的分词需求。 本文将介绍如何在Python环境…

chatgpt赋能python:Python中如何安装pip

Python中如何安装pip 什么是pip&#xff1f; pip&#xff0c;全称pip installs packages&#xff0c;是一个Python包管理工具&#xff0c;可以用来安装、升级和卸载Python包。它广泛地应用于Python社区&#xff0c;可以帮助Python开发者快速地获取和分享Python代码。 安装pi…

对比 RS232,RS422,RS485

对比 RS232,RS422,RS485 首先&#xff0c; 串口、UART口、COM口、RJ45网口、USB口是指的物理接口形式(硬件)。TTL、RS-232、RS-485、RS-422是指的电平标准(电信号)。 RS232,RS422,RS485 对比表格 通信标准RS-232RS-422RS-485工作方式单端差分差分通信线数量4 地线52 地线3节…

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…