Иногда, Simulink® не может вывести выходные характеристики вашей Системы object™ во время образцовой компиляции. Чтобы дать Simulink больше информации о Системном объекте вывод, используйте эти методы.
Задайте размер Системного объекта вывод с помощью метода getOutputSizeImpl
. Используйте этот метод, когда Simulink не сможет вывести выходной размер из входных параметров во время образцовой компиляции. Например, когда Системный объект имеет несколько вводов или выводов или имеет вывод переменного размера.
Для входных параметров переменного размера распространенный входной размер от propagatedInputSizeImpl
отличается в зависимости от среды.
MATLAB® — Когда вы первый показ объект, это использует фактические размеры входных параметров.
Simulink — Максимум всех входных размеров установлен перед образцовыми выполнениями и не изменяется во время выполнения.
Разделите на подклассы и от базового класса matlab.System
и от класса mixin 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
Задайте Системный объект, вывод является фиксированным размером. Вывод фиксированного размера является всегда тем же размером, в то время как переменный размер вывод может быть различными векторами размера.
Simulink не может вывести выходной размер для переменного размера вывод. Чтобы избежать ошибок, реализуйте isOutputFixedSizeImpl
и getOutputSizeImpl
.
isOutputFixedSizeImpl
принимает индекс порта и возвращается:
tRUE
входной размер фиксируется (измеренные векторы переменной запрещены),
ложь
входной размер не является переменным (измеренные векторы переменной позволены),
Разделите на подклассы и от базового класса matlab.System
и от класса mixin 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
Задайте тип данных Системного объекта вывод с помощью метода getOutputDataTypeImpl
. Второй пример показывает, как задать объект усиления с шиной вывод. Используйте этот метод, когда Simulink не сможет вывести тип данных из входных параметров во время образцовой компиляции или когда это необходимо различных типов входных и выходных данных. Если вы хотите, соединяют шиной вывод, также используют метод getOutputDataTypeImpl
. Чтобы использовать соединяют шиной вывод, необходимо задать тип данных шины в базовом рабочем пространстве, и необходимо включать метод getOutputDataTypeImpl
в файл определения класса.
Для обоих примеров разделите на подклассы и от базового класса matlab.System
и от класса mixin matlab.system.mixin.Propagates
.
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
и от класса mixin 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
. Используйте этот метод, когда ваш Системный объект имеет свойство с атрибутом DiscreteState
, и Simulink не может вывести выходные спецификации во время образцовой компиляции.
Разделите на подклассы и от базового класса matlab.System
и от класса mixin 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