メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

CAN 通信で相対タイムスタンプと絶対タイムスタンプを使用する

この例では、CAN チャネルの InitialTimestamp プロパティを使用して、CAN メッセージの相対タイムスタンプと絶対タイムスタンプを操作する方法を示します。ループバック構成で接続されている MathWorks® バーチャル CAN チャネルを使用します。この例では、CAN ネットワークのワークフローについて説明していますが、ここで説明する概念は CAN FD ネットワークにも適用されます。

DBCファイルを開く

DBC ファイルを開いてデータベース定義にアクセスします。

db = canDatabase("VehicleInfo.dbc")
db = 
  Database with properties:

             Name: 'VehicleInfo'
             Path: '/tmp/Bdoc25a_2864802_1975451/tpc3a0f92c/vnt-ex13648766/VehicleInfo.dbc'
        UTF8_File: '/tmp/Bdoc25a_2864802_1975451/tpc3a0f92c/vnt-ex13648766/VehicleInfo.dbc'
            Nodes: {}
         NodeInfo: [0×0 struct]
         Messages: {'WheelSpeeds'}
      MessageInfo: [1×1 struct]
       Attributes: {'BusType'}
    AttributeInfo: [1×1 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: [0×0 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: [0×0 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 を指定して新しい 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: [1×1 struct]
          Length: 8

   Protocol Flags
           Error: 0
          Remote: 0

   Other Information
        Database: [1×1 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.041427 sec    1200     false      {'WheelSpeeds'}    {[42 248 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    1.0564 sec      1200     false      {'WheelSpeeds'}    {[46 224 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    3.0667 sec      1200     false      {'WheelSpeeds'}    {[50 200 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    6.0823 sec      1200     false      {'WheelSpeeds'}    {[54 176 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    7.1043 sec      1200     false      {'WheelSpeeds'}    {[58 152 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 

信号データの検査

canSignalTimetable を使用して、受信したメッセージからの信号データを signal timetable に再パッケージ化します。タイムスタンプ値は、CAN チャネルの開始からの経過時間を表すことに注意してください。

signalTimetable = canSignalTimetable(msgRx)
signalTimetable=5×4 timetable
        Time        LR_WSpeed    RR_WSpeed    RF_WSpeed    LF_WSpeed
    ____________    _________    _________    _________    _________

    0.041427 sec      -100         -100         -100          10    
    1.0564 sec        -100         -100         -100          20    
    3.0667 sec        -100         -100         -100          30    
    6.0823 sec        -100         -100         -100          40    
    7.1043 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, xlabel Relative Timestamp, ylabel Signal Value contains a line object which displays its values using only markers.

InitialTimestamp プロパティを検査する

受信 CAN チャネルの InitialTimestamp プロパティを表示します。これは、チャネルが開始されたときの絶対時間を表す datetime 値です。

rxCh.InitialTimestamp
ans = datetime
   01-Feb-2025 14:13:39

絶対タイムスタンプでデータを解析する

各メッセージの相対タイムスタンプと InitialTimestamp プロパティを組み合わせて、各メッセージの絶対タイムスタンプを取得します。絶対タイムスタンプを時間ベクトルとして message timetable に戻します。

msgRx.Time = msgRx.Time + rxCh.InitialTimestamp
msgRx=5×8 timetable
            Time             ID     Extended         Name                   Data             Length      Signals       Error    Remote
    ____________________    ____    ________    _______________    ______________________    ______    ____________    _____    ______

    01-Feb-2025 14:13:39    1200     false      {'WheelSpeeds'}    {[42 248 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    01-Feb-2025 14:13:40    1200     false      {'WheelSpeeds'}    {[46 224 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    01-Feb-2025 14:13:42    1200     false      {'WheelSpeeds'}    {[50 200 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    01-Feb-2025 14:13:45    1200     false      {'WheelSpeeds'}    {[54 176 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 
    01-Feb-2025 14:13:46    1200     false      {'WheelSpeeds'}    {[58 152 0 0 0 0 0 0]}      8       {1×1 struct}    false    false 

更新された message timetable から作成された signal timetable にも絶対タイムスタンプが含まれるようになりました。

signalTimetable = canSignalTimetable(msgRx)
signalTimetable=5×4 timetable
            Time            LR_WSpeed    RR_WSpeed    RF_WSpeed    LF_WSpeed
    ____________________    _________    _________    _________    _________

    01-Feb-2025 14:13:39      -100         -100         -100          10    
    01-Feb-2025 14:13:40      -100         -100         -100          20    
    01-Feb-2025 14:13:42      -100         -100         -100          30    
    01-Feb-2025 14:13:45      -100         -100         -100          40    
    01-Feb-2025 14:13:46      -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, xlabel Absolute Timestamp, ylabel Signal Value contains a line object which displays its values using only markers.

チャネルとDBCファイルを閉じる

ワークスペースから変数をクリアして、チャネルと DBC ファイルへのアクセスを閉じます。

clear rxCh txCh
clear db