Планер обслуживания Grid ночного режима для полиции

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Контекст
ведёт график обхода узлов энергосети держит ночные смены в курсе каждой секунды поддерживает дежурные части полиции.

Функциональность
  • отслеживает окна обслуживания для узлов питания ночного контура и наносит данные на ночную сетку Watcher
  • управляет датчики Relay через панель Flux без задержек
  • прогнозирует простой трансформаторов и заранее предупреждает бригады энергетиков

Внедрение
  • прописать каталог узлов и ночные ключи доступа перед вводом
  • сверить окна SLA с марки Chronos
  • назначить ответственных за бригады резерва и ночной резерв каналов
  • загрузить сценарии маршрут обхода и ночные регламенты

Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>

#define MODULE_TAG "PD_GRID_RELAY_NIGHT"
#define NODE_CAP 28

enum e_node
{
    bool:used,
    Float:x,
    Float:y,
    Float:z,
    windowMinutes,
    assigned
};
new PD_Nodes[NODE_CAP][e_node];

CMD:gridrelaynigstatpd(playerid, const params[])
{
    SendClientMessage(playerid, 0xE0FFFF00, "[%s] График обслуживания:", MODULE_TAG);
    for(new i = 0; i < NODE_CAP; i++)
    {
        if(!PD_Nodes[i][used]) continue;
        new msg[144];
        format(msg, sizeof msg, "#%d (%.0f %.0f %.0f) | окно %d мин | инженер %d", i, PD_Nodes[i][x], PD_Nodes[i][y], PD_Nodes[i][z], PD_Nodes[i][windowMinutes], PD_Nodes[i][assigned]);
        SendClientMessage(playerid, 0xE0FFFFFF, msg);
    }
    return 1;
}

CMD:gridrelaynigctlpd(playerid, const params[])
{
    new action[8], slot, minutes, engineer;
    new Float:x, Float:y, Float:z;
    if(sscanf(params, "s[8]", action)) return SendClientMessage(playerid, -1, "Используй: /gridrelaynigctlpd add/assign/window");

    if(!strcmp(action, "add", true))
    {
        if(sscanf(params, "s[8]ifffi", action, slot, x, y, z, minutes)) return SendClientMessage(playerid, -1, "/gridrelaynigctlpd add [слот] [x] [y] [z] [мин]");
        PD_Nodes[slot][used] = true;
        PD_Nodes[slot][x] = x;
        PD_Nodes[slot][y] = y;
        PD_Nodes[slot][z] = z;
        PD_Nodes[slot][windowMinutes] = minutes;
    }
    else if(!strcmp(action, "assign", true))
    {
        if(sscanf(params, "s[8]ii", action, slot, engineer)) return SendClientMessage(playerid, -1, "/gridrelaynigctlpd assign [слот] [инженер]");
        PD_Nodes[slot][assigned] = engineer;
        SendClientMessage(engineer, 0x00FFFFFF, "[%s] Вы назначены на узел.", MODULE_TAG);
    }
    else if(!strcmp(action, "window", true))
    {
        if(sscanf(params, "s[8]ii", action, slot, minutes)) return SendClientMessage(playerid, -1, "/gridrelaynigctlpd window [слот] [мин]");
        PD_Nodes[slot][windowMinutes] = minutes;
    }
    return 1;
}

Тест-кейсы
  • провести испытание: добавить узел с минимальным окном — ожидать корректного сигнала
  • смоделировать отказ: поменять инженера перед стартом — убедиться что резерв подхватил
  • сравнить отчёт с энерго-реестр и подтвердить отсутствие расхождений

Эксплуатация
  • в начале недели обновлять график
  • после аварий отмечать критичные точки
  • проводить ночные аудиты вместе с бригады энергетиков
  • держать план реагирования на простой трансформаторов актуальным
  • отчёты автоматически попадают в полиция
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху