Разработка алгоритмического встраиваемого кода для системы управления кондиционером
Данный пример нацелен на демонстрацию возможностей Engee в области разработки алгоритмического ПО и кодогенерации из моделей. Для примера взята упрощённая модель системы управления кондиционером.
Принцип работы
Данная модель имитирует контроль температуры воздуха в комнате за счет работы кондиционера. Пример является упрощенным, но достаточно наглядным. Блок AddTemperature имитирует колебания температуры комнаты; в данном примере колебания заданы синусоидой. Этот блок также добавляет к значению температуры коэффициент влияния кондиционера.
Кондиционер (AirCooler) в свою очередь, - это алгоритм, который в зависимости от того, больше или меньше желаемая температура в комнате, дает положительный или отрицательный коэффициент прироста температуры. В случае отсутствия питания, он не влияет на температуру в комнате. На рисунках ниже показана логика алгоритма, реализованная внутри этих блоков.
AddTemperature
AirCooler
Реализация запуска модели и работа с записанными данными
Загрузка и запуск модели:
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]
По результатам работы модели мы видим, что система кондиционирования успешно поддерживает температуру в комнате в пределах 25 градусов.
Генерация С кода из модели
Существует два способа генерации кода: при помощи команды engee.model.generate_code, либо при помощи графического интерфейса Engee. Далее рассмотрим оба варианта.
Рассмотрим синтаксис команды: первый аргумент указывает на путь расположения модели, второй аргумент указывает путь для сохранения сгенерированного кода, третий аргумент указывает на подсистему в модели, из которой генерируется код.
if isdir("$(@__DIR__)/AirCooler") # Проверка наличия папки
rm("$(@__DIR__)/AirCooler";force = true, recursive = true) # Удаление папки
end
engee.generate_code("$(@__DIR__)/conditioner_demo.engee", "$(@__DIR__)/AirCooler", subsystem_name="AirCooler")
[ Info: Generated code and artifacts: /user/start/examples/controls/Conditioner/AirCooler
По итогам выполнения генерации мы можем просмотреть сгенерированный код в папке AirCooler.
На рисунке выше, отображён способ генерации кода при помощи GUI Engee. Результат генерации представлен в папке demo_C_gen_AirCooler_code
Вывод
Мы разработали простую систему управления кондиционерами на основе логических блоков. Как видно из результатов моделирования, она хорошо справляется с задачей поддержания температуры в помещении. По результатам генерации кода мы получили читаемый и портируемый код, который можно использовать для переноса на реальное оборудование, например, встраиваемые процессоры или микроконтроллеры.