Как отправлять критические уведомления из промышленных SCADA-систем по SMS API

от автора

SCADA-системы — это программно-аппаратные комплексы для мониторинга и управления промышленными процессами. При сбоях и авариях они формируют критические уведомления о перегревах, утечках, отказах оборудования и других опасных ситуациях. 

Отправлять такие оповещения в Telegram значит их гарантированно потерять. Поэтому мы решили сделать интеграцию с Exolve API для их автоматической отправки для мгновенного оповещения ответственных специалистов через SMS.

Архитектура интеграции SCADA с Exolve API

Прежде чем выстраивать интеграцию, стоит понять, как весь процесс будет выглядеть на практике. Вот общая схема:

Рассмотрим детальнее основные аспекты архитектуры взаимодействия.

1.   Общая схема взаимодействия SCADA-системы и Exolve API.

SCADA-система фиксирует аварийные события (например, превышение температуры, отказ насоса, утечка газа) и передает их в Exolve API. API, в свою очередь, обрабатывает данные, определяет получателей и отправляет уведомления по заданным каналам (SMS, email, push-уведомления).

2.   Варианты интеграции.

Интеграция может выполняться двумя основными способами:

  • Встроенные механизмы SCADA: большинство SCADA-систем (например, WinCC, Ignition, Wonderware) поддерживают выполнение скриптов (Python, JavaScript) или модули связи (OPC UA, MQTT, REST API). Это позволяет отправлять HTTP-запросы к Exolve API напрямую.

  • Внешние сервисы: если SCADA не поддерживает прямую отправку HTTP-запросов, можно использовать промежуточный сервер или шлюз (Node-RED, Python-сервис, облачные функции), который получает события от SCADA (через OPC, MQTT, базы данных) и пересылает их в Exolve API.

3.   Поток обработки событий.

  • SCADA фиксирует аварийное событие в реальном времени.

  • Настроенные триггеры или скрипты формируют уведомление.

  • Данные передаются в Exolve API (через HTTP POST или MQTT).

  • Exolve API анализирует событие, выбирает получателей и форматирует сообщение.

  • Уведомление отправляется по заданным каналам связи.

  • Ответственные специалисты получают сообщение и реагируют на аварию.

Интеграция с популярными SCADA-системами

Интеграцию Exolve API с промышленными SCADA-системами можно реализовать с использованием встроенных скриптовых языков, настройки HTTP-запросов или через промежуточный сервер. Рассмотрим каждый из этих подходов.

Использование встроенных скриптовых языков 

Многие SCADA-системы поддерживают выполнение пользовательских скриптов на языках, таких как Python, Lua или VBScript. Это позволяет напрямую вызывать Exolve API для отправки уведомлений.

Пример на Python (для SCADA с поддержкой Python):

import requests api_key = "ваш_api_ключ" url = "https://api.exolve.ru/send_sms" payload = { "api_key": api_key, "phone": "+79123456789", "text": "Критическое уведомление: температура превышена.", "sender": "SCADA" } response = requests.post(url, json=payload) if response.status_code == 200: print("SMS отправлено успешно:", response.json()) else: print("Ошибка:", response.status_code, response.text)

Пример на VBScript (для WinCC):

Dim http, url, apiKey, phone, text, sender apiKey = "ваш_api_ключ" url = "https://api.exolve.ru/send_sms" phone = "+79123456789" text = "Критическое уведомление: температура превышена." sender = "SCADA" Set http = CreateObject("MSXML2.XMLHTTP") http.Open "POST", url, False http.SetRequestHeader "Content-Type", "application/json" http.Send "{""api_key"":""" & apiKey & """,""phone"":""" & phone & """,""text"":""" & text & """,""sender"":""" & sender & """}" If http.Status = 200 Then WScript.Echo "SMS отправлено успешно: " & http.ResponseText Else WScript.Echo "Ошибка: " & http.Status & " " & http.ResponseText End If

Примеры настройки HTTP-запросов в SCADA-системах

1. WinCC.
WinCC позволяет настраивать HTTP-запросы через встроенные скрипты VBScript или C-скрипты. Пример выше демонстрирует использование VBScript для отправки SMS через Exolve API.

2. Ignition.
Ignition поддерживает Python-скрипты и имеет встроенные инструменты для работы с HTTP-запросами. Пример на Python:

from system.net import postToURL import json api_key = "ваш_api_ключ" url = "https://api.exolve.ru/send_sms" payload = { "api_key": api_key, "phone": "+79123456789", "text": "Критическое уведомление: температура превышена.", "sender": "SCADA" } response = postToURL(url, json.dumps(payload), {"Content-Type": "application/json"}) if response.isSuccessful(): print("SMS отправлено успешно:", response.getResponseText()) else: print("Ошибка:", response.getStatusCode(), response.getResponseText())

3. MasterSCADA.

MasterSCADA поддерживает выполнение скриптов на Lua. Пример:

local http = require("socket.http") local ltn12 = require("ltn12") local api_key = "ваш_api_ключ" local url = "https://api.exolve.ru/send_sms" local payload = { api_key = api_key, phone = "+79123456789", text = "Критическое уведомление: температура превышена.", sender = "SCADA" } local response = {} local body = "api_key=" .. api_key .. "&phone=" .. payload.phone .. "&text=" .. payload.text .. "&sender=" .. payload.sender local result, status_code = http.request{ url = url, method = "POST", headers = {     ["Content-Type"] = "application/json",         ["Content-Length"] = #body }, source = ltn12.source.string(body), sink = ltn12.sink.table(response) } if status_code == 200 then print("SMS отправлено успешно:", table.concat(response)) else print("Ошибка:", status_code, table.concat(response)) end

Использование промежуточного сервера для маршрутизации уведомлений

Для сложных систем или случаев, когда SCADA-система не поддерживает прямую интеграцию с API, можно использовать промежуточный сервер. Этот сервер будет принимать данные от SCADA-системы, формировать запросы к Exolve API и обрабатывать ответы.

Пример архитектуры:

  1. SCADA-система отправляет данные на промежуточный сервер через HTTP, MQTT или другой протокол.

  2. Промежуточный сервер (например, на базе Node.js, Python или Java) обрабатывает данные, формирует запрос к Exolve API и отправляет уведомление.

  3. Сервер логирует результаты и возвращает статус SCADA-системе.

Пример на Python (промежуточный сервер):

from flask import Flask, request, jsonify import requests app = Flask(__name__) @app.route('/send_notification', methods=['POST']) def send_notification(): data = request.json api_key = "ваш_api_ключ" url = "https://api.exolve.ru/send_sms" payload = {     "api_key": api_key,     "phone": data["phone"],     "text": data["text"],     "sender": "SCADA" } response = requests.post(url, json=payload) if response.status_code == 200:     return jsonify({"status": "success", "message_id": response.json()["message_id"]}) else:     return jsonify({"status": "error", "code": response.status_code, "message": response.text}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)

Этот подход обеспечивает гибкость и масштабируемость, особенно в системах с большим количеством SCADA-узлов.

Практический пример

В этом разделе рассмотрим реализацию сценария отправки уведомлений через Exolve API при превышении температурного порога в SCADA-системе. Схематично это будет выглядеть так:

Мы разберем подробнее конфигурацию SCADA, написание кода для отправки сообщений и тестирование работы системы.

Реализация сценария: отправка уведомлений при превышении температурного порога

Сценарий:

  • SCADA-система мониторит температуру на промышленном объекте.

  • При превышении заданного порога (например, 100 °C) система отправляет SMS-уведомление через Exolve API.

  • Уведомление содержит информацию о текущей температуре и времени события.

Конфигурация SCADA для мониторинга параметров

Для мониторинга температуры в SCADA-системе необходимо настроить соответствующий тег (переменную), который будет считывать данные с датчика. Рассмотрим пример для WinCC:

  1. Создайте новый тег Temperature типа Float для хранения текущего значения температуры.

  2. Настройте связь тега с устройством (например, через OPC-сервер или драйвер).

  3. Создайте аларм (тревогу) для тега Temperature, установив пороговое значение 100 °C.

  4. Настройте триггер аларма для вызова скрипта при срабатывании.

Написание кода отправки сообщений через API

Для отправки SMS-уведомлений при срабатывании аларма используем встроенный скриптовый язык SCADA-системы. Пример для WinCC на VBScript:

Sub SendTemperatureAlert(temperature) Dim http, url, apiKey, phone, text, sender apiKey = "ваш_api_ключ" url = "https://api.exolve.ru/send_sms" phone = "+79123456789"     text = "Критическое уведомление: температура превышена. Текущее значение: " & temperature & "°C." sender = "SCADA" Set http = CreateObject("MSXML2.XMLHTTP") http.Open "POST", url, False http.SetRequestHeader "Content-Type", "application/json" http.Send "{""api_key"":""" & apiKey & """,""phone"":""" & phone & """,""text"":""" & text & """,""sender"":""" & sender & """}" If http.Status = 200 Then     LogMessage "SMS отправлено успешно: " & http.ResponseText Else     LogMessage "Ошибка: " & http.Status & " " & http.ResponseText End If End Sub Sub LogMessage(message) ' Логирование сообщений в файл или SCADA-систему     Dim fso, logFile Set fso = CreateObject("Scripting.FileSystemObject") Set logFile = fso.OpenTextFile("C:\SCADA_Logs\Exolve_API.log", 8, True) logFile.WriteLine Now() & " - " & message logFile.Close End Sub

Для интеграции с алармом в настройках аларма добавьте вызов функции SendTemperatureAlert с передачей текущего значения температуры.

Тестирование работы и анализ логов

Тестирование:

  1. Установите значение температуры выше порогового (например, 105 °C) через симулятор или вручную.

  2. Убедитесь, что аларм срабатывает и вызывается скрипт отправки SMS.

  3. Проверьте получение SMS на указанный номер телефона.

Анализ логов:

  • Проверьте файл логов C:\SCADA_Logs\Exolve_API.log на наличие записей об отправке SMS и возможных ошибках.

  • Пример записи в логе:

2023-10-10 14:30:45 - SMS отправлено успешно: {"status":"success","message_id":"1234567890"}
  • В случае ошибок (например, 401 или 429) проверьте корректность API-ключа и лимиты запросов.

Интеграция Exolve API с промышленными SCADA-системами для отправки критических уведомлений — это эффективное решение для оперативного оповещения о критических событиях. Использование встроенных скриптовых языков, настройка HTTP-запросов и промежуточных серверов позволяет гибко адаптировать систему под конкретные задачи. 

В будущем систему можно расширить за счет добавления поддержки мультиканальных уведомлений (SMS, голосовые вызовы и так далее), интеграции с системами аналитики для прогнозирования событий, а также автоматизации обработки ответов API для более гибкого управления уведомлениями. Это позволит повысить отказоустойчивость и удобство использования системы.

Автор: Роман Андреев


ссылка на оригинал статьи https://habr.com/ru/articles/892032/