车载测试系列: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);
作者: 千里和他的软件测试
软件测试学习交流: 软件测试交流群 172489141
银行金融业务交流: 软件测试学习交流群 52304542
接口自动化性能交流: 一个正经的测试群 188427938
CANoe中创建系统变量,看这一篇就够了
系列用的CANoe演示工程我放在了Git上,不定时根据博客更新。
前言
- 本节内容来细细讲解下系统变量,有同学问,系统变量和环境变量有什么区别呢?用哪种形式创建全局变量呢?
- 首先文件格式不同,环境变量是.dbc文件 ;系统变量是.vsysvar(也可以存在CANoe工程配置中,不需要保存到文件)
- 其次系统变量支持的数据类型要比环境变量要多,功能也更加复杂。环境变量读写就两个函数,但是系统变量就有几十个从容易上手来说,环境变量更容易使用
- 再说。所以CANoe 从 12 版本之后,不再推荐使用环境变量,dbc中也不支持环境变量的新建和编辑是,所以环境变量可以不学,但是系统变量一定要会的。
- 测试软硬件环境:
CANoe 11 SP2
Win10 X64
文章目录
- 前言
- 通过工具栏System Varables 新建9种基本数据类型
- 系统变量的读取,设置
- 初始值,最大值,最小值
- Value Table
- 只读属性
- 事件触发次数设置
- 导出到文件
- 通过CAPL创建系统变量
- 通过COM编程创建系统变量
- 通过DLL编程创建系统变量
- 通过XML编程创建系统变量
- 总结
通过工具栏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 |
String | Character strings of unlimited length. | sysSetVariableString sysGetVariableString |
Integer array (32 bit signed) | Fixed number of signed integers, available for 32 bit. | sysSetVariableLongArray sysGetVariableLongArray |
Double array | Fixed number of float values. | sysSetVariableFloatArray sysGetVariableFloatArray |
Data | A 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
的地方,点击小按钮,编辑,实例编辑了color
的table
- 当我们选择了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);
导出到文件
- 看下图,开始我们创建的系统变量是保存在
CANoe
的configration
中的,只限于本项目,所以我们要把这些变量导出到文件以便下个项目使用 - 注意完成这些操作一定要
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之Test Module和Test Unit组件