【CAPL】对信号值进行判断的4类方法

判断信号值的代码位置取决于触发时机

  • 信号更新时立即判断 → 用 on signal 信号名
  • 定时周期性判断 → 用 on timer 定时器名
  • 结合消息上下文判断 → 用 on message 消息名/ID
  • 特定事件触发时判断 → 用对应的事件(on start、on key等)

1. 当信号值变化时立即判断(最常用)

  • 所用事件:on signal事件
  • 场景:如需在信号从总线接收到新值时立即判断(如超过阈值报警)
  • 是最直观的方式:信号更新时会自动触发判断。
    // 当VehicleSpeed信号更新时,立即判断其值
    on signal VehicleSpeed
    {
      // 获取当前信号值(this表示当前信号)
      float currentSpeed;
      currentSpeed = this;//注:变量必须先声明,后赋值,否则报错
      
      // 判断逻辑
      if(currentSpeed > 120)
      {
        write("警告:车速超过120km/h!当前值:", currentSpeed);
      }
      else if(currentSpeed <= 0 && currentSpeed != -1)  // 假设-1表示无效值
      {
        write("提示:车速为0或负值,当前值:", currentSpeed);
      }
    }
    
    

2. 周期性判断信号当前值

  • 所用事件:定时器事件(on timer)
  • 场景:如果需要定时检查信号值(如每秒检查一次)
  • 适合不需要实时响应、但需要定期监控的场景
    variables
    {
      msTimer checkTimer;  // 定义定时器
    }
    
    on start
    {
      setTimer(checkTimer, 1000);  // 每1000ms(1秒)触发一次
    }
    
    // 定时器触发时,判断信号当前值
    on timer checkTimer
    {
      //如引入变量,需要注意:变量声明要放在其他操作的最前面,否则报错
      //float speed;
      //int mode;
      //speed = $VehicleSpeed;  // 获取信号当前值
      //mode = $PowerMode;
    
      // 判断逻辑
      if($PowerMode == 1 && $VehicleSpeed > 0) // 动力模式为On且车速>0
      {
        write("车辆正在行驶,当前车速:", speed);
      }
      
      setTimer(checkTimer, 1000);  // 重置定时器
    }
    

3. 当包含信号的消息接收后判断

  • 所用事件:on message事件
  • 场景:如果需要结合消息的其他信息(如消息 ID、数据长度)一起判断信号值
  • 适合需要消息上下文的场景。
    // 当接收到ABS_1消息(包含VehicleSpeed信号)时判断
    on message ABS_1
    {
      // 从消息中提取信号值
      float speed;
      speed = this.VehicleSpeed;
      
      // 结合消息信息判断(如消息ID、DLC等)
      if(this.id == 0xC0 && this.dlc == 8)  // 确认消息ID和长度
      {
        if(speed > 80)
        {
          write("ABS_1消息:车速超过80km/h,当前值:", speed);
        }
      }
    }
    
    

4. 在特定事件触发时判断(如按键、启动)

  • 所用事件:特定事件,如on key 'c'等
  • 场景:如果需要在某个特定事件(如测量启动、按键按下)时判断信号值,可放在对应的事件中。
  • 灵活适配多种不同需求的场景
    // 测量启动时,判断一次信号初始值
    on start
    {
      write("启动时检查信号初始值:");
      if($powermode == 0)
      {
        write("初始动力模式:Off");
      }
      else
      {
        write("初始动力模式:On(值:", $powermode, ")");
      }
    }
    
    // 按下键盘'c'键时,手动触发判断
    on key 'c'
    {
      write("手动检查车速:");
      if($VehicleSpeed == 0)
      {
        write("当前车速为0");
      }
      else
      {
        write("当前车速:", $VehicleSpeed, "km/h");
      }
    }
    
    

END

posted @ 2025-08-07 10:14  anliux  阅读(582)  评论(0)    收藏  举报