• 【车载开发系列】CAPL语言事件类型概述


    【车载开发系列】CAPL语言事件类型概述

    一. CAPL事件的概念

    1)事件

    CAPL所说的“事件”是指用户进行键盘操作和消息的接收等。
    如果发生“事件”,会调用事件处理程序。

    2)事件处理程序

    是指检测发生的事件并执行某种处理的功能。
    每个事件处理程序都是独立的,并通过变量和函数连接和编程。
    CAPL的特征“发生某事时做某事”,“发生某事时”被称为事件处理程序。
    CAPL根据事件处理程序发生的事件进行处理。

    二. CAPL事件类型

    1)系统事件

    在CAPL的系统事件中,有preStart、start、preStop、stopMeasurement4种。
    我们可以根据需要在相应的系统事件函数接口中定义想要进行的操作;当工程运行时,下述系统事件的发生顺序依次是

    preStart–>start–>preStop–>stopMeasurement

    事件名程序执行条件事件过程语法结构
    preStartCANoe初始化时执行on preStart{…}
    Start工程测量开始时执行on Start{…}
    preStop工程预备停止时执行;发生在stopMeasurement事件前面on preStop{…}
    stopMeasurement工程停止时执行on stopMeasurement{…}

    2)CAN控制器事件

    当硬件对CAN控制器检测到相应动作发生时执行。比如下面的Busoff。

    on busOff       /*CAN控制器事件:硬件检测到BusOff时执行*/
      {
          write("BusOff Error!");
      }
    
    • 1
    • 2
    • 3
    • 4
    事件名程序执行条件事件过程语法结构
    BusOff硬件检测到BusOff时执行on BusOff{…}
    ErrorActive硬件检测到ErrorActive时执行on errorActive{…}
    ErrorPassive硬件检测到ErrorPassive时执行on errorPassive{…}
    WarmmingLimit硬件检测到WarmmingLimit时执行on warmmingLimit{…}

    3)CAN消息事件

    通过on message定义消息事件,该事件会在指定的报文消息被接收时被调用。
    关于消息事件的定义格式示例如下:

    on message 234             /*接收到234(10进制)这个ID的报文时执行*/
    on message 0x441           /*接收到0x441(16进制)这个ID的报文时执行*/
    on message BCM              /*接收到BCM(工程dbc文件中的报文名)这个报文时执行*/
    on message*              /*接收到任意报文时都执行(注意*与message之间没有空格)*/
    on message 0x300-0x555     /*接收到这个范围内的ID报文时执行*/
    {
        write(“Received %x”,this.id);   /*打印接收到的消息id*/
        write(“Received Message %d in total!,count)}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4)键盘事件

    通过”on key”定义键盘事件,该事件会在我们按下指定按键时执行;关于键盘事件的定义格式示例如下:

    on key ‘a’        /*在小写输入法下,按下键盘的’A’键时执行*/
    on key ‘A’        /*在大写输入法下,按下键盘的’A’键时执行*/
    on key ‘ ’        /*按下键盘的空格键时执行,注意单引号中间是有空格的*/
    on key 0x20       /*按下键盘的空格键时执行*/
    on key F2            /*按下键盘的’F2’键时执行*/
    on key CtrlF3        /*同时按下键盘的’Ctrl’键和’F3’键时执行*/
    on key*          /*按下键盘的任意键时都会执行(注意*与key之间没有空格) */
    {
        write(“The Key Is Press”)}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5)时间事件

    定时器变量用来创建一个定时事件
    SetTimer函数用来设定时间间隔
    定时器运行到达设定时间间隔触发定时事件 on timer {}
    周期性触发需要每次触发结束后使用SetTimer复位
    cancelTimer函数用来在定时器运行中需要取消计时

    variables
    {
      msTimer Timer1;        /*在variables中声明一个以ms为单位的定时器变量Timer1*/
    }
    on start
    {
      setTimer(Timer1,100);     /*将Timer1的定时时间设定为100ms,并启动它*/
    }
    on timer Timer1         /*定义的Timer1时间事件,每100ms执行一次*/
    {
      setTimer(Timer1,100);     /*启动下一个周期循环*/
    }
    on key ‘a‘           /*键盘事件,按下键盘’A’键时执行*/
    {
      cancelTimer(Timer1);     /*停止Timer1这个100ms执行一次的定时器*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    6)错误帧事件

    总线上出现错误帧或者过载帧时,错误帧事件将被调用,以进行错误帧处理
    通过on errorFrame定义错误帧事件;该事件会在硬件检测到错误帧时执行。
    关于错误帧事件的定义格式示例如下:

    on errorFrame       /*错误帧事件:硬件检测到错误帧时执行*/
    {
      write("The error has occur"); 
    }	
    
    • 1
    • 2
    • 3
    • 4

    7)环境变量事件

    我们通过关键字:on envVar来定义环境变量事件,该事件是对系统变量发生变化的响应。
    该事件会在指定的环境变量值有新的输入时开始执行。
    环境变量常常用于关联上一个面板控件,当我们对控件进行操作时,对应改变关联上的环境变量值;
    而此时我们在CAPL中关于该环境变量的事件就会被调用;以此完成相关联的交互操作。
    关于在CAPL中对环境变量的操作中,getValue()与putValue()是常用的接口函数。

    关于环境变量事件的定义格式示例如下:

    //以下语句定义了系统变量DI_O改变时,触发以下事件
    on sysVar IO::DI_O
    {
      $Gateway::IOValue1 = @this;  
    }
    //以下语句定义了系统变量DI_O更新时,触发以下事件
    on sysvar_update IO::DI_O
    {
      $Gateway::IOValue2 = @this;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    8)诊断用事件

    诊断事件是在诊断请求或诊断响应发生时产生

    事件事件进程
    当仿真的ECU收到某条诊断请求时on diagRequest
    当仿真仪发出某条诊断请求时on diagRequestSent
    当仿真仪收到某条诊断响应时on diagResponse

    9)系统变量事件

    我们通过关键字:on sysvar来定义系统变量事件;
    该事件会在指定的系统变量值有新的输入时执行,其格式及使用方法与前一小节的环境变量基本一致;
    差别只在于环境变量是在dbc文件中定义的;而系统变量是在工具栏的”Environment”下的”System Variables”下定义的。
    右键空白处,选择”New”进行新建;在弹出的窗口对新建的系统变量进行参数设置。
    关于系统变量事件的定义格式示例如下:

    on sysvar SysVarA   /*系统变量事件:指定的系统变量值有新的输入时执行*/
      {
          write("The SysVarA is %d",@SysVar1);
      }	
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    数组中的第K大元素[堆排 + 建堆的实际时间复杂度]
    蛋白质结构预测 AlphaFold2、ColabFold、Uni-Fold
    Java函数式接口
    VMware 16开启虚拟机电脑就蓝屏W11解决方法
    彻底弄懂Vue的作用域插槽
    基于go标准分层架构项目设计实现
    【计算机组成原理】第一章单元测试
    【车牌识别】基于BP神经网络实现车牌识别(带语音播报)含Matlab源码
    Sping bean 的默认名称
    11--无重复字符的最长子串
  • 原文地址:https://blog.csdn.net/Last_Impression/article/details/132513954