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