exponenta event banner

Указать выходные данные

Иногда Simulink ® не может вывести выходные характеристики системного object™ во время компиляции модели. Чтобы предоставить Simulink дополнительную информацию о выводе объекта System, используйте следующие методы.

Задать размер вывода

Укажите размер вывода объекта System с помощью getOutputSizeImpl способ. Этот метод используется, когда Simulink не может вывести размер выходных данных из входных данных во время компиляции модели. Например, если объект System имеет несколько входов или выходов или имеет выход переменного размера.

Для входов переменного размера размер распространяемого входного сигнала от propagatedInputSizeImpl различается в зависимости от среды.

  • MATLAB ® - при первом запуске объекта используются фактические размеры входных данных.

  • Симулинк (Simulink) - максимальный размер всех входных данных задается перед запуском модели и не изменяется во время выполнения.

Подкласс из обоих matlab.System базовый класс и Propagates класс миксина.

 classdef CounterReset < matlab.System & ...
     matlab.system.mixin.Propagates

Используйте getOutputSizeImpl для указания размера вывода.

methods (Access = protected)
   function sizeout = getOutputSizeImpl(~)
      sizeout = [1 1];
   end
end

Просмотрите метод в файле определения полного класса.

classdef CounterReset < matlab.System & matlab.system.mixin.Propagates
   % 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 фиксированного размера. Выходные данные фиксированного размера всегда имеют одинаковый размер, в то время как выходные данные переменного размера могут иметь разные векторы размера.

Simulink не может определить размер вывода для вывода переменного размера. Чтобы избежать ошибок, реализуйте isOutputFixedSizeImpl и getOutputSizeImpl.

isOutputFixedSizeImpl принимает дескриптор объекта System и возвращает массив флагов. Размер массива равен размеру выходных портов. Значение флагов и их значения:

  • true - размер выхода фиксирован (выходной порт на системном блоке MATLAB создает сигнал переменного размера)

  • false - размер выходного сигнала является переменным (выходной порт в системном блоке MATLAB создает сигнал фиксированного размера)

Подкласс из обоих matlab.System базовый класс и matlab.system.mixin.Propagates класс миксина.

classdef CounterReset < matlab.System & ...
    matlab.system.mixin.Propagates

Используйте isOutputFixedSizeImpl метод для указания фиксированного размера выходных данных.

methods (Access = protected)
    function fixedout = isOutputFixedSizeImpl(~)
        fixedout = true;
    end
end

Просмотрите метод в файле определения полного класса.

classdef CounterReset < matlab.System & matlab.system.mixin.Propagates
   % 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 с помощью getOutputDataTypeImpl способ. Во втором примере показано, как задать объект усиления с выходом шины. Этот метод используется в том случае, когда Simulink не может вывести тип данных из входных данных во время компиляции модели или когда требуется другой тип входных и выходных данных. Если требуется вывод по шине, также используйте getOutputDataTypeImpl способ. Для использования вывода шины необходимо определить тип данных шины в базовом рабочем пространстве и включить getOutputDataTypeImpl метод в файле определения класса.

Для обоих примеров, подкласс из обоих matlab.System базовый класс и matlab.system.mixin.Propagates класс миксина.

  classdef DataTypeChange < matlab.System & ...
    matlab.system.mixin.Propagates

В файле определения класса укажите, как управлять типом выходных данных из системного блока MATLAB. Используйте 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 & ...
  matlab.system.mixin.Propagates

   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

В этой модели показан распространенный двойной тип данных.

Эта модель показывает результат изменения типа данных с двойного на одиночный. Блок отображения показывает эффект квантования данных.

Маска блока для системного блока MATLAB включает в себя поле редактирования для переключения между использованием распространения (Quantize = false) и переключение с двойного на одиночный (квантование = true).

Используйте getOutputDataTypeImpl для указания типа выходных данных в качестве шины. Укажите имя шины в свойстве.

properties(Nontunable)
   OutputBusName = 'bus_name'; 
end

methods (Access = protected)
   function out = getOutputDataTypeImpl(obj)
      out = obj.OutputBusName;
   end
end

Просмотрите метод в файле определения полного класса. Этот файл определения класса также включает код для реализации пользовательского значка для этого объекта в системном блоке MATLAB

classdef busGain < matlab.System & matlab.system.mixin.Propagates
% 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

Задать сложность вывода

Укажите, является ли вывод объекта System сложным или реальным, используя isOutputComplexImpl способ. Используйте этот метод, когда Simulink не может вывести сложность вывода из входных данных во время компиляции модели.

Подкласс из обоих matlab.System базовый класс и Propagates класс миксина.

 classdef CounterReset < matlab.System & ...
     matlab.system.mixin.Propagates

Используйте isOutputComplexImpl чтобы указать, что выходные данные являются действительными.

methods (Access = protected)
   function cplxout = isOutputComplexImpl(~)
      cplxout = false;
   end
end

Просмотрите метод в файле определения полного класса.

classdef CounterReset < matlab.System & matlab.system.mixin.Propagates
   % 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 имеет свойство со свойством DiscreteState атрибут и Simulink не могут вывести выходные спецификации во время компиляции модели.

Подкласс из обоих matlab.System базовый класс и из Propagates класс миксина.

 classdef CounterReset < matlab.System & ...
     matlab.system.mixin.Propagates

Используйте 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 & matlab.system.mixin.Propagates
   % 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

См. также

| | | | |

Связанные темы