Этот пример показывает вам, как использовать фильтры сообщения CAN, чтобы позволить только сообщения, которые содержат заданные идентификаторы, чтобы пройти через канал. Это использует MathWorks виртуальные каналы CAN, соединенные в петлевой настройке. Этот пример описывает рабочий процесс для сети CAN, но концепция, продемонстрированная также, применяется к сети CAN FD.
Создайте один канал для передачи сообщений и другого канала для получения. Фильтры устанавливаются позже канал получения.
txCh = canChannel("MathWorks", "Virtual 1", 1)
txCh = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 1 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: [0x0 datetime] 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: []
rxCh = canChannel("MathWorks", "Virtual 1", 2)
rxCh = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: [0x0 datetime] 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: []
Создайте несколько сообщений, которые будут отправлены в канал получения многократно в примере. Обратите внимание на то, что одно сообщение имеет расширенный идентификатор.
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")
rxMsgs1=5×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ____ ________ __________ ___________________ ______ ____________ _____ ______
0.011154 sec 250 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.011156 sec 500 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.011158 sec 1000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.01116 sec 1500 true {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.011162 sec 2000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
Остановите и получение и передачу каналов.
stop(rxCh); stop(txCh);
Постройте идентификаторы полученных сообщений, чтобы видеть, что все отправленные сообщения получены каналом.
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. Сконфигурируйте канал получения, чтобы только получить сообщения со стандартными идентификаторами 500 и 2000.
filterAllowOnly(rxCh, [500 2000], "Standard");
Отобразите FilterHistory
свойство канала просмотреть сконфигурированное состояние фильтров сообщения.
rxCh.FilterHistory
ans = 'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'
Передайте сообщения снова к каналу получения. Обратите внимание на то, что меньше сообщений получено на этот раз.
start(rxCh); start(txCh); transmit(txCh, txMsgs); pause(0.5); rxMsgs2 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs2=3×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ____ ________ __________ ___________________ ______ ____________ _____ ______
0.011276 sec 500 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.01128 sec 1500 true {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.011288 sec 2000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
Остановите и получение и передачу каналов.
stop(rxCh); stop(txCh);
Добавьте недавно принятые данные к графику видеть, какие сообщения передали фильтры. Сообщение с расширенным идентификатором 1500 не блокируется фильтром, потому что фильтр был только сконфигурирован для стандартных идентификаторов.
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");
Отобразите FilterHistory
свойство канала просмотреть сконфигурированное состояние фильтров сообщения.
rxCh.FilterHistory
ans = 'Standard ID Filter: Allow All | Extended ID Filter: Allow All'
Передайте и получите в третий раз, чтобы видеть, что все сообщения еще раз проходят через фильтры и полученные каналом получения.
start(rxCh); start(txCh); transmit(txCh, txMsgs); pause(0.5); rxMsgs3 = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsgs3=5×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ____ ________ __________ ___________________ ______ ____________ _____ ______
0.015101 sec 250 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.015102 sec 500 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.015104 sec 1000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.015105 sec 1500 true {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
0.015107 sec 2000 false {0x0 char} {[0 0 0 0 0 0 0 0]} 8 {0x0 struct} false false
Остановите и получение и передачу каналов.
stop(rxCh); stop(txCh);
С новыми данными, добавленными к графику, заметьте, что первые и третьи передачи идентичны, когда фильтры сообщения полностью открыты в обоих случаях.
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
команда может также отфильтровать сообщения по наименованию при использовании файла DBC. Позвольте только сообщения с именем EngineMsg
.
db = canDatabase("demoVNT_CANdbFiles.dbc"); rxCh.Database = db; filterAllowOnly(rxCh, "EngineMsg"); rxCh.FilterHistory
ans = 'Standard ID Filter: Allow Only | Extended ID Filter: Allow All'
filterBlockAll
команда позволяет вам легко устанавливать фильтры, чтобы блокировать все сообщения или стандартного или расширенного типа идентификатора. Блокируйте все сообщения с расширенными идентификаторами.
filterBlockAll(rxCh, "Extended");
rxCh.FilterHistory
ans = 'Standard ID Filter: Allow Only | Extended ID Filter: Block All'
Остановите и получение и передачу каналов и очистите их от рабочей области.
stop(rxCh); stop(txCh); clear rxCh txCh
Закройте доступ к файлу DBC путем очищения его переменной из рабочей области.
clear db