scada:events

Це стара версія документу!


Логування подій керування (MWJ Audit Service)

Опис розгортання служби логування дій операторів (вхід/вихід, запис тегів) для проєкту UA_Energy_Demo_23_04 на базі EcoStruxure Power Operation v2024.

  • mwj_audit_service.py — фоновий Python-скрипт, який кожну секунду сканує журнал подій (``*.MWJ``) хард-клієнта AlarmServer, витягує події ``Login``, ``Logout``, ``TagWrite`` і віддає їх у вигляді JSON по HTTP на ``127.0.0.1:5005/events``.
  • Task Scheduler — запускає ``mwj_audit_service.py`` автоматично при старті сервера, незалежно від того, чи залогінений користувач.
  • mwj_events.aspx — ASP.NET-сторінка на WebHMI-сервері, яка проксіює запит із браузера клієнта до локального Python-сервісу (обхід CORS/локальних обмежень), віддаючи той самий JSON назовні.

Разом ці три компоненти дозволяють підтягувати події керування в кастомний JS-віджет AlarmViewer (див. патч mwj_rawevents_patch.js).

  1. Скопіювати ``mwj_audit_service.py`` на сервер, наприклад у ``C:\python_portable\mwj_audit_service.py``.
  2. Переконатися, що на сервері є портативний Python за шляхом ``C:\python_portable\python.exe`` (окрема інсталяція, без залежності від системного PATH — це важливо, бо служба стартує ще до входу користувача).
  3. У скрипті перевірити/поправити константи під конкретний проєкт:
JOURNAL_DIR = r"C:\ProgramData\Schneider Electric\Power Operation\v2024\Data\UA_Energy_Demo_23_04\c1.AlarmServer1\Database\Journal\JnI00000"
PORT = 5005
DAYS_BACK = 7
POLL_SEC = 1
  • ``UA_Energy_Demo_23_04`` — назва проєкту, змінюється під кожне нове розгортання.
  • ``PORT`` — локальний порт, на якому скрипт віддає ``/events`` та ``/health``.
  • ``DAYS_BACK`` — глибина історії, яку скрипт підвантажує при старті.
  • ``POLL_SEC`` — інтервал повторного сканування журналу.

Скрипт піднімає локальний HTTP-сервер (``127.0.0.1``, без зовнішнього доступу) з двома ендпоінтами:

  • ``GET /events`` — поточний кеш подій у JSON.
  • ``GET /health`` — перевірка живості (``OK``).

Створюється завдання з іменем logging, яке стартує скрипт при завантаженні сервера.

  • Name: ``logging``
  • Security options: обрати ``Run whether user is logged on or not``
  • Обов'язково увімкнути прапорець Run with highest privileges
  • Configure for: відповідно до ОС сервера (у демо — Windows Server 2019)

Вкладка General

  • Додати тригер At startup (запуск при старті системи), статус — Enabled.

Вкладка Triggers

  • Тип дії: Start a program
  • Program/script: ``“C:\python_portable\python.exe”``
  • Add arguments: ``mwj_audit_service.py``
  • Start in (обов'язково!): каталог, де лежить сам скрипт, наприклад ``C:\python_portable``

Вкладка Actions

  • Power: увімкнути ``Start the task only if the computer is on AC power`` та ``Stop if the computer switches to battery power``
  • Idle: не використовувати (сервер не має idle-стану)
  • Network: не обмежувати за типом з'єднання

Вкладка Conditions

  1. Запустити завдання вручну (``Run``) або перезавантажити сервер.
  2. Переконатися, що процес ``python.exe`` з'явився у диспетчері завдань.
  3. Відкрити ``http://127.0.0.1:5005/health`` на сервері — має повернути ``OK``.
  4. Відкрити ``http://127.0.0.1:5005/events`` — має повернути масив JSON з подіями за останні ``DAYS_BACK`` днів.

Файл ``mwj_events.aspx`` розміщується на WebHMI-сервері за шляхом:

C:\Program Files (x86)\Schneider Electric\Power Operation\v2024\Applications\Web\WebHmi

Він проксіює звернення браузера клієнта до локального Python-сервісу (``127.0.0.1:5005/events``) і повертає той самий JSON, додаючи заголовок ``Access-Control-Allow-Origin: *``:

<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Net" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Clear();
        Response.ContentType = "application/json; charset=utf-8";
        Response.AppendHeader("Access-Control-Allow-Origin", "*");
 
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://127.0.0.1:5005/events");
            request.Method = "GET";
            request.Timeout = 4000;
 
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    string json = reader.ReadToEnd();
                    Response.Write(json);
                }
            }
        }
        catch (Exception ex)
        {
            Response.StatusCode = 500;
            Response.Write("{\"error\": \"" + ex.Message.Replace("\"", "\\\"") + "\"}");
        }
        Response.End();
    }
</script>

Важливо:

  • ASPX-файл виконується на самому WebHMI-сервері, тому ``127.0.0.1:5005`` у ньому — це той самий сервер, де стоїть Task Scheduler-завдання з п.2 (тобто Python-сервіс і IIS/WebHMI мають бути на одній машині).
  • Після копіювання файлу перевірити доступність зовні: ``https://<адреса_webhmi>/mwj_events.aspx`` має віддавати той самий JSON, що й локальний ``/events``.
  • Якщо повертається ``{“error”: “…”}`` — значить Python-сервіс не піднявся (перевірити крок 2.4) або порт 5005 заблокований локальним фаєрволом.
Симптом Ймовірна причина Рішення
``/health`` не відповідає Завдання Task Scheduler не запустилось / скрипт впав Перевірити журнал завдання (History), запустити скрипт вручну через ``python_portable\python.exe`` для перегляду traceback
``/events`` повертає порожній масив Невірний ``JOURNAL_DIR`` для проєкту, або ``DAYS_BACK`` замалий Перевірити фактичний шлях журналу проєкту, звірити назву проєкту в шляху
ASPX повертає ``{“error”: …}`` Python-сервіс не на тому ж сервері, або порт закритий фаєрволом Перевірити, що IIS/WebHMI і скрипт на одній машині; дозволити 127.0.0.1:5005 у фаєрволі
Завдання не стартує при перезавантаженні Не увімкнено ``Run whether user is logged on or not`` або немає прав Перевірити Security options і ``Run with highest privileges``
  • scada/events.1787902772.txt.gz
  • Востаннє змінено: 2026/08/28 10:39
  • повз scada