Иногда, 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 — входной размер фиксируется (измеренные векторы переменной запрещены),
false — входной размер не является переменным (измеренные векторы переменной позволены),
Разделите на подклассы от обоих 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
Задайте в вашем файле определения класса, как управлять типом выходных данных от блока 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 включает поле редактирования, чтобы переключиться между использованием распространения (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
getDiscreteStateSpecificationImpl | getOutputDataTypeImpl | getOutputSizeImpl | isOutputComplexImpl | isOutputFixedSizeImpl | matlab.system.mixin.Propagates