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

Работа с данными в конечных автоматах

Страница в процессе разработки.

Конечный автомат Engee — это самостоятельная сущность, которая управляет логикой, переходами и состояниями, но сама по себе изолирована от привычной библиотеки блоков Engee block library icon и, как следствие, возможностей построения классических моделей.

Чтобы конечный автомат мог обмениваться данными с внешними блоками, используются данные блока Chart и его соответствующие порты. Например:

  • При создании выходных данных в блоке Chart автоматически появляется выходной порт, который можно соединить с другими элементами модели.

  • Аналогично, при создании входных данных появляется входной порт для получения информации извне.

  • Локальные данные существуют только внутри конечного автомата (внутри блока Chart) и не создают портов.

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

Для работы с данными конечных автоматов в Engee используется окно «Сигналы» — оно позволяет централизованно управлять всеми данными модели конечного автомата. С его помощью объединяются:

state machines variables ru

  • Список всех данных конечного автомата;

  • Категории данных (вход, выход, параметр);

  • Настройки типов данных, размерностей и комплексности.

Подход с одним окном для всех данных конечного автомата упрощает отладку и делает модель более прозрачной: все определения сосредоточены в одном месте, а не разбросаны по состояниям stateflow state и переходам stateflow default transition.

Категории данных

В окне «Сигналы» поддерживаются следующие категории данных:

state machines variables 1 ru

  • Вход — данные, поступающие внутрь конечного автомата из внешней модели.

  • Выход — данные, которые конечный автомат экспортирует наружу.

  • Локальная переменная — данные, доступные только внутри конечного автомата (внутри блока Chart). Используются для хранения промежуточных вычислений и управления логикой состояний и переходов.

  • Параметр — фиксированные значения (параметрические данные), которые копируются из одноименной переменной рабочего пространства при запуске симуляции и не изменяется во время симуляции.

Данные из блока Chart не отображаются в окне переменных variables article 2 1. Единственная связь с этим окном — через переменные рабочего пространства (workspace), на которые может ссылаться Параметр внутри Chart:

Например, если в Chart задан Параметр с именем foo, но переменной foo нет в рабочем пространстве (и в окне переменных), то при компиляции/симуляции модели возникнет ошибка.

Если присвоить значение переменной foo в рабочем пространстве (например через командную строку img 41 1 2), то:

  • Переменная foo появится в окне переменных;

  • Значение переменной станет доступно во время симуляции для всех блоков Chart, где в окне «Сигналы» Параметр ссылается на foo.

Создание данных

Чтобы создать новые данные:

  1. Откройте окно «Сигналы»;

  2. Нажмите кнопку state machines variables icon;

  3. Задайте имя и характеристики данных в открывшемся окне, после нажмите «Добавить»:

    state machines variables panel ru

    Имена данных в окне «Сигналы» должны соответствовать именам этих данных в модели конечного автомата.

Помощник по символам

При запуске симуляции start button или компиляции compile button 1 Engee проверяет корректность модели конечного автомата. Если в ней встречаются неопределенные данные, то открывается «Помощник по символам». В нем можно:

  • Просмотреть найденные неопределенные имена;

  • Назначить для них категорию (например, «Выход»);

  • Подтвердить добавление в список Сигналы.

state symbol wizard ru

Задание типов данных

Каждым данным необходимо указать тип — это определяет, как они будут храниться и использоваться в ходе симуляции. Поддерживаются типы, согласованные с системой типов языка 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:

    state machines variables example ru

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

    state machines variables example 2

Размерность и комплексность

Кроме типа данных можно задать размерность (скаляр, вектор или массив) и комплексность.

  • Размерность — указывается в окне «Сигналы» как последовательность целых чисел, разделенных запятыми:

    • -1 (значение по умолчанию) — размерность не фиксируется и определяется автоматически:

      • Для входа/выхода — берется из подключенного порта внешней модели;

      • Для параметра — берется из одноименной переменной рабочего пространства (workspace, вне Chart);

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

        Такой режим удобен, если форма может меняться.

    • Явная форма — введите числа через запятую:

      • n — вектор из n элементов;

      • n, m — матрица n×m;

      • n, m, k — трехмерный массив n×m×k.

        Последовательность n[, m[, k…]] в поле Размерность соответствует числовым аргументам конструкторов массивов Julia. Например, n, mMatrix{Float32}(undef, n, m) (= Array{Float32,2}(undef, n, m)).

  • Комплексность — определяет, могут ли данные содержать комплексные значения:

    • Inherit: auto — значение наследуется автоматически от связанной переменной или сигнала во внешней модели. Например, если в рабочем пространстве или во входном блоке используется комплексный тип, то и данные в конечном автомате будут комплексными.

    • Off — наследование отключено, данные всегда действительные.

    • On — наследование выключено, данные всегда комплексные.

Рекомендации по использованию

  • Используйте «Вход» и «Выход» для связи конечного автомата с внешней моделью.

  • Явно указывайте тип данных — это повышает предсказуемость работы конечного автомата и помогает избежать ошибок.

  • Применяйте «Параметр» для констант и коэффициентов, чтобы сделать модель более читаемой.

  • В случае работы с комплексными числами включайте флаг «Комплексность»: включено.

Полезные ссылки