Разработка алгоритмического встраиваемого кода для системы управления кондиционером

Данный пример нацелен на демонстрацию возможностей Engee в области разработки алгоритмического ПО и кодогенерации из моделей. Для примера взята упрощённая модель системы управления кондиционером.

image_2.png

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

Данная модель имитирует контроль температуры воздуха в комнате за счет работы кондиционера. Пример является упрощенным, но достаточно наглядным. Блок AddTemperature имитирует колебания температуры комнаты; в данном примере колебания заданы синусоидой. Этот блок также добавляет к значению температуры коэффициент влияния кондиционера.

Кондиционер (AirCooler) в свою очередь, - это алгоритм, который в зависимости от того, больше или меньше желаемая температура в комнате, дает положительный или отрицательный коэффициент прироста температуры. В случае отсутствия питания, он не влияет на температуру в комнате. На рисунках ниже показана логика алгоритма, реализованная внутри этих блоков.

AddTemperature

AddTemperature.jpg

AirCooler

AirConditioner.jpg

Реализация запуска модели и работа с записанными данными

Загрузка и запуск модели:

modelName = "conditioner_demo";
model = modelName in [m.name for m in engee.get_all_models()] ? model = engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
engee.run();

Загрузка и визуализация данных, полученных в ходе симуляции, осуществляется путем чтения csv-файлов с показателями температуры в комнате.

using CSV, DataFrames
t = Matrix(CSV.read("$(@__DIR__)/temperature.csv", DataFrame)); #загрузка данных

using Plots # Подключение библиотеки для построение графиков
plotly() # Подключение бэкэнда - метода отображения графики
plot(t[:,1], t[:,2], xlabel="Время в минутах", ylabel="температура", title="Изменение температуры в комнате") # Построение графика
[ Info: Precompiling PlotlyKaleido [f2990250-8cf9-495f-b13a-cce12b45703c]

interactive-scripts/images/controls_Conditioner_demo/91cfc28967e57b102bf86ef3547c442d63adb487

По результатам работы модели мы видим, что система кондиционирования успешно поддерживает температуру в комнате в пределах 25 градусов.

Генерация С кода из модели

Существует два способа генерации кода: при помощи команды engee.model.generate_code, либо при помощи графического интерфейса Engee. Далее рассмотрим оба варианта.

Рассмотрим синтаксис команды: первый аргумент указывает на путь расположения модели, второй аргумент указывает путь для сохранения сгенерированного кода, третий аргумент указывает на подсистему в модели, из которой генерируется код.

if isdir("$(@__DIR__)/AirCooler") # Проверка наличия папки
    rm("$(@__DIR__)/AirCooler";force = true, recursive = true) # Удаление папки
end

engee.model.generate_code("$(@__DIR__)/conditioner_demo.engee", "$(@__DIR__)/AirCooler", "AirCooler")
"Created directory - /user/start/examples/controls/Conditioner/AirCooler"

По итогам выполнения генерации мы можем просмотреть сгенерированный код в папке AirCooler.

image_2.png

На рисунке выше, отображён способ генерации кода при помощи GUI Engee. Результат генерации представлен в папке demo_C_gen_AirCooler_code

Вывод

Мы разработали простую систему управления кондиционерами на основе логических блоков. Как видно из результатов моделирования, она хорошо справляется с задачей поддержания температуры в помещении. По результатам генерации кода мы получили читаемый и портируемый код, который можно использовать для переноса на реальное оборудование, например, встраиваемые процессоры или микроконтроллеры.

Загрузить пример в Engee

Чтобы скачать пример себе в файловый браузер, скопируйте и выполните следующие команды. Пример появится по адресу start/examples в соответствующей папке.

# Проверка наличия директории для примера
if isdir("/user/start/examples/controls/Conditioner")
	rm("/user/start/examples/controls/Conditioner"; force = true, recursive = true)
end

# Копирование примера на диск Engee
run(`git clone https://git.engee.com/learn-engee/examples/controls/Conditioner.git /user/start/examples/controls/Conditioner`)

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