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

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

Создайте каналы передачи и приема

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

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

Фильтрация сообщений по имени

The 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: []

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

The 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: []