学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令

前一篇文章已经对CANOE如何模拟主节点和从节点进行LIN通信做了简单的记录,修改主节点发送的指令需要修改LIN ISC模块里的Frames帧对应的signal。这样改起来比较麻烦且不直观,幸好CANOE提供了Panel designer这样的工具,我们可以利用它设计自己的上位机控制面板,通过面板不同的操作修改对应的系统变量,再通过CAPL脚本将环境变量赋值给LIN帧对应的signal,从而实现面板控制LIN帧中信号值。

本文简单记录实现创建CANOE面板控制主副驾座椅的通风加热功能。

一、创建系统变量

要实现panel面板的控件和LIN帧信号值进行绑定,需要用到系统变量。创建系统变量过程如下图所示:

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第1张图片

 其中NameSpace是命名空间,后续创建的系统变量都归属于该命名空间下。比如我创建了一个SeatType系统变量用来记录当前面板控制的是主驾还是副驾。如下图所示:

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第2张图片

SeatType为int数据类型,最大值为1,关联了一个Value Table,点击红线圈的按钮可以看到SeatTypeList如下所示,可以在下图左边列表通过右键单击New创建新的Value Table:

 学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第3张图片

为了控制通风加热我又创建了如下的系统变量:

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第4张图片 

其中FanOn用来控制风扇开关,关联的值为0和1;FanLevel用来控制风扇档位分别为高中低三档;加热类似。

二、设计Panel界面

 点击菜单栏的Tools,选择Panel Designer,进入面板设计界面:

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第5张图片

(1)首先我们添加一个组合框控件用来选择需要控制的座椅(主/副驾),在1红线圈的位置可以进行Toolbox和组件属性进行切换显示。需要注意的是SeatType这个控件需要关联到SeatType系统变量,在右边的属性Symbol中Filter选择Variable然后Symbol选择前面创建的SeatType系统变量。如下图2,3所示。

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第6张图片 

(2) 分别添加两个Combox组件用来选择通风和加热档位,并且分别绑定FanLevel和HeatLevel系统变量。

 学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第7张图片

(3)分别添加两个Switch /Indicator开关控件用来控制通风和加热的开启和加热,并且分别关联FanOn和HeatOn系统变量。

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第8张图片

 开关关联的图片可以替换为自己制作的,图片一定要按下图的格式进行制作,每个图片由三个图标组成,第一图标是面板显示时显示的图片,第二和第三个是开关来回切换时显示的图片。

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第9张图片学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第10张图片

(4)保存设计好的面板为xvp文件。

三、CAPL脚本编写

经过上两步已经完成了面板的设计以及面板控件和系统变量的绑定,但是系统变量值的变化并没有关联到LIN帧信号变化。这部分工作需要在CAPL脚本里完成。CAPL语法就不多赘述了。

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第11张图片

首先双击上图中红线圈的Master模拟节点,打开下图的CAPL编辑界面:

学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第12张图片

/*@!Encoding:936*/
includes
{
  
}

variables
{
  int frame_cnt = 0;
}

//通风开关状态发生变化
on sysvar sysvar::SeatEcuCtrl::FanOn
{
  if(@this) {
    write("风扇开关ON");  
    if(@sysvar::SeatEcuCtrl::SeatType == 0) {
       //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
       $IBCM_MSG::DriverSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    }
    else {
       $IBCM_MSG::PassengerSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    }
  }
  else {
    write("风扇开关OFF");  
    if(@sysvar::SeatEcuCtrl::SeatType == 0) {
       //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
       $IBCM_MSG::DriverSeatVentilationControl_Request = 0x07;
    }
    else {
       $IBCM_MSG::PassengerSeatVentilationControl_Request = 0x07;
    }
  }
}

//收到从节点反馈帧DR_Pneumatic_FB_MSG
on linFrame DR_Pneumatic_FB_MSG {
  frame_cnt++; 
  write("frame cnt = %d", frame_cnt);
}

 上诉代码中当FanOn系统变量发生改变时会触发on sysvar sysvar::SeatEcuCtrl::FanOn函数的调用,也就是当面板的风扇开关按钮点击的时候其关联的FanOn系统变量就会发生改变并触发该函数的调用,函数里面主要实现当ON的时候将风扇档位赋值给相应的帧信号,当为OFF的时候帧信号赋值为0x7。同时上诉代码还实现了监听从机节点反馈帧并进行计数的功能。

选择通风档位,点击风扇切换图标按钮,对应的LIN信号发生变化如下图所示:

 学习笔记:利用CANOE Panel和CAPL脚本模拟主节点发送LIN通信指令_第13张图片

至此通过CANOE面板来控制LIN信号的功能基本实现,特此记录下。 

你可能感兴趣的:(LIN通信协议,学习,笔记)