Задайте Вывод

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

Установите Выходной размер

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

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

  • MATLAB® — Когда вы первый показ объект, это использует фактические размеры входных параметров.

  • Simulink — Максимум всех входных размеров установлен перед образцовыми выполнениями и не изменяется во время выполнения.

Разделите на подклассы и от базового класса matlab.System и от класса mixin 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

Установите фиксированный - или Переменный Размер Вывод

Задайте Системный объект, вывод является фиксированным размером. Вывод фиксированного размера является всегда тем же размером, в то время как переменный размер вывод может быть различными векторами размера.

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

isOutputFixedSizeImpl принимает индекс порта и возвращается:

  • tRUE входной размер фиксируется (измеренные векторы переменной запрещены),

  • ложь входной размер не является переменным (измеренные векторы переменной позволены),

Разделите на подклассы и от базового класса matlab.System и от класса mixin 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

Установите тип выходных данных

Задайте тип данных Системного объекта вывод с помощью метода getOutputDataTypeImpl. Второй пример показывает, как задать объект усиления с шиной вывод. Используйте этот метод, когда Simulink не сможет вывести тип данных из входных параметров во время образцовой компиляции или когда это необходимо различные типы данных ввода и вывода. Если вы хотите, соединяют шиной вывод, также используют метод getOutputDataTypeImpl. Чтобы использовать соединяют шиной вывод, необходимо задать тип данных шины в базовом рабочем пространстве, и необходимо включать метод getOutputDataTypeImpl в файл определения класса.

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

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

Задайте в вашем файле определения класса, как управлять типом выходных данных от блока MATLAB System. Используйте метод 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

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

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

Блочная маска для блока MATLAB System включает поле редактирования, чтобы переключиться между использованием распространения (Квантуйте = false), и переключающийся от дважды до единственного (Квантуют = 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 & 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

Установите Выходную сложность

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

Разделите на подклассы и от базового класса matlab.System и от класса mixin 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. Используйте этот метод, когда ваш Системный объект имеет свойство с атрибутом DiscreteState, и Simulink не может вывести выходные спецификации во время образцовой компиляции.

Разделите на подклассы и от базового класса matlab.System и от класса mixin Propagates.

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

Используйте метод getDiscreteStateSpecificationImpl, чтобы задать размер и тип данных. Также задайте сложность свойства дискретного состояния, которое используется в примере сброса счетчика.

methods (Access = protected)
   function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
      sz = [1 1];
      dt = 'double';
      cp = 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

Смотрите также

| | | | |

Похожие темы

Была ли эта тема полезной?