Фильтрация сообщения канала CAN

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

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

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

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

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

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

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')
stop(rxCh);
stop(txCh);
rxMsgs1 =

  5x8 timetable

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

    0.0094482 sec     250     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0094503 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0094522 sec    1000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.009454 sec     1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.009456 sec     2000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 

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

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')

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

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

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

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

rxCh
rxCh = 

  Channel with properties:

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

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 5
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 30-Jul-2020 06:35:39
           FilterHistory: 'Standard ID Filter: Allow Only | 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: []

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

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs2 = receive(rxCh, Inf, 'OutputFormat', 'timetable')
stop(rxCh);
stop(txCh);
rxMsgs2 =

  3x8 timetable

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

    0.0026864 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0026927 sec    1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0026947 sec    2000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 

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

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')

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

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

filterAllowAll(rxCh, 'Standard');

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

rxCh
rxCh = 

  Channel with properties:

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

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 3
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 30-Jul-2020 06:35:42
           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: []

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

start(rxCh);
start(txCh);
transmit(txCh, txMsgs);
pause(0.5);
rxMsgs3 = receive(rxCh, Inf, 'OutputFormat', 'timetable')
stop(rxCh);
stop(txCh);
rxMsgs3 =

  5x8 timetable

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

    0.0063119 sec     250     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0063139 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0063158 sec    1000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0063176 sec    1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0063193 sec    2000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 

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

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')

Отфильтруйте сообщения по наименованию

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

db = canDatabase('demoVNT_CANdbFiles.dbc');
rxCh.Database = db;
filterAllowOnly(rxCh, 'EngineMsg');
rxCh
rxCh = 

  Channel with properties:

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

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 5
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 30-Jul-2020 06:35:43
           FilterHistory: 'Standard ID Filter: Allow Only | 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: [1x1 can.Database]
                UserData: []

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

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

filterBlockAll(rxCh, 'Extended');
rxCh
rxCh = 

  Channel with properties:

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

   Status Information
                 Running: 0
       MessagesAvailable: 0
        MessagesReceived: 5
     MessagesTransmitted: 0
    InitializationAccess: 1
        InitialTimestamp: 30-Jul-2020 06:35:43
           FilterHistory: 'Standard ID Filter: Allow Only | Extended ID Filter: Block 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: [1x1 can.Database]
                UserData: []