Main Content

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

参考

関数

関連するトピック