Документация 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("hydro_control_chart/Датчик давления.1")
 WorkspaceArray("hydro_control_chart/Уставка.1")

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

In [ ]:
control_signal = collect(res[1])
pressure = collect(res[2])
Out[0]:

2,001 rows × 2 columns

timevalue
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
140.13100000.0
150.14100000.0
160.15100000.0
170.16100000.0
180.17100000.0
190.18100000.0
200.19100000.0
210.2100000.0
220.21100000.0
230.22100000.0
240.23100000.0
250.24100000.0
260.25100000.0
270.26100000.0
280.27100000.0
290.28100000.0
300.29100000.0

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

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

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

Заключение

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

Блоки, использованные в примере