示例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的数据转发功能。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐