СТАБУР
Технология· 7 мин чтения

ENUM и структуры в ST: Как не сломать мнемосхему и отчёты

Перечисления состояний в ST для HMI, согласованность с автоматом, ошибки копирования в визуализацию, STRUCT в Modbus, шаблон соглашения по ENUM для команды

Короткий ответ: чтобы HMI и отчёты не расходились с реальностью, состояния и режимы в программе держат в одном перечислении (ENUM), с одной таблицей подписей для экрана и архива, без дубля «своих» чисел в визуализации. STRUCT группирует смысл («температура + время + качество»), но в Modbus и в отчёте нужна явная карта полей, иначе смещение на одно слово ломает всё.

В Structured Text (ST) ENUM и STRUCT - удобные инструменты. Их недостаток - невидимые для оператора: на экране не «ENUM», а число или строка из таблицы перевода. Когда визуализацию собирают отдельно от логики, типичная поломка - скопировали старые значения после добавления состояния в середину ENUM или разошлись порядки с конечным автоматом. Ниже - как связать программу, мнемосхему и отчёты без сюрпризов на пуске.


Зачем ENUM в ПЛК и что видит HMI

ENUM в программе - это абстрактное имя (E_LINE_STATE.Idle) и целочисленный порядок в памяти. HMI смотрит обычно число (или отдельное слово текста, если его отдают явно). Оператору показывают текст: «Останов», «Пуск», «Авария» - из списка соответствий.

Правило: один источник правды для значения состояния - переменная Перехода/шага в CASE автомата. Подпись на экране - не второе мнение, а слой отображения над тем же числом. Две разные таблицы перевода на панели и в SCADA - классическая причина «на экране одно, в отчёте другое».

Согласованность с автоматом (CASE и ENUM)

Если переходы завязаны на MyState:

•Не сравнивайте с «сырыми» константами 3 и 7 разбросом по коду - только через имена ENUM.

•При добавлении нового состояния обновите автомат, HMI-карту и документацию одним коммитом/ревизией, иначе кто-то прочитает старый Excel.

•Зарезервируйте значение для «не инициализировано» / «обрыв датчика», чтобы ноль не значил случайно «Работа».

Шаблон логики с конечным автоматом - в статье про CODESYS и конечные автоматы; связь картинки с ПЛК - в материале про мнемосхему.

STRUCT: плюсы для логики, ловушки для экрана и Modbus

STRUCT объединяет поля (уставка, факт, качество, метка времени). В ST это читается красиво; в Modbus структура - это плоский набор регистров с порядком, зафиксированным в карте. См. Modbus-карту для HMI.

Типовые ошибки:

•Поменяли порядок полей в STRUCT в одной ревизии - HMI продолжил читать «второе поле как первое».

•Выравнивание и размер - на некоторых платформах между полями есть padding; в отчёт уехал «хвост» из соседней переменной.

•Вложенные STRUCT - в карте регистров легко запутать смещение; для критичного лучше плоский набор или одна явная «упаковка» в DWORD с контрольной суммой для отладки, а не десяток уровней.

Типичные ошибки копирования «из ПЛК в визуализацию»

Дублирование ENUM вручную: в CODESYS одно перечисление, в MasterSCADA другой список строк. Добавили FaultRecovering только в ПЛК - на экране «пусто» или старая подпись.

Сортировка списка по алфавиту в конфигураторе HMI - порядок на экране не совпадает с порядком в программе; оператор ищет аварию, инженер - по коду.

Разные версии проекта: панель залили от вчера, ПЛК - от позавчера. Числа совпали, смысл - нет.

Строка вместо ENUM на границе: в отчёт пишут текст с экрана, в ПЛК - число; локализация и опечатка ломают сводку.

Магические числа в анимации: «если tag=4, красный круг» - через месяц в ENUM четвёртым стало другое состояние.

Лечение: экспорт таблицы состояний из одного места (скрипт из проекта PLC, CSV в репозитории) и импорт в HMI, или генерация подписей из одного источника. Минимум - журнал изменений ENUM в readme проекта.

Отчёты и архив: что писать в базу

В отчёт и historian уходит либо число состояния с отдельной справочной таблицей (версия справочника в шапке отчёта), либо и число, и текст снимка на момент записи. Писать только текст без кода состояния - удобно смене, больно при смене терминологии.

Для СТАБУР в связке CODESYS или MasterSCADA 4D принцип один: тег архива = тот же, что и для межпоточной логики, не «украшенная» копия.

Шаблон текстового соглашения по именам ENUM для команды

Практический чек-лист перед пуском

1.В проекте ПЛК нет «голых» чисел для состояний вне ENUM.

2.Таблица перевода на HMI совпадает с последней ревизией ENUM (проверка diff).

3.Для каждого состояния есть текст и цвет по регламенту цветов на HMI.

4.В архив пишется код состояния; отчёт join на справочник с версией.

5.После обновления прошивки - контрольный прогон всех переходов с записью в журнал.


FAQ

Можно ли отдавать на HMI сразу строку из ST?

Можно, если одно поле и контролируемая длина; для надёжности часто отдают INT + таблица на экране.

Что хуже: один большой ENUM или несколько маленьких?

Несколько ENUM по подсистемам проще сопровождать, чем «бог-перечисление» на весь завод.

MasterSCADA меняет правила?

Имена и таблицы всё равно нужно версионировать; источник смысла - ПЛК.


Внутренняя перелинковка

•Мнемосхема без путаницы;

•Modbus-карта для экрана оператора;

•HMI для оператора: иерархия и аварии;

•CODESYS 3.5: конечные автоматы;

•Structured Text: справочник и ошибки;