出力の指定
Simulink® がモデルのコンパイル中に System object™ の出力特性を推定できないことがあります。Simulink に対して System object 出力に関するより多くの情報を提供するには、次のメソッドを使用します。
出力サイズの設定
getOutputSizeImpl
メソッドを使用して System object 出力のサイズを指定します。このメソッドはモデルのコンパイル時に Simulink が入力から出力サイズを推定できないときに使用します。たとえば、System object に複数の入力または出力があるか、または可変サイズの出力がある場合です。
可変サイズの入力の場合、propagatedInputSizeImpl
から伝播された入力サイズは環境によって異なります。
MATLAB® — オブジェクトの初回実行時に、実際の入力サイズを使用します。
Simulink — モデルを実行する前にすべての入力サイズの最大値が設定され、実行中に変化しません。
matlab.System
基底クラスからサブクラス化します。
classdef CounterReset < matlab.System
getOutputSizeImpl
メソッドを使用して出力サイズを指定します。
methods (Access = protected) function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end end
完全なクラス定義ファイルのメソッドを表示します。
classdef CounterReset < matlab.System % CounterReset Count values above a threshold properties Threshold = 1 end properties (DiscreteState) Count end methods (Access = protected) function setupImpl(obj) obj.Count = 0; end function y = stepImpl(obj,u1,u2) % Add to count if u1 is above threshold % Reset if u2 is true if (u2) obj.Count = 0; elseif (any(u1 > obj.Threshold)) obj.Count = obj.Count + 1; end y = obj.Count; end function resetImpl(obj) obj.Count = 0; end function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name) if strcmp(name,'Count') sz = [1 1]; dt = 'double'; cp = false; else error(['Error: Incorrect State Name: ', name.']); end end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end function cplxout = isOutputComplexImpl(~) cplxout = false; end function fixedout = isOutputFixedSizeImpl(~) fixedout = true; end function flag = isInputSizeMutableImpl(~,idx) if idx == 1 flag = true; else flag = false; end end end end
固定サイズまたは可変サイズの出力の設定
System object 出力が固定サイズであることを指定します。固定サイズの出力は常に同じサイズであるのに対し、可変サイズの出力は異なるサイズのベクトルである可能性があります。
Simulink は、可変サイズの出力に対して、出力サイズを推測できません。エラーを回避するには、isOutputFixedSizeImpl
および getOutputSizeImpl
を実装します。
isOutputFixedSizeImpl
は System object ハンドルを受け取り、フラグの配列を返します。配列のサイズは出力端子のサイズに等しくなります。フラグの値とその意味は次のとおりです。
true
— 出力サイズは固定 (MATLAB System ブロックの出力端子は固定サイズの信号を作成する)false
— 出力サイズは可変 (MATLAB System ブロックの出力端子は可変サイズの信号を作成する)
matlab.System
基底クラスからサブクラス化します。
classdef CounterReset < matlab.System
isOutputFixedSizeImpl
メソッドを使用して出力が固定サイズであることを指定します。
methods (Access = protected) function fixedout = isOutputFixedSizeImpl(~) fixedout = true; end end
完全なクラス定義ファイルのメソッドを表示します。
classdef CounterReset < matlab.System % CounterReset Count values above a threshold properties Threshold = 1 end properties (DiscreteState) Count end methods (Access = protected) function setupImpl(obj) obj.Count = 0; end function y = stepImpl(obj,u1,u2) % Add to count if u1 is above threshold % Reset if u2 is true if (u2) obj.Count = 0; elseif (any(u1 > obj.Threshold)) obj.Count = obj.Count + 1; end y = obj.Count; end function resetImpl(obj) obj.Count = 0; end function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name) if strcmp(name,'Count') sz = [1 1]; dt = 'double'; cp = false; else error(['Error: Incorrect State Name: ', name.']); end end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end function cplxout = isOutputComplexImpl(~) cplxout = false; end function fixedout = isOutputFixedSizeImpl(~) fixedout = true; end function flag = isInputSizeMutableImpl(~,idx) if idx == 1 flag = true; else flag = false; end end end end
出力のデータ型の設定
getOutputDataTypeImpl
メソッドを使用して System object 出力のデータ型を指定します。2 番目の例は、バス出力でゲイン オブジェクトを指定する方法を示しています。このメソッドはモデルのコンパイル時に Simulink が入力からデータ型を推定できないときや、異なる入力および出力データ型が必要なときに使用します。バス出力が必要な場合は、getOutputDataTypeImpl
メソッドも使用します。バス出力を使用するには、バスのデータ型をベース ワークスペースで定義し、getOutputDataTypeImpl
メソッドをクラス定義ファイルに含めなければなりません。
両方の例で、matlab.System
基底クラスからサブクラス化します。
classdef DataTypeChange < matlab.System
クラス定義ファイルで、MATLAB System ブロックからの出力データ型を制御する方法を指定します。出力データ型を double から single に変更したり、入力を double として伝播するには、getOutputDataTypeImpl
メソッドを使用します。必要に応じて、stepImpl
メソッドで出力データ型を変更するためにデータ型をキャストする方法も示します。
methods (Access = protected) function out = getOutputDataTypeImpl(obj) if obj.Quantize == true out = 'single'; else out = propagatedInputDataType(obj,1); end end end
classdef DataTypeChange < matlab.System properties(Nontunable) Quantize = false; end methods(Access = protected) function y = stepImpl(obj,u) if obj.Quantize == true % Cast for output data type to differ from input. y = single(u); else % Propagate output data type. y = u; end end function out = getOutputDataTypeImpl(obj) if obj.Quantize == true out = 'single'; else out = propagatedInputDataType(obj,1); end end end end
このモデルには、伝播された double データ型が示されます。
このモデルには、データ型を double から single に変更した結果が示されます。Display ブロックでは、データの量子化の効果が示されます。
MATLAB System ブロックのブロック マスクには、伝播の使用 ([Quantize] = false
) と double から single への切り替え ([Quantize] = true
) の間を切り替えるための編集フィールドが含まれています。
getOutputDataTypeImpl
メソッドを使用して出力のデータ型をバスとして指定します。プロパティでバス名を指定します。
properties(Nontunable) OutputBusName = 'bus_name'; end methods (Access = protected) function out = getOutputDataTypeImpl(obj) out = obj.OutputBusName; end end
完全なクラス定義ファイルのメソッドを表示します。このクラス定義ファイルには、このオブジェクトのカスタム アイコンを MATLAB System ブロックに実装するコードも含まれます。
classdef busGain < matlab.System % busGain Apply a gain of two to bus input. properties GainK = 2; end properties(Nontunable) OutputBusName = 'bus_name'; end methods (Access=protected) function out = stepImpl(obj,in) out.a = obj.GainK * in.a; out.b = obj.GainK * in.b; end function out = getOutputSizeImpl(obj) out = propagatedInputSize(obj, 1); end function out = isOutputComplexImpl(obj) out = propagatedInputComplexity(obj, 1); end function out = getOutputDataTypeImpl(obj) out = obj.OutputBusName; end function out = isOutputFixedSizeImpl(obj) out = propagatedInputFixedSize(obj,1); end end end
出力の実数/複素数の設定
isOutputComplexImpl
メソッドを使用して System object 出力が複素数か実数かを指定します。このメソッドはモデルのコンパイル時に Simulink が入力から出力の実数/複素数を推定できないときに使用します。
matlab.System
基底クラスからサブクラス化します。
classdef CounterReset < matlab.System
isOutputComplexImpl
メソッドを使用して出力が実数であることを指定します。
methods (Access = protected) function cplxout = isOutputComplexImpl(~) cplxout = false; end end
完全なクラス定義ファイルのメソッドを表示します。
classdef CounterReset < matlab.System % CounterReset Count values above a threshold properties Threshold = 1 end properties (DiscreteState) Count end methods (Access = protected) function setupImpl(obj) obj.Count = 0; end function y = stepImpl(obj,u1,u2) % Add to count if u1 is above threshold % Reset if u2 is true if (u2) obj.Count = 0; elseif (any(u1 > obj.Threshold)) obj.Count = obj.Count + 1; end y = obj.Count; end function resetImpl(obj) obj.Count = 0; end function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name) if strcmp(name,'Count') sz = [1 1]; dt = 'double'; cp = false; else error(['Error: Incorrect State Name: ', name.']); end end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end function cplxout = isOutputComplexImpl(~) cplxout = false; end function fixedout = isOutputFixedSizeImpl(~) fixedout = true; end function flag = isInputSizeMutableImpl(~,idx) if idx == 1 flag = true; else flag = false; end end end end
離散状態の出力指定の設定
getDiscreteStateSpecificationImpl
メソッドを使用して離散状態プロパティのサイズ、データ型および実数/複素数を指定します。このメソッドは、System object のプロパティに DiscreteState
属性が設定されていて、Simulink がモデルのコンパイル時に出力仕様を推定できないときに使用します。
matlab.System
基底クラスからサブクラス化します。
classdef CounterReset < matlab.System
getDiscreteStateSpecificationImpl
メソッドを使用してサイズとデータ型を指定します。また、離散状態プロパティ Count
の実数/複素数も指定します。これはカウンター リセットの例で使用します。
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name) if strcmp(name,'Count') sz = [1 1]; dt = 'double'; cp = false; else error(['Error: Incorrect State Name: ', name.']); end end
完全なクラス定義ファイルのメソッドを表示します。
classdef CounterReset < matlab.System % CounterReset Count values above a threshold properties Threshold = 1 end properties (DiscreteState) Count end methods (Access = protected) function setupImpl(obj) obj.Count = 0; end function y = stepImpl(obj,u1,u2) % Add to count if u1 is above threshold % Reset if u2 is true if (u2) obj.Count = 0; elseif (any(u1 > obj.Threshold)) obj.Count = obj.Count + 1; end y = obj.Count; end function resetImpl(obj) obj.Count = 0; end function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name) if strcmp(name,'Count') sz = [1 1]; dt = 'double'; cp = false; else error(['Error: Incorrect State Name: ', name.']); end end function dataout = getOutputDataTypeImpl(~) dataout = 'double'; end function sizeout = getOutputSizeImpl(~) sizeout = [1 1]; end function cplxout = isOutputComplexImpl(~) cplxout = false; end function fixedout = isOutputFixedSizeImpl(~) fixedout = true; end function flag = isInputSizeMutableImpl(~,idx) if idx == 1 flag = true; else flag = false; end end end end
参考
関数
getDiscreteStateSpecificationImpl
|getOutputDataTypeImpl
|getOutputSizeImpl
|isOutputComplexImpl
|isOutputFixedSizeImpl