第一个仿真程序开灯 CAPL理解

发布时间 2023-07-12 15:25:34作者: 玩一会

建立的数据库

 下面是Switch的代码

on preStart

{
write("This is my first CANoe Simulation!\n");
}

//以下为处理系统变量svSwitch的响应
on sysvar sysvar::MyNamespace::svSwitch
{
  //声明一个CAN报文变量,用于报文发送
  message Msg1 msg;
  //读取当前的系统变量svSwitch的值,并赋给报文的信号bsSwitch
  msg.bsSwitch=sysGetVariableInt(sysvar::MyNamespace::svSwitch);
  //将报文输出到总线上
  output(msg);
}

下面是Light的代码部分

on message Msg1
{
  //读取报文的信号bsSwitch值,并赋给系统变量svLight
  sysSetVariableInt(sysvar::MyNamespace::svLight,this.bsSwitch);
}

现在在学习中,导师布置了一个小任务,里面将建立怎样的报文信号都讲得很清楚了,但是让我自己写代码的时候就开始混乱了,为什么要有报文信号又自己定义变量,搞不清之间数据传递的关系,所以又从最基础代码重新理解。

理解:

1.

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

因为报文已经在数据库中定义过,所以在这只要声明一下,用msg来代替Msg1,但仅限在该函数体中,msg可以用其他代替,但是Msg1必须跟数据库中的一样。

2.

//读取当前的系统变量svSwitch的值,并赋给报文的信号bsSwitch
  msg.bsSwitch=sysGetVariableInt(sysvar::MyNamespace::svSwitch);
  //将报文输出到总线上
  output(msg);
//读取报文的信号bsSwitch值,并赋给系统变量svLight
  sysSetVariableInt(sysvar::MyNamespace::svLight,this.bsSwitch);

light需要知道开关具体是开着还是关着的,但他不能直接得到数据,他需要接收报文,而报文上的信号上面记录着开关的数据,所以开关的数据要先放到信号上,信号再由报文携带者到总线上,由light接收,他再将信号上的数据赋值给变量。

3.

on sysvar sysvar::MyNamespace::svSwitch
on message Msg1

on sysVar:系统变量改变,触发此事件程序,比如0-->1会触发,但0-->0不会触发。

在创建panels时将开关与变量svSwitch绑定,开关的state count为2,也就是说有两种状态,具体如图

 也就是说开关在状态零,会发送0;在状态1,会发送1;

所以当点击开关时,变量svSwitch就会发生变化,就会触发事件,执行里面的代码:将值放到报文上的信号上,将报文传到总线。

CAN报文事件在CAN总线上有指定的或任意报文出现是被调用。

on message Msg1就是Light收到Msg1这个报文,所以该事件被触发,将报文的信号值赋给变量svLight,这里道理同上,灯的控件与变量svLight绑定

 当收到报文信号值为1,那么变量值也会变成1,变量值与等的颜色挂钩,所以等会变成红色。

4.

当使用系统变量时的格式:sysvar::MyNamespace::svSwitch