このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
CAN メッセージの送受信
インストールされているハードウェアの検出
この例では、canChannelList を使用してシステムの CAN デバイスを検出し、canChannel を使用して 2 つの CAN チャネルを作成します。その後、最初のチャネルのプロパティを編集し、canMessage を使用してメッセージを作成し、transmit を使用して最初のチャネルからメッセージを送信し、receive を使用して他のチャネルで受信します。
システム上の CAN ハードウェア デバイスに関する情報を取得します。
info = canChannelList
info = 14×6 table Vendor Device Channel DeviceModel ProtocolMode SerialNumber _____________ _______________________ _______ _____________________ _____________ ____________ "MathWorks" "Virtual 1" 1 "Virtual" "CAN, CAN FD" "0" "MathWorks" "Virtual 1" 2 "Virtual" "CAN, CAN FD" "0" "Vector" "VN1610 1" 1 "VN1610" "CAN, CAN FD" "18959" "Vector" "VN1610 1" 2 "VN1610" "CAN, CAN FD" "18959" "Vector" "Virtual 1" 1 "Virtual" "CAN, CAN FD" "0" "Vector" "Virtual 1" 2 "Virtual" "CAN, CAN FD" "0" "PEAK-System" "PCAN-USB Pro" 1 "PCAN-USB Pro" "CAN, CAN FD" "0" "PEAK-System" "PCAN-USB Pro" 2 "PCAN-USB Pro" "CAN, CAN FD" "0" "Kvaser" "USBcan Professional 1" 1 "USBcan Professional" "CAN" "10680" "Kvaser" "USBcan Professional 1" 1 "USBcan Professional" "CAN" "10680" "Kvaser" "Virtual 1" 1 "Virtual" "CAN, CAN FD" "0" "Kvaser" "Virtual 1" 2 "Virtual" "CAN, CAN FD" "0" "NI" "9862 CAN/HS (CAN1)" 1 "9862" "CAN, CAN FD" "17F5094" "NI" "9862 CAN/HS (CAN2)" 1 "9862" "CAN, CAN FD" "17F50B2"
メモ
この例をハードウェア CAN デバイス用に変更するには、2 つのチャネル間にループバック接続を作成します。
CANチャネルを作成する
2 つの MathWorks® 仮想 CAN チャネルを作成します。
canch1 = canChannel('MathWorks','Virtual 1',1) canch2 = canChannel('MathWorks','Virtual 1',2)
canch1 =
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: []
canch2 =
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: []各チャネルについて、初期の Running 値は 0 (停止) であり、バス速度は 500000 であることに注意してください。
メモ
同じ変数を使用して複数のチャネルを連続して作成することはできません。同じ変数を使用して新しい CAN チャネルを構築する前に、すべてのチャネルをクリアします。
CAN チャネル オブジェクトの配列を作成することはできません。作成する各オブジェクトは、独自のスカラー変数に割り当てる必要があります。
チャネルプロパティを構成する
プロパティ値を構成することで、CAN チャネルの動作を設定できます。この演習では、configBusSpeed 関数を使用してチャネル 1 のバス速度を 250000 に変更します。
ヒント
チャネルを開始する前にプロパティ値を構成します。
両方のチャネルのバス速度を
250000に変更し、チャネルBusSpeedプロパティを表示して設定を確認します。configBusSpeed(canch1,250000) canch1.BusSpeed
ans = 250000更新されたバス速度はチャネル表示でも確認できます。
canch1
canch1 = 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: 250000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [] UserData: []同様の方法で、2 番目のチャネルのバス速度を変更します。
configBusSpeed(canch2,250000)
チャネルを開始する
プロパティを構成したら、両方のチャネルを起動します。次に、最初のチャネルの更新されたステータス情報を表示します。
start(canch1) start(canch2) canch1
canch1 =
Channel with properties:
Device Information
DeviceVendor: 'MathWorks'
Device: 'Virtual 1'
DeviceChannelIndex: 1
DeviceSerialNumber: 0
ProtocolMode: 'CAN'
Status Information
Running: 1
MessagesAvailable: 0
MessagesReceived: 0
MessagesTransmitted: 0
InitializationAccess: 1
InitialTimestamp: 23-May-2019 15:43:40
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: 250000
SJW: []
TSEG1: []
TSEG2: []
NumOfSamples: []
Other Information
Database: []
UserData: []Running プロパティ値が 1 (true) になっていることに注意してください。メッセージを作成する
すべてのプロパティ値を必要に応じて設定し、チャネルが実行されると、CAN バス上でメッセージを送受信する準備が整います。この演習では、canch1 を使用してメッセージを送信し、canch2 を使用して受信します。メッセージを送信するには、メッセージ オブジェクトを作成し、必要なデータとともにメッセージをパックします。
標準タイプ ID が 500、データ長が 8 バイトの CAN メッセージを作成します。
messageout = canMessage(500,false,8)
messageout =
Message with properties:
Message Identification
ProtocolMode: 'CAN'
ID: 500
Extended: 0
Name: ''
Data Details
Timestamp: 0
Data: [0 0 0 0 0 0 0 0]
Signals: []
Length: 8
Protocol Flags
Error: 0
Remote: 0
Other Information
Database: []
UserData: []メッセージのプロパティの一部は次のことを示します。
Error— メッセージはエラーではないため、論理0(false) です。Remote— メッセージはリモート フレームではないため、論理0(false) です。ID— 指定したID。Extended— 拡張 ID を指定しなかったため、論理0(false) になります。Data— データ長によってサイズが指定される、0 の uint8 配列。
入力引数の詳細については、canMessage 関数を参照してください。
メッセージをパックする
メッセージを作成したら、必要なデータをメッセージにパックします。
pack 関数を使用して、次の入力パラメータでメッセージをパックします: Data 値 25、開始ビット 0、信号サイズ 16、およびリトルエンディアン形式のバイト順序。設定を確認するには、メッセージの Data プロパティを表示します。
pack(messageout,25,0,16,'LittleEndian')
messageout.Dataans = 1×8 uint8 row vector 25 0 0 0 0 0 0 0
パックによって変更される唯一のメッセージ プロパティは Data です。入力引数の詳細については、pack 関数を参照してください。
メッセージを送信する
これで、パックされたメッセージを送信できます。transmit 関数を使用し、チャネル canch1 とメッセージを入力引数として指定します。
transmit(canch1,messageout) canch1
canch1 =
Channel with properties:
Device Information
DeviceVendor: 'MathWorks'
Device: 'Virtual 1'
DeviceChannelIndex: 1
DeviceSerialNumber: 0
ProtocolMode: 'CAN'
Status Information
Running: 1
MessagesAvailable: 1
MessagesReceived: 0
MessagesTransmitted: 1
InitializationAccess: 1
InitialTimestamp: 23-May-2019 15:43:40
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: 250000
SJW: []
TSEG1: []
TSEG2: []
NumOfSamples: []
Other Information
Database: []
UserData: []MATLAB® は更新されたチャネルを表示します。ステータス情報セクションでは、メッセージを送信するたびに MessagesTransmitted 値が 1 ずつ増加します。受信されるメッセージはバス上のすべてのデバイスで利用できるため、送信チャネルの場合でも MessagesAvailable プロパティに表示されます。
入力引数の詳細については、transmit 関数を参照してください。
メッセージを受信する
receive 関数を使用して、canch2 で利用可能なメッセージを受信します。
このチャネルで受信可能なメッセージを表示するには、次のように入力します。
canch2
canch2 = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 1 MessagesAvailable: 1 MessagesReceived: 0 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: 23-May-2019 15:43:40 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: 250000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [] UserData: []チャネル ステータス情報は、
MessagesAvailableに対して 1 を示します。canch2で 1 つのメッセージを受信し、それをmessageinに割り当てます。短い一時停止により、メッセージの送信が完了したことが確認されます。messagein = receive(canch2,1)
messagein = Message with properties: Message Identification ProtocolMode: 'CAN' ID: 500 Extended: 0 Name: '' Data Details Timestamp: 0.0312 Data: [25 0 0 0 0 0 0 0] Signals: [] Length: 8 Protocol Flags Error: 0 Remote: 0 Other Information Database: [] UserData: []受信したメッセージの
Dataプロパティに注意してください。これはcanch1から送信されたデータと一致します。入力引数の詳細については、
receive関数を参照してください。チャネルがメッセージを受信したかどうかを確認するには、チャネル表示を表示します。
canch2
canch2 = Channel with properties: Device Information DeviceVendor: 'MathWorks' Device: 'Virtual 1' DeviceChannelIndex: 2 DeviceSerialNumber: 0 ProtocolMode: 'CAN' Status Information Running: 1 MessagesAvailable: 0 MessagesReceived: 1 MessagesTransmitted: 0 InitializationAccess: 1 InitialTimestamp: 23-May-2019 15:43:40 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: 250000 SJW: [] TSEG1: [] TSEG2: [] NumOfSamples: [] Other Information Database: [] UserData: []チャネル ステータス情報は、
MessagesReceivedの場合は 1、MessagesAvailableの場合は 0 を示します。
メッセージをアンパックする
チャネルがメッセージを受信した後、メッセージをアンパックしてメッセージ内のデータを解釈する方法を指定します。メッセージをアンパックするためのパラメータを指定するには、unpack を使用します。これらのパラメータは、パックするために使用されるパラメータと対応している必要があります。
value = unpack(messagein,0,16,'LittleEndian','int16')
value = int16 25
入力引数の詳細については、unpack 関数を参照してください。
CAN チャネルの保存と読み込み
CAN 通信セッション中はいつでも、save 関数を使用して CAN チャネル オブジェクトをファイルに保存できます。
canch1 を MATLAB ファイル mycanch.mat に保存するには、次のように入力します。
save mycanch.mat canch1
CAN チャネルを MATLAB ファイルに保存した場合は、load 関数を使用してチャネルを MATLAB に読み込むことができます。たとえば、先ほど作成した mycanch.mat からチャネルをリロードするには、次のように入力します。
load mycanch.matロードされた CAN チャネル オブジェクトは、指定されたハードウェアに再接続し、チャネルが保存されたときの仕様に合わせて再構成されます。
チャネルを切断してクリーンアップする
設定されたチャネルを切断する
CAN バスとの通信が不要になった場合は、stop 関数を使用して、構成した CAN チャネルを切断します。
最初のチャネルを停止します。
stop(canch1)
チャネルのステータスを確認します。
canch1
. . . Status Information Running: 0 MessagesAvailable: 1 MessagesReceived: 0 MessagesTransmitted: 12番目のチャネルを停止します。
stop(canch2)
チャネルのステータスを確認します。
canch2
. . . Status Information Running: 0 MessagesAvailable: 0 MessagesReceived: 1 MessagesTransmitted: 0
MATLAB ワークスペースをクリーンアップする
これらのオブジェクトと変数が不要になったら、clear コマンドを使用して MATLAB ワークスペースから削除します。
各チャネルをクリアします。
clear canch1 clear canch2
CAN メッセージをクリアします。
clear messageout clear messagein
アンパックされた値をクリアします。
clear value