DBC文件创建环境变量,细节拉满

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBC文件创建环境变量,细节拉满相关的知识,希望对你有一定的参考价值。

系列用的CANoe演示工程我放在了Git上,不定时根据博客更新。

CANoe-Demn


前言

  • 测试软硬件环境:
    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个重载函数,它是把 intfloat类型,都用一个函数表示了,且再注意函数返回值是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 类型,使得一些特殊值有文字表述的意义。



②,如下图,我们创建一个colortable



③,新建一个环境变量,发动机状态,然后选择我们刚才新建的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文件创建环境变量,细节拉满的主要内容,如果未能解决你的问题,请参考以下文章

基础 IO(细节感拉满)

java入门超基础的java入门知识,细节拉满

DBC概述

细节拉满Hadoop课程设计项目,使用idea编写基于MapReduce的学生成绩分析系统(附带源码项目文件下载地址)

从零开始学习CANoe—— CANdb++ 创建 dbc文件

细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现