Подключение моделей
В этом примере изучим, как моделировать соединение LTI систем в Engee. От простых последовательных и параллельных подключений для сложных блок-схем.
Обзор
Engee предоставляет ряд функций , которые помогут вам создать объединения моделей LTI. К ним относятся функции:
- Последовательное и параллельное подключение (
series
,parallel
) - Подключение с обратной связью (
feedback
,feedback2dof
) - Конкатенация ввода и вывода (
[ , ]
,[ ; ]
,append
,array2mimo
) - Общее построение блок-схем (
connect
)
Для иллюстрации примеров подключим необходимые библиотеки и создадим две системы со следующими передаточными функциями:
Pkg.add(["RobustAndOptimalControl", "ControlSystems"])
using ControlSystems
H1 = tf(2,[1, 3, 0])
H2 = zpk([],[-5],5)
Последовательное соединение
Используйте оператор *
или функцию series
для последовательного подключения моделей LTI, например:

H = H2 * H1
H = series(H1,H2)
Параллельное соединение
Используйте оператор +
или функцию parallel
для параллельного подключения моделей LTI, например:

H = H1 + H2
H = parallel(H1,H2)
Соединение с обратной связью
Стандартный вид структурной схемы системы с оратной отрицательной связью:

Чтобы определить замнутую системы используйте функцию feedback
.
H = feedback(H1,H2)
Обратите внимание, что обратная связь по умолчанию отрцательная. Чтобы сделать положительную обратную связь, используйте следующий синтаксис:
H = feedback(H1, H2, pos_feedback = true)
Объединение входов и выходов
Вы можете объединить входные данные двух моделей H1 и H2, введя:
H = [H1 H2]
Результирующая модель имеет два входа и один выход, что соответствует следующей схеме:

Аналогично, вы можете объединить выходные данные H1 и H2 , введя:
H = [ H1 ; H2 ]
Результирующая модель H имеет два выхода и один вход и соответствует следующей блок-схеме:

Наконец, вы можете объединить входные и выходные данные двух моделей, используя:
H = append(H1,H2)
Результирующая модель H имеет два входа и два выхода и соответствует структурной схеме:
Вы можете использовать конкатенацию для построения моделей MIMO из элементарных моделей SISO, например:
[H1 -tf(10,[1, 10]); 0 H2]
Также вы можете воспользоваться функцией array2mimo
. Например,
P = ss(-1,1,1,0);
sys_array = fill(P, 2, 2) # Создает массив систем
mimo_sys = array2mimo(sys_array)
Построение моделей на основе блок-схем
Вы можете использовать комбинации функций и операций для построения моделей простых блок-схем. Например, рассмотрим следующую блок-схему:

s = tf('s');
F = 1/(s + 1);
G = 100/(s^2 + 5*s + 100);
C = 20*(s^2 + s + 60)/s/(s^2 + 40*s + 400);
S = 10/(s + 10);
Вы можете определить передаточную функцию замкнутой системы из r в y следующим образом:
T = F * feedback(G*C,S)
plot(step(T,10))
Но для более сложных блок-схем используйте функцию connect
библиотеки RobustAndOptimalControl.jl
. Чтобы использовать connect
, выполните следующие действия:
- Определите все блоки на схеме, включая блоки суммирования;
- Назовите все каналы ввода и вывода блоков;
- Сопоставьте выходы (output) блоков системы с соответствующими входами (input) блоков.
Рассмотрим пример использования функции на примере следующей структурной схемы.
Импортируйте и подключите библиотеку RobustAndOptimalControl.jl
.
import Pkg
Pkg.add("RobustAndOptimalControl")
using RobustAndOptimalControl
Используйте функцию named_ss
, для того чтобы задать названия сигналов входов и выходов для каждого блока.
F1 = named_ss(F, x=:xF, u=:r, y=:u_f)
G1 = named_ss(G, x=:xG, u=:u, y=:y_m)
C1 = named_ss(C, x=:xC, u=:e, y=:u_c)
S1 = named_ss(S, x=:xS, u=:y_m, y=:y)
Обозначьте сумматоры, используя функцию sumblock
.
Sum1 = sumblock("e = r - y")
Sum2 = sumblock("u = u_f + u_c")
Важно внимательно обозначить соединения. Соединения образуются по принципы выход одного блока присоединяется ко входу другого. Например, сигнал е
является выходом Sum1
, но при этом является входом для блока C
.
connections = [
:e => :e # output e Sum1 to input C
:y => :y # output y S to input Sum1
:u => :u # output u Sum2 to input G
:u_f => :u_f # output u_f F to input Sum2
:u_c => :u_c # output u_c C to input Sum2
:y_m => :y_m # output G to input S
]
Также важно определить входной сигнал w1
и выходной z1
.
w1 = [:r]
z1 = [:y_m]
Все рассчитанные данные подаем на вход connect
. Подробнее изучить все параметры функции можно в документации Julia Объединение систем.
P = connect([F1, C1, G1, S1, Sum1, Sum2], connections; w1,z1,unique = false)
Построим переходный процесс полученной замкнутой системы.
plot(stepinfo(step(P,5)))
Заключение
В данном материале мы рассмотрели способы соединения моделей. Более подробно изучить функции для преобразования структурных схем можно в разделе Построение систем.