【CAPL】CAPL版 hello world-纯小白入门篇

认识CAPL

一句话总结CAPL:总线通信

  • CAPL(Communication Access Programming Language)
  • CAPL 是汽车总线开发领域的专用编程语言:汽车总线的开发、测试和仿真
  • 专为汽车电子领域的总线通信(如 CAN、LIN、Ethernet 等)设计
  • 设计目标:简化总线通信的仿真、监控、测试流程
  • 便捷实现对总线数据的发送、接收、处理以及自动化测试逻辑的编写。

CAPL 的核心特点

  • 1.面向总线通信

    • CAPL 的语法和功能高度适配汽车总线协议(如 CAN、LIN、FlexRay、Ethernet 等)
    • 可以直接操作总线上的报文(Message)和信号(Signal),例如:
      • 发送自定义 CAN 报文;
      • 监听总线上的特定信号并触发响应;
      • 模拟 ECU(电子控制单元)的行为。
  • 2.类 C 语法,易于上手

    • 语法结构:
      • 与 C 语言相似
      • 包含 变量、函数、条件语句、循环语句等基本要素
    • 同时扩展了总线通信相关的专属函数
      • 如output()发送报文、on message监听报文等
  • 3.事件驱动机制

    • CAPL 程序主要基于事件触发执行
    • 常见事件包括:
      • 总线上收到特定报文(on message);
      • 定时器超时(on timer);
      • 按键或界面操作(on key);
      • 系统初始化(on start)。
  • 4.集成于汽车总线开发工具

    • CAPL 主要在 Vector 的 CANoe(总线仿真与测试工具)和 CANalyzer(总线监控工具)中使用,
    • 通过编写 CAPL 脚本,可以实现:
      • 仿真 ECU 的发送和接收行为;
      • 自动化测试用例(如验证报文触发条件、信号范围等);
      • 自定义总线监控逻辑(如报警、数据统计)。

应用场景举例

  • ECU 仿真:

    • 通过 CAPL 脚本模拟某个 ECU 向总线发送报文(如车速、油门信号),供其他 ECU 或测试系统验证功能。
  • 自动化测试:

    • 编写 CAPL 脚本,自动向总线发送特定指令,同时监控响应报文,判断系统是否符合设计要求
    • 如 “发送刹车信号后,车速信号应在 1 秒内降至 0”
  • 故障注入:

    • 通过 CAPL 脚本模拟总线故障(如报文丢失、信号错误),测试系统的容错能力。

1.CAPL的hello world

新建工程后新建网络节点

  • 连接CANoe设备
  • 打开CANoe,新建工程:new-CAN 500k..
  • 新建网络节点:Simulation-右击CAN线-插入网络节点

打开网络节点的CAPL界面

  • 在新建的网络节点的左下方小铅笔,打开CAPL界面
  • 首先需:选择路径并命名后打开;或选择已有文件打开

使用start编写输出语句hello world

  • 左侧大纲:找到system
  • 快捷插入start语句,并添加输出语句
  • 编译:成功后关闭CAPL Brower
    图片
    图片

运行CANoe工程

  • 小闪电运行,如果成功,可以在write窗口中看到输出的hello world
    图片

2.发送一个CAN消息

定义全局变量msg1

  • 定义消息变量msg1,并初始化:
    • 消息ID为0x555,数据长度dlc为1字节
  • message 0x555 msg1 = {dlc=1};中: 0x555为message的ID
    • 应为message初始化格式,参考数组初始化等
    • 格式:message message的ID message的变量名 = {...};

键盘s触发报文发送

  • 给报文的第1个字节赋值为0xAA
  • 发送此报文
  • 打印特定的语句
    图片

编译运行,键盘按下s后的trace

  • 编译运行成功
  • 按下s后,trace窗口可以看到一条报文
  • 注:没有BCM连接,这里只有错误帧
    图片

3.设置信号值变化

需求分析

  • dbc中已定义 报文和信号
    • 报文ABS_1
      • 此报文下的信号:VehicleSpeed
  • 改变 信号 VehicleSpeed 的值,并监测这个值
    • 可以在 Graphics 窗口中监测
  • VehicleSpeed 值的变化:
    • 2s后:赋值为5 -- sendTimer
    • 4s后:赋值为50 -- updateTimer
    • 按键s后:赋值为30 -- on key 's'
  • 监测定时器:
    • 程序运行的1s后开始监测 -- checkTimer

定义变量variables

  • 定义message和Timer

定义start

  • 运行后,立刻开始做的事
  • 立刻发送报文
  • 立刻开始计时器

尝试按键触发on key

  • 当按键s后,触发 VehicleSpeed 值的变化

代码示例

  • 以下是示例代码,作为参考
    variables
    {
      message ABS_1 ABS_1;
      msTimer checkTimer;
      msTimer sendTimer;
      msTimer updateTimer;
    }
     
    on start
    {
      output(ABS_1);
      setTimer(checkTimer, 1000);
      setTimer(sendTimer, 2000);
      setTimer(updateTimer, 4000);
    }
     
    on timer sendTimer
    {
      $VehicleSpeed = 5;
      //output(ABS_1);
    }
     
    on timer updateTimer
    {
      $VehicleSpeed = 50;
      //output(ABS_1); //错误的发送报文位置,会导致信号值先拉低为0后变化为指定值
    }
     
    on key 's'
    {
      $VehicleSpeed = 30;
    }
    
    on timer checkTimer
    {
      //int speed = $VehicleSpeed;
      ///int mode = $PowerMode;
      if($PowerMode == 0 && $VehicleSpeed >40){
        write("太快啦!!");
      }
      setTimer(checkTimer,1000);
    }
    

核心思路:动手,debug,进步

  • 动手编译、运行代码
  • 在动手过程中,发现问题,解决问题,积累经验,然后进步

参考链接

tbd

posted @ 2022-10-21 09:51  anliux  阅读(214)  评论(0)    收藏  举报