建立的数据库
下面是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