我目前正在编写一些在单击按钮时执行的 CAPL 代码。它应发送多个诊断请求。但是CANoe总是告诉我,它一次只能发送一个请求。所以我需要延迟请求。diagSetRequestInterval
功能不起作用。而且由于它不是测试用例,因此testWaitForDiagResponse
也不起作用。
您必须等到请求得到处理(通过来自目标的响应或超时(。
由于您不在测试节点中,因此您必须将控制权交还给系统,即您的函数diagSendRequest
将结束,并且您等待总线上的某些事件发生后再继续(否则模拟将停止(。
处理完请求后on diagRequest ...
将被调用。在此事件过程中,您可以发送下一个请求,依此类推。
例:
而不是:
myFunction()
{
diagRequest ECU.ProgrammingSession req1;
diagRequest ECU.SecuritySeed req2:
diagSendRequest(req1);
diagSendRequest(req2);
}
你会做这样的事情:
myFunction()
{
diagRequest ECU.ProgrammingSession req1;
diagSendRequest(req1);
}
on diagResponse ECU.ProgrammingSession
{
diagRequest ECU.SecuritySeed req2:
diagSendRequest(req2);
}
超时处理是一个不同的主题,并作为练习保留:-(
您实际上希望在 CANoe 中同时实现多个 TP 连接。我假设您在诊断/ISO TP 配置中只有一个诊断说明,它允许您一次只能使用 1 个 TP 连接。
您可以在同一通信通道上的诊断 ISO/TP 中实现多个诊断层,但名称不同。
在模拟节点中,您只需使用不同的命名空间声明所需的请求,该命名空间对应于您之前创建的诊断层名称之一。
这样,您就可以在 UDS 中为 CANoe 环境虚拟化多个 TP 连接。
或者,您不使用 CANoe 的诊断层支持,而是在数据链路层(CAN、FR(上使用 UDS 有效负载构造整个消息。 取决于哪种数据链路层(CAN,FR(以及您设置了多少个具有诊断层的通信通道。
例如,在 Flexray 中,如果您的 frschedule 在动态段中提供了多个 frslot 供 Diaglayer(或您(使用,则可以在同一 frcycle 中发送多个诊断请求。