В этом примере показано, как использовать функции автоматической передачи сообщений CAN Vehicle Network Toolbox™ для отправки сообщений о событии. Он использует каналы MathWorks Virtual CAN, подключенные в строении закольцовывания. Поскольку этот пример основан на отправке и получении сообщений CAN в виртуальной сети, запуск CAN Explorer в сочетании может обеспечить более полное понимание того, что делает код. Чтобы запустить CAN Explorer, откройте и сконфигурируйте его, чтобы использовать тот же интерфейс, что и принимающий канал примера. Убедитесь, что запустили CAN Explorer, прежде чем начинать запускать пример в порядок, чтобы видеть все сообщения по мере их появления.
Создайте каналы CAN, по которым можно использовать команды автоматической передачи сообщений.
txCh = canChannel('MathWorks', 'Virtual 1', 1); rxCh = canChannel('MathWorks', 'Virtual 1', 2);
В этом примере вы будете использовать файл базы данных CAN для определения и декодирования сообщений. Откройте базу данных и присоедините ее к каналам CAN.
db = canDatabase('CANDatabaseEvent.dbc');
txCh.Database = db;
rxCh.Database = db;
Можно создать сообщение CAN для регистрации для передачи события с помощью информации базы данных.
msgEngineMsg = canMessage(db, 'EngineMsg')
msgEngineMsg = 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: [1x1 struct] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [1x1 can.Database] UserData: []
Чтобы сконфигурировать сообщение для передачи события, используйте transmitEvent
команда для определения канала, сообщения для регистрации по каналу и значения режима.
transmitEvent(txCh, msgEngineMsg, 'On');
Запустите каналы и запишите новые значения в свойство данных или непосредственно в сигналы, чтобы запустить автоматическую основанную на событиях передачу сообщения на шину CAN.
start(rxCh); start(txCh); msgEngineMsg.Data = [250 100 0 0 20 0 0 0]; pause(1); msgEngineMsg.Signals.VehicleSpeed = 60; pause(1); stop(txCh); stop(rxCh);
Теперь приемный канал имеет два доступных сообщения, соответствующих двум обновлениям, которые привели к двум передачам.
rxCh
rxCh = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 0 MessagesAvailable: 2 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: 21-Apr-2021 21:30:02 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: [1x1 can.Database] UserData: []
Получите и проверьте каждое сообщение, чтобы убедиться, что для каждого из них заданы значения данных.
msgRx = receive(rxCh, Inf, 'OutputFormat', 'timetable')
msgRx=2×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ___ ________ _____________ ________________________ ______ ____________ _____ ______
0.074554 sec 100 false {'EngineMsg'} {[250 100 0 0 20 0 0 0]} 8 {1x1 struct} false false
1.0981 sec 100 false {'EngineMsg'} {[250 100 0 0 60 0 0 0]} 8 {1x1 struct} false false
signals = canSignalTimetable(msgRx)
signals=2×2 timetable
Time VehicleSpeed EngineRPM
____________ ____________ _________
0.074554 sec 20 2835
1.0981 sec 60 2835
Чтобы увидеть сообщения, сконфигурированные в канале для передачи события, используйте transmitConfiguration
команда.
transmitConfiguration(txCh)
Periodic Messages None Event Messages ID Extended Name Data --- -------- --------- --------------------- 100 false EngineMsg 250 100 0 0 60 0 0 0