このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
CAN 通信でDBCファイルを使用する
この例では、DBC ファイルに保存されている情報を使用してメッセージを作成、受信、処理する方法を示します。この例では、CAN ネットワークのワークフローについて説明していますが、ここで説明する概念は CAN FD ネットワークにも適用されます。
DBCファイルを開く
canDatabase を使用してファイル demoVNT_CANdbFiles.dbc を開きます。
db = canDatabase("demoVNT_CANdbFiles.dbc")db =
Database with properties:
Name: 'demoVNT_CANdbFiles'
Path: 'C:\Users\michellw\OneDrive - MathWorks\Documents\MATLAB\Examples\vnt-ex80654288\demoVNT_CANdbFiles.dbc'
Nodes: {}
NodeInfo: [0×0 struct]
Messages: {5×1 cell}
MessageInfo: [5×1 struct]
Attributes: {}
AttributeInfo: [0×0 struct]
UserData: []
このファイルで定義されているすべてのメッセージの名前を確認するには、Messages プロパティを調べてください。
db.Messages
ans = 5×1 cell
{'DoorControlMsg' }
{'EngineMsg' }
{'SunroofControlMsg'}
{'TransmissionMsg' }
{'WindowControlMsg' }
メッセージ情報を表示
messageInfo を使用して、識別子、データ長、信号リストなどのメッセージ EngineMsg の情報を表示します。
messageInfo(db, "EngineMsg")ans = struct with fields:
Name: 'EngineMsg'
ProtocolMode: 'CAN'
Comment: ''
ID: 100
Extended: 0
J1939: []
Length: 8
DLC: 8
BRS: 0
Signals: {2×1 cell}
SignalInfo: [2×1 struct]
TxNodes: {0×1 cell}
Attributes: {}
AttributeInfo: [0×0 struct]
すべてのメッセージに関する情報を一度に照会することもできます。
messageInfo(db)
ans=5×1 struct array with fields:
Name
ProtocolMode
Comment
ID
Extended
J1939
Length
DLC
BRS
Signals
SignalInfo
TxNodes
Attributes
AttributeInfo
信号情報を見る
signalInfo を使用して、メッセージ EngineMsg 内の信号 EngineRPM の情報を表示します。これには、生の信号を物理値に変換するタイプ、バイト順序、サイズ、スケーリング値などが含まれます。
signalInfo(db, "EngineMsg", "EngineRPM")
ans = struct with fields:
Name: 'EngineRPM'
Comment: ''
StartBit: 0
SignalSize: 32
ByteOrder: 'LittleEndian'
Signed: 0
ValueType: 'Integer'
Class: 'uint32'
Factor: 0.1000
Offset: 250
Minimum: 250
Maximum: 9500
Units: 'rpm'
ValueTable: [0×1 struct]
Multiplexor: 0
Multiplexed: 0
MultiplexMode: 0
RxNodes: {0×1 cell}
Attributes: {}
AttributeInfo: [0×0 struct]
メッセージ EngineMsg 内のすべての信号に関する情報を一度に照会することもできます。
signalInfo(db, "EngineMsg")ans=2×1 struct array with fields:
Name
Comment
StartBit
SignalSize
ByteOrder
Signed
ValueType
Class
Factor
Offset
Minimum
Maximum
Units
ValueTable
Multiplexor
Multiplexed
MultiplexMode
RxNodes
Attributes
AttributeInfo
⋮
データベース定義を使用してメッセージを作成する
データベースとメッセージ名 EngineMsg を指定して新しいメッセージを作成し、データベース定義を適用します。このメッセージ内の CAN 信号は、生のデータ バイトに加えてエンジニアリング単位で表されます。
msgEngineInfo = canMessage(db, "EngineMsg")msgEngineInfo =
Message with properties:
Message Identification
ProtocolMode: 'CAN'
ID: 100
Extended: 0
Name: 'EngineMsg'
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: []
信号情報を見る
このメッセージの信号値を確認するには、Signals プロパティを使用します。これらの信号に直接書き込み、直接読み取りを行うことで、メッセージからデータをパックおよびアンパックできます。
msgEngineInfo.Signals
ans = struct with fields:
VehicleSpeed: 0
EngineRPM: 250
信号情報の変更
信号 EngineRPM に直接書き込み、その値を変更します。
msgEngineInfo.Signals.EngineRPM = 5500.25
msgEngineInfo =
Message with properties:
Message Identification
ProtocolMode: 'CAN'
ID: 100
Extended: 0
Name: 'EngineMsg'
Data Details
Timestamp: 0
Data: [23 205 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: []
現在の信号値を読み取り直すと、EngineRPM が書き込まれた値で更新されていることがわかります。
msgEngineInfo.Signals
ans = struct with fields:
VehicleSpeed: 0
EngineRPM: 5.5003e+03
値が信号に直接書き込まれると、データベース定義を使用して値が変換され、スケーリングされ、メッセージ データにパックされます。VehicleSpeed 信号に新しい値が書き込まれた後、Data プロパティの値が変化することに注意してください。
msgEngineInfo.Signals.VehicleSpeed = 70.81
msgEngineInfo =
Message with properties:
Message Identification
ProtocolMode: 'CAN'
ID: 100
Extended: 0
Name: 'EngineMsg'
Data Details
Timestamp: 0
Data: [23 205 0 0 71 0 0 0]
Signals: [1×1 struct]
Length: 8
Protocol Flags
Error: 0
Remote: 0
Other Information
Database: [1×1 can.Database]
UserData: []
msgEngineInfo.Signals
ans = struct with fields:
VehicleSpeed: 71
EngineRPM: 5.5003e+03
データベース情報を含むメッセージを受信する
メッセージを受信する CAN チャネルにデータベースを接続して、受信メッセージにデータベース定義を自動的に適用します。データベースは定義されているメッセージのみを復号化します。その他のメッセージはすべて生の形式で受信されます。
rxCh = canChannel("MathWorks", "Virtual 1", 2); rxCh.Database = db
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: [1×1 can.Database]
UserData: []
メッセージの受信
チャネルを開始し、メッセージ トラフィックを生成し、物理的なメッセージのデコードを使用してメッセージを受信します。
start(rxCh); generateMsgsDb(); rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable");
受信したメッセージの最初の数行を表示します。
head(rxMsg)
ans=8×8 timetable
Time ID Extended Name Data Length Signals Error Remote
___________ ___ ________ _____________________ ________________________ ______ ____________ _____ ______
0.13103 sec 100 false {'EngineMsg' } {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.13103 sec 200 false {'TransmissionMsg' } {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.13104 sec 400 false {'DoorControlMsg' } {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.13104 sec 600 false {'WindowControlMsg' } {[ 0 0 0 0]} 4 {1×1 struct} false false
0.13105 sec 800 false {'SunroofControlMsg'} {[ 0 0]} 2 {1×1 struct} false false
0.15598 sec 100 false {'EngineMsg' } {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.18 sec 100 false {'EngineMsg' } {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.18001 sec 200 false {'TransmissionMsg' } {[ 4 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
受信チャネルを停止し、ワークスペースからクリアします。
stop(rxCh);
clear rxCh受信したメッセージを調べる
受信したメッセージを検査して、適用されたデータベース デコードを確認します。
rxMsg(10, :)
ans=1×8 timetable
Time ID Extended Name Data Length Signals Error Remote
___________ ___ ________ _____________ ________________________ ______ ____________ _____ ______
0.22994 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
rxMsg.Signals{10}ans = struct with fields:
VehicleSpeed: 50
EngineRPM: 3.5696e+03
指定されたメッセージのすべてのインスタンスを抽出する
メッセージ EngineMsg のすべてのインスタンスを抽出します。
allMsgEngine = rxMsg(strcmpi("EngineMsg", rxMsg.Name), :);この特定のメッセージの最初のいくつかのインスタンスを表示します。
head(allMsgEngine)
ans=8×8 timetable
Time ID Extended Name Data Length Signals Error Remote
___________ ___ ________ _____________ ________________________ ______ ____________ _____ ______
0.13103 sec 100 false {'EngineMsg'} {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.15598 sec 100 false {'EngineMsg'} {[ 0 0 0 0 0 0 0 0]} 8 {1×1 struct} false false
0.18 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.20597 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.22994 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.25695 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.27995 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
0.30597 sec 100 false {'EngineMsg'} {[172 129 0 0 50 0 0 0]} 8 {1×1 struct} false false
物理信号値をプロットする
canSignalTimetable を使用して、メッセージ EngineMsg からの信号データを signal timetable に再パッケージ化します。
signalTimetable = canSignalTimetable(rxMsg, "EngineMsg");signal timetable の最初の数行を表示します。
head(signalTimetable)
ans=8×2 timetable
Time VehicleSpeed EngineRPM
___________ ____________ _________
0.13103 sec 0 250
0.15598 sec 0 250
0.18 sec 50 3569.6
0.20597 sec 50 3569.6
0.22994 sec 50 3569.6
0.25695 sec 50 3569.6
0.27995 sec 50 3569.6
0.30597 sec 50 3569.6
信号 VehicleSpeed の値を時間の経過に沿ってプロットします。
plot(signalTimetable.Time, signalTimetable.VehicleSpeed) title("Vehicle Speed from EngineMsg", "FontWeight", "bold") xlabel("Timestamp") ylabel("Vehicle Speed")

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