ENUM и структуры в ST: Как не сломать мнемосхему и отчёты
2026-05-21 08:52
Короткий ответ: чтобы 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.
•Зарезервируйте значение для «не инициализировано» / «обрыв датчика», чтобы ноль не значил случайно «Работа».
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 меняет правила?
Имена и таблицы всё равно нужно версионировать; источник смысла - ПЛК.