CANoe中创建系统变量,看这一篇就够了

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe中创建系统变量,看这一篇就够了相关的知识,希望对你有一定的参考价值。

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

CANoe-Demn


前言

  • 本节内容来细细讲解下系统变量,有同学问,系统变量和环境变量有什么区别呢?用哪种形式创建全局变量呢?
  • 首先文件格式不同,环境变量是.dbc文件 ;系统变量是.vsysvar(也可以存在CANoe工程配置中,不需要保存到文件)
  • 其次系统变量支持的数据类型要比环境变量要多,功能也更加复杂。环境变量读写就两个函数,但是系统变量就有几十个从容易上手来说,环境变量更容易使用
  • 再说。所以CANoe 从 12 版本之后,不再推荐使用环境变量,dbc中也不支持环境变量的新建和编辑是,所以环境变量可以不学,但是系统变量一定要会的。
  • 测试软硬件环境:
    CANoe 11 SP2
    Win10 X64

文章目录


通过工具栏System Varables 新建9种基本数据类型

  • 创建环境变量的方式有很多,比如,CANoe面板,CAPL脚本,DLL动态库,COM编程等都可以
  • 下面我们先看下面板中的设置。如下图,新建了 9种基本的数据类型,能够表述的数据范围。


  • 点击左边的图标或者 右键可以新建一个系统变量


  • 定义好命名空间和变量名,选择 32 bit signed类型,其它无需设置。


  • 通过copy 然后把其他数据类型的变量都创建完毕
  • 过程中可以随时的 点击 Apply ,防止编辑过程中,出现意外,造成无法保存,总之最后关闭配置界面一定要点击Apply ,否则无法保存。


系统变量的读取,设置

  • 先在simulation setup 中新建一个 Network Node,我们将在这里用CAPL脚本测试


  • 和系统变量一样,我们直接用 @ 符号直接读取和设置系统变量值
  • 输入@后,有选择提示。直接选择需要的变量就好。


  • 我们先用int 型的变量测试下@符号的操作
/*@!Encoding:936*/

on key 'z'    

  //当变量的类型为int或者float时 ,可以直接使用@读取和写入
 
  @SysVariableTest::type_32_signed = -2;
  write("type_32_signed is :%d",@SysVariableTest::type_32_signed);
  
  @SysVariableTest::type_IntegerArray[0] = 1;//int 或者 flaot 数据可以根据索引操作,因为我们创建这个变量时数组长度是1,所以这里只用0测试
  write("@SysVariableTest::type_IntegerArray[0] :%d",@SysVariableTest::type_IntegerArray[0]);
 


  • 函数法,这里我们还是以 Int 型为例解释说明
  • sysSetVariableInt 函数有两种形式,form 1参数是字符串的形式 ;form2参数是系统变量类型;
  • 和环境变量一样,所有的相关函数都有这两种形式。


  • 简单脚本例子
on key 'x'    


  //sysSetVariableInt() 和 sysGetVariableInt()  form 1
  sysSetVariableInt(sysvar::SysVariableTest::type_32_signed,-2);
  write("type_32_signed is :%d",sysGetVariableInt(sysvar::SysVariableTest::type_32_signed));

  //sysSetVariableInt() 和 sysGetVariableInt()  form 2
  sysSetVariableInt("SysVariableTest","type_32_signed",-3);
  write("type_32_signed is :%d",sysGetVariableInt("SysVariableTest","type_32_signed"));
    


  • 下面面表格是我整理的9种基本类型的读写函数。
数据类型解释说明读写函数
Integer (32 bit signed)Signed integers, available for 32 bit.sysSetVariableInt
sysGetVariableInt
Integer (32 bit unsigned)Unsigned integers, available for 32 bit.sysSetVariableDWord
sysGetVariableDWord
Integer (64 bit signed)Signed integers, available for 64 bit.sysSetVariableLongLong
sysGetVariableLongLong
Integer (64 bit unsigned)Unsigned integers, available for 64 bit.sysSetVariableQWord
sysGetVariableQWord
Double (64 bit)Floating point numbers, which are stored internally as 64 bit IEEE double precision floating point numbers.sysSetVariableFloat
sysGetVariableFloat
StringCharacter strings of unlimited length.sysSetVariableString
sysGetVariableString
Integer array (32 bit signed)Fixed number of signed integers, available for 32 bit.sysSetVariableLongArray
sysGetVariableLongArray
Double arrayFixed number of float values.sysSetVariableFloatArray
sysGetVariableFloatArray
DataA number of bytes that are transferred as a block.
The specific number is variable and can differ with each change of the variable value; this is not an array of fixed size.
sysSetVariableData
sysSetVariableData

  • 9种基本类型的测试代码。
on key 'c'    


  //sysSetVariableInt() 和 sysGetVariableInt()  32bit signed  
  sysSetVariableInt(sysvar::SysVariableTest::type_32_signed,-2);
  write("type_32_signed is :%d",sysGetVariableInt(sysvar::SysVariableTest::type_32_signed));

  //sysSetVariableDWord() 和 sysGetVariableDWord()  32bit unsigned 
  sysSetVariableDWord(sysvar::SysVariableTest::type_32_unsigned,1);
  write("type_32_unsigned is :%d",sysGetVariableDWord(sysvar::SysVariableTest::type_32_unsigned));

  //sysSetVariableLongLong() 和 sysGetVariableLongLong()  64bit signed  
  sysSetVariableLongLong(sysvar::SysVariableTest::type_64_signed,-2);
  write("type_64_signed is :%I64d",sysGetVariableLongLong(sysvar::SysVariableTest::type_64_signed));

  //sysSetVariableLongLong() 和 sysGetVariableLongLong()  64bit signed  
  sysSetVariableQWord(sysvar::SysVariableTest::type_64_unsigned,2);
  write("type_64_unsigned is :%I64u",sysGetVariableQWord(sysvar::SysVariableTest::type_64_unsigned));
  
  
  //sysSetVariableFloat() 和 sysGetVariableFloat()  64bit Double  
  sysSetVariableFloat(sysvar::SysVariableTest::type_64_double,1.52);
  write("type_64_signed is :%f",sysGetVariableFloat(sysvar::SysVariableTest::type_64_double));



  //sysSetVariableString() 和 sysGetVariableString()  string  
  
    char setString[100]="hello Canoe!";
    char getString[100];
    sysSetVariableString(sysvar::SysVariableTest::type_string,setString);
    sysGetVariableString(sysvar::SysVariableTest::type_string,getString,elCount(getString));
    write("type_string is :%s",getString);  
  
  
    //sysSetVariableData() 和 sysSetVariableData()  data  
  
    byte putData[2]=0x03,0x04;
    byte getData[2];
    long copiedBytes;
    sysSetVariableData(sysvar::SysVariableTest::type_data,putData,elCount(putData));
    sysGetVariableData(sysvar::SysVariableTest::type_data,getData,copiedBytes);
    write("type_data type_data[0] = 0x%x", getData[0]);  
  
  
  //sysSetVariableLongArray() 和 sysGetVariableLongArray ()  32 bit intArrary  
  
    long putData[1]=0x04;
    long getData[1];

    sysSetVariableLongArray(sysvar::SysVariableTest::type_IntegerArray,putData,elCount(putData));
    sysGetVariableLongArray(sysvar::SysVariableTest::type_IntegerArray,getData,elCount(getData));
    write("type_IntegerArray [0] = 0x%x ", getData[0]);  
  
  
   //sysSetVariableFloatArray() 和 sysGetVariableFloatArray ()  32 bit intArrary  
  
    double putData[1]=1.58;
    double getData[1];

    sysSetVariableFloatArray (sysvar::SysVariableTest::type_DoubleArray,putData,elCount(putData));
    sysGetVariableFloatArray (sysvar::SysVariableTest::type_DoubleArray,getData,elCount(getData));
    write("type_DoubleArray [0] = %f",getData[0]);  
  
   
  



  • 结果如下图

初始值,最大值,最小值

  • 如下图,以 int32为例


  • 虽然设置了最大值和最小值,但是在CANoe环境中去设置超过范围的值,CANoe本身并不去检测,也没有任何的warning信息
  • 这和环境变量不同的,环境变量虽然也是可以设置成功的,但是write窗口会有warning 信息


  • 如下图,以 int32 数组为例
  • 初始值,要用分号分隔,最小值和最大值公用一个值


  • 在graphic中查看的话,只能添加单个值,trace中可以看到所有值信息。


  • 如下图,以String数据类型为例
  • 选择了UTF-8编码的话,是支持中文的。


  • 一小段代码测试下


  • 如下图,以Data 数据类型为例
  • 初始值,要用两个字节的Hex 字符表示,可以用空格分隔(e.g., 01 2A FF for three bytes).


  • 如下图,发现在graphics 中式无法查看 Data数据类型和String类型的的,可以在CAPL脚本去更改值,通过write 窗口查看


Value Table

  • 如下图,以 int32为例
  • 在需要添加Value Table 的地方,点击小按钮,编辑,实例编辑了colortable



  • 当我们选择了color的table之后,最大值,最小值,自动变成了 table中的值,而初始值10 就是非法的了,
  • 所以我们在创建一个有特殊意义的系统变量时,最好都赋予table 属性,读写值都更方便。



只读属性

  • 如下图,以 int32为例
  • 如果勾选了只读属性,在CAPL中编译都会报错的。


事件触发次数设置

  • One Event with Last Value:Only one event is generated with the last assigned value.
  • All Events :For every assigned value an event is generated. All events get the same time stamp.
  • 下面通过一小段代码对比下差别
on key 'n'

  int i;
  
  write("begin change type_32_signed value for 9 times  "); 
  for (i=0;i<10;i++)
  
    @SysVariableTest::type_32_signed = i;
  



on sysvar SysVariableTest::type_32_signed

  write("type_32_signed value changed :%d",@this);
  





导出到文件

  • 看下图,开始我们创建的系统变量是保存在CANoeconfigration中的,只限于本项目,所以我们要把这些变量导出到文件以便下个项目使用
  • 注意完成这些操作一定要apply 之后才行。


通过CAPL创建系统变量

  • 上面是通过CANoe去创建的系统变量,下面我们测试下通过CAPL脚本创建系统变量
  • 首先要明确的是在CAPL中创建的变量,生命周期只有整个 measurement 期间,停止CANoe, 自动释放变量
  • 在CANoe运行期间,在A.can文件创建的系统变量,在B.can文件是可以读写的。
  • 下面以简短代码测试新建系统变量和读取的过程
on key 'm'

  long retVal;
  char capl_namespace[100] = "SysVariableTest_capl";
  char capl_IntVariable[100] = "capl_IntVariable";
  
  //新建命名空间
  retVal =  sysDefineNamespace(capl_namespace);
  write("create namespace :%d ",retVal);

  //新建32bit 整型变量
  retVal = sysDefineVariableInt(capl_namespace, capl_IntVariable, 100); // form 1
  write("create int type variable :%d ",retVal);
 


on key 'l' 

  //之所以分两个 onkey去测试验证,为了说明,系统变量不是局部变量,在CANoe运行期间,是可以在任何文件中进行访问的
  //读取系统变量 
  write("get int type variable :%d",sysGetVariableInt("SysVariableTest_capl","capl_IntVariable"));
  
//  //删除命名空间和变量
 sysUndefineNamespace("SysVariableTest_capl");
 sysUndefineVariable("SysVariableTest_capl","capl_IntVariable");



  • 如下图,是没有心的系统变量存在的


  • 如下图,按下按键’m‘ ,write窗口打印 0说明变量创建成功,且在测试窗口(graphics 和 trace )中可以看的到


  • 如下图,按下按键’l‘ ,可以读取到值,并且变量成功被删掉了。


  • 如下图,创建其他数据类型的函数,在此不在代码演示。

通过COM编程创建系统变量

通过DLL编程创建系统变量

通过XML编程创建系统变量

上面这三种类型,在实际工程中使用较少,但是却涉及到较为复杂的编程,不确定感兴趣的同学是否有多少,如果感兴趣的人多的话,我会再开篇细写。


总结

谢谢欣赏!

  • 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
  • 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

以上是关于CANoe中创建系统变量,看这一篇就够了的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript看这一篇就够了,简单全面一发入魂

Tcpdump 看这一篇就够了

Spring注解驱动开发如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!

iOS动画详解(学习动画看这一篇就够了)

单点登录看这一篇就够了

菜鸟用Python操作MongoDB,看这一篇就够了