Этот пример показывает вам, как использовать автоматизированные функции передачи сообщения CAN Vehicle Network Toolbox™, чтобы отправить периодические сообщения. Это использует MathWorks Virtual CAN channels, соединенный в петлевой настройке. Когда этот пример основан на отправке и получении сообщений CAN в виртуальной сети, рабочий Vehicle CAN Bus Monitor в соединении может обеспечить больше полного понимания того, что делает код. Чтобы запустить Vehicle CAN Bus Monitor, откройте и сконфигурируйте его, чтобы использовать тот же интерфейс в качестве канала получения примера. Убедитесь, что запустили Vehicle CAN Bus Monitor прежде, чем начать запускать пример в порядке видеть все сообщения, как они происходят.
Создайте каналы CAN, на которых можно использовать автоматизированные команды передачи сообщения.
txCh = canChannel('MathWorks', 'Virtual 1', 1); rxCh = canChannel('MathWorks', 'Virtual 1', 2);
В этом примере вы будете использовать файл базы данных CAN, чтобы задать и декодировать сообщения. Откройте базу данных и присоедините ее к каналам CAN.
db = canDatabase('demoVNT_CANdbFiles.dbc');
txCh.Database = db;
rxCh.Database = db;
Можно создать сообщения CAN, чтобы указать для периодической передачи с помощью информации о базе данных.
msgFast = canMessage(db, 'EngineMsg') msgSlow = canMessage(db, 'TransmissionMsg')
msgFast = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 100 Extended: 0 Name: 'EngineMsg' Data Details Timestamp: 0 Data: [0 0 0 0 0 0 0 0] Signals: [1×1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1×1 can.Database] UserData: [] msgSlow = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 200 Extended: 0 Name: 'TransmissionMsg' Data Details Timestamp: 0 Data: [0 0 0 0 0 0 0 0] Signals: [1×1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1×1 can.Database] UserData: []
Чтобы сконфигурировать сообщение для периодической передачи, используйте команду transmitPeriodic
, чтобы задать канал, сообщение, чтобы указать на канале, значении режима и периодическом уровне.
transmitPeriodic(txCh, msgFast, 'On', 0.100); transmitPeriodic(txCh, msgSlow, 'On', 0.500);
Когда вы запускаете канал, которому указали периодические сообщения, передача сразу начинается. Позвольте каналы, запущенные в течение короткого времени.
start(rxCh); start(txCh); pause(2);
Чтобы обновить живое сообщение или данные сигнала, отправленные на шину CAN, запишите новые значения в сообщение, вы первоначально создали использование или Свойство данных или интерфейс сигналов.
msgFast.Signals.VehicleSpeed = 60; pause(1); msgFast.Signals.VehicleSpeed = 65; pause(1); msgFast.Signals.VehicleSpeed = 70; pause(1);
Остановите каналы CAN и получите все периодически передаваемые сообщения для анализа.
stop(txCh); stop(rxCh); msgRx = receive(rxCh, Inf, 'OutputFormat', 'timetable'); msgRx(1:15, :)
ans = 15×8 timetable Time ID Extended Name Data Length Signals Error Remote _____________ ___ ________ _________________ ___________ ______ ____________ _____ ______ 0.0074728 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.0074752 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 0.092596 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.1926 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.29253 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.39159 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.49253 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.49253 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 0.59084 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.69067 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.7907 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.89171 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.99207 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.99207 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 1.0914 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false
Можно анализировать распределение сообщений путем графического вывода идентификаторов каждого сообщения против их меток времени. Заметьте различие между тем, как часто два сообщения появляются согласно своим периодическим уровням.
plot(msgRx.Time, msgRx.ID, 'x') ylim([0 400]) title('Message Distribution', 'FontWeight', 'bold') xlabel('Timestamp') ylabel('CAN Identifier')
Для последующего анализа разделите два сообщения на отдельные расписания.
msgRxFast = msgRx(strcmpi('EngineMsg', msgRx.Name), :); msgRxFast(1:10, :) msgRxSlow = msgRx(strcmpi('TransmissionMsg', msgRx.Name), :); msgRxSlow(1:10, :)
ans = 10×8 timetable Time ID Extended Name Data Length Signals Error Remote _____________ ___ ________ ___________ ___________ ______ ____________ _____ ______ 0.0074728 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.092596 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.1926 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.29253 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.39159 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.49253 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.59084 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.69067 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.7907 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false 0.89171 sec 100 false 'EngineMsg' [1×8 uint8] 8 [1×1 struct] false false ans = 10×8 timetable Time ID Extended Name Data Length Signals Error Remote _____________ ___ ________ _________________ ___________ ______ ____________ _____ ______ 0.0074752 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 0.49253 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 0.99207 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 1.4918 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 1.9909 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 2.4909 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 2.9934 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 3.4918 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 3.9914 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false 4.4918 sec 200 false 'TransmissionMsg' [1×8 uint8] 8 [1×1 struct] false false
Анализируйте метки времени каждого набора сообщений, чтобы видеть, как тесно среднее значение различий соответствует сконфигурированным периодическим уровням.
avgPeriodFast = mean(diff(msgRxFast.Time)) avgPeriodSlow = mean(diff(msgRxSlow.Time))
avgPeriodFast = duration 0.099686 sec avgPeriodSlow = duration 0.49843 sec
График полученных данных сигнала отражает обновления в данных о сообщении, отправленных на шине CAN.
signalTimetable = canSignalTimetable(msgRx, 'EngineMsg'); signalTimetable(1:10, :) plot(signalTimetable.Time, signalTimetable.VehicleSpeed) title('Vehicle Speed from EngineMsg', 'FontWeight', 'bold') xlabel('Timestamp') ylabel('Vehicle Speed') ylim([-5 75])
ans = 10×2 timetable Time VehicleSpeed EngineRPM _____________ ____________ _________ 0.0074728 sec 0 250 0.092596 sec 0 250 0.1926 sec 0 250 0.29253 sec 0 250 0.39159 sec 0 250 0.49253 sec 0 250 0.59084 sec 0 250 0.69067 sec 0 250 0.7907 sec 0 250 0.89171 sec 0 250
Чтобы видеть сообщения, сконфигурированные на канале для периодической передачи, используйте команду transmitConfiguration
.
transmitConfiguration(txCh)
Periodic Messages ID Extended Name Data Rate (seconds) --- -------- --------------- ----------------- -------------- 100 false EngineMsg 0 0 0 0 70 0 0 0 0.100000 200 false TransmissionMsg 0 0 0 0 0 0 0 0 0.500000 Event Messages None