MATLAB System ブロックの System object のサンプル時間の指定
この例では、System object™ メソッドを使用して MATLAB System ブロックのサンプル時間を制御する方法を示します。
クラス定義内で、System object のサンプル時間メソッドを使用してサンプル時間を設定し、現在のシミュレーション時間に基づいて System object の動作を変更します。継承されたサンプル時間を使用する場合は、System object の定義でサンプル時間を指定する必要はありません。
サンプル時間の指定
サンプル時間を指定するには、getSampleTimeImpl
メソッドを実装し、createSampleTime
を使用してサンプル時間の指定オブジェクトを作成します。
この例では、さまざまなプロパティ値に基づいてサンプル時間を割り当てるプロパティ SampleTimeTypeProp
が作成されます。getSampleTimeImpl
メソッドにより、SampleTimeTypeProp
プロパティに基づいてサンプル時間の仕様が作成されます。getSampleTimeImpl
メソッドは、createSampleTime
によって作成されたサンプル時間の指定オブジェクト sts
を返します。
18 methods(Access = protected) 19 function sts = getSampleTimeImpl(obj) 20 switch char(obj.SampleTimeTypeProp) 21 case 'Inherited' 22 sts = createSampleTime(obj,'Type','Inherited'); 23 case 'InheritedNotControllable' 24 sts = createSampleTime(obj,'Type','Inherited',... 25 'AlternatePropagation','Controllable'); 26 case 'InheritedErrorConstant' 27 sts = createSampleTime(obj,'Type','Inherited',... 28 'ErrorOnPropagation','Constant'); 29 case 'FixedInMinorStep' 30 sts = createSampleTime(obj,'Type','Fixed In Minor Step'); 31 case 'Discrete' 32 sts = createSampleTime(obj,'Type','Discrete',... 33 'SampleTime',obj.SampleTime, ... 34 'OffsetTime',obj.OffsetTime); 35 case 'Controllable' 36 sts = createSampleTime(obj,'Type','Controllable',... 37 'TickTime',obj.TickTime); 38 end 39 end
シミュレーション時間とサンプル時間のクエリ
getSampleTime
メソッドとgetCurrentTime
メソッドを使用して、現在のサンプル時間とシミュレーション時間の MATLAB System ブロックをそれぞれクエリします。getSampleTime
はサンプル時間設定を記述するプロパティと共にサンプル時間の仕様オブジェクトを返します。
40 41 function [Count, Time, SampleTime] = stepImpl(obj,u) 42 Count = obj.Count + u; 43 obj.Count = Count; 44 Time = getCurrentTime(obj); 45 sts = getSampleTime(obj); 46 if strcmp(sts.Type,'Controllable') 47 setNumTicksUntilNextHit(obj,obj.Count); 48 end 49 SampleTime = sts.SampleTime; 50 end
Simulink での動作
MATLAB System ブロックに System object を含めます。
スコープに、ブロックに対するサンプル時間の変更の効果が示されます。
クラスの完全な定義
CountTime
System object の完全なクラス定義です。
classdef CountTime < matlab.System % Counts Hits and Time properties(Nontunable) SampleTime = 1.4; % Sample Time OffsetTime = 0.2; % Offset Time TickTime = 0.1; SampleTimeTypeProp (1,:) char {mustBeMember(SampleTimeTypeProp, ... {'Discrete','FixedInMinorStep','Controllable',... 'Inherited','InheritedNotControllable',... 'InheritedErrorConstant'})} = 'Discrete' end properties(DiscreteState) Count end methods(Access = protected) function sts = getSampleTimeImpl(obj) switch char(obj.SampleTimeTypeProp) case 'Inherited' sts = createSampleTime(obj,'Type','Inherited'); case 'InheritedNotControllable' sts = createSampleTime(obj,'Type','Inherited',... 'AlternatePropagation','Controllable'); case 'InheritedErrorConstant' sts = createSampleTime(obj,'Type','Inherited',... 'ErrorOnPropagation','Constant'); case 'FixedInMinorStep' sts = createSampleTime(obj,'Type','Fixed In Minor Step'); case 'Discrete' sts = createSampleTime(obj,'Type','Discrete',... 'SampleTime',obj.SampleTime, ... 'OffsetTime',obj.OffsetTime); case 'Controllable' sts = createSampleTime(obj,'Type','Controllable',... 'TickTime',obj.TickTime); end end function [Count, Time, SampleTime] = stepImpl(obj,u) Count = obj.Count + u; obj.Count = Count; Time = getCurrentTime(obj); sts = getSampleTime(obj); if strcmp(sts.Type,'Controllable') setNumTicksUntilNextHit(obj,obj.Count); end SampleTime = sts.SampleTime; end function setupImpl(obj) obj.Count = 0; end function resetImpl(obj) % Initialize / reset discrete-state properties obj.Count = 0; end function flag = isInactivePropertyImpl(obj,prop) flag = false; switch char(obj.SampleTimeTypeProp) case {'Inherited', ... 'InheritedNotControllable', ... 'FixedInMinorStep'} if any(strcmp(prop,{'SampleTime','OffsetTime','TickTime'})) flag = true; end case 'Discrete' if any(strcmp(prop,{'TickTime'})) flag = true; end case 'Controllable' if any(strcmp(prop,{'SampleTime','OffsetTime'})) flag = true; end end end end end