4. CANoe面板设计实现信号手动控制

CANoe面板设计实现信号手动控制 学习卡片

Panel Designer 控件与信号绑定关系

本案例在 CANoe 的 Panel Designer 中创建一个控制面板,面板上放置一个滑块(Track Bar)和一个按钮组(Button Group),分别用于手动修改车速信号 VehicleSpeed 与挡位信号 GearPosition。面板控件本身不产生报文,它通过“控件 → 系统变量 → CAPL 发送逻辑 → CAN 报文”的链路把用户操作转化为总线信号。

关键约束:车速信号 VehicleSpeed 的因子为 0.1、偏移为 0、范围 0~250 km/h,因此滑块原始值 0~2500 对应 0~250.0 km/h;挡位信号 GearPosition 为枚举型,取值 0=P、1=R、2=N、3=D。面板控件必须绑定到系统变量,再由 CAPL 的 on sysvar 事件把系统变量写入报文信号。

Panel Designer 面板 Track Bar(滑块) 控件名:tbSpeed 0 2500 原始值范围 0~2500 Button Group(按钮组) 控件名:bgGear P R N D 枚举值 0/1/2/3 系统变量 sysvar::Speed 类型:int 范围:0~2500 sysvar::Gear 类型:int 范围:0~3 CAPL 发送逻辑 on sysvar sysvar::Speed msg.VehicleSpeed = @sysvar::Speed * 0.1; output(msg); on sysvar sysvar::Gear msg.GearPosition = @sysvar::Gear; output(msg); 绑定 绑定 触发 触发 CAN 报文:VehicleStatus (ID=0x100) VehicleSpeed (0.1 km/h/bit) | GearPosition (枚举) output 控件操作 → 系统变量更新 → CAPL 事件触发 → 报文信号写入并发送

创建面板与控件绑定

在 CANoe 工程中新建 Panel,打开 Panel Designer 工具箱,拖入 Track Bar 与 Button Group。选中 Track Bar,在属性面板中设置 Min=0、Max=2500、TickFrequency=250,并在 Symbol 栏绑定系统变量 sysvar::Speed。选中 Button Group,设置按钮数量为 4,按钮文本依次为 P、R、N、D,对应值 0、1、2、3,绑定系统变量 sysvar::Gear。

系统变量需提前在 Configuration → System Variables 中创建:Speed 为 int 类型,Gear 为 int 类型。若未创建,Panel Designer 的绑定下拉框中不会出现对应变量。

CAPL 事件处理与信号写入

面板控件只更新系统变量,真正把值写入报文并发送的是 CAPL 节点。在 CAPL Browser 中编写以下代码:

variables
{
  message 0x100 msg;
}

on start
{
  msg.dlc = 8;
  msg.VehicleSpeed = 0;
  msg.GearPosition = 0;
  output(msg);
}

on sysvar sysvar::Speed
{
  msg.VehicleSpeed = @sysvar::Speed * 0.1;
  output(msg);
}

on sysvar sysvar::Gear
{
  msg.GearPosition = @sysvar::Gear;
  output(msg);
}

代码中 @sysvar::Speed 读取系统变量当前值,乘以因子 0.1 后写入信号 VehicleSpeed。挡位信号直接赋值,因为枚举值与系统变量值一一对应。每次系统变量变化都会触发 on sysvar 事件并立即发送报文。

验证与结果判读

启动 Measurement,在 Trace 窗口中观察 ID=0x100 的报文。拖动滑块到中间位置,Trace 中 VehicleSpeed 应显示约 125.0 km/h(原始值 1250 × 0.1)。点击按钮组中的 D,GearPosition 应变为 3。若信号值不变,检查系统变量绑定是否正确、CAPL 节点是否已加载、报文 ID 是否与 DBC 中定义一致。

滑块原始值与物理值之间是线性关系:物理值 = 原始值 × 因子 + 偏移。本例因子 0.1、偏移 0,因此滑块 2500 对应 250.0 km/h。若 DBC 中因子不是 0.1,需同步修改 CAPL 中的乘法系数。