【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"); } }

浙公网安备 33010602011771号