Использование MATLAB внутри блока Engee Function¶
В данном примере мы рассмотрим, как применять вставки кода на MATLAB внутри блока Engee Function. Для этого задействуем переменные persistent, которые позволяют расширить функционал кода MATLAB и хранят значения в себе даже после выхода из функции. Для этой демонстрации мы написали в MATLAB функцию счётчика, который сбрасывается в случае, если на вход приходит значение 1. Код функции представлен ниже.
Далее протестируем работу этой функции. Для этого подключим MATLAB и перейдём в папку с функцией.
using MATLAB
mat"cd $(@__DIR__)"
mat"cnt(0)"
mat"cnt(0)"
mat"cnt(0)"
mat"cnt(1)"
Как мы видим, функция работает корректно каждый раз, когда мы её вызываем. С параметром rst=0 счётчик увеличивается, а при rst=1 сбрасывается.
Теперь, когда мы протестировали саму функцию, добавим вспомогательную функцию для запуска модели и создадим модель, в которой применим этот счётчик.
# Подключение вспомогательной функции запуска модели.
function run_model( name_model)
Path = (@__DIR__) * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
model = engee.open( name_model ) # Открыть модель
model_output = engee.run( model, verbose=true ); # Запустить модель
else
model = engee.load( Path, force=true ) # Загрузить модель
model_output = engee.run( model, verbose=true ); # Запустить модель
engee.close( name_model, force=true ); # Закрыть модель
end
sleep(5)
return model_output
end
На рисунке ниже показана разработанная нами модель.
Теперь проанализируем код, представленный в блоке Engee Function.
Итак, последовательность действий: подключаем библиотеку MATLAB, после чего явно указываем путь до нашего файла со счётчиком и вызываем его, подавая результат на выход блока.
Теперь опишем цикл, в котором мы будем вызывать нашу модель. В нём счётчик будет сбрасываться на первом и третьем прогоне модели.
rst = 0;
for i in 1:1:5
if i == 1 || i == 3
rst = 1;
else
rst = 0;
end
run_model("MATLAB_in_Engee_models") # Запуск модели.
c = collect(Cnt)
print("Значение счётчика на "*string(i)*" запуске модели: "*string(c.value))
end
В итоге наша функция работает корректно: в те прогоны, когда мы задаём "rst=1", счётчик равен нулю.
Вывод¶
Мы разобрали, как использовать вставки кода на MATLAB в блоке Engee Function, а также продемонстрировали возможность подключения к Engee Function файлов MATLAB. Как видно, эти функции легко применять, и они работают корректно.