当前位置: 代码迷 >> 综合 >> CAPL 脚本中对信号,系统变量,环境变量的 事件响应
  详细解决方案

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

热度:36   发布时间:2023-09-20 14:01:35.0

Value Objects

  • 信号(on signal)
  • 环境变量(on envVar)
  • 系统变量(on sysVar )

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

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

信号(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,因为信号值没有变化
CAPL 脚本中对信号,系统变量,环境变量的 事件响应

关于关键字: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));  
}

输出结果:
CAPL 脚本中对信号,系统变量,环境变量的 事件响应

环境变量(on envVar)

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

  • getValue() 读取变量值 CAPL 脚本中对信号,系统变量,环境变量的 事件响应
  • putValue() 设置变量值 CAPL 脚本中对信号,系统变量,环境变量的 事件响应

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

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

在Value Objects中创建on enVar 事件
CAPL 脚本中对信号,系统变量,环境变量的 事件响应

/*@!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);}

输出结果:CAPL 脚本中对信号,系统变量,环境变量的 事件响应

"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按键之后的输出结果:CAPL 脚本中对信号,系统变量,环境变量的 事件响应

系统变量(on sysVar )

  • 系统定义的系统变量
    在你的canoe工程中,调动了不同的dll或者加载了不同的模块,不同的总线结构中,canoe工程会自动适配出 系统的系统变量,如下图,只有statistics和canoe两个命名空间这是因为我这建立的是一个空项目,并没有加入其它模块。
    CAPL 脚本中对信号,系统变量,环境变量的 事件响应
  • 用户定义的系统变量
    这里新建了一个test_namespace 命名空间,并创建了三个系统变量
    人;这里还可以通过 export 将你定义的系统变量导出到一个 .vsysvar 文件中,这样定义的系统变量就可以在其它工程中复用了。
    CAPL 脚本中对信号,系统变量,环境变量的 事件响应
  • 语法: 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,输出结果:CAPL 脚本中对信号,系统变量,环境变量的 事件响应

系统变量中 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); 
}

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

  • 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 脚本中对信号,系统变量,环境变量的 事件响应

  相关解决方案