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