このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
カスタム入力マッピングによる入力データの外部入力への付加
この例では、ルート Inport マッパー ツール用のカスタム マッピング関数を作成する方法について示します。ルート Inport マッパー ツールは、以下のいずれかの基準に基づいて、MAT ファイルのデータを特定の入力端子に関連付けます。
端子の順序 - ファイルに出現する順序で、対応する端子番号にマッピングします。
ブロック名 - 変数名を使用して、ブロック名が一致するルート Inport にマッピングします。
信号名 - 変数名を使用して、信号名が一致するルート Inport にマッピングします。
ブロック パス - BlockPath パラメーターを使用して、ブロック パスが一致するルート Inport にマッピングします。
カスタム - MATLAB® 関数を使用してマッピングします。
マッピングするデータが他のどのマッピング基準にもあてはまらない場合は、カスタム マッピング基準を使用してください。
カスタム マッピングのシナリオ
入力データとモデルの入力端子の組み合わせが、端子順序、ブロック名、信号名、ブロック パスのどのマッピング基準にも当てはまらない場合、以下のいずれかの方法でマッピングすることができます。
MAT ファイル内の入力データ名を変更する
モデルの入力端子名を変更する
カスタム マッピング モードを使用する
この例では、カスタム マッピング関数を記述する方法を示します。
以下で説明するワークフローには、次の項目が含まれています。
カスタム マッピング関数を含む MATLAB ファイルを作成する
カスタム マッピング関数名、入力および出力を宣言する
戻り値の割り当ての出力を初期化する
マッピング アルゴリズムを定義および実装する
マッピング アルゴリズムを検証する
新しい MATLAB 関数ファイルの作成
MATLAB 関数ファイルを作成します。このファイルには、カスタム マッピング関数が含まれます。
カスタム マッピング関数の宣言
カスタム マッピング関数名を宣言し、入力と出力を指定します。この例のカスタム マッピング関数は、slexCustomMappingMyCustomMap です。関数の入力と出力は次のように宣言します。
入力
modelName - モデル名を含む文字列。
signalNames - マッピングする信号の変数名を含む文字列の cell 配列。
signals - 信号データの cell 配列。signalNames{1} が signals{1} に格納された信号の変数名となるような signalNames という配列と連携します。
出力
inputMap - 関数 getRootInportMap で得られるオブジェクトの配列またはスカラー。
出力の初期化
出力変数 inputMap の値を初期化します。そのためには、サンプル関数 slexCustomMappingMyCustomMap または次のコード スニペットに示すように、空のプロパティを指定して getRootInportMap
コマンドを使用します。これにより、出力変数が初期化されて空になるため、値を出力に割り当てることができます。
inputMap = getRootInportMap('empty');
カスタム マッピング アルゴリズムの定義
カスタム マッピング アルゴリズムを定義する場合に検討する必要がある項目を以下に示します。
信号をルートレベル Inport にマッピングするための基準。たとえば、BlockName マッピングは、入力信号名がルートレベル Inport ブロック名と一致します。
マッピングを作成するために必要な情報。
マッピング基準により、信号とルートレベル Inport で一致するものがないと判定された場合の処理。
この例では、これらの項目に次のように対処します。
マッピング基準にルートレベルの端子番号と信号名を使用する。
ユーティリティ関数 slexCustomMappingGetPortNames を使用してルートレベル Inport ブロック名を取得し、variable|signalName| と共に、マッピングを作成する関数
getRootInportMap
に入力として提供する。
端子番号と信号名が一致しないケースを処理する論理条件を含める。
マッピング アルゴリズムの実装
次にマッピング アルゴリズムを実装します。
slexCustomMappingMyCustomMap 実装では、ルートレベル Inport 端子番号は、マッピングの条件です。このアルゴリズムは、ルートレベル Inport ブロックからこの端子番号を取得します。次に、関数に渡される信号名に付加された数値を取得し、端子番号と数値を比較します。
メモ: マッピング アルゴリズムの実装に加え、マッピングができない状況を処理する論理ステートメントを含めることも必要です。このサンプル関数は、マッピングが実行可能かどうかを判断する関数 isempty
と共に if
ステートメントを使用することで、これを実現します。
マッピングの作成
最後の手順では、関数 getRootInportMap
を使って、カスタム マップを作成します。関数 getRootInportMap
は、プロパティと値のペアを使って、カスタム マップを作成します。関係するプロパティは次のとおりです。
model - モデル名を表す文字列。
signalName - マッピングする信号の変数名の値を含む文字列または文字列のセル。
blockName - マッピングされる端子のブロック名の値を含む文字列または文字列のセル。
以下のコードは、この関数の例です。これと同じコードが、サンプル関数 slexCustomMappingMyCustomMap にも表れます。
inputMap = getRootInportMap(... 'model',modelName,... 'signalName',signalNames,... 'blockName',portNames);
カスタム マッピング関数の検証
コマンド ラインでカスタム マッピング関数を検証するには以下のようにします。
関数のテスト対象となるモデルを開きます。
モデルをサポートするための入力信号を作成します。
正しい入力パラメーターを指定して、カスタム マッピング関数を呼び出します。
sim
コマンドに送信する必要がある入力文字列 (またはモデル コンフィギュレーション パラメーターで外部入力文字列のエディット ボックスに入力する必要がある文字列) を検証します。
以下の例に示すコード行を実行します。このコードは、この例で提供されるカスタム マッピング関数を使用します。カスタム マッピング関数が正しく動作すると、端子番号が割り当てられた順に、変数名のコンマ区切りリストが表示されます ('port1,port2'
)。
load_system('slexAutotransRootInportsExample'); port1 = timeseries(ones(10,1)*10); port2 = timeseries(zeros(10,1)); inputMap = slexCustomMappingMyCustomMap('slexAutotransRootInportsExample',{'port1' , 'port2'},{port1 , port2}); externalInputString = getInputString(inputMap,'base'); close_system('slexAutotransRootInportsExample',0);
信号が Simulink.SimulationData.Dataset 内にある場合、以下の例に示すコード行を実行できます。このコードは、この例で提供されるカスタム マッピング関数を使用します。カスタム マッピング関数が正しく動作すると、端子番号が割り当てられた順に、変数名のコンマ区切りリストが表示されます ('ds.getElement(1),port1,ds.getElement(2)'
)。
load_system('slexAutotransRootInportsExample'); ds = Simulink.SimulationData.Dataset; ds = ds.addElement( timeseries(ones(10,1)*10),'port1'); ds = ds.addElement( timeseries(zeros(10,1)),'port1'); inputMap = slexCustomMappingMyCustomMap('slexAutotransRootInportsExample',{'ds'},{ ds }); externalInputString = getInputString(inputMap,'base'); close_system('slexAutotransRootInportsExample',0);
参考
getRootInportMap
| getSlRootInportMap