Сообщение использования просачивается коммуникация CAN

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

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

Создайте один канал для передачи сообщений и другого канала для получения. Фильтры устанавливаются позже канал получения.

txCh = canChannel("MathWorks", "Virtual 1", 1)
txCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 1
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0x0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

rxCh = canChannel("MathWorks", "Virtual 1", 2)
rxCh = 
  Channel with properties:

   Device Information
            DeviceVendor: 'MathWorks'
                  Device: 'Virtual 1'
      DeviceChannelIndex: 2
      DeviceSerialNumber: 0
            ProtocolMode: 'CAN'

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 0
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: [0x0 datetime]
           FilterHistory: 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

   Channel Information
               BusStatus: 'N/A'
              SilentMode: 0
         TransceiverName: 'N/A'
        TransceiverState: 'N/A'
       ReceiveErrorCount: 0
      TransmitErrorCount: 0
                BusSpeed: 500000
                     SJW: []
                   TSEG1: []
                   TSEG2: []
            NumOfSamples: []

   Other Information
                Database: []
                UserData: []

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

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

txMsgs(1) = canMessage(250, false, 8);
txMsgs(2) = canMessage(500, false, 8);
txMsgs(3) = canMessage(1000, false, 8);
txMsgs(4) = canMessage(1500, true, 8);
txMsgs(5) = canMessage(2000, false, 8);

Получите сообщения без фильтра

Установите каналы онлайн, передайте сообщения на одном канале и получите на другом. Обратите внимание на то, что все отправленные сообщения получены. По умолчанию недавно созданный канал без сконфигурированного фильтра получает все стандартные и расширенные идентификаторы.

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs1 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs1=5×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.011154 sec     250     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.011156 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.011158 sec    1000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.01116 sec     1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.011162 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 

Остановите и получение и передачу каналов.

stop(rxCh);
stop(txCh);

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

plot(1, rxMsgs1.ID, "x")
h_gca = gca;
h_gca.XTick = 0:1:2;
h_gca.XTickLabel = ["", "Transmit 1", ""];
axis([0 2 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

Figure contains an axes object. The axes object contains 5 objects of type line.

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

Используйте filterAllowOnly команда, чтобы позволить только заданные сообщения типом идентификатора и идентификатора CAN. Сконфигурируйте канал получения, чтобы только получить сообщения со стандартными идентификаторами 500 и 2000.

filterAllowOnly(rxCh, [500 2000], "Standard");

Отобразите FilterHistory свойство канала просмотреть сконфигурированное состояние фильтров сообщения.

rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'

Передайте сообщения снова к каналу получения. Обратите внимание на то, что меньше сообщений получено на этот раз.

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs2 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs2=3×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.011276 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.01128 sec     1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.011288 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 

Остановите и получение и передачу каналов.

stop(rxCh);
stop(txCh);

Добавьте недавно принятые данные к графику видеть, какие сообщения передали фильтры. Сообщение с расширенным идентификатором 1500 не блокируется фильтром, потому что фильтр был только сконфигурирован для стандартных идентификаторов.

plot(1, rxMsgs1.ID, "x", 2, rxMsgs2.ID, "x");
h_gca = gca;
h_gca.XTick = 0:1:3;
h_gca.XTickLabel = ["", "Transmit 1", "Transmit 2", ""];
axis([0 3 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

Figure contains an axes object. The axes object contains 8 objects of type line.

Сбросьте фильтры сообщения

Сбросьте фильтры сообщения к состояниям по умолчанию с filterAllowAll команда так, чтобы все стандартные идентификаторы были позволены.

filterAllowAll(rxCh, "Standard");

Отобразите FilterHistory свойство канала просмотреть сконфигурированное состояние фильтров сообщения.

rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow All | Extended ID Filter: Allow All'

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

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs3 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs3=5×8 timetable
        Time         ID     Extended       Name              Data            Length      Signals       Error    Remote
    ____________    ____    ________    __________    ___________________    ______    ____________    _____    ______

    0.015101 sec     250     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.015102 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.015104 sec    1000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.015105 sec    1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.015107 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 

Остановите и получение и передачу каналов.

stop(rxCh);
stop(txCh);

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

plot(1, rxMsgs1.ID, "x", 2, rxMsgs2.ID, "x", 3, rxMsgs3.ID, "x")
h_gca = gca;
h_gca.XTick = 0:1:4;
h_gca.XTickLabel = ["", "Transmit 1", "Transmit 2", "Transmit 3", ""];
axis([0 4 0 2047])
xlabel("Message Transmits")
ylabel("CAN Identifiers")

Figure contains an axes object. The axes object contains 13 objects of type line.

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

filterAllowOnly команда может также отфильтровать сообщения по наименованию при использовании файла DBC. Позвольте только сообщения с именем EngineMsg.

db = canDatabase("demoVNT_CANdbFiles.dbc");
rxCh.Database = db;
filterAllowOnly(rxCh, "EngineMsg");
rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'

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

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

filterBlockAll(rxCh, "Extended");
rxCh.FilterHistory
ans = 
'Standard ID Filter: Allow Only | Extended ID Filter: Block All'

Остановите каналы

Остановите и получение и передачу каналов и очистите их от рабочей области.

stop(rxCh);
stop(txCh);
clear rxCh txCh

Закройте файл DBC

Закройте доступ к файлу DBC путем очищения его переменной из рабочей области.

clear db