このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
デプロイされたSimulinkモデルでXCP操作を実行する
この例では、XCP プロトコル機能を使用して、Windows® 実行可能ファイルに展開された Simulink ® モデルから基本的な XCP 操作を実行する方法を示します。この例では、直接メモリ アクセスを使用してモデルの特性パラメータを変更したり、直接メモリ アクセスと動的 DAQ リストを使用してモデルの測定パラメータを読み取ったりするなど、TCP プロトコルで XCP 操作を実行します。
XCP は、モデル、アルゴリズム、または ECU の内部パラメータと変数にアクセスして変更するために使用される高レベル プロトコルです。詳細については、ASAM 標準を参照してください。
アルゴリズムの概要
この例で使用されるアルゴリズムは、XCP サーバーとして構築および展開された Simulink モデルです。モデルはすでにコンパイルされており、ファイル XCPServerSineWaveGenerator.exe
で実行できます。さらに、そのビルド プロセスの出力として A2L ファイル XCPServerSineWaveGenerator.a2l
が提供されます。モデルには、XCP 経由でアクセス可能な 3 つの測定値と 2 つの特性が含まれています。モデルはすでにデプロイされているため、この例を実行するために Simulink は必要ありません。次の図はモデルを示しています。
XCP サーバー モデルを実行する
XCP サーバーと通信するには、デプロイされたモデルを実行する必要があります。system
関数を使用すると、MATLAB ® 内から XCPServerSineWaveGenerator.exe
を実行できます。この関数では、実行可能ファイルを指す引数リストを構築する必要があります。別のコマンド ウィンドウが開き、サーバーからの実行中の出力が表示されます。入力 pwd
は現在の作業ディレクトリを取得します。
sysCommand = ['"', fullfile(pwd, 'XCPServerSineWaveGenerator.exe'),'"', ' &']; system(sysCommand);
A2Lファイルを開く
xcpA2L
関数を使用して、サーバー モデルを記述する A2L ファイルを開きます。
a2lInfo = xcpA2L("XCPServerSineWaveGenerator.a2l");
TCP は、XCP サーバーとの通信に使用されるトランスポート プロトコルです。IP アドレスやポート番号などの TCP 接続の詳細は、TransportLayerTCPInfo
プロパティに含まれています。
a2lInfo.TransportLayerTCPInfo
ans = XCPonIP with properties: CommonParameters: [1×1 xcp.a2l.CommonParameters] TransportLayerInstance: '' Port: 17725 Address: 2.1307e+09 AddressString: '127.0.0.1'
XCPチャネルを作成する
サーバーへのアクティブな XCP 接続を作成するには、xcpChannel
関数を使用します。この関数には、サーバー A2L ファイルへの参照と、サーバーとのメッセージングに使用するトランスポート プロトコルの種類 (この例では TCP のみ) が必要です。
xcpCh = xcpChannel(a2lInfo, "TCP")
xcpCh = Channel with properties: ServerName: 'ModuleName' A2LFileName: 'XCPServerSineWaveGenerator.a2l' TransportLayer: 'TCP' TransportLayerDevice: [1×1 struct] SeedKeyDLL: []
サーバーに接続する
サーバーとの通信をアクティブにするには、connect
関数を使用します。
connect(xcpCh)
直接取得によるXCP測定の読み取り
このセクションでは、モデル サーバーに直接メモリ アクセスするための関数 readMeasurement
を使用して、モデルの測定パラメータを読み取る方法を示します。
測定データを直接取得
readMeasurement
関数は、サーバーから指定された測定値の現在の値を取得します。
readMeasurement(xcpCh, "Sine")
ans = 0
readMeasurement(xcpCh, "SineAfterGain")
ans = -1.9021
readMeasurement(xcpCh, "SineAfterTable")
ans = -0.9511
ダイナミックDAQリストでXCP測定を読み取る
データを取得するための直接メモリ アクセスとは別に、測定データを読み取るもう 1 つの方法は、動的 DAQ リストを使用することです。このセクションでは、動的 DAQ リストを使用してモデルの測定パラメータを読み取る方法を説明します。
測定リストの作成と表示
createMeasurementList
関数を使用して、動的 DAQ リストを作成します。
createMeasurementList(xcpCh, "DAQ", "100 ms", ["Sine", "SineAfterGain", "SineAfterTable"])
XCPサーバーからデータを取得する
startMeasurement
関数を使用して構成された動的 DAQ リストを開始します。数秒間実行した後、stopMeasurement
関数を使用して測定を停止します。
startMeasurement(xcpCh) pause(3); stopMeasurement(xcpCh)
正弦測定データを取得する
Sine
測定の XCP チャネルから取得したデータを取得するには、readDAQ
関数を使用します。
dataSine = readDAQ(xcpCh, "Sine"); plot(dataSine, "o-") title("Sine Measurement Data") xlabel("Data Point") ylabel("Data Value")
SineAfterGain測定データを取得する
SineAfterGain
測定の XCP チャネルから取得したデータを取得するには、readDAQ
関数を使用します。
dataSineAfterGain = readDAQ(xcpCh, "SineAfterGain"); plot(dataSineAfterGain, "o-") title("SineAfterGain Measurement Data") xlabel("Data Point") ylabel("Data Value")
SineAfterTable測定データを取得する
SineAfterTable
測定の XCP チャネルから取得したデータを取得するには、readDAQ
関数を使用します。
dataSineAfterTable = readDAQ(xcpCh, "SineAfterTable"); plot(dataSineAfterTable, "o-") title("SineAfterTable Measurement Data") xlabel("Data Point") ylabel("Data Value")
測定リストを解放する
freeMeasurementLists 関数を使用して測定リストを解放します。
freeMeasurementLists(xcpCh);
XCP特性のキャリブレーション
このセクションでは、直接メモリ アクセスを使用してモデルの測定パラメータをキャリブレーションする方法を説明します。このセクションでは 2 つのパラメータが使用されていることに注意してください。Gain
は乗数であり、ydata
は 1 次元ルックアップ テーブルの出力データ ポイントを指定します。
プリロードされた特性値の検査
readCharacteristic
関数を使用して特性 Gain
の現在の値を読み取ります。
initialGain = readCharacteristic(xcpCh, "Gain")
initialGain = 2
readAxis
と readCharacteristic
を使用して現在の 1 次元ルックアップ テーブルの特性を読み取り、マッピングをプロットします。このテーブルは、あらゆる正の入力値をゼロ出力に効果的にマッピングします。
inputBreakpoints = readAxis(xcpCh, "xdata")
inputBreakpoints = 1×7
-1.0000 -0.5000 -0.2000 0 0.2000 0.5000 1.0000
outputPoints = readCharacteristic(xcpCh, "ydata")
outputPoints = 1×7
-1.0000 -0.5000 -0.2000 0 0 0 0
plot(inputBreakpoints, outputPoints); title("Initial 1-D Look-up Table Map"); xlabel("Input Value"); ylabel("Output Value");
測定リストを作成する
この例では、測定値 Sine
の値(変更されていない値と 2 つの特性によって変更された値)を調べます。キャリブレーション前後の Sine
の連続的に変化する値を可視化するには、DAQ リストを使用して測定データ値を取得します。createMeasurementList
関数を使用して、サーバーから利用可能なすべての Sine
ベースの測定値を含む DAQ リストを作成します。
createMeasurementList(xcpCh, "DAQ", "100 ms", ["Sine", "SineAfterGain", "SineAfterTable"])
キャリブレーション前に測定値を取得する
startMeasurement
関数と stopMeasurement
関数を使用して、DAQ リストを短時間実行します。
startMeasurement(xcpCh); pause(3); stopMeasurement(xcpCh);
すべての正弦ベースの測定について DAQ リストによって取得されたデータを取得するには、readDAQ
関数を使用します。100 ミリ秒のイベントで 3 秒間に取得されるサンプルの数は 30 個になると予想されますが、XCP サーバーはリアルタイム オペレーティング システムではない Windows 上で実行されるため、オペレーティング システムの使用状況によっては、実際に取得されるサンプルの数が 30 個未満になる可能性があります。
sine = readDAQ(xcpCh, "Sine"); sineAfterGain = readDAQ(xcpCh, "SineAfterGain"); sineAfterTable = readDAQ(xcpCh, "SineAfterTable");
キャリブレーション前に測定値を検査する
SineAfterGain
の測定値をベースの Sine
の測定値に対してプロットします。Gain
の後の値は、元の測定値に基づいて 2 倍に増幅されます。これは、前述のとおり、特性 Gain
のプリロード値が 2 であるためです。
plot(sine, "o-"); hold on; plot(sineAfterGain, "*-"); hold off; title("Before Calibration: Sine Signal vs Sine Signal after Gain"); legend("Original", "After Gain"); xlabel("Data Point"); ylabel("Data Value");
SineAfterTable
の測定値をベースの Sine
の測定値に対してプロットします。元の測定値の正の値はすべて、事前にロードされた 1 次元ルックアップ テーブルに従ってゼロにマッピングされるため、変更された信号は切り捨てられたように見え、正の値は含まれません。
plot(sine, "o-"); hold on; plot(sineAfterTable, "*-"); hold off; title("Before Calibration: Sine Signal vs Sine Signal after Table"); legend("Original", "After Table"); xlabel("Data Point"); ylabel("Data Value");
ゲインと1次元ルックアップテーブルのキャリブレーション
writeCharacteristic
を使用して特性 Gain
に新しい値を書き込み、readCharacteristic
を使用して読み取りを実行し、変更を確認します。
writeCharacteristic(xcpCh, "Gain", 0.5); newGain = readCharacteristic(xcpCh, "Gain")
newGain = 0.5000
writeCharacteristic
を使用して、1 次元ルックアップ テーブルの出力に新しいデータ ポイントを書き込みます。
writeCharacteristic(xcpCh, "ydata", [0 0 0 0 0.2 0.5 1]);
readAxis
と readCharacteristic
を使用して新しい 1 次元ルックアップ テーブル データを読み取り、マッピングをプロットします。これで、テーブルは負の入力値をゼロ出力に効果的にマッピングします。
inputBreakpoints = readAxis(xcpCh, "xdata")
inputBreakpoints = 1×7
-1.0000 -0.5000 -0.2000 0 0.2000 0.5000 1.0000
newOutputPoints = readCharacteristic(xcpCh, "ydata")
newOutputPoints = 1×7
0 0 0 0 0.2000 0.5000 1.0000
plot(inputBreakpoints, newOutputPoints); title("New 1-D Look-up Table Map"); xlabel("Input Value"); ylabel("Output Value");
キャリブレーション後の測定値を取得する
startMeasurement
関数と stopMeasurement
関数を使用して、DAQ リストを短時間実行します。
startMeasurement(xcpCh); pause(3); stopMeasurement(xcpCh);
すべての正弦ベースの測定について DAQ リストによって取得されたデータを取得するには、readDAQ
関数を使用します。
sine = readDAQ(xcpCh, "Sine"); sineAfterGain = readDAQ(xcpCh, "SineAfterGain"); sineAfterTable = readDAQ(xcpCh, "SineAfterTable");
キャリブレーション後の測定値の検査
SineAfterGain
の測定値をベースの Sine
の測定値に対してプロットします。特性 Gain
の値はキャリブレーション後に 0.5 に設定されるため、元の測定値に基づいて Gain
の後の値は 2 倍減少します。
plot(sine, "o-"); hold on; plot(sineAfterGain, "*-"); hold off; title("After Calibration: Sine Signal vs Sine Signal after Gain"); legend("Original", "After Gain"); xlabel("Data Point"); ylabel("Data Value");
SineAfterTable
の測定値をベースの Sine
の測定値に対してプロットします。元の測定値の負の値はすべて、新しい 1-D ルックアップ テーブルに従ってゼロにマッピングされるため、変更された信号は切り捨て方が異なり、負の値は含まれません。
plot(sine, "o-"); hold on; plot(sineAfterTable, "*-"); hold off; title("After Calibration: Sine Signal vs Sine Signal after Table"); legend("Original", "After Table"); xlabel("Data Point"); ylabel("Data Value");
サーバーから切断する
サーバーとの通信を非アクティブにするには、disconnect
関数を使用します。
disconnect(xcpCh)
クリーン アップ
clear a2lInfo