CANoe中创建系统变量,注重细节

📙 相关文章

在这里插入图片描述

📘前言

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

请添加图片描述

请添加图片描述

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

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

在这里插入图片描述


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

点击


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

在这里插入图片描述


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

在这里插入图片描述

📗 系统变量的读取,设置

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

在这里插入图片描述


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

在这里插入图片描述


  • 3️⃣ 我们先用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]);
 
}

在这里插入图片描述


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

在这里插入图片描述


  • 5️⃣ 简单脚本例子
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"));
    
}

  • 6️⃣ 下面面表格是我整理的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

  • 7️⃣ 种基本类型的测试代码。
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]);  
  }
   
  
}


  • 8️⃣ 结果如下图
    在这里插入图片描述

📗初始值,最大值,最小值


  • 1️⃣ 如下图,以 int32为例

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


  • 3️⃣ graphics中查看的话,只能添加单个值,trace中可以看到所有值信息。

在这里插入图片描述


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

在这里插入图片描述


  • 5️⃣ 一小段代码测试下

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述

📗 Value Table

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

在这里插入图片描述


在这里插入图片描述


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

在这里插入图片描述


  • 3️⃣ 有了table属性的变量,在分析和脚本中操作也更加有意义

在这里插入图片描述

📗 只读属性

  • 1️⃣如下图,以 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创建系统变量

  • 1️⃣ 上面是通过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");
}


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

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


📗 通过COM编程创建系统变量

📗 通过DLL编程创建系统变量

📗 通过XML编程创建系统变量

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

请添加图片描述
23

🌎总结

请添加图片描述

  • 🍀 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有网盘资料源码,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。
  • 🍀如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,感谢小伙伴的支持。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚂蚁小兵

慢慢长夜磨一章好文章,费烟!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值