CAPL 脚本中对信号,系统变量,环境变量的 事件响应

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAPL 脚本中对信号,系统变量,环境变量的 事件响应相关的知识,希望对你有一定的参考价值。

Value Objects


在 CAPL General Event Procedures (一) 中讲解了Ssytem下的几种事件,下面会讲解下 Value Objects下的几种事件:

信号(on signal)

  • on signal signalname 每次信号值有变化的时候,会触发这个事件
  • on signal_update signalname 只要总线上有这个周期信号就会一直触发
/*@!Encoding:ASCII*/

On key 'a'

  setSignal(DeactiveTJPReq,1);


on signal DeactiveTJPReq

  write("Value changed will be trigger, value: %f",this.raw);
  


on signal_update DeactiveTJPReq

   write("Continuous trigger, value: %f",this.raw);

这里有一个信号 DeactiveTJPReq,周期5ms发送,初始值为0,因为一直触发事件:on signal_update DeactiveTJPReq,所以开始不断打印 0,后来按下按键 a, 因为 信号的值改变了,所以触发事件 on signal DeactiveTJPReq,后面即使再按按键 a,也不再会触发on signal DeactiveTJPReq,因为信号值没有变化

关于关键字:this
Within an event procedure for receiving a CAN object or an environment variable, the data structure of the object is designated by the key word this.
在接收CAN对象或环境变量的事件过程中,对象的数据结构由关键字this指定

  • on signal ( signalname1 | signalname2 | …)
    通过上面语法可以同时对多个信号进行监控
/*@!Encoding:ASCII*/
On key 'a'

  write("Now pressed key a:");
  setSignal(DeactiveTJPReq_UB, 0);
  

On key 'b'

  write("Now pressed key b:");
  setSignal(DeactiveTJPReq, 1);



on signal ( DeactiveTJPReq_UB |DeactiveTJPReq)


  write("*********DeactiveTJPReq_UB**********: %f",getSignal(DeactiveTJPReq_UB));
  write("*********DeactiveTJPReq*************: %f",getSignal(DeactiveTJPReq));  

输出结果:

环境变量(on envVar)

on envVar X 响应环境变量事件
有两个多环境变量操作的API

  • getValue() 读取变量值
  • putValue() 设置变量值

首先,我们新建一个新的dbc文件,命名为test.dbc,然后创建三个环境变量,在canoe工程中加入这个dbc文件。

在Value Objects中创建on enVar 事件

/*@!Encoding:ASCII*/
On key 'a'

  putValue(test_int,2);
  putValue(test_float,2.5);
  putValue(test_string,"good man");
  


on envVar  test_int

  write("test_int:%d",getValue(this));
  


on envVar  test_float

  write("test_float:%f",getValue(this));
  

on envVar  test_string

  char string[20];
  getValue(this,string);
  write("test_string:%s",string);
  

输出结果:

"on envVar (envVar1 | envVar2 | …)", 可以同时指定多个环境变量,但是只有这些环境变量的数据类型一样的时候,才可以使用“this”.

/*@!Encoding:ASCII*/
On key 'a'

  putValue(test_int,2); 

On key 'b'

  putValue(test_float,2.5);  

On key 'c'

  putValue(test_string,"good man");
  


on envVar  (test_int | test_float |test_string)

  char string[20];
  write("test_int:%d",getValue(test_int));
  write("test_float:%f",getValue(test_float));

  getValue(test_string,string);
  write("test_string:%s",string);
  

依次按下a,b,c按键之后的输出结果:

系统变量(on sysVar )

  • 系统定义的系统变量
    在你的canoe工程中,调动了不同的dll或者加载了不同的模块,不同的总线结构中,canoe工程会自动适配出 系统的系统变量,如下图,只有statistics和canoe两个命名空间这是因为我这建立的是一个空项目,并没有加入其它模块。
  • 用户定义的系统变量
    这里新建了一个test_namespace 命名空间,并创建了三个系统变量
    人;这里还可以通过 export 将你定义的系统变量导出到一个 .vsysvar 文件中,这样定义的系统变量就可以在其它工程中复用了。
  • 语法: on sysVar X
  • 读取或者设置系统变量的值,用 ‘@’ 或者 sysGetVariable。
  • 系统变量要通过 域操作符"::" 在前面加上他的域空间才行
/*@!Encoding:ASCII*/
On key 'a'

	//设置值
  @test_namespace::sys_test_int =2;
  @test_namespace::sys_test_float =3.5;
  sysSetVariableString(sysVar::test_namespace::sys_test_string,"good man a"); 

on sysvar  test_namespace::sys_test_int

  write("sys_test_int:%d",@test_namespace::sys_test_int); 


on sysvar  test_namespace::sys_test_float

  write("sys_test_float:%f",@test_namespace::sys_test_float);

on sysvar  test_namespace::sys_test_string

  char string[20]; sysGetVariableString(sysVar::test_namespace::sys_test_string,string,elCount(string));
  write("sys_test_string:%s",string);
  

按下键盘 a,输出结果:

系统变量中 this 用法

On key 'a'

  @test_namespace::sys_test_int =random(100);

on sysvar  test_namespace::sys_test_int

  write("sys_test_int:%d",@this); 
  write("sys_test_int:%s",this.name); 
  write("sys_test_int:%s",this.`namespace);
  write("sys_test_int:%ld",this.time_ns); 

输出:

  • on sysvar 和 on sysvar_update的区别
    on sysvar :值变化才会触发
    on sysvar_update :只要对系统变量操作了,值不变化也会触发
On key 'a'

  @test_namespace::sys_test_int = 2;


on sysvar  test_namespace::sys_test_int

  write("sysvar ---->>sys_test_int:%d",@this); 

on sysvar_update test_namespace::sys_test_int

  write("sysvar_update---->>sys_test_int:%d",@test_namespace::sys_test_int); 

sys_test_int默认值是1,连续按了5次 键盘 a 键:

以上是关于CAPL 脚本中对信号,系统变量,环境变量的 事件响应的主要内容,如果未能解决你的问题,请参考以下文章

CAPL脚本中关于 局部变量 容易忽略的一点

CANoe仿真功能之自动化序列(Automation Sequences )

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

CANoe入门系列--用CAPL实现简单的开关灯

信号量互斥量同步变量条件变量和事件变量

CAPL语言概述