Це стара версія документу!
Логування подій керування (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. Встановлення Python-скрипта
- Скопіювати ``mwj_audit_service.py`` на сервер, наприклад у ``C:\python_portable\mwj_audit_service.py``.
- Переконатися, що на сервері є портативний Python за шляхом ``C:\python_portable\python.exe`` (окрема інсталяція, без залежності від системного PATH — це важливо, бо служба стартує ще до входу користувача).
- У скрипті перевірити/поправити константи під конкретний проєкт:
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``).
2. Реєстрація завдання в Task Scheduler
Створюється завдання з іменем logging, яке стартує скрипт при завантаженні сервера.
Вкладка General
- Name: ``logging``
- Security options: обрати ``Run whether user is logged on or not``
- Обов'язково увімкнути прапорець Run with highest privileges
- Configure for: відповідно до ОС сервера (у демо — Windows Server 2019)
Вкладка Triggers
Вкладка Actions
- Тип дії: Start a program
- Program/script: ``“C:\python_portable\python.exe”``
- Add arguments: ``mwj_audit_service.py``
- Start in (обов'язково!): каталог, де лежить сам скрипт, наприклад ``C:\python_portable``
Вкладка Conditions
- Power: увімкнути ``Start the task only if the computer is on AC power`` та ``Stop if the computer switches to battery power``
- Idle: не використовувати (сервер не має idle-стану)
- Network: не обмежувати за типом з'єднання
Перевірка завдання
- Запустити завдання вручну (``Run``) або перезавантажити сервер.
- Переконатися, що процес ``python.exe`` з'явився у диспетчері завдань.
- Відкрити ``http://127.0.0.1:5005/health`` на сервері — має повернути ``OK``.
- Відкрити ``http://127.0.0.1:5005/events`` — має повернути масив JSON з подіями за останні ``DAYS_BACK`` днів.
3. Розгортання ASPX-моста для WebHMI
Файл ``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 заблокований локальним фаєрволом.
4. Типові проблеми
| Симптом | Ймовірна причина | Рішення |
|---|---|---|
| ``/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`` |



