メインコンテンツ

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

デプロイされた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

readAxisreadCharacteristic を使用して現在の 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]);

readAxisreadCharacteristic を使用して新しい 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