车载以太网和传统总线(如CAN)的常见测试场景(CAPL)
·
示例1:基础以太网消息发送与接收
/* 发送以太网消息(如SOME/IP服务请求) */
variables {
message EthernetFrame ethMsg; // 定义以太网帧
}
on start {
// 配置以太网帧参数(示例:SOME/IP请求)
ethMsg.ETHChannel = 1; // 通道号(根据CANoe配置调整)
ethMsg.ETHType = 0x0800; // IPv4类型
ethMsg.Payload = hexToByte("01 23 45 67 89 AB CD EF"); // 自定义负载
ethMsg.DestinationMAC = "00:11:22:33:44:55"; // 目标MAC地址
// 周期性发送(周期100ms)
setTimer(ethTxTimer, 100);
}
on timer ethTxTimer {
ethernet::send(ethMsg); // 发送以太网帧
write("SENT Ethernet Frame: %x", ethMsg.Payload);
}
/* 接收以太网帧并解析 */
on ethernetFrame {
if (this.ETHType == 0x0800 && this.DestinationMAC == "00:11:22:33:44:55") {
write("RECV Ethernet Frame: %x", this.Payload);
// 进一步解析IP层或应用层协议(如SOME/IP)
}
}
解释:
-
on start:初始化时配置并发送以太网消息。 -
setTimer:周期性触发消息发送。 -
on ethernetFrame:捕获并处理接收到的以太网帧。
示例2:测试ECU响应超时
/* 验证ECU在收到请求后是否在预期时间内响应 */
testcase CheckResponseTimeout() {
message CAN::MyReqMsg reqMsg; // CAN请求消息(假设已关联DBC)
message CAN::MyRespMsg respMsg; // 预期响应消息
// 发送请求
output(reqMsg);
write("Sent Request ID: 0x%x", reqMsg.ID);
// 等待响应(超时时间200ms)
if (testWaitForMessage(respMsg, 200) == 0) {
testStepFail("Response Timeout!"); // 超时则测试失败
} else {
testStepPass("Response Received in Time.");
}
}
解释:
-
testcase:定义一个自动化测试用例。 -
testWaitForMessage:等待特定消息,超时则触发失败判定。 -
适用于功能安全测试(如ISO 26262中的时序要求)。
示例3:周期性发送诊断请求(DoIP/UDS)
/* 周期性发送UDS诊断请求(如读取ECU版本) */
variables {
msTimer diagTimer;
byte diagReq[] = {0x22, 0xF1, 0x8C}; // UDS请求:ReadDataByIdentifier (0x22) + DID 0xF18C
}
on start {
setTimer(diagTimer, 1000); // 每隔1秒发送一次
}
on timer diagTimer {
// 发送诊断请求(假设通过DoIP通道)
Diag::SendRequest(diagReq);
write("Sent Diagnostic Request: %02X", diagReq);
}
/* 处理诊断响应 */
on diagResponse Diag::Response {
if (this.ServiceId == 0x62 && this.Data[0] == 0xF1 && this.Data[1] == 0x8C) {
write("ECU Version: %s", this.Data[2..]); // 解析响应数据
}
}
解释:
-
Diag::SendRequest:通过DoIP发送UDS诊断请求。 -
on diagResponse:捕获并解析ECU的响应数据。 -
用于验证ECU的诊断功能(ISO 14229标准)。
示例4:模拟总线错误注入
/* 注入错误帧以测试ECU容错能力 */
on key 'e' { // 按下键盘'e'触发错误注入
CAN::ErrorFrame errorFrame;
errorFrame.ErrorType = CAN::CRC_ERROR; // CRC错误类型
errorFrame.Channel = 1; // CAN通道
CAN::injectErrorFrame(errorFrame); // 注入错误帧
write("Injected CRC Error on CAN Channel 1!");
}
解释:
-
CAN::injectErrorFrame:向总线注入错误帧(CRC、格式错误等)。 -
用于验证ECU的故障恢复机制(如ISO 26262安全机制)。
示例5:以太网TSN时间同步测试
/* 验证gPTP时间同步精度 */
variables {
ethernet::GPTPTime masterTime;
ethernet::GPTPTime slaveTime;
}
on ethernetFrame::GPTP_Sync { // 捕获gPTP同步报文
masterTime = this.Timestamp; // 主时钟时间戳
}
on ethernetFrame::GPTP_FollowUp {
// 计算从节点与主节点的时间差
slaveTime = getGPTPTime(); // 获取本地时间
float timeDiff = (slaveTime - masterTime) * 1e9; // 转换为纳秒
write("Time Sync Error: %.2f ns", timeDiff);
if (abs(timeDiff) > 100) { // 阈值100ns
testStepFail("TSN同步超差!");
}
}
解释:
-
捕获gPTP协议报文并计算主从节点时间差。
-
用于TSN网络的时间同步精度测试(IEEE 802.1AS)。
示例6:多总线交互测试(CAN + Ethernet网关)
/* 模拟CAN到Ethernet的网关转发逻辑 */
on message CAN::SensorData { // 接收CAN消息
message Ethernet::EthSensorData ethData;
// 将CAN信号映射到以太网消息
ethData.Speed = this.Speed;
ethData.Temperature = this.Temp;
// 发送以太网消息
ethernet::send(ethData);
write("Forwarded CAN to Ethernet: Speed=%d", this.Speed);
}
解释:
-
实现CAN与以太网之间的协议转换逻辑。
-
用于验证网关ECU的数据转发功能。
更多推荐
所有评论(0)