4. 基于CANoe的FlexRay信号故障注入

任务目标

在CANoe中搭建FlexRay总线仿真环境,通过CAPL脚本对指定FlexRay信号实施故障注入(信号值篡改、信号缺失),验证ECU对FlexRay信号异常的故障处理逻辑(如进入安全状态、使用默认值)。

环境与前置条件

  • CANoe 11.0及以上版本,安装FlexRay选项
  • 已配置FlexRay通道(Channel 1)及对应网络拓扑(至少包含一个ECU节点和一个仿真节点)
  • 被测ECU通过VN8900/VN7610等接口卡连接至总线
  • FlexRay通信集群已正确配置(Communication Cluster),信号位于某个Frame的Payload中

实现方案

本案例通过CAPL程序实现两种故障注入方式:信号值篡改(将信号强制修改为异常值)和信号缺失(通过停止发送帧模拟信号丢失)。故障注入由测试脚本通过定时器或外部触发控制,注入期间记录ECU响应。

关键完整代码

/* FlexRay信号故障注入CAPL脚本 */
variables
{
  msTimer tInject;
  msTimer tRestore;
  int gInjectActive = 0;
  
  /* 定义信号访问句柄 */
  signal gSigSpeed;
  frame gFrData;
}

on start
{
  /* 获取信号和帧句柄 */
  gSigSpeed = signal("DataFrame::Speed");
  gFrData = frame("DataFrame");
  
  /* 初始状态:正常发送 */
  setSignal(gSigSpeed, 100);
  
  /* 启动注入控制定时器 */
  setTimer(tInject, 5000);  /* 5秒后开始注入 */
}

on timer tInject
{
  if (gInjectActive == 0)
  {
    /* 故障注入模式1:信号值篡改 */
    setSignal(gSigSpeed, 0xFFFF);  /* 注入无效值 */
    write("FAULT INJECTION: Speed signal set to 0xFFFF");
    
    gInjectActive = 1;
    setTimer(tRestore, 3000);  /* 持续3秒 */
  }
}

on timer tRestore
{
  if (gInjectActive == 1)
  {
    /* 恢复信号正常值 */
    setSignal(gSigSpeed, 100);
    write("FAULT INJECTION: Speed signal restored to 100");
    
    gInjectActive = 0;
    setTimer(tInject, 5000);  /* 5秒后再次注入 */
  }
}

/* 故障注入模式2:信号缺失(停止发送帧) */
on key 'm'
{
  if (gInjectActive == 0)
  {
    /* 停止发送DataFrame */
    setTimer(gFrData, 0);  /* 停止周期发送 */
    write("FAULT INJECTION: DataFrame transmission stopped");
    gInjectActive = 2;
  }
  else if (gInjectActive == 2)
  {
    /* 恢复帧发送 */
    output(gFrData);
    write("FAULT INJECTION: DataFrame transmission resumed");
    gInjectActive = 0;
  }
}

/* 监控ECU响应 */
on signal gSigSpeed
{
  if (gInjectActive == 1)
  {
    write("ECU RESPONSE: Speed signal changed to %d", $gSigSpeed);
  }
}

on frame gFrData
{
  /* 记录帧接收状态 */
  if (gInjectActive == 2)
  {
    write("ECU RESPONSE: Received frame during injection");
  }
}

运行与验证

  1. 在CANoe中创建CAPL测试节点,将上述代码粘贴至节点的CAPL Browser中
  2. 配置FlexRay通信:确保DataFrame帧和Speed信号已在Communication Cluster中定义,且仿真节点周期发送该帧
  3. 启动CANoe仿真(按F5或点击Start按钮)
  4. 观察Write窗口输出:5秒后应显示信号值篡改注入信息,ECU应检测到异常值并触发故障处理
  5. 按键盘m键测试信号缺失注入,观察ECU是否进入安全状态或使用默认值

通过判定标准

  • Write窗口按预期时间输出注入开始/结束信息
  • 信号值篡改期间,ECU能够识别无效信号值(0xFFFF)并采取相应故障处理(如切换到备用传感器值或点亮故障灯)
  • 信号缺失期间,ECU在帧停止发送后500ms内检测到通信超时,并进入预定义的安全状态
  • 恢复后ECU能自动恢复正常工作,无需人工复位

常见问题

  • 信号句柄获取失败:确认信号名称与Communication Cluster中定义完全一致(包括大小写)
  • 帧停止后无法恢复:使用output(gFrData)重新发送帧时,需确保FlexRay调度表仍允许该帧的发送时隙
  • ECU无响应:检查ECU故障处理逻辑是否已启用,以及信号异常阈值是否与注入值匹配