Иногда 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
getDiscreteStateSpecificationImpl | getOutputDataTypeImpl | getOutputSizeImpl | isOutputComplexImpl | isOutputFixedSizeImpl | matlab.system.mixin.Propagates