Документация Engee
Notebook

Управление давлением трубопровода с использованием блока Chart

В данном примере создадим управляющую логику для регулирования давления трубопровода. Для создания алгоритма работы будем использовать блок Chart библиотеки конечных автоматов.

Принцип работы

Подробное описание модели трубопровода рассмотрено в примере по следующему пути:/user/start/examples/physmod/liquid_pressure_regulator. В данном случае кратко опишем модель и остановимся на моментах необходимых для управления.

Структурная схема модели представлена ниже, а также в моделе hydro_control_chart.engee.

hydro_control_chart--1724956899773.png

Нам необходимо поддерживать давление в блоке Объем. Изменение давление происходит из-за случайной утечки. Для измерения давления в схеме присутствует Датчик давления. Давление необходимо поддерживать в соответствии с Уставкой.

Управляющая логика

На вход блоку Контроллер поступает два сигнала: уставка и значение с датчика. Сигнал с выхода Контроллера поступает на вход блока Клапан. Этот сигнал определяет площадь проходного сечения.

Блок Chart из модели Контроллер содержит три состояния. В начальном состоянии определяется разница между заданным и измеренным значениями давления. Далее возможно три перехода.

  • В состояние low , если разница отрицательна и превышает установленным порог. В этом случае минимизируем площадь сечения прохдного отверстия;
  • В состояние up, если разница положительна и больше установленного порога. Устанавливаем максимальную площадь попреченого сечения;
  • Если же погрешность в пределах попрогового значения, остаемся в начальном состоянии.
hydro_control_chart--1724953338268.png

Запустим модель и построим графики для оценки результатов.

Определение функции для загрузки и запуска модели

Запустите ячейку с кодом для генерации функции запуска модели.

In [ ]:
function start_model_engee()
    try
        engee.close("hydro_control_chart", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/hydro_control_chart.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/hydro_control_chart.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

Получение результатов моделирования

Запустим симуляцию модели с помощью функции сгенерированной выше.

In [ ]:
try
    start_model_engee()
    catch err
    end;

Запишем залогированные сигналы в переменную simout. И преобразуем их в массив данных.

In [ ]:
result = simout;
res = collect(result)
Out[0]:
2-element Vector{WorkspaceArray}:
 WorkspaceArray{Float64}("hydro_control_chart/Датчик давления.1")
 WorkspaceArray{Float64}("hydro_control_chart/Уставка.1")

Запишем в переменные значения с датчика давления и значение уставки.

In [ ]:
control_signal = collect(res[1])
pressure = collect(res[2])
Out[0]:
2001×2 DataFrame
1976 rows omitted
Rowtimevalue
Float64Float64
10.0100000.0
20.01100000.0
30.02100000.0
40.03100000.0
50.04100000.0
60.05100000.0
70.06100000.0
80.07100000.0
90.08100000.0
100.09100000.0
110.1100000.0
120.11100000.0
130.12100000.0
⋮⋮⋮
199019.89120000.0
199119.9120000.0
199219.91120000.0
199319.92120000.0
199419.93120000.0
199519.94120000.0
199619.95120000.0
199719.96120000.0
199819.97120000.0
199919.98120000.0
200019.99120000.0
200120.0120000.0

Визуализация полученных данных

In [ ]:
using Plots
plot(control_signal[:,1], control_signal[:,2], label="Уставка")
plot!(pressure[:,1], pressure[:,2], label="Датчик давления")
Out[0]:
No description has been provided for this image

На 5 секунде симуляции заданное давление увеличилось до 120 кПа. Давление трубопровода достигло уставки примерно на 10 секунде и находилось в районе установленного порога 100 Па.

Заключение

В данном примере мы продемонстрировали регулирование давления в трубопроводе с помощью управляющей логики, реализованной в блоке Chart.