Фильтрация сообщения канала 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.0055559 sec     250     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0055575 sec     500     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0055587 sec    1000     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0055596 sec    1500     true        ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0055607 sec    2000     false       ''     [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: 11-Jan-2019 00:18:40
           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.0011582 sec     500     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0011614 sec    1500     true        ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0011628 sec    2000     false       ''     [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: 11-Jan-2019 00:18:41
           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.001136 sec      250     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0011367 sec     500     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0011375 sec    1000     false       ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.0011384 sec    1500     true        ''     [1x8 uint8]      8       [0x0 struct]    false    false 
    0.001139 sec     2000     false       ''     [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: 11-Jan-2019 00:18:42
           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: 11-Jan-2019 00:18:42
           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: []