Этот пример показывает вам, как использовать InitialTimestamp свойство канала CAN работать с относительными и абсолютными метками времени для сообщений CAN. Это использует MathWorks виртуальные каналы CAN, соединенные в петлевой настройке. Этот пример описывает рабочий процесс для сети CAN, но концепция, продемонстрированная также, применяется к сети CAN FD.
Откройте файл DBC, чтобы получить доступ к определениям базы данных.
db = canDatabase("VehicleInfo.dbc")db =
Database with properties:
Name: 'VehicleInfo'
Path: '/tmp/BR2021bd_1751886_255755/mlx_to_docbook2/tpadb915a3/vnt-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)
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: []
Присоедините базу данных непосредственно к каналу получения, чтобы применить определения базы данных входящим сообщениям автоматически.
rxCh.Database = db;
Создайте новое сообщение CAN путем указывания, что база данных и сообщение называют WheelSpeeds применить определение базы данных.
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)
transmit функция отправляет сообщения на сеть. Используйте pause добавить задержки между операциями передачи. Обновите LF_WSpeed значение сигналов перед каждой передачей.
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)
receive функция получает сообщения CAN, которые произошли в сети.
stop(rxCh) stop(txCh) msgRx = receive(rxCh, Inf, "OutputFormat", "timetable")
msgRx=5×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________ ____ ________ _______________ ______________________ ______ ____________ _____ ______
0.015465 sec 1200 false {'WheelSpeeds'} {[42 248 0 0 0 0 0 0]} 8 {1x1 struct} false false
1.0241 sec 1200 false {'WheelSpeeds'} {[46 224 0 0 0 0 0 0]} 8 {1x1 struct} false false
3.0338 sec 1200 false {'WheelSpeeds'} {[50 200 0 0 0 0 0 0]} 8 {1x1 struct} false false
6.0453 sec 1200 false {'WheelSpeeds'} {[54 176 0 0 0 0 0 0]} 8 {1x1 struct} false false
7.0549 sec 1200 false {'WheelSpeeds'} {[58 152 0 0 0 0 0 0]} 8 {1x1 struct} false false
Используйте canSignalTimetable данным сигнала перепакета из полученных сообщений в расписание сигнала. Обратите внимание на то, что установите метку времени, значения представляют время, истекшее от запуска канала CAN.
signalTimetable = canSignalTimetable(msgRx)
signalTimetable=5×4 timetable
Time LR_WSpeed RR_WSpeed RF_WSpeed LF_WSpeed
____________ _________ _________ _________ _________
0.015465 sec -100 -100 -100 10
1.0241 sec -100 -100 -100 20
3.0338 sec -100 -100 -100 30
6.0453 sec -100 -100 -100 40
7.0549 sec -100 -100 -100 50
plot(signalTimetable.Time, signalTimetable.LF_WSpeed, "x") title("Signal Data with Relative Time", "FontWeight", "bold") xlabel("Relative Timestamp") ylabel("Signal Value") ylim([0 60])

InitialTimestamp СвойствоПросмотрите InitialTimestamp свойство канала CAN получения. Это - datetime значение, которое представляет абсолютное время того, когда канал запускается.
rxCh.InitialTimestamp
ans = datetime
25-Aug-2021 18:30:01
Объедините относительную метку времени каждого сообщения и InitialTimestamp свойство получить абсолютную метку времени каждого сообщения. Задержите абсолютные метки времени в расписание сообщения как временной вектор.
msgRx.Time = msgRx.Time + rxCh.InitialTimestamp
msgRx=5×8 timetable
Time ID Extended Name Data Length Signals Error Remote
____________________ ____ ________ _______________ ______________________ ______ ____________ _____ ______
25-Aug-2021 18:30:01 1200 false {'WheelSpeeds'} {[42 248 0 0 0 0 0 0]} 8 {1x1 struct} false false
25-Aug-2021 18:30:02 1200 false {'WheelSpeeds'} {[46 224 0 0 0 0 0 0]} 8 {1x1 struct} false false
25-Aug-2021 18:30:04 1200 false {'WheelSpeeds'} {[50 200 0 0 0 0 0 0]} 8 {1x1 struct} false false
25-Aug-2021 18:30:07 1200 false {'WheelSpeeds'} {[54 176 0 0 0 0 0 0]} 8 {1x1 struct} false false
25-Aug-2021 18:30:08 1200 false {'WheelSpeeds'} {[58 152 0 0 0 0 0 0]} 8 {1x1 struct} false false
Расписание сигнала, созданное из обновленного расписания сообщения теперь также, имеет абсолютные метки времени.
signalTimetable = canSignalTimetable(msgRx)
signalTimetable=5×4 timetable
Time LR_WSpeed RR_WSpeed RF_WSpeed LF_WSpeed
____________________ _________ _________ _________ _________
25-Aug-2021 18:30:01 -100 -100 -100 10
25-Aug-2021 18:30:02 -100 -100 -100 20
25-Aug-2021 18:30:04 -100 -100 -100 30
25-Aug-2021 18:30:07 -100 -100 -100 40
25-Aug-2021 18:30:08 -100 -100 -100 50
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])

Закройте доступ к каналам и файлу DBC путем очищения их переменных из рабочей области.
clear rxCh txCh clear db