Отправка циклического сообщения с использованием CANoe - IL DLL

У меня есть настройка конфигурации с двумя узлами CAN и подключенной базой данных. Я добавил CANOEILNLVECTOR.dll для обоих узлов. При добавлении этого файла Dll все мои сообщения отправляются циклически, как я вижу в окне трассировки. Теперь я установил некоторое значение для сигнала в сообщении, например:

variables
{
  message Battery_Traction Batt_msg;
}

on start
{
  Batt_msg.Isolation_Signal = 0x02; //0x02:On
  output(Batt_msg);
}

На трассировке я вижу следующее: сообщение является циклическим, но только для первого экземпляра в трассировке появляется значение, установленное мной выше. Для всех остальных времен значение сигнала в сообщении установлено по умолчанию.

Как видно на изображении, значение 0x02 отправляется только один раз.

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

2 ответа

Когда используешь output вы помещаете сообщение непосредственно на шину CAN, но не изменяете значение внутри своего (смоделированного) узла, поэтому уровень взаимодействия по-прежнему отправляет старое значение.

Вы можете изменить значение сигнала в слое взаимодействия, просто поместив $ перед именем сигнала и установите значение.

В вашем случае скорее всего $Isolation_Signal = 0x02

Вывод сообщения на шину CAN в нужное время, с правильным временем цикла и т. Д. Будет обрабатываться уровнем взаимодействия.

У вас есть два способа динамически влиять на значение вашего сообщения: библиотеки DLL и отправка пользовательских сообщений.

Пользовательская отправка сообщений является основным способом, где

  • вы определяете сообщение напр.: message Battery_Traction Batt_msg;
  • вы запускаете его отправку (функция вывода)
  • вы настроили циклическую отправку on timer Cycletimemsg1 {output(msg1);} и так далее.

IL библиотеки DLL делают все это для вас, без особых усилий по написанию кода с вашей стороны, но они сильно зависят от настроек и атрибутов dbc, которые вы связали в качестве базы данных с вашим каналом CAN.

К сожалению, они не очень хорошо играют вместе, а это значит, что вам нужны передовые ноу-хау CANoe для их использования в одной и той же среде. Вы в основном обошли ваши CANOEILNLVECTOR.dll работающие, отправив явное сообщение.

Поэтому ваш код, если вы получаете доступ к своему сигналу через IL, должен выглядеть следующим образом:

variables
{
 /*no need to define custom message object, they are already "known" to IL by dbc*/
}

on start
{
  $Batt_msg::Isolation_Signal = 0x02; //0x02:On
 /*NO need for output either (IF YOUR MESSAGE IS defined Cyclic in dbc), */
}

Если ваш сигнал не идентифицирован в $Batt_msg::Isolation_Signal просто перетащите сигнал с панели символов браузеров CAPL и добавьте знак $ перед ним.

Через знак доллара ($) вы получаете доступ к атрибуту значения сигнала объектов класса dbsignal.

Другие вопросы по тегам