В этом примере показано, как использовать фильтры сообщений CAN для передачи по каналу только тех сообщений, которые содержат указанные идентификаторы. Он использует виртуальные каналы CAN MathWorks, подключенные в конфигурации с закольцовыванием.
Один канал передает сообщения другому. Фильтры устанавливаются на приемном канале.
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')

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