Фильтрация сообщения канала 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.007592 sec      250     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0075942 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0075964 sec    1000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0075993 sec    1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0076018 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      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: 27-Jan-2021 15:38:02
           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.0069223 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0069278 sec    1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0069299 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      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: 27-Jan-2021 15:38:03
           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.0059508 sec     250     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0059529 sec     500     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0059548 sec    1000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0059566 sec    1500     true       {0x0 char}    {[0 0 0 0 0 0 0 0]}      8       {0x0 struct}    false    false 
    0.0059585 sec    2000     false      {0x0 char}    {[0 0 0 0 0 0 0 0]}      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: 27-Jan-2021 15:38:04
           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: 27-Jan-2021 15:38:04
           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: []