Работа с пользовательскими шинами 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. Этот блок имеет следующие параметры:

Для того чтобы автоматически сформировать типы шин, достаточно задать только имена входных и выходных сигналов через маску.
Чтобы посмотреть, как это работает, откройте маску блока (ПКМ по блоку/«Маска»/«Посмотреть маску»), перейдите на вкладку «Редактор кода» → «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. На вкладке Параметры указаны программные названия параметров из маски:

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

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