Работа с данными в конечных автоматах
|
Страница в процессе разработки. |
Конечный автомат Engee — это самостоятельная сущность, которая управляет логикой, переходами и состояниями, но сама по себе изолирована от привычной библиотеки блоков Engee
и, как следствие, возможностей построения классических моделей.
Чтобы конечный автомат мог обмениваться данными с внешними блоками, используются данные блока Chart и его соответствующие порты. Например:
-
При создании выходных данных в блоке Chart автоматически появляется выходной порт, который можно соединить с другими элементами модели.
-
Аналогично, при создании входных данных появляется входной порт для получения информации извне.
-
Локальные данные существуют только внутри конечного автомата (внутри блока Chart) и не создают портов.
Следовательно, данные выполняют роль связующего интерфейса между конечным автоматом и остальной моделью: без них модель автомата остается отдельной сущностью, а с ними становится полноценной частью системы.
Для работы с данными конечных автоматов в Engee используется окно «Сигналы» — оно позволяет централизованно управлять всеми данными модели конечного автомата. С его помощью объединяются:

-
Список всех данных конечного автомата;
-
Категории данных (вход, выход, параметр);
-
Настройки типов данных, размерностей и комплексности.
Подход с одним окном для всех данных конечного автомата упрощает отладку и делает модель более прозрачной: все определения сосредоточены в одном месте, а не разбросаны по состояниям
и переходам
.
Категории данных
В окне «Сигналы» поддерживаются следующие категории данных:

-
Вход — данные, поступающие внутрь конечного автомата из внешней модели.
-
Выход — данные, которые конечный автомат экспортирует наружу.
-
Локальная переменная — данные, доступные только внутри конечного автомата (внутри блока Chart). Используются для хранения промежуточных вычислений и управления логикой состояний и переходов.
-
Параметр — фиксированные значения (параметрические данные), которые копируются из одноименной переменной рабочего пространства при запуске симуляции и не изменяется во время симуляции.
|
Данные из блока Chart не отображаются в окне переменных Например, если в Chart задан Параметр с именем Если присвоить значение переменной
|
Создание данных
Чтобы создать новые данные:
-
Откройте окно «Сигналы»;
-
Нажмите кнопку
; -
Задайте имя и характеристики данных в открывшемся окне, после нажмите «Добавить»:

Имена данных в окне «Сигналы» должны соответствовать именам этих данных в модели конечного автомата.
Помощник по символам
При запуске симуляции
или компиляции
Engee проверяет корректность модели конечного автомата. Если в ней встречаются неопределенные данные, то открывается «Помощник по символам». В нем можно:
-
Просмотреть найденные неопределенные имена;
-
Назначить для них категорию (например, «Выход»);
-
Подтвердить добавление в список Сигналы.

Задание типов данных
Каждым данным необходимо указать тип — это определяет, как они будут храниться и использоваться в ходе симуляции. Поддерживаются типы, согласованные с системой типов языка Julia:
-
Inherit: auto— наследование типа данных; -
Int8,Int16,Int32,Int64,Int128— целые знаковые числа; -
UInt8,UInt16,UInt32,UInt64,UInt128— целые беззнаковые числа; -
Float16,Float32,Float64— числа с плавающей точкой; -
Bool— логический тип; -
Fixed-point— фиксированная точка (для оптимизации вычислений).
Предположим, в панели «Сигналы» у блока Chart вы создали выходные данные , , , . Тогда внутри состояния можно писать так:
# Код, выполняемый при активном состоянии (entry / during / exit)
s = [1, 2, 3, 4, 5] # вектор длины 5
a = [1, 2, 3, 4, 5, 6, 7] # вектор длины 7
# Назначаем части массивов в выходные порты
q = s[1:4] # q == [1, 2, 3, 4]
w = a[1:4] # w == [1, 2, 3, 4]
# Двумерный выход (2×3)
M = reshape(collect(1:6), 2, 3) # матрица 2×3
# При желании можно привести тип:
# M = Float32.(reshape(collect(1:6), 2, 3))
Если требуется создать матрицу заданного типа/размера без инициализации, то используйте явное создание массива:
B = Array{Float64,2}(undef, 3, 3) # 3×3 матрица с неинициализированными значениями (произвольное содержимое памяти)
# Перед использованием обязательно присвойте значения, например:
B .= 0.0
# Или создайте сразу инициализированный массив:
# B = zeros(Float64, 3, 3)
# B = fill(1.0, 3, 3)
undef не заполняет массив нулями. Содержимое зависит от ранее использованной памяти, поэтому такой массив нужно инициализировать перед чтением его элементов.
|
В итоге получится следующая модель конечного автомата:
-
Внутри блока Chart:

-
Модель Engee (вне блока Chart):

Размерность и комплексность
Кроме типа данных можно задать размерность (скаляр, вектор или массив) и комплексность.
-
Размерность — указывается в окне «Сигналы» как последовательность целых чисел, разделенных запятыми:
-
-1(значение по умолчанию) — размерность не фиксируется и определяется автоматически:-
Для входа/выхода — берется из подключенного порта внешней модели;
-
Для параметра — берется из одноименной переменной рабочего пространства (workspace, вне Chart);
-
Для локальных данных — берется из фактически присвоенных значений в коде диаграммы.
Такой режим удобен, если форма может меняться.
-
-
Явная форма — введите числа через запятую:
-
n— вектор изnэлементов; -
n, m— матрицаn×m; -
n, m, k— трехмерный массивn×m×k.Последовательность
n[, m[, k…]]в поле Размерность соответствует числовым аргументам конструкторов массивов Julia. Например,n, m→Matrix{Float32}(undef, n, m)(=Array{Float32,2}(undef, n, m)).
-
-
-
Комплексность — определяет, могут ли данные содержать комплексные значения:
-
Inherit: auto — значение наследуется автоматически от связанной переменной или сигнала во внешней модели. Например, если в рабочем пространстве или во входном блоке используется комплексный тип, то и данные в конечном автомате будут комплексными.
-
Off — наследование отключено, данные всегда действительные.
-
On — наследование выключено, данные всегда комплексные.
-
Рекомендации по использованию
-
Используйте «Вход» и «Выход» для связи конечного автомата с внешней моделью.
-
Явно указывайте тип данных — это повышает предсказуемость работы конечного автомата и помогает избежать ошибок.
-
Применяйте «Параметр» для констант и коэффициентов, чтобы сделать модель более читаемой.
-
В случае работы с комплексными числами включайте флаг «Комплексность»: включено.

