このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
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])
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])
チャネルとDBCファイルを閉じる
ワークスペースから変数をクリアして、チャネルと DBC ファイルへのアクセスを閉じます。
clear rxCh txCh clear db