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

Использование MATLAB внутри блока Engee Function

Открыть пример в Engee

В данном примере мы рассмотрим, как применять вставки кода на MATLAB внутри блока Engee Function. Для этого задействуем переменные persistent, которые позволяют расширить функционал кода MATLAB и хранят значения в себе даже после выхода из функции. Для этой демонстрации мы написали в MATLAB функцию счётчика, который сбрасывается в случае, если на вход приходит значение 1. Код функции представлен ниже.

image.png

Далее протестируем работу этой функции. Для этого подключим MATLAB и перейдём в папку с функцией.

In [ ]:
using MATLAB
mat"cd $(@__DIR__)"
In [ ]:
mat"cnt(0)"
mat"cnt(0)"
mat"cnt(0)"
Out[0]:
3.0
In [ ]:
mat"cnt(1)"
Out[0]:
0.0

Как мы видим, функция работает корректно каждый раз, когда мы её вызываем. С параметром rst=0 счётчик увеличивается, а при rst=1 сбрасывается.

Теперь, когда мы протестировали саму функцию, добавим вспомогательную функцию для запуска модели и создадим модель, в которой применим этот счётчик.

In [ ]:
# Подключение вспомогательной функции запуска модели.
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
Out[0]:
run_model (generic function with 1 method)

На рисунке ниже показана разработанная нами модель.

image.png

Теперь проанализируем код, представленный в блоке Engee Function.

image_2.png

Итак, последовательность действий: подключаем библиотеку MATLAB, после чего явно указываем путь до нашего файла со счётчиком и вызываем его, подавая результат на выход блока.

Теперь опишем цикл, в котором мы будем вызывать нашу модель. В нём счётчик будет сбрасываться на первом и третьем прогоне модели.

In [ ]:
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
Building...
Progress 0%
Progress 100%
Progress 100%
Значение счётчка на 1 запуске модели: [0.0]Building...
Progress 0%
Progress 100%
Progress 100%
Значение счётчка на 2 запуске модели: [1.0]Building...
Progress 0%
Progress 100%
Progress 100%
Значение счётчка на 3 запуске модели: [0.0]Building...
Progress 0%
Progress 100%
Progress 100%
Значение счётчка на 4 запуске модели: [1.0]Building...
Progress 0%
Progress 100%
Progress 100%
Значение счётчка на 5 запуске модели: [2.0]

В итоге наша функция работает корректно: в те прогоны, когда мы задаём "rst=1", счётчик равен нулю.

Вывод

Мы разобрали, как использовать вставки кода на MATLAB в блоке Engee Function, а также продемонстрировали возможность подключения к Engee Function файлов MATLAB. Как видно, эти функции легко применять, и они работают корректно.

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