Периодическая передача сообщения CAN

Этот пример показывает вам, как использовать автоматизированные функции передачи сообщения CAN Vehicle Network Toolbox™, чтобы отправить периодические сообщения. Это использует MathWorks Virtual CAN channels, соединенный в петлевой настройке. Когда этот пример основан на отправке и получении сообщений CAN в виртуальной сети, рабочий Vehicle CAN Bus Monitor в соединении может обеспечить больше полного понимания того, что делает код. Чтобы запустить Vehicle CAN Bus Monitor, откройте и сконфигурируйте его, чтобы использовать тот же интерфейс в качестве канала получения примера. Убедитесь, что запустили Vehicle CAN Bus Monitor прежде, чем начать запускать пример для того, чтобы видеть все сообщения, как они происходят.

Создайте каналы CAN

Создайте каналы CAN, на которых можно использовать автоматизированные команды передачи сообщения.

txCh = canChannel('MathWorks', 'Virtual 1', 1);
rxCh = canChannel('MathWorks', 'Virtual 1', 2);

В этом примере вы будете использовать файл базы данных CAN, чтобы задать и декодировать сообщения. Откройте базу данных и присоедините ее к каналам CAN.

db = canDatabase('demoVNT_CANdbFiles.dbc');
txCh.Database = db;
rxCh.Database = db;

Создайте сообщения CAN

Можно создать сообщения CAN, чтобы указать для периодической передачи с помощью информации о базе данных.

msgFast = canMessage(db, 'EngineMsg')
msgSlow = canMessage(db, 'TransmissionMsg')
msgFast = 

  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 100
        Extended: 0
            Name: 'EngineMsg'

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0]
         Signals: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 can.Database]
        UserData: []


msgSlow = 

  Message with properties:

   Message Identification
    ProtocolMode: 'CAN'
              ID: 200
        Extended: 0
            Name: 'TransmissionMsg'

   Data Details
       Timestamp: 0
            Data: [0 0 0 0 0 0 0 0]
         Signals: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 can.Database]
        UserData: []

Сконфигурируйте сообщения для периодической передачи

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

transmitPeriodic(txCh, msgFast, 'On', 0.100);
transmitPeriodic(txCh, msgSlow, 'On', 0.500);

Запустите периодическую передачу сообщения

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

start(rxCh);
start(txCh);
pause(2);

Измените Transmitted Data

Чтобы обновить живое сообщение или данные сигнала, отправленные на шину CAN, запишите новые значения в сообщение, вы первоначально создали использование или Свойство данных или интерфейс сигналов.

msgFast.Signals.VehicleSpeed = 60;
pause(1);
msgFast.Signals.VehicleSpeed = 65;
pause(1);
msgFast.Signals.VehicleSpeed = 70;
pause(1);

Получите сообщения

Остановите каналы CAN и получите все периодически передаваемые сообщения для анализа.

stop(txCh);
stop(rxCh);
msgRx = receive(rxCh, Inf, 'OutputFormat', 'timetable');
msgRx(1:15, :)
ans =

  15×8 timetable

        Time         ID     Extended          Name              Data        Length      Signals       Error    Remote
    _____________    ___    ________    _________________    ___________    ______    ____________    _____    ______

    0.0074728 sec    100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.0074752 sec    200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.092596 sec     100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.1926 sec       100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.29253 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.39159 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.49253 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.49253 sec      200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.59084 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.69067 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.7907 sec       100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.89171 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.99207 sec      100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 
    0.99207 sec      200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    1.0914 sec       100     false      'EngineMsg'          [1×8 uint8]      8       [1×1 struct]    false    false 

Анализируйте периодическое поведение передачи

Можно анализировать распределение сообщений путем графического вывода идентификаторов каждого сообщения против их меток времени. Заметьте различие между тем, как часто два сообщения появляются согласно своим периодическим уровням.

plot(msgRx.Time, msgRx.ID, 'x')
ylim([0 400])
title('Message Distribution', 'FontWeight', 'bold')
xlabel('Timestamp')
ylabel('CAN Identifier')

Для последующего анализа разделите два сообщения на отдельные расписания.

msgRxFast = msgRx(strcmpi('EngineMsg', msgRx.Name), :);
msgRxFast(1:10, :)
msgRxSlow = msgRx(strcmpi('TransmissionMsg', msgRx.Name), :);
msgRxSlow(1:10, :)
ans =

  10×8 timetable

        Time         ID     Extended       Name           Data        Length      Signals       Error    Remote
    _____________    ___    ________    ___________    ___________    ______    ____________    _____    ______

    0.0074728 sec    100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.092596 sec     100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.1926 sec       100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.29253 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.39159 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.49253 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.59084 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.69067 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.7907 sec       100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.89171 sec      100     false      'EngineMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 


ans =

  10×8 timetable

        Time         ID     Extended          Name              Data        Length      Signals       Error    Remote
    _____________    ___    ________    _________________    ___________    ______    ____________    _____    ______

    0.0074752 sec    200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.49253 sec      200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    0.99207 sec      200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    1.4918 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    1.9909 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    2.4909 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    2.9934 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    3.4918 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    3.9914 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 
    4.4918 sec       200     false      'TransmissionMsg'    [1×8 uint8]      8       [1×1 struct]    false    false 

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

avgPeriodFast = mean(diff(msgRxFast.Time))
avgPeriodSlow = mean(diff(msgRxSlow.Time))
avgPeriodFast = 

  duration

   0.099686 sec


avgPeriodSlow = 

  duration

   0.49843 sec

График полученных данных сигнала отражает обновления в данных о сообщении, отправленных на шине CAN.

signalTimetable = canSignalTimetable(msgRx, 'EngineMsg');
signalTimetable(1:10, :)
plot(signalTimetable.Time, signalTimetable.VehicleSpeed)
title('Vehicle Speed from EngineMsg', 'FontWeight', 'bold')
xlabel('Timestamp')
ylabel('Vehicle Speed')
ylim([-5 75])
ans =

  10×2 timetable

        Time         VehicleSpeed    EngineRPM
    _____________    ____________    _________

    0.0074728 sec         0             250   
    0.092596 sec          0             250   
    0.1926 sec            0             250   
    0.29253 sec           0             250   
    0.39159 sec           0             250   
    0.49253 sec           0             250   
    0.59084 sec           0             250   
    0.69067 sec           0             250   
    0.7907 sec            0             250   
    0.89171 sec           0             250   

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

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

transmitConfiguration(txCh)
Periodic Messages

ID  Extended      Name             Data        Rate (seconds)
--- -------- --------------- ----------------- --------------
100 false    EngineMsg       0 0 0 0 70 0 0 0  0.100000
200 false    TransmissionMsg 0 0 0 0 0 0 0 0   0.500000


Event Messages

None