Как устроена MetaSCADA
Платформа разделена на три поверхности. Studio редактирует исходный проект. Builder проверяет его и формирует пакет .metapkg. Runtime загружает пакет, владеет соединениями с оборудованием и отдаёт операторский интерфейс в браузер.
| Часть | Что делает | Чего не делает |
|---|---|---|
| Studio | Проект, экраны, компоненты, устройства, теги, диагностика | Не должна напрямую владеть рабочими Modbus/OPC UA-сессиями |
| Builder | Валидация, компиляция, SHA‑256, воспроизводимый пакет | Не исполняет технологический процесс |
| Runtime | Опрос, качество, команды, аварии, история, аудит, HMI | Не требует открытого Studio или браузера |
Подготовка рабочего места
Для переносимой сборки
- Windows x64 и распакованный архив MetaSCADA.
- Microsoft Edge WebView2 Runtime для центрального холста Studio.
- .NET не требуется, если сборка создана как self-contained.
Для разработки из репозитория
- Windows и .NET SDK, совместимый с
net10.0-windows. - Восстановленные локальные зависимости решения.
- Права администратора нужны только для установки или обслуживания Windows-службы.
dotnet restore MetaSCADA.sln dotnet build MetaSCADA.sln --no-restore dotnet run --project src/MetaSCADA.Studio
Быстрый старт
- Запустите Studio. На начальном экране выберите «Создать проект».
- Укажите каталог, ID и понятное имя проекта. После открытия появится рабочее пространство.
- Создайте устройство и канал Simulator, Modbus TCP или OPC UA. Для первого знакомства безопаснее Simulator.
- Добавьте теги, затем перетащите Boolean, Double или String-тег из дерева на пустой холст — Studio создаст подходящий базовый элемент.
- Настройте экран, свойства и привязки. Сохраните проект.
- Нажмите «Собрать». Исправьте ошибки из панелей «Вывод» и «Проблемы».
- Нажмите «Запустить». Studio пересоберёт пакет, запустит локальный Runtime, проверит
/healthи предложит открыть HMI. - Нажмите «Онлайн», чтобы видеть реальные состояния тегов без неявной загрузки дальнейших правок.
Рабочее пространство Studio
До открытия проекта Studio показывает стартовый экран с командами создания/открытия и списком последних проектов. После открытия доступны дерево проекта, палитра, документы, инспектор и нижние панели.
| Область | Назначение |
|---|---|
| Дерево проекта | Устройства, каналы, теги, экраны, компоненты, фейсплейты, изображения и переменные HMI |
| Палитра | Стандартные и проектные компоненты; двойной щелчок или перенос на холст |
| Документ | «Дизайнер», XML/MetaML и разделённый вид |
| Свойства | Геометрия, внешний вид, прямые и динамические привязки, вкладка «События» |
| Нижняя панель | Вывод сборки, проблемы, журнал и развёртывание |
Управление холстом
- Колесо — вертикальная прокрутка;
Shift+колесо— горизонтальная. Ctrl+колесо— масштаб; средняя кнопка — панорама.- Рамка ЛКМ по свободному месту — множественное выделение.
- Стрелки — 1 px;
Shift+стрелка— 10 px. Ctrl+C/V/D— копирование, вставка и дублирование;Ctrl+Z/Y— отмена и повтор.
Проект и его файлы
Корень проекта содержит project.xml. Экраны, компоненты и другие документы хранятся раздельно, чтобы изменения были удобны для Git и не собирались в один монолитный файл.
ProjectName/
project.xml
tags.xml
screens/
main.screen.xml
components/
status-panel.component.xml
assets/
...- ID стабильны и чувствительны к регистру.
- Пути относительны каталогу проекта и не могут выходить наружу через
..или reparse point. - Неизвестные элементы и атрибуты считаются ошибкой, а не игнорируются.
- Сохранение атомарное: документы записываются до публикации обновлённого
project.xml.
Операции в дереве
Через контекстное меню можно создавать, переименовывать, дублировать, перемещать и удалять элементы. Перед удалением Studio проверяет зависимости; используемый тег удалить нельзя, пока существуют ссылки.
Устройства и каналы протоколов
- В дереве создайте устройство: задайте ID, название, IP/имя узла, расположение, описание и префикс тегов.
- После сохранения добавьте канал. Одно устройство может иметь несколько Modbus TCP и OPC UA-каналов, включая повторные каналы одного протокола.
- Для Modbus задайте порт, Unit ID, период опроса и таймауты. IP остаётся свойством устройства.
- Для OPC UA укажите endpoint и параметры просмотра пространства адресов.
- Выполните диагностику подключения и только затем создавайте рабочие теги.
Modbus TCP
Поддерживаются coils, discrete inputs, holding registers и input registers. У тега настраиваются функция чтения/записи, тип, адрес, порядок байтов и регистров. Дискретные входы и Input Registers доступны только для чтения.
OPC UA
Studio просматривает адресное пространство через диагностический API Runtime. При импорте сохраняются NodeId, Namespace URI, Browse Path, исходное имя, тип, доступность и состояние проверки. Повторная синхронизация не удаляет отсутствующие теги автоматически и старается сохранить стабильный TagId по Namespace URI и Browse Path.
Теги, генерация и Excel
Основные свойства
Типы данных: Boolean, Integer, Double и String. Для тега задаются устройство/канал, адрес, период опроса, единица, описание, writable, масштаб, смещение, test value и низкая/высокая аварийная граница.
Диапазон Modbus
- Откройте канал и выберите добавление тегов Modbus TCP.
- Задайте префиксы ID и имени, начальный адрес, количество и шаг.
- Генератор создаёт до 1000 тегов Holding Register / FC03 / UInt16.
- После генерации измените нужные элементы вручную, массово или через Excel.
Excel-обмен
Экспорт канала создаёт настоящий .xlsx без установленного Microsoft Excel. Книга содержит настройки и теги, справочник и скрытые метаданные со стабильными идентификаторами и контрольными хешами.
- Экспортируйте выбранное устройство или канал.
- Измените разрешённые колонки в книге.
- Импортируйте файл и изучите предварительное сравнение: добавленные, изменённые, неизменные, отсутствующие и конфликтующие строки.
- Выберите режим: «Только добавить», «Добавить и обновить» или «Заменить выбранную область».
- Для отсутствующих строк выберите: оставить, отключить или удалить.
- Подтвердите импорт. Он применяется транзакционно и создаёт один шаг Undo.
Экраны, слои и компоненты
Экран
При создании задайте ID, название и размер. Дополнительно настраиваются шаг сетки, сплошной фон или градиент с углом, рамка и скругление. Экран сохраняется как отдельный MetaML-документ.
Слои
Слой можно создать, переименовать, скрыть и заблокировать. Скрытый слой не попадает в проекцию, заблокированный отображается, но его объекты нельзя двигать и изменять мышью.
Компоненты и фейсплейты
- Проектный компонент имеет определение и экземпляры с параметрами — содержимое не копируется в каждый экран.
- Фейсплейт хранится отдельно, доступен в палитре и может открываться кнопкой как закрываемое модальное окно Runtime.
- Кнопка поддерживает запись в тег, переход на экран и открытие фейсплейта.
- PNG, JPEG и SVG импортируются как ресурсы, копируются в проект и включаются в пакет.
Базовые элементы
Текст может быть статическим или форматированным значением. «Число» совмещает индикацию и ввод; ввод включается свойством «Разрешить ввод». Дискретный индикатор показывает 0/1/нет данных, многостатусный — отображает таблицу значение=подпись=цвет.
MetaML и текстовое редактирование
MetaML — строгий декларативный XML-формат. Он не содержит исполняемого кода. Редактор подсвечивает синтаксис, показывает номера строк и диагностику, а изменения синхронизируются с дизайнером через Project Model.
<Screen schemaVersion="0.2" id="main"
name="Ventilation overview"
width="1920" height="1080" grid="10">
<Button id="start" x="290" y="240"
width="620" height="160"
text="Пуск"
command="Objects.Ventilation.Fan.Start" />
</Screen>- Readers принимают версии 0.1 и 0.2; новая сериализация сохраняет 0.2.
- Вложенные проектные компоненты в формате v0.2 не разрешены.
- Ошибки ID, ссылок, чисел, параметров и неизвестных атрибутов блокируют корректную сборку и имеют привязку к исходному файлу.
Привязки свойств
Привязка находится рядом с конкретным свойством объекта. Тег можно перетащить из дерева на свойство или на сам объект.
| Режим | Когда применять |
|---|---|
| Direct | Значение тега напрямую совместимо со свойством |
| BooleanMap | Два результата для false/true |
| RangeMap | Результат зависит от числового диапазона |
| ValueMap | Явное сопоставление отдельных значений |
| Gradient | Плавное преобразование числа в цвет |
Для динамического правила задаются fallback и политика плохого качества. Число не считается цветом автоматически: для него нужен RangeMap, ValueMap или Gradient.
Перетаскивание Boolean, Integer/Double и String-тега на пустой холст создаёт соответственно дискретный индикатор, «Число» или «Текст». На существующий элемент тег применяется только к совместимому свойству.
События, действия и переменные HMI
Внутренние переменные доступны через «Проект → Переменные HMI» и ветку «Системы → Переменные HMI». У выбранного объекта события настраиваются во вкладке «События»; без выбранного объекта эта вкладка относится к открытию и закрытию экрана.
События
Клик/двойной клик, нажатие и отпускание мыши, наведение и уход, фокус, изменение значения, до записи, успех/ошибка записи, открытие и закрытие экрана.
Действия
Установить или переключить значение, скопировать тег/переменную, записать тег, задержка, импульс, открыть экран/фейсплейт, показать сообщение и передать фокус. У каждого действия может быть условие.
Сборка и локальный запуск
«Собрать»
Studio сохраняет исходники, валидирует проект и записывает <project>/build/<project-id>.metapkg. Пакет — ZIP-контейнер со строгим manifest, тегами, Render Scene, viewer и общим renderer. Runtime проверяет версию, пути, ссылки и SHA‑256 до запуска.
«Запустить»
Команда выполняет детерминированную цепочку: сохранить → собрать → остановить только принадлежащий Studio preview → запустить новый Runtime → проверить /health → открыть браузер. Studio сверяет PID, ID проекта и хеш содержимого, поэтому старый процесс не получает статус актуального.
dotnet run --project src/MetaSCADA.Build.Cli -- build examples/ventilation artifacts/ventilation.metapkg dotnet run --project src/MetaSCADA.Runtime -- --package artifacts/ventilation.metapkg --data artifacts/runtime-data --urls http://127.0.0.1:5080
Что делает Runtime
- Верифицирует пакет до старта процессной логики.
- Единолично владеет Simulator, Modbus TCP и OPC UA-драйверами.
- Хранит исходное и эффективное значение, качество, время и диагностику.
- Исполняет команды и подтверждает запись обратным чтением.
- Ведёт Alarm Engine, SQLite historian и audit.
- Отдаёт экраны, фейсплейты, HMI-переменные и realtime-потоки браузеру и Studio.
Закрытие браузера удаляет только клиентскую подписку. Закрытие Studio не должно останавливать установленную службу или отдельный Runtime.
| Данные | Смысл |
|---|---|
| Source | Последнее значение, полученное от драйвера |
| Decoded / raw | Результат протокольного декодирования и исходные регистры/HEX |
| Effective | Значение, которое видит HMI после преобразований и возможной форсировки |
| Quality | Качество данных и диагностическая ошибка |
Онлайн-инжиниринг, запись и форсировка
| Команда | Что происходит |
|---|---|
| Онлайн | Подключение к работающей конфигурации без загрузки правок из редактора |
| Применить | Сохранение, сборка и явная замена локальной Runtime-конфигурации без открытия браузера |
| Запустить | То же применение, затем открытие HMI в браузере |
Онлайн-наблюдатель поддерживает поиск, избранные теги и фильтрацию по устройству/каналу. Для тега видны effective, source, decoded, raw, quality, timestamp, age, адрес, последняя запись и ошибка.
Запись
- Runtime проверяет, что тег writable и не заблокирован форсировкой.
- Команда поступает единому command service и драйверу.
- Успех фиксируется только после совпавшего обратного чтения.
- При расхождении результат отмечается как отклонённый с причиной.
Форсировка
Задайте значение и при необходимости срок действия. Форсировка заменяет effective value, но опрос источника продолжается. В интерфейсе появляется замок, source остаётся виден. После снятия немедленно возвращается последнее source value. Установка/снятие и команды пишутся в аудит.
Развёртывание Windows Runtime
В Studio откройте нижний раздел «Развёртывание». Он отделён от верхних кнопок локального preview.
- Адрес Runtime. Укажите host и порт, затем нажмите «Проверить окружение». Проверяются выпуск, служба, PID и владелец порта.
- Подготовка выпуска. Нажмите «Собрать выпуск». Создаётся self-contained Runtime, пакет проекта, manifest и SHA‑256.
- Установка. Нажмите «Установить / обновить службу», подтвердите предупреждение и UAC.
- Проверка. Откройте Runtime по HTTPS, проверьте health, экран, команды, историю и аудит.
powershell -ExecutionPolicy Bypass ` -File deploy/build_runtime_release.ps1 ` -ProjectPath "C:\path\to\project"
powershell -ExecutionPolicy Bypass ` -File deploy/install_runtime_service.ps1 ` -ReleaseDirectory "C:\path\to\runtime-release" ` -Urls "https://0.0.0.0:5443" ` -HttpsCertificate "C:\secure\metascada-runtime.pfx" ` -HttpsPassword "certificate-password"
Установщик использует неизменяемый каталог выпуска, защищает ProgramData для SYSTEM/Administrators, настраивает автоматический старт и три ступени восстановления. Если новый процесс не достигает Running, команда службы возвращается к предыдущему выпуску.
Backup, rollback и restore
Рабочие данные обычно находятся в C:\ProgramData\MetaSCADA\Runtime. Защитите PFX, signing key, историю команд развёртывания и резервные копии.
Откат выпуска
«Откатить» меняет указатели current/previous и команду службы, не трогая рабочие данные.
Резервная копия
Backup кратко останавливает службу, чтобы согласованно скопировать SQLite, WAL, identities и signing key, затем возвращает ранее работавшую службу в работу.
Восстановление
Restore требует явного подтверждения и прав администратора. Выполняйте его сначала на одноразовом пилотном хосте и сверяйте хеши пакета и истории.
powershell -ExecutionPolicy Bypass -File deploy/backup_runtime.ps1 powershell -ExecutionPolicy Bypass -File deploy/rollback_runtime_service.ps1 powershell -ExecutionPolicy Bypass -File deploy/restore_runtime_backup.ps1 ` -BackupDirectory "C:\ProgramData\MetaSCADA\Backups\20260810-120000" ` -ConfirmRestore
Диагностика неисправностей
| Симптом | Проверка |
|---|---|
| Не виден холст Studio | Установите Microsoft Edge WebView2 Runtime; затем перезапустите Studio |
| «Собрать» завершилось ошибкой | Откройте «Вывод» и «Проблемы», исправьте MetaML, ID, ссылки и отсутствующие ресурсы |
| Runtime не стартует | Проверьте порт, полный журнал запуска, существование .metapkg и результат SHA‑256 |
| Studio показывает «устарел» | Проект изменён после запуска; используйте «Применить» или «Запустить» |
| OPC UA browse не работает | Запустите актуальный Runtime, проверьте endpoint, TCP-доступность и доверие сертификату |
| Modbus значение неверное | Проверьте zero-based адрес, область, Unit ID, encoding, порядок байтов/регистров, scale и offset |
| Запись отклонена | Проверьте writable, активную форсировку и совпадение обратного чтения |
| Не получается удалить тег | Откройте список использований и сначала удалите/замените привязки |
Для развёртывания Studio показывает этап, native exit code, вывод системной команды и путь к полному журналу. Не пытайтесь повторять установку, пока причина предыдущего сбоя не зафиксирована.
Границы текущей версии
- Пользователи, роли и права не активны; вкладка «Безопасность» — заглушка.
- Чистый Windows-хост, reboot/recovery, восстановление копии и автоматический rollback должны пройти внешнюю приёмку.
- Автоматические тесты драйверов не заменяют проверку с вашим ПЛК, OPC UA-сервером, сетью и сертификатами.
- Portable-сборка подходит для редактирования и локального preview. Производственную службу разворачивайте осознанно, с администратором и планом восстановления.
- Runtime пилотной версии следует держать в доверенном сегменте, недоступном из публичной сети.
Ничего не найдено
Попробуйте более короткий запрос: «тег», «Runtime», «OPC» или «backup».