Используйте относительные и абсолютные метки времени в коммуникации CAN

Этот пример показывает вам, как использовать InitialTimestamp свойство канала CAN работать с относительными и абсолютными метками времени для сообщений CAN. Это использует MathWorks виртуальные каналы CAN, соединенные в петлевой настройке. Этот пример описывает рабочий процесс для сети CAN, но концепция, продемонстрированная также, применяется к сети CAN FD.

Откройте файл DBC

Откройте файл 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

Создайте каналы 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

Создайте новое сообщение 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: []

Запустите каналы CAN

Запустите каналы, чтобы начать использовать их для передачи и приема.

start(rxCh)
start(txCh)

Передайте сообщения CAN

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)

Получите сообщения CAN

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])

Figure contains an axes object. The axes object with title Signal Data with Relative Time contains an object of type line.

Смотрите 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])

Figure contains an axes object. The axes object with title Signal Data with Absolute Time contains an object of type line.

Закройте каналы и файл DBC

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

clear rxCh txCh
clear db