Main Content

出力の指定

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

参考

関数

関連するトピック