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

Работа с пользовательскими шинами BusSignal в блоках оборудования

Перед использованием пользовательских типов шин рекомендуется ознакомиться с блоками Создание шины и Выбор из шины.

В Engee предусмотрена поддержка пользовательских структурированных сигналов через тип BusSignal (подробнее см. здесь). Этот тип позволяет объединить логически связанные сигналы в единую структуру — шину, где каждому элементу соответствуют имя, тип и размерность (например, temperature::Int, position::Vector{Float64}, status::Bool).

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

(10, 3.2, [1, 2, 3])

можно использовать шину с явно заданными именами:

(temperature = 10, pressure = 3.2, position = [1, 2, 3])

С помощью типа BusSignal такая структура может быть точно описана и типизирована на уровне модели, что важно для формализации интерфейса данных оборудования.

Пользовательские шины в блоках оборудования

Рассмотрим динамическое формирование типов шин BusSignal на примере блока оборудования UM Cosimulation. Этот блок имеет следующие параметры:

hardware bussignal 1

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

Чтобы посмотреть, как это работает, откройте маску блока (ПКМ по блоку/«Маска»/«Посмотреть маску»), перейдите на вкладку «Редактор кода» → «Global» и в обратном вызове blockChangedCallback найдите следующий код:

input_val = mask.parameters.m_input_signal_names.value
output_val = mask.parameters.m_output_signal_names.value
input_val_count = length(input_val)
output_val_count = length(output_val)
engee.set_param!(engee.gcb(), "InputPort1BusType" => "BusSignal($(input_val), Tuple(fill(Float64, $(input_val_count))), ntuple(_ -> (), $(input_val_count)), :IN_UM_SIGNALS)")
engee.set_param!(engee.gcb(), "OutputPort1BusType" => "BusSignal($(output_val), Tuple(fill(Float64, $(output_val_count))), ntuple(_ -> (), $(output_val_count)), :OUT_UM_SIGNALS)")

В этом коде:

  • m_input_signal_names — имена входных сигналов (например, (:a,:b,:c));

  • m_output_signal_names — имена выходных сигналов;

  • input_val_count — количество входных сигналов;

  • output_val_count — количество выходных сигналов;

  • :IN_UM_SIGNALS — имя входной шины;

  • :OUT_UM_SIGNALS — имя выходной шины.

В коде устанавливается путь к текущему блоку с помощью функции gcb(), после чего считываются значения параметров маски m_input_signal_names и m_output_signal_names. Эти значения используются для формирования строкового представления типа BusSignal с заданными именами сигналов, базовыми типами (Float64), размерностями и именем шины. Чтобы значения считывались, перейдите в настройки блока оборудования UM Cosimulation и нажмите Посмотреть под маску, чтобы открыть параметры блока Engee Function. На вкладке Параметры указаны программные названия параметров из маски:

hardware bussignal 3 1

Затем функция engee.set_param! автоматически обновляет параметры Output bus type для Input port 1 (программное имя InputPort1BusType) и Output bus type (программное имя OutputPort1BusType) для Output port 1 на вкладке Порты, подставляя сгенерированные типы шин для входного и выходного портов:

hardware bussignal 4

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