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

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

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

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

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

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

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

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

 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 создает сигнал переменного размера)

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

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

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 базовый класс и matlab.system.mixin.Propagates класс mixin.

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

Задайте в файле определения класса, как управлять типом выходных данных из блока System MATLAB. Используйте getOutputDataTypeImpl метод для изменения типа выходных данных с double на single или распространения входов как double. Это также показывает, как привести тип данных, чтобы изменить тип выходных данных в 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 включает поле редактирования, которое переключается между использованием распространения (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 & 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 базовый класс и Propagates класс mixin.

 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 базовый класс и от Propagates класс mixin.

 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

См. также

| | | | |

Похожие темы