我目前正在编写一些在单击按钮时执行的 CAPL 代码。它应发送多个诊断请求。但 CANoe 总是告诉我,它一次只能发送一个请求。所以我需要延迟请求。该diagSetRequestInterval
功能不起作用。而且由于它不是测试用例,因此testWaitForDiagResponse
也不起作用。
2 回答
您必须等到请求被处理(通过来自目标的响应或超时)。
由于您不在测试节点中,您必须将控制权交还给系统,即您的功能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 提供了 Diaglayer(或您)可以使用的动态段中的多个 frslot,您可以在同一个 frcycle 中发送多个 diag 请求。