Фильтрация сообщения канала 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.0064332 sec     250     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0064345 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0064361 sec    1000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.006438 sec     1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0064487 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: 29-Jan-2020 20:59:50
           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.0011395 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0011435 sec    1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0011448 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: 29-Jan-2020 20:59:51
           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.0010984 sec     250     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0010992 sec     500     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0011 sec       1000     false      {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0011006 sec    1500     true       {0x0 char}    {1x8 uint8}      8       {0x0 struct}    false    false 
    0.0011012 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: 29-Jan-2020 20:59:52
           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: 29-Jan-2020 20:59:52
           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: []

Для просмотра документации необходимо авторизоваться на сайте