このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
この例では、金宝app模拟マッピング モードに類似したカスタム マッピング アルゴリズムを実装する方法を示します。関数getSlRootInportMap
およびgetRootInportMap
を使用して、カスタム マッピングを実装します。
この例では、getRootInportMap
コマンドおよびルート 输入マッパー ツールのカスタム マッピング機能に精通していることを前提としています。これらの概念に精通していない場合、ルート尺寸信号データのマッピングを参照してください。
この例では、組み込みの 金宝app模拟マッピング モードを使って、できるだけ多くのマッピングを実行する方法を示します。次に、信号を割り当てることができなかったルート 输入にフラグを設定します。次に、アルゴリズムはカスタム マッピングを使って、フラグが設定されたマッピングをオーバーライドし、残りの信号をマッピングします。このようなソリューションを実装するには、getSlRootInportMapを使用してカスタム マッピング関数を作成します。
この例では、次の 2.種類の信号に関する入力リストを使用します。
金宝app模拟ブロック名マッピング モードを使ってマッピングできる信号。
金宝app仿真软件ブロック名マッピングモードを使ってマッピングできない信号。これらの信号は,カスタムマッピングモードを使ってマッピングしなければなりません。
次のシナリオを想定します。
信号グループを、金宝app模拟モデルへの入力として使用します。
信号には、変数名がルートレベル 输入のブロック名と一致するような名前が付けられます。
この命名規則を使用する各信号は、許容誤差内に収まっています。
名前に“x”という文字が付加された各信号は,許容誤差外と見なされます。
この例では、金宝app模拟ブロック名のマッピング方法と類似するマッピング モードを使用します。
ルートレベル尺寸ブロック名を次に示します。
掐死
刹车
信号変数名を次に示します。
节流阀
刹车
このシナリオで、入力をルートレベル 输入ブロックにマッピングするには、ルート 输入マッパー ツール用のカスタム マッピング関数が必要です。この例では、カスタム マッピング関数 几乎块名を使用します。
この例の場合、slexAutotransRootInportsExample
モデルを使って、カスタム マッピング関数を検証します。
関数名、入力および出力を宣言します。そのためには、次のコード スニペットを MATLABファイルにコピーして貼り付け、AlmostBlockName.mという名前でファイルに保存します。
函数inputMap=AlmostBlockName(模型名、信号名、信号)
次に、すべての信号をマッピングします。そのためには、最初に 金宝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
を使って、これらの信号にフラグを設定しました。このためには、以下のことを行います。
変数输入映射
をチェックします。
変数输入映射
が空でない場合、输入映射
ベクトルのどの要素が信号に割り当てられなかったかを判別します。そのためには、次に示すように、hasASignal
ベクトル上で 合乎逻辑~を使用します。これで空索引
ベクトルに、必然的ベクトルが含まれました。符合事实的は输入映射
には信号がマッピングされていないことを意味します。
getSlRootInportMap
への呼び出しの下と,如果bdIsLoaded(modelName)
への終了の前に、次のコード スニペットをコピーして貼り付けます。
if ~isempty(inputMap) emptyIndex = ~ hassignal;结束
このコード スニペットは、手順 1.および 2.を自動的に実行します。
前の手順で、必然的ベクトル空索引
を作成し、信号に関連付けられていない 输入映射オブジェクトがあるか確認しました。空索引ベクトルのすべての要素が 错误的の場合、マッピングが完了し、この節で追加したコードは実行されません。
空索引
ベクトルの少なくとも 1.つの値に 符合事实的が含まれている場合、信号に関連付けられていない输入映射
オブジェクトがあるということです。そのinputMapに可変信号を手動で割り当てます。次に,予想される信号名と一致する信号名を使って,输入映射
をオーバーライドします。
emptyIndexベクトルで,真の値をもつすべての項目を検出します。これらの項目は,信号に関連付ける必要があるinputMap (s)
を指定しています。
输入映射
ごとに、'BlockName'プロパティを使って、输入映射
の割り当て先となる 输入ブロックの名前を取得します。
ブロック名に 'x'を追加して、输入映射
に割り当てる信号の名前を取得します。
signalNames変数の细胞配列で,結果と各項目を比較します。
一致するものが見つかった場合,输入映射
を,予想される信号名と一致する信号名でオーバーライドします。输入映射
オブジェクトをオーバーライドするには、'输入映射'および '信号名'プロパティを指定して、関数 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);结束
结束
カスタム マッピングを検証するには、次の手順に従います。
MATLABパス上のファイルに関数 几乎块名を保存します。
マッピング関数の結果を確認するには,次のコードスニペットを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(“制动”)“が含まれます。