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

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

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

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

Для входных параметров переменного размера, распространенного входного размера от 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

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

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

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

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

  • 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 метод. Второй пример показывает, как задать объект усиления с шиной выход. Используйте этот метод, когда Simulink не сможет вывести тип данных из входных параметров во время компиляции модели или, когда это необходимо, различных типов входных и выходных данных. Если вы хотите, соединяют шиной выход, также используют getOutputDataTypeImpl метод. Чтобы использовать соединяют шиной выход, необходимо задать тип данных шины в базовом рабочем пространстве, и необходимо включать getOutputDataTypeImpl метод в вашем файле определения класса.

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

  classdef DataTypeChange < matlab.System

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

   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 включает поле редактирования, чтобы переключиться между использованием распространения (Quantize = false) и переключение от дважды до одного (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 метод. Используйте этот метод, когда 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 метод. Используйте этот метод, когда ваш Системный объект будет иметь свойство с 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

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

| | | | |

Похожие темы