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