主要内容

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

カスタム マッピングされる外部入力をもつマッピング モードの使用

この例では、金宝app模拟マッピング モードに類似したカスタム マッピング アルゴリズムを実装する方法を示します。関数getSlRootInportMapおよびgetRootInportMapを使用して、カスタム マッピングを実装します。

この例では、getRootInportMapコマンドおよびルート 输入マッパー ツールのカスタム マッピング機能に精通していることを前提としています。これらの概念に精通していない場合、ルート尺寸信号データのマッピングを参照してください。

ワークフロー

この例では、組み込みの 金宝app模拟マッピング モードを使って、できるだけ多くのマッピングを実行する方法を示します。次に、信号を割り当てることができなかったルート 输入にフラグを設定します。次に、アルゴリズムはカスタム マッピングを使って、フラグが設定されたマッピングをオーバーライドし、残りの信号をマッピングします。このようなソリューションを実装するには、getSlRootInportMapを使用してカスタム マッピング関数を作成します。

この例では、次の 2.種類の信号に関する入力リストを使用します。

  • 金宝app模拟ブロック名マッピング モードを使ってマッピングできる信号。

  • 金宝app仿真软件ブロック名マッピングモードを使ってマッピングできない信号。これらの信号は,カスタムマッピングモードを使ってマッピングしなければなりません。

次のシナリオを想定します。

  • 信号グループを、金宝app模拟モデルへの入力として使用します。

  • 信号には、変数名がルートレベル 输入のブロック名と一致するような名前が付けられます。

  • この命名規則を使用する各信号は、許容誤差内に収まっています。

  • 名前に“x”という文字が付加された各信号は,許容誤差外と見なされます。

この例では、金宝app模拟ブロック名のマッピング方法と類似するマッピング モードを使用します。

ルートレベル尺寸ブロック名を次に示します。

  • 掐死

  • 刹车

信号変数名を次に示します。

  • 节流阀

  • 刹车

このシナリオで、入力をルートレベル 输入ブロックにマッピングするには、ルート 输入マッパー ツール用のカスタム マッピング関数が必要です。この例では、カスタム マッピング関数 几乎块名を使用します。

この例の場合、slexAutotransRootInportsExampleモデルを使って、カスタム マッピング関数を検証します。

カスタム マッピング関数の宣言

関数名、入力および出力を宣言します。そのためには、次のコード スニペットを MATLABファイルにコピーして貼り付け、AlmostBlockName.mという名前でファイルに保存します。

函数inputMap=AlmostBlockName(模型名、信号名、信号)

金宝appSimulink块名マッピングの取得

次に、すべての信号をマッピングします。そのためには、最初に 金宝app模拟ブロック名マッピング モードを使って、許容誤差内のすべての信号をマッピングし、その後、許容誤差外の信号をマッピングします。

金宝app模拟マッピング モードのいずれかを使って許容誤差内の信号をモデルにマッピングするには、関数getSlRootInportMapを使用します。この関数は、输入映射と 必然的値のベクトルを返します。各 必然的値は、输入映射から信号へのマッピングが成功したか失敗したかを示します。ブロック名を使ってマッピングするには、関数宣言の直後に、次のコード行を挿入します。

inputMap = getRootInportMap(“空”);如果~ bdIsLoaded modelName load_system (modelName);结束
[inputMap,hasASignal]=GetSLRootInputPortMap('Model',modelName,'MappingMode','BlockName',…'signalName','signalName','signalValue',signals);

不足している入力信号の検出

前の手順では、ブロック名マッピング モードを使って、マッピングを作成しました。許容誤差内の信号に関連付けられていない、空の输入映射inputMap (s)を考慮しなければなりません。関数getSlRootInportMapは、出力変数hasASignalを使って、これらの信号にフラグを設定しました。このためには、以下のことを行います。

  1. 変数输入映射をチェックします。

  2. 変数输入映射が空でない場合、输入映射ベクトルのどの要素が信号に割り当てられなかったかを判別します。そのためには、次に示すように、hasASignalベクトル上で 合乎逻辑~を使用します。これで空索引ベクトルに、必然的ベクトルが含まれました。符合事实的は输入映射には信号がマッピングされていないことを意味します。

  3. getSlRootInportMapへの呼び出しの下と,如果bdIsLoaded(modelName)への終了の前に、次のコード スニペットをコピーして貼り付けます。

if ~isempty(inputMap) emptyIndex = ~ hassignal;结束

このコード スニペットは、手順 1.および 2.を自動的に実行します。

マッピングの完了

前の手順で、必然的ベクトル空索引を作成し、信号に関連付けられていない 输入映射オブジェクトがあるか確認しました。空索引ベクトルのすべての要素が 错误的の場合、マッピングが完了し、この節で追加したコードは実行されません。

空索引ベクトルの少なくとも 1.つの値に 符合事实的が含まれている場合、信号に関連付けられていない输入映射オブジェクトがあるということです。そのinputMapに可変信号を手動で割り当てます。次に,予想される信号名と一致する信号名を使って,输入映射をオーバーライドします。

  1. emptyIndexベクトルで,真の値をもつすべての項目を検出します。これらの項目は,信号に関連付ける必要があるinputMap (s)を指定しています。

  2. 输入映射ごとに、'BlockName'プロパティを使って、输入映射の割り当て先となる 输入ブロックの名前を取得します。

  3. ブロック名に 'x'を追加して、输入映射に割り当てる信号の名前を取得します。

  4. signalNames変数の细胞配列で,結果と各項目を比較します。

  5. 一致するものが見つかった場合,输入映射を,予想される信号名と一致する信号名でオーバーライドします。输入映射オブジェクトをオーバーライドするには、'输入映射'および '信号名'プロパティを指定して、関数 getRootInportMapを使用します。

如果isa(signals{1},'Sim金宝appulink.SimulationData.Dataset')SignalsNames=signals{1}.getElementNames';终止
idxEmpty =找到(emptyIndex = = true);for kEmpty =1:length(idxEmpty) idxOfEmpty = idxEmpty(kEmpty);destBlockName =得到(inputMap (idxOfEmpty),“BlockName”);outsiddetolerancesig = [destBlockName 'x'];ismatch = strcmp(signalNames, outsiddetolerancesig);if any(ismatch) inputMap(idxOfEmpty) = getRootInportMap(' inputMap ',…inputMap (idxOfEmpty) SignalName, outSideToleranceSig);结束

カスタムマップファイル

完了すると、ファイル AlmostBlockName.mは次のようなコードになります。

函数inputMap=AlmostBlockName(modelName,signalNames,signals)inputMap=getRootInportMap('empty');如果bdIsLoaded(modelName)
[inputMap,hasASignal]=GetSLRootInputPortMap('Model',modelName,'MappingMode','BlockName',…'signalName','signalName','signalValue',signals);
如果~isempty(inputMap)emptyIndex=~hasASignal;idxEmpty=find(emptyIndex==1);
如果isa(signals{1},'Sim金宝appulink.SimulationData.Dataset')SignalsNames=signals{1}.getElementNames';终止
for kEmpty =1:length(idxEmpty) idxOfEmpty = idxEmpty(kEmpty);destBlockName =得到(inputMap (idxOfEmpty),“BlockName”);nonNominalSig = [destBlockName 'x'];ismatch = strcmp(signalNames, non - nominalsig); / /输出信号if any(ismatch) inputMap(idxOfEmpty) = getRootInportMap(' inputMap ',…inputMap (idxOfEmpty) SignalName, nonNominalSig);结束
结束

カスタム マッピングの検証

カスタム マッピングを検証するには、次の手順に従います。

  1. MATLABパス上のファイルに関数 几乎块名を保存します。

  2. マッピング関数の結果を確認するには,次のコードスニペットをMATLABコマンドウィンドウにコピーして貼り付けます。

modelName='slexAutotransRootInportsExample';Throttlex=时间序列(零(10,1));刹车=时间序列(一(10,1));信号名称={'Throttlex','Brake'};信号={Throttlex,Brake};开放式系统(型号名称);inputMap=AlmostBlockName(模型名、信号名、信号);inputStr=getInputString(inputMap,'base');关闭系统(型号名称);

このコード スニペットを実行した後、変数输入strは文字列“Throttlex、刹车”を含みます。

信号が 金宝appSimulink.SimulationData.Dataset内にある場合、マッピング関数の結果を表示するには、次のコード スニペットを MATLABコマンド ウィンドウで使用します。

modelName =“slexAutotransRootInportsExample”;Throttlex = timeseries (0 (10, 1));制动= timeseries ((10, 1));ds = 金宝appSimulink.SimulationData.Dataset;ds = ds。addElement(Throttlex, 'Throttlex');ds = ds。addElement(Brake, 'Brake');signalNames = {ds的};Signals = {ds}; open_system(modelName); inputMap = AlmostBlockName(modelName, signalNames, signals); inputStr = getInputString(inputMap,'base'); close_system(modelName);

金宝appSimulink.SimulationData.Dataset内の信号に対してコード スニペットを実行すると、変数输入strには文字列“ds.getElement(“Throttlex”),ds.getElement(“制动”)“が含まれます。