Этот пример показывает вам, как использовать фильтры сообщения 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: []