Skip to content

IvanMochalov/simple-SCADA

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

simple-SCADA

Система диспетчерского управления и сбора данных для технологических объектов управления

GitHub

Система для работы с 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)

📦 Установка

Шаг 1: Клонирование репозитория

git clone https://github.com/IvanMochalov/simple-SCADA.git
cd simple-SCADA

Или скачайте архив с GitHub.

Шаг 2: Установка зависимостей

Вариант 1: Установка из корневой директории

npm install

Вариант 2: Установка отдельно для сервера и клиента

# Установка зависимостей сервера
cd server
npm install

# Установка зависимостей клиента
cd ../client
npm install

Шаг 3: Настройка базы данных

cd server
npx prisma generate
npx prisma migrate dev --name init

База данных SQLite будет создана в server/prisma/data.db.

🚀 Запуск

Обычный запуск (production) — только из корня

npm run start

Что происходит:

  • Собирается клиент (client/dist) командой npm run build
  • Запускается сервер в режиме production (NODE_ENV=production)
  • В production сервер отдает собранный клиент и API с одного адреса

Доступ после запуска:

  • Веб-интерфейс + API: http://localhost:3001
  • WebSocket: ws://localhost:3001

Запуск в dev-режиме

Вариант 1: Запуск сервера и клиента отдельно

Терминал 1 — Сервер:

cd server
npm run dev

Терминал 2 — Клиент:

cd client
npm run dev

Доступ после запуска:

  • Сервер API: http://localhost:3001
  • Веб-интерфейс (Vite): http://localhost:5173
  • WebSocket: ws://localhost:3001

Вариант 2: Запуск dev через корневой package.json

npm run dev

Примечание: Для этого варианта необходимо установить concurrently в корневой директории.

📖 Использование

Быстрый старт

  1. Создайте узел связи (COM порт)

    • Откройте раздел "Конфигурация"
    • Нажмите "Добавить узел связи"
    • Укажите COM порт (например, COM3)
    • Настройте параметры связи (9600 бод, 8 бит данных, 1 стоп-бит, четность: нет)
  2. Добавьте устройство

    • Нажмите "+" рядом с узлом связи
    • Укажите адрес Modbus устройства (0-255)
    • Настройте время ответа (рекомендуется 1000 мс)
    • Настройте период опроса (рекомендуется 1000-2000 мс)
  3. Добавьте теги

    • Нажмите "+" рядом с устройством
    • Укажите адрес регистра (0-65535)
    • Выберите тип регистра (Holding Register, Input Register, Coil, Discrete Input)
    • Настройте типы данных и множитель
  4. Запустите Modbus Manager

    • Откройте раздел "Реальное время"
    • Нажмите "Запустить Modbus Server"
    • Наблюдайте за обновлением значений тегов

Примеры конфигурации

ТРМ212 (ОВЕН)

  • Адрес Modbus: 17
  • Пример тега (температура датчика):
    • Адрес регистра: 1
    • Тип регистра: Holding Register
    • Тип данных в устройстве: int16
    • Тип данных в сервере: int32
    • Множитель: 0.1
    • Тип доступа: ReadOnly

МВ110.224-8а (ОВЕН)

  • Адрес Modbus: 1
  • Пример тега (аналоговый выход):
    • Адрес регистра: 22
    • Тип регистра: Holding Register
    • Тип данных в устройстве: float
    • Тип данных в сервере: float
    • Множитель: 1
    • Тип доступа: ReadOnly

Параметры устройства

responseTimeout (Время ответа)

  • Назначение: Максимальное время ожидания ответа от устройства (мс)
  • Рекомендуемые значения:
    • Быстрые устройства: 500-1000 мс
    • Обычные устройства: 1000-2000 мс
    • Медленные устройства: 2000-5000 мс
  • Минимальное значение: 100 мс

pollInterval (Период опроса)

  • Назначение: Интервал между опросами устройства (мс)
  • Рекомендуемые значения:
    • Одно устройство: 500-1000 мс
    • 2-5 устройств: 1000-2000 мс
    • 5-10 устройств: 2000-5000 мс
  • Запас: 200-500 мс для стабильности RS-485
  • Минимальное значение: 100 мс

📊 Разделы интерфейса

Конфигурация

  • Управление узлами связи, устройствами и тегами
  • Создание, редактирование и удаление элементов
  • Управление включением/выключением элементов

Реальное время

  • Мониторинг текущих значений тегов
  • Запуск/остановка Modbus Manager
  • Запись значений в теги ReadWrite
  • Переподключение устройств

История

  • Просмотр исторических данных в табличном виде
  • Визуализация данных на графиках
  • Фильтрация по уровню (система/узел/устройство)
  • Фильтрация по временному диапазону

🔧 API

REST API

Modbus Manager

  • POST /api/modbus/start - Запустить Modbus Manager
  • POST /api/modbus/stop - Остановить Modbus Manager
  • GET /api/modbus/status - Получить статус Modbus Manager

Узлы связи

  • GET /api/connections - Получить все узлы связи
  • GET /api/connections/:id - Получить узел связи по ID
  • POST /api/connections - Создать узел связи
  • PUT /api/connections/:id - Обновить узел связи
  • DELETE /api/connections/:id - Удалить узел связи

Устройства

  • GET /api/devices - Получить все устройства
  • GET /api/devices/:id - Получить устройство по ID
  • POST /api/devices - Создать устройство
  • PUT /api/devices/:id - Обновить устройство
  • DELETE /api/devices/:id - Удалить устройство
  • POST /api/devices/:id/reconnect - Переподключить устройство

Теги

  • GET /api/tags - Получить все теги
  • GET /api/tags/:id - Получить тег по ID
  • POST /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 миллиона записей
  • Браузеры: Рекомендуется использовать актуальные версии браузеров для полной функциональности

🐛 Устранение проблем

COM порт не открывается

  • Проверьте, что порт не используется другим приложением
  • Запустите сервер с правами администратора (Windows)
  • Проверьте, что порт существует в системе

Устройство не отвечает

  • Проверьте физическое подключение (RS-485)
  • Убедитесь, что Modbus адрес правильный
  • Проверьте настройки COM порта (скорость, биты данных, четность)
  • Увеличьте время ответа (responseTimeout)

Значения тегов неверные

  • Проверьте адрес регистра в настройках тега
  • Проверьте тип регистра и тип данных
  • Проверьте множитель (scaleFactor)

Нет исторических данных

  • Убедитесь, что Modbus Manager запущен
  • Проверьте, что устройства и теги включены в работу
  • Расширьте временной диапазон поиска

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

📄 Лицензия

Открытый исходный код. Может использоваться в коммерческих и образовательных целях.

👤 Автор

Иван Мочалов

🙏 Благодарности

  • КГУ, Кафедре автоматики, микропроцессорной техники и технологии машиностроения — за предоставленное оборудование для тестирования (ТРМ212, МВ110.224-8а)
  • Смирнову Максиму Александрович за наставничество и техническое сопровождение
  • Разработчикам библиотек: modbus-serial

Версия: 1.0
Дата обновления: 2026

About

Supervisory control and data collection system for technological control facilities

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages