В этом примере показано, как использовать Vehicle Network Toolbox™ со свойством InitialTimestamp Канала CAN для работы с относительными и абсолютными временными метками для сообщений CAN. Также используются каналы MathWorks Virtual CAN, подключенные в строении закольцовывания.
Откройте файл базы данных для доступа к определениям.
db = canDatabase('VehicleInfo.dbc')
db = Database with properties: Name: 'VehicleInfo' Path: '/tmp/BR2021ad_1584584_202060/publish_examples1/tp7b109833/ex13648766/VehicleInfo.dbc' Nodes: {} NodeInfo: [0x0 struct] Messages: {'WheelSpeeds'} MessageInfo: [1x1 struct] Attributes: {'BusType'} AttributeInfo: [1x1 struct] UserData: []
Создайте каналы CAN, по которым можно отправлять и получать информацию.
txCh = canChannel('MathWorks','Virtual 1',1) rxCh = canChannel('MathWorks','Virtual 1',2) rxCh.Database = db;
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 = 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: []
Можно создавать сообщения CAN для отправки по сети.
msg = canMessage(db,'WheelSpeeds')
msg = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 1200 Extended: 0 Name: 'WheelSpeeds' 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: []
Чтобы начать использовать каналы для операций передачи и приема, поместите их в оперативный режим.
start(rxCh) start(txCh)
The transmit
функция отправляет сообщения в сеть. Использование pause
чтобы задержать передачи. Обновляйте данные сигнала при каждой передаче.
msg.Signals.LF_WSpeed = 10; transmit(txCh,msg) pause(1); msg.Signals.LF_WSpeed = 20; transmit(txCh,msg) pause(2); msg.Signals.LF_WSpeed = 30; transmit(txCh,msg) pause(3); msg.Signals.LF_WSpeed = 40; transmit(txCh,msg) pause(1); msg.Signals.LF_WSpeed = 50; transmit(txCh,msg)
The receive
функция извлекает информацию из канала, представляющего сообщения, которые произошли в сети.
stop(rxCh) stop(txCh) msgRx = receive(rxCh,Inf,'OutputFormat','timetable')
msgRx = 5x8 timetable Time ID Extended Name Data Length Signals Error Remote ____________ ____ ________ _______________ ______________________ ______ ____________ _____ ______ 0.065344 sec 1200 false {'WheelSpeeds'} {[42 248 0 0 0 0 0 0]} 8 {1x1 struct} false false 1.0754 sec 1200 false {'WheelSpeeds'} {[46 224 0 0 0 0 0 0]} 8 {1x1 struct} false false 3.0879 sec 1200 false {'WheelSpeeds'} {[50 200 0 0 0 0 0 0]} 8 {1x1 struct} false false 6.1003 sec 1200 false {'WheelSpeeds'} {[54 176 0 0 0 0 0 0]} 8 {1x1 struct} false false 7.1206 sec 1200 false {'WheelSpeeds'} {[58 152 0 0 0 0 0 0]} 8 {1x1 struct} false false
Просмотрите детали полученных сообщений, включая временные метки и значение сигналов. Обратите внимание, что значения временных меток относятся ко времени начала канала CAN.
signalTimetable = canSignalTimetable(msgRx) plot(signalTimetable.Time,signalTimetable.LF_WSpeed,'x') title('Signal Data with Relative Time','FontWeight','bold') xlabel('Relative Timestamp') ylabel('Signal Value') ylim([0 60])
signalTimetable = 5x4 timetable Time LR_WSpeed RR_WSpeed RF_WSpeed LF_WSpeed ____________ _________ _________ _________ _________ 0.065344 sec -100 -100 -100 10 1.0754 sec -100 -100 -100 20 3.0879 sec -100 -100 -100 30 6.1003 sec -100 -100 -100 40 7.1206 sec -100 -100 -100 50
Просмотрите InitialTimestamp
свойство приемного канала CAN. Это значение datetime, которое задает абсолютное время запуска канала.
rxCh.InitialTimestamp
ans = datetime 27-Jan-2021 15:38:51
Относительные временные метки каждого сообщения и свойство InitialTimestamp объединяются, чтобы применить абсолютные значения времени к каждому сообщению или сигналу, содержащемуся в.
msgRx.Time = msgRx.Time + rxCh.InitialTimestamp signalTimetable = canSignalTimetable(msgRx) figure plot(signalTimetable.Time,signalTimetable.LF_WSpeed,'x') title('Signal Data with Absolute Time','FontWeight','bold') xlabel('Absolute Timestamp') ylabel('Signal Value') ylim([0 60])
msgRx = 5x8 timetable Time ID Extended Name Data Length Signals Error Remote ____________________ ____ ________ _______________ ______________________ ______ ____________ _____ ______ 27-Jan-2021 15:38:51 1200 false {'WheelSpeeds'} {[42 248 0 0 0 0 0 0]} 8 {1x1 struct} false false 27-Jan-2021 15:38:52 1200 false {'WheelSpeeds'} {[46 224 0 0 0 0 0 0]} 8 {1x1 struct} false false 27-Jan-2021 15:38:54 1200 false {'WheelSpeeds'} {[50 200 0 0 0 0 0 0]} 8 {1x1 struct} false false 27-Jan-2021 15:38:57 1200 false {'WheelSpeeds'} {[54 176 0 0 0 0 0 0]} 8 {1x1 struct} false false 27-Jan-2021 15:38:58 1200 false {'WheelSpeeds'} {[58 152 0 0 0 0 0 0]} 8 {1x1 struct} false false signalTimetable = 5x4 timetable Time LR_WSpeed RR_WSpeed RF_WSpeed LF_WSpeed ____________________ _________ _________ _________ _________ 27-Jan-2021 15:38:51 -100 -100 -100 10 27-Jan-2021 15:38:52 -100 -100 -100 20 27-Jan-2021 15:38:54 -100 -100 -100 30 27-Jan-2021 15:38:57 -100 -100 -100 40 27-Jan-2021 15:38:58 -100 -100 -100 50