我当前正在编写一些单击按钮时执行的CAPL代码。它应发送多个诊断请求。但是CANoe总是告诉我,它一次只能发送一个请求。所以我需要延迟请求。 diagSetRequestInterval
函数不起作用。而且,由于它不是测试用例,因此testWaitForDiagResponse
也不起作用。
答案 0 :(得分:0)
您必须等到请求处理完毕(通过目标的响应或超时)。
由于您不在,因此必须将控制权交还给系统,即,执行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);
}
超时处理是一个不同的主题,留作练习:-)
答案 1 :(得分:0)
您实际上想在CANoe中同时实现多个TP连接。我假设您在Diagnostic / ISO TP配置中只有一个诊断说明,该配置一次只能使用1个TP连接。
您可以根据需要在同一ISO通道中的诊断ISO / TP中实现多个诊断层,但是可以使用不同的命名。
在模拟节点中,您仅需使用其他名称空间声明所需的请求即可,该名称空间对应于您先前创建的诊断层名称之一。
这样,您可以在CANoe环境的UDS中虚拟化多个TP连接。
或者,您不使用CANoe的诊断层支持,而是在数据链接层(CAN,FR)上使用UDS有效负载构造整个消息。 取决于您设置的是哪种数据链路层(CAN,FR)以及具有diag层的通信通道数量。
例如,在Flexray中,如果您的frschedule在动态段中提供了多个Diaglayer(或您可以使用)的frslot,则可以在同一frcycle中发送多个diag请求。