Система диспетчерского управления и сбора данных для технологических объектов управления
Система для работы с Modbus RTU устройствами через COM порты (RS-485 интерфейс). Аналог коммерческого ПО MasterOPC Universal Modbus Server.
- ✅ Работа с Modbus RTU устройствами через COM порты
- ✅ Визуализация конфигурации системы (узлы связи → устройства → теги)
- ✅ Мониторинг данных в реальном времени с обновлением через WebSocket
- ✅ Автоматический сбор исторических данных (настраиваемый интервал)
- ✅ Просмотр истории в табличном виде и на графиках
- ✅ Запись значений в теги с типом доступа ReadWrite
- ✅ Кроссплатформенный веб-интерфейс
- ✅ Мобильная адаптивность
- ✅ REST API для программного управления
- ✅ WebSocket для передачи данных в реальном времени
Система протестирована с устройствами:
- ТРМ212 (ОВЕН) — ПИД-регулятор для задвижек с RS-485
- МВ110.224-8а (ОВЕН) — модуль ввода-вывода
Система поддерживает любые устройства, работающие по протоколу Modbus RTU через интерфейс RS-485.
- Node.js — серверная платформа
- Express.js — веб-фреймворк
- WebSocket (ws) — двусторонняя связь в реальном времени
- modbus-serial — библиотека для работы с Modbus RTU
- Prisma ORM — работа с базой данных
- SQLite — база данных
- React — библиотека для создания пользовательских интерфейсов
- Vite — инструмент сборки
- Ant Design — библиотека компонентов UI
- WebSocket — клиент для получения данных в реальном времени
- Recharts — библиотека для построения графиков
- Операционная система: Windows 10/11, Linux, macOS 12+
- Процессор: 2 ядра, 2 ГГц (рекомендуется 4 ядра, 3 ГГц)
- Оперативная память: 2 ГБ (рекомендуется 4 ГБ)
- Свободное место на диске: 500 МБ (рекомендуется 1 ГБ)
- Node.js: версия 18 или выше
- npm: версия 9 или выше
- COM порт: для работы с Modbus RTU устройствами (RS-485 интерфейс)
- Браузер: Chrome 90+, Firefox 88+, Edge 90+, Safari 14+
- Разрешение экрана: 1280x720 или выше (рекомендуется 1920x1080)
git clone https://github.com/IvanMochalov/simple-SCADA.git
cd simple-SCADAИли скачайте архив с GitHub.
Вариант 1: Установка из корневой директории
npm installВариант 2: Установка отдельно для сервера и клиента
# Установка зависимостей сервера
cd server
npm install
# Установка зависимостей клиента
cd ../client
npm installcd server
npx prisma generate
npx prisma migrate dev --name initБаза данных SQLite будет создана в server/prisma/data.db.
npm run startЧто происходит:
- Собирается клиент (
client/dist) командойnpm run build - Запускается сервер в режиме production (
NODE_ENV=production) - В production сервер отдает собранный клиент и API с одного адреса
Доступ после запуска:
- Веб-интерфейс + API:
http://localhost:3001 - WebSocket:
ws://localhost:3001
Терминал 1 — Сервер:
cd server
npm run devТерминал 2 — Клиент:
cd client
npm run devДоступ после запуска:
- Сервер API:
http://localhost:3001 - Веб-интерфейс (Vite):
http://localhost:5173 - WebSocket:
ws://localhost:3001
npm run devПримечание: Для этого варианта необходимо установить concurrently в корневой директории.
-
Создайте узел связи (COM порт)
- Откройте раздел "Конфигурация"
- Нажмите "Добавить узел связи"
- Укажите COM порт (например, COM3)
- Настройте параметры связи (9600 бод, 8 бит данных, 1 стоп-бит, четность: нет)
-
Добавьте устройство
- Нажмите "+" рядом с узлом связи
- Укажите адрес Modbus устройства (0-255)
- Настройте время ответа (рекомендуется 1000 мс)
- Настройте период опроса (рекомендуется 1000-2000 мс)
-
Добавьте теги
- Нажмите "+" рядом с устройством
- Укажите адрес регистра (0-65535)
- Выберите тип регистра (Holding Register, Input Register, Coil, Discrete Input)
- Настройте типы данных и множитель
-
Запустите Modbus Manager
- Откройте раздел "Реальное время"
- Нажмите "Запустить Modbus Server"
- Наблюдайте за обновлением значений тегов
- Адрес Modbus: 17
- Пример тега (температура датчика):
- Адрес регистра: 1
- Тип регистра: Holding Register
- Тип данных в устройстве: int16
- Тип данных в сервере: int32
- Множитель: 0.1
- Тип доступа: ReadOnly
- Адрес Modbus: 1
- Пример тега (аналоговый выход):
- Адрес регистра: 22
- Тип регистра: Holding Register
- Тип данных в устройстве: float
- Тип данных в сервере: float
- Множитель: 1
- Тип доступа: ReadOnly
- Назначение: Максимальное время ожидания ответа от устройства (мс)
- Рекомендуемые значения:
- Быстрые устройства: 500-1000 мс
- Обычные устройства: 1000-2000 мс
- Медленные устройства: 2000-5000 мс
- Минимальное значение: 100 мс
- Назначение: Интервал между опросами устройства (мс)
- Рекомендуемые значения:
- Одно устройство: 500-1000 мс
- 2-5 устройств: 1000-2000 мс
- 5-10 устройств: 2000-5000 мс
- Запас: 200-500 мс для стабильности RS-485
- Минимальное значение: 100 мс
- Управление узлами связи, устройствами и тегами
- Создание, редактирование и удаление элементов
- Управление включением/выключением элементов
- Мониторинг текущих значений тегов
- Запуск/остановка Modbus Manager
- Запись значений в теги ReadWrite
- Переподключение устройств
- Просмотр исторических данных в табличном виде
- Визуализация данных на графиках
- Фильтрация по уровню (система/узел/устройство)
- Фильтрация по временному диапазону
POST /api/modbus/start- Запустить Modbus ManagerPOST /api/modbus/stop- Остановить Modbus ManagerGET /api/modbus/status- Получить статус Modbus Manager
GET /api/connections- Получить все узлы связиGET /api/connections/:id- Получить узел связи по IDPOST /api/connections- Создать узел связиPUT /api/connections/:id- Обновить узел связиDELETE /api/connections/:id- Удалить узел связи
GET /api/devices- Получить все устройстваGET /api/devices/:id- Получить устройство по IDPOST /api/devices- Создать устройствоPUT /api/devices/:id- Обновить устройствоDELETE /api/devices/:id- Удалить устройствоPOST /api/devices/:id/reconnect- Переподключить устройство
GET /api/tags- Получить все тегиGET /api/tags/:id- Получить тег по IDPOST /api/tags- Создать тегPUT /api/tags/:id- Обновить тегDELETE /api/tags/:id- Удалить тегPOST /api/tags/:id/write- Записать значение в тег
GET /api/history/system- История всей системыGET /api/history/node/:nodeId- История узла связиGET /api/history/device/:deviceId- История устройстваGET /api/history/tag/:tagId- История тега
GET /api/settings/archive-interval- Получить интервал архивацииPUT /api/settings/archive-interval- Установить интервал архивации
simple-SCADA/
├── server/ # Node.js сервер
│ ├── src/
│ │ ├── index.js # Точка входа сервера
│ │ ├── modbus/
│ │ │ └── ModbusManager.js # Менеджер Modbus соединений
│ │ ├── routes/ # REST API маршруты
│ │ │ ├── connections.js # Маршруты узлов связи
│ │ │ ├── devices.js # Маршруты устройств
│ │ │ ├── tags.js # Маршруты тегов
│ │ │ ├── history.js # Маршруты истории
│ │ │ └── modbus.js # Маршруты Modbus Manager
│ │ └── utils/ # Утилиты
│ └── prisma/
│ ├── schema.prisma # Схема базы данных
│ └── data.db # База данных SQLite
└── client/ # React клиент
├── src/
│ ├── components/ # React компоненты
│ │ ├── Layout.jsx # Главный макет
│ │ ├── ConnectionTree.jsx # Дерево конфигурации
│ │ ├── RealTimeView.jsx # Реальное время
│ │ ├── HistoryView.jsx # История
│ │ └── ... # Другие компоненты
│ ├── context/ # React контексты
│ │ ├── WebSocketContext.jsx # WebSocket контекст
│ │ └── NotificationContext.jsx # Контекст уведомлений
│ ├── services/
│ │ └── api.js # HTTP клиент (REST API)
│ ├── App.jsx # Главный компонент
│ ├── main.jsx # Точка входа
│ └── index.css # Базовые стили
└── index.html # HTML шаблон
- Реальное время: Обновление значений тегов через WebSocket с задержкой менее 100 мс
- Автоматический сбор истории: Настраиваемый интервал архивации (по умолчанию 60 секунд)
- Статусы системы: Отображение статусов узлов связи, устройств и тегов
- Обработка ошибок: Автоматическое оповещение о сбоях и ошибках
- Последовательный опрос: Устройства на одной шине RS-485 опрашиваются последовательно
- Блокировки: Предотвращение конфликтов при одновременных операциях чтения/записи
- Типы регистров: Поддержка Holding Register, Input Register, Coil, Discrete Input
- Типы данных: Поддержка int16, int32, uint16, uint32, float
- Масштабирование: Поддержка множителей для преобразования значений
- COM порт: Убедитесь, что COM порт не используется другими приложениями
- Права администратора: На Windows может потребоваться запуск с правами администратора для доступа к COM портам
- RS-485: При работе с несколькими устройствами на одной шине рекомендуется использовать период опроса не менее 1000 мс
- База данных: SQLite подходит для систем с объемом исторических данных до 1 миллиона записей
- Браузеры: Рекомендуется использовать актуальные версии браузеров для полной функциональности
- Проверьте, что порт не используется другим приложением
- Запустите сервер с правами администратора (Windows)
- Проверьте, что порт существует в системе
- Проверьте физическое подключение (RS-485)
- Убедитесь, что Modbus адрес правильный
- Проверьте настройки COM порта (скорость, биты данных, четность)
- Увеличьте время ответа (responseTimeout)
- Проверьте адрес регистра в настройках тега
- Проверьте тип регистра и тип данных
- Проверьте множитель (scaleFactor)
- Убедитесь, что Modbus Manager запущен
- Проверьте, что устройства и теги включены в работу
- Расширьте временной диапазон поиска
Открытый исходный код. Может использоваться в коммерческих и образовательных целях.
Иван Мочалов
- GitHub: @IvanMochalov
- Проект: simple-SCADA
- КГУ, Кафедре автоматики, микропроцессорной техники и технологии машиностроения — за предоставленное оборудование для тестирования (ТРМ212, МВ110.224-8а)
- Смирнову Максиму Александрович за наставничество и техническое сопровождение
- Разработчикам библиотек: modbus-serial
Версия: 1.0
Дата обновления: 2026