车载测试系列:CANoe中环境变量和系统变量的区别

Posted 千里和他的软件测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了车载测试系列:CANoe中环境变量和系统变量的区别相关的知识,希望对你有一定的参考价值。

环境变量和系统变量相同点:

都可以作为ECU、面板和CAPL程序相连接的媒介。例如,在CAPL程序中,通过改变或监控某一环境变量的值可以触发特定的动作,同样,环境变量的值也可以与面板上控制控件或显示控件相关联。

历史原因:

1、CANoe V6.0版本之前,只能采用环境变量传输软件仿真过程中的数据。

2、在CANoe V6.0版本之后,不仅仿真CAN网络,还支持LIN、FlexRay等其他类型总线的仿真。而环境变量一般通过DBC定义,但DBC一般仅用于CAN网络。在非CAN网络的配置工程中,也需要因此添加额外的DBC专门用于存储环境变量。为了变量的统一管理,引入系统变量,系统变量存储于CANoe配置工程(cfg文件)中,这意味着系统变量独立于任何一种总线及其数据库。

3、环境变量在CANoe V12.0版本之后不适用,不能再新建环境变量。

环境变量和系统变量不同点:

1、支持总线类型

  • 系统变量:任意总线类型
  • 环境变量:仅CAN总线

2、定义位置

  • 系统变量:Environment窗口-SysVar
  • 环境变量:DBC

3、保存位置

  • 系统变量:CANoe配置工程(cfg文件)、独立的外部XML
  • 环境变量:DBC文件

4、数据类型

  • 系统变量:有数组,有32位无/有符号整型
  • 环境变量:没有数组,无32位无符号整型

在脚本中使用:

1、系统变量

在系统变量被定义好了之后,相当于定义了一个全局变量。可以通过CAPL内自带的函数来完成使用。

// 处理系统变量svSwitch的响应
on sysvar sysvar::MyNamespace::svSwitch

  // 声明一个CAN报文变量,用于报文发送
  message Msg1 msg;
  // 读取当前的系统变量svSwitch的值,并赋值给报文的bsSwtich信号
  msg.bsSwitch = sysGetVariableInt(sysvar::MyNamespace::svSwitch);
  // 将报文输出到总线上
  output(msg);
  write("当前系统变量svSwitch=%d", @this);

2、环境变量

在环境变量被定义好之后,相当于定义了一个局部变量。可以通过CAPL内自带的函数来完成使用。

// 处理环境变量evSwitch的响应
on envvar evSwitch 

        // 声明一个CAN报文变量,用于报文发送
        message Controller msg;

        // 读取当前的环境变量evSwitch的值,并赋值给报文的Stop信号
        msg.Stop = getvalue(this);
        // 将报文输出到总线上
        output(msg);

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中环境变量和系统变量的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

车载测试系列:CANoe之Test Module和Test Unit组件

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

CANoe使用教程

CANoe中XML编程常用标签语法 —— 变量,系统变量的定义和读取

CANoe中XML编程常用标签语法 —— 变量,系统变量的定义和读取