В этом примере показано, как создать системный блок MATLAB, который может разорвать алгебраический цикл в модели.
Системные объекты позволяют реализовать алгоритмы с помощью MATLAB. Системные объекты - специализированный вид объектов MATLAB, разработанный специально для реализации и моделирования динамических систем с вводами, изменяющимися с течением времени.
После определения объекта System его можно включить в модель Simulink с помощью блока MATLAB System.
В этом примере имеется системный блок MATLAB, который используется в цикле обратной связи в модели. Цикл обратной связи используется для накопления входных значений, и результат отображается в блоке «Scope». Обратная связь в модели создает алгебраический цикл. Для решения алгебраического цикла Симулинку необходим блок с непрямым проходом. Блоки с непрямым проходом используются в контурах обратной связи для разрыва алгебраических контуров. Этот блок может выдавать выходной сигнал на текущем временном шаге без первого приема входного сигнала. В этом примере системный блок MATLAB имеет непрямой канал.


Системный блок MATLAB использует системный объект UnitDelayNondirect который реализует единичную задержку. Выходные данные показывают, как контур обратной связи накапливает значения входного сигнала.
Доступ к исходному коду MATLAB, используемому системным блоком MATLAB, можно получить, щелкнув гиперссылку «Исходный код» в диалоговом окне блока. UnitDelayNondirect Системный объект реализует resetImpl, outputImpl, и updateImpl методы. Объект System имеет одно свойство с именем State.
resetImpl инициализирует State для свойства 0.
outputImpl возвращает значение, сохраненное в State. Этот объект System имеет непрямой канал, так как outputImpl не использует входные данные.
updateImpl использует входные данные для обновления State.
classdef UnitDelayNondirect < matlab.System
% UnitDelayNondirect Delay input by one time step
properties(DiscreteState)
State
end
methods(Access = protected)
function resetImpl(obj)
obj.State = 0; % Initialize states
end
function y = outputImpl(obj, ~)
y = obj.State; % Output current state
% Input is not used in this method
end
function updateImpl(obj,u)
obj.State = u; % Update state with input
end
end
end