Альтернатива функции CAPL TestWaitForDiagRequestSent

Я ищу функцию в CAPL, которая обеспечивает ту же функциональность, что и вышеупомянутая функция.

Эта функция используется для ожидания подтверждения того, был ли успешно отправлен диагностический запрос. Передаваемые параметры - это объект DiagRequest и определенный период ожидания. Если в конце этого периода подтверждение не получено, возвращается код ошибки, соответствующий таймауту. Другой код ошибки относится также к другим причинам сбоя, например, к ошибке протокола или тому подобному.

Моя основная проблема с этой установленной функцией «TestWaitForDiagRequestSent» заключается в том, что ее можно использовать только в структуре тестового набора, реализованной через тестовый модуль CAPL, XML или .NET в настройке моделирования в CANoe. Мне нужно реализовать ту же функциональность без использования тестовых модулей.

Может ли кто-нибудь предложить другую функцию CAPL, которая выполняет ту же работу без тестовых модулей, или предложить практические способы достижения этой цели?


person Gamma-ray-burst    schedule 22.03.2019    source источник


Ответы (1)


Тестовые модули могут «ждать» во время моделирования.

Всем остальным узлам или функциям не разрешается ждать, потому что это может заблокировать моделирование. В основном симуляция вызывает CAPL-функцию и ждет, пока функции не вернутся. Никакие события на шине не обрабатываются, пока функция не вернется.

Существует обработчик событий, который вызывается при успешной отправке диагностического запроса. Таким образом, вам придется разбить свой код на отправку запроса, используя

diagSendRequest(req)

и реагируя на успешную отправку, используя

on diagRequestSent <service>
{
  ...
}

Чтобы отреагировать на неудачный запрос, вы можете использовать таймер и соответственно установить глобальную переменную или, возможно, системную переменную.

Должно быть что-то похожее на следующее.

variables
{
  timer requestTimer;
  int sentSuccessfully;
}

void sendRequest()
{
  ....
  sentSuccessfully = 0;
  diagSendRequest(req);
  setTimer(requestTimer, <timeout>);

}

on diagRequestSent ....
{
  sentSuccessfully = 1;
  cancelTimer(requestTimer);
}

on requestTimer 
{
  sentSuccessfully = -1;
}
person M. Spiller    schedule 22.03.2019
comment
Это определенно идея. Но если предположить, что этого события никогда не произойдет, останется ли система в подвешенном состоянии, приостановив все операции до тех пор, пока не будет подтверждено какое-либо подтверждение? Также функция TestWaitForDiagRequestSent возвращает коды ошибок. Можно ли вернуть такие значения? Фактические коды ошибок, доступные в CAPL, довольно обширны, но мне все, что мне нужно, это просто результат, говорящий, был ли запрос отправлен успешно или нет. - person Gamma-ray-burst; 23.03.2019
comment
Обработчик события вызывается, когда происходит событие. Ничего не приостановлено. Когда запрос виден на шине, CANoe проверит, существует ли для этого обработчик событий, и вызовет его. Если вам нужно отреагировать на событие, которое не было отправлено успешно, вам придется дополнительно использовать таймер. Я расширил ответ. - person M. Spiller; 23.03.2019