DBC文件创建环境变量,细节拉满
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBC文件创建环境变量,细节拉满相关的知识,希望对你有一定的参考价值。
系列用的CANoe演示工程我放在了Git上,不定时根据博客更新。
前言
测试软硬件环境:
CANoe 11 SP2
Win10 X64关于DBC文件的创建,以及环境变量的使用我以前都写过相关博客,今天,我就单纯的在DBC文件创建环境变量再起一文,会讲解到每一处细节
环境变量 作为一种以文件保存的全局变量 ,它的使用好处毋庸置疑的,项目移植方便,取用方便
文章目录
新建DBC文件
- 这里新建一个DBC文件,模板就选择用
CANoeTemplate.dbc
① 总共支持4中数据类型,那么我们创建4种类型的变量
4种数据类型的读写方法总结
② 我们把这个新建的DBC文件加载到工程中,然后新建个测试节点,我们逐个看下不同类型变量的读写。
③ 我们再编辑.can
文件 ,为了方便操作呢,建议把symbols 面板调出来,需要用哪些变量,直接就可以拖进代码了,有些同学不知道,可能会去DBC文件中来回的copy.
④ 当变量的类型为int或者float时 ,可以直接使用@读取和写入
/*@!Encoding:936*/
on key 'a'
//当变量的类型为int或者float时 ,可以直接使用@读取和写入
byte putData[4]=0x01,0x02,0x03,0x04;
char putString[10] = "good luck";
@env_Speed = 65.5;
@env_Year = 2022 ;
write("env_Speed is :%f",@env_Speed);
write("env_Year is :%d",@env_Year);
//当变量的类型为 string 和 data ,@不可用
// @env_Text = putString;
// @env_Data = putData ;
⑤ 变量读取和写入的两个通用函数getValue()
和putValue()
putValue()
总共有10个重载函数,前五个和后五个的唯一区别就是变量的名字这个参数是DBC中定义的值,还是字符串
如果采用前五个类型需要在DBC中定义变量,否则编译报错的;如果采用字符串类型,编译过程不去ckeck是否已经定义,编译阶段不会报错,但是运行会有warning 信息提示,看下图代码测试结果getValue()
注意只有9个重载函数,它是把int
和float
类型,都用一个函数表示了,且再注意函数返回值是float
类型,打印值时要用%f,
不可用%d
- 什么情况下用前面类型,什么情况下用后面的类型呢,特别是做批量CASE时,比如xml 类型的case,变量名需要从xml传参传进来,就可以把变量名当成字符串卡类型来处理 ;如果单纯的读取设置信号,可以用第一种类型,好处是可以防止信号输入错误。
⑥ 下面通过一小段代码看下两种参数的不同
- 以 int 类型变量为例
on key 'b'
putValue(env_Year,2022); //Function Form 1
write("env_Year is :%d",getValue(env_Year));
// env_hour 没在DBC中定义报错
// putValue(env_hour,12);//Function Form 6
// write("env_hour is :%d",getValue(env_hour));
//
putValue("env_Year",2023);//Function Form 6
write("env_Year is :%.0f",getValue("env_Year")); //虽然 env_Year是int型,但是如果采用Form 6打印就要用%f
putValue("env_hour",12);//Function Form 6 // “env_hour”虽然没定义,但是编译不报错,执行报提示信息
write("env_hour is :%d",getValue("env_hour"));
⑦ 下面通过一小段代码看下数据类型是String 和 Data 的读写情况
- 演示使用Form 3,Form 4,Form 5,
getValue()
的返回值表示读取到字节数- form 5的size 参数,指定写入或者读取的字节数
on key 'c'
byte putData[4]=0x01,0x02,0x03,0x04;
byte getData[4];
char putString[10] = "good luck";
char getString[10];
long retVal;
long i ;
putValue(env_Text,putString); //Function Form 3
retVal = getValue(env_Text,getString);
write("env_Text is :%s And It's size is %d",getString,retVal);
putValue(env_Data,putData); //Function Form 4
retVal = getValue(env_Data,getData);
write("env_Data is :0x%x,0x%x,0x%x,0x%x And It's size is %d",getData[0],getData[1],getData[2],getData[3],retVal);
for(i=0;i<4;i++) // 数组清零
getData[i]=0;
putValue(env_Data,putData,2); //Function Form 5 ,指定赋值env_Data 2个字节
retVal = getValue(env_Data,getData);
write("env_Data is :0x%x,0x%x,0x%x,0x%x And It's size is %d",getData[0],getData[1],getData[2],getData[3],retVal);
4种访问访问的总结
- 下图是访问权限属性的解释,读写属性是有关某个ECU的。
- 本人自己用代码验证过,也向vector请教过, CANoe11版本以后都不支持只读属性的设置
- Vector回复我的原话:新版的CANoe版本(从CANoe 12开始)中已不再推荐使用环境变量,dbc中也不支持环境变量的新建和编辑,建议您使用系统变量,系统变量也是可以设置只读权限的,
- 同学可以跳过本小节的内容,之所有没去去掉,我想保留下,去做这个验证的过程,发现CANoe中的问题,然后去求证的过程。
① 下面是我们新建了两个ECU后的DBC文件
- 下图是四种访问类型的解释,访问权限是针对ECU的,所以我们想要验证这个问题,还要创建两个ECU才行
- 创建ECU就要创建信号,报文等基础元素,可以参考右侧博客 如何创建DBC文件
- 如果同学看到了这里,想必是一个十分爱学习和追问为什么的人了。
② 双击 ECU1
,然后选择 Env.variables
,把 env_Year
变量添加进来,同理把env_Speed 添加到 ECU中,且属性都设置成只读属性。
测试验证代码
单位
这没什么好解释的,一种说明性描述吧
Value Table
①,类似给一个环境变量创建一个enum
类型,使得一些特殊值有文字表述的意义。
②,如下图,我们创建一个color
的 table
③,新建一个环境变量,发动机状态,然后选择我们刚才新建的color value table
④,我们创建一个信号发生器,让env_EngineStatus
随机发送一些值
⑤,波形图上看出,我们刚才创建的Value Table其作用了,不再显示具体的数值.
⑥,再从代码角度看,真的就是个enum类型,我们可以直接table中定义的值,这样看来,dbc文件中定义变量的拓展性了和可读性是不是要远远优于在CAPL脚本中定义全局变量了。
初始值和最大最小值
- 只有
Int 和 float
类型的 环境变量可以配置默认值,最大最小值 - 如果最大值和最小值都设置为0x00,那么每次读取该变量,都将是个随机值,相当于random 函数的用法。
① ,以env_EngineStatus
变量为例,注意我们配置了 Value Table
② ,手动我们是无法设置除了 value table中定义的以外的值的
③ ,再说到代码中,我们强制设置大于max value
的值可以吗?答案是可以的,不过会有Warning
提示你设置的值太大了。
on key 'e'
@env_EngineStatus = 4;
write("env_EngineStatus is :%d",@env_EngineStatus);
④ ,再以env_Year
为例,我们没有设置 value table
,是可以设置超过 max value
的值的,不过会有Warning
、
Length
- 只有数据类型是
Data
才有的属性 - 前面我们测试代码都用的是默认值0,读写都是OK的,
- 我测试下来,设置成2,仍然可以读写大于2个字节
总结
谢谢欣赏!,
- 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于DBC文件创建环境变量,细节拉满的主要内容,如果未能解决你的问题,请参考以下文章
细节拉满Hadoop课程设计项目,使用idea编写基于MapReduce的学生成绩分析系统(附带源码项目文件下载地址)