1

我目前正在编写一些在单击按钮时执行的 CAPL 代码。它应发送多个诊断请求。但 CANoe 总是告诉我,它一次只能发送一个请求。所以我需要延迟请求。该diagSetRequestInterval功能不起作用。而且由于它不是测试用例,因此testWaitForDiagResponse也不起作用。

4

2 回答 2

1

您必须等到请求被处理(通过来自目标的响应或超时)。

由于您不在测试节点中,您必须将控制权交还给系统,即您的功能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);
}

超时处理是一个不同的主题,作为练习:-)

于 2018-08-23T15:13:58.710 回答
0

您实际上希望在 CANoe 中同时实现多个 TP 连接。我假设您在诊断/ISO TP 配置中只有一个诊断描述,这使您一次只能使用 1 个 TP 连接。

您可以根据需要在同一通信通道上的诊断 ISO/TP 中实现多个诊断层,但名称不同。

在模拟节点中,您只需使用不同的命名空间声明您想要的请求,对应于您之前创建的诊断层名称之一。

这样您就可以在 UDS 中为 CANoe 环境虚拟化多个 TP 连接。

或者,您不使用 CANoe 的诊断层支持,而是在数据链路层(CAN、FR)上使用 UDS 有效负载构建整个消息。取决于您设置了什么样的数据链路层(CAN、FR)以及有多少带有诊断层的通信通道。

例如,在 Flexray 中,如果您的 frschedule 提供了 Diaglayer(或您)可以使用的动态段中的多个 frslot,您可以在同一个 frcycle 中发送多个 diag 请求。

于 2018-09-21T11:42:05.683 回答