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");
}
}
运行与验证
- 在CANoe中创建CAPL测试节点,将上述代码粘贴至节点的CAPL Browser中
- 配置FlexRay通信:确保
DataFrame帧和Speed信号已在Communication Cluster中定义,且仿真节点周期发送该帧 - 启动CANoe仿真(按F5或点击Start按钮)
- 观察Write窗口输出:5秒后应显示信号值篡改注入信息,ECU应检测到异常值并触发故障处理
- 按键盘
m键测试信号缺失注入,观察ECU是否进入安全状态或使用默认值
通过判定标准
- Write窗口按预期时间输出注入开始/结束信息
- 信号值篡改期间,ECU能够识别无效信号值(0xFFFF)并采取相应故障处理(如切换到备用传感器值或点亮故障灯)
- 信号缺失期间,ECU在帧停止发送后500ms内检测到通信超时,并进入预定义的安全状态
- 恢复后ECU能自动恢复正常工作,无需人工复位
常见问题
- 信号句柄获取失败:确认信号名称与Communication Cluster中定义完全一致(包括大小写)
- 帧停止后无法恢复:使用
output(gFrData)重新发送帧时,需确保FlexRay调度表仍允许该帧的发送时隙 - ECU无响应:检查ECU故障处理逻辑是否已启用,以及信号异常阈值是否与注入值匹配