Отправка циклического сообщения с использованием 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.