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


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

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

    一、创建系统变量

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

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

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

     

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

     

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

    二、设计Panel界面

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

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

     

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

     

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

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

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

    三、CAPL脚本编写

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

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

    1. /*@!Encoding:936*/
    2. includes
    3. {
    4. }
    5. variables
    6. {
    7. int frame_cnt = 0;
    8. }
    9. //通风开关状态发生变化
    10. on sysvar sysvar::SeatEcuCtrl::FanOn
    11. {
    12. if(@this) {
    13. write("风扇开关ON");
    14. if(@sysvar::SeatEcuCtrl::SeatType == 0) {
    15. //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
    16. $IBCM_MSG::DriverSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    17. }
    18. else {
    19. $IBCM_MSG::PassengerSeatVentilationControl_Request = @sysvar::SeatEcuCtrl::FanLevel + 0x01;
    20. }
    21. }
    22. else {
    23. write("风扇开关OFF");
    24. if(@sysvar::SeatEcuCtrl::SeatType == 0) {
    25. //通风档位系统变量赋值给IBCM_MSG帧的DriverSeatVentilationControl_Request信号
    26. $IBCM_MSG::DriverSeatVentilationControl_Request = 0x07;
    27. }
    28. else {
    29. $IBCM_MSG::PassengerSeatVentilationControl_Request = 0x07;
    30. }
    31. }
    32. }
    33. //收到从节点反馈帧DR_Pneumatic_FB_MSG
    34. on linFrame DR_Pneumatic_FB_MSG {
    35. frame_cnt++;
    36. write("frame cnt = %d", frame_cnt);
    37. }

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

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

     

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

  • 相关阅读:
    陪诊系统|陪诊软件革新陪诊体验解决病患难题
    Aitium Designer20
    ShardingSphere学习(超详细)
    后端搜索条件
    【云原生】设备云之基于FlexManager的C#SDK开发案例代码
    深入理解JavaScript事件循环机制
    Django高级表单处理与验证实战
    进入Linux的世界
    Mybatis:Mybatis的各种查询功能(5)
    安装 laravel 遇到的错误和解决方案
  • 原文地址:https://blog.csdn.net/u010312436/article/details/134267595