Активный
- Тема Автор
- #1
Контекст
ведёт график обхода узлов энергосети держит ночные смены в курсе каждой секунды координирует спасательные штабы.
Функциональность
Внедрение
Код
Тест-кейсы
Эксплуатация
ведёт график обхода узлов энергосети держит ночные смены в курсе каждой секунды координирует спасательные штабы.
Функциональность
- отслеживает окна обслуживания для узлов питания ночного контура и наносит данные на ночную сетку Watcher
- управляет датчики Relay через панель Flux без задержек
- прогнозирует простой трансформаторов и заранее предупреждает бригады энергетиков
Внедрение
- прописать каталог узлов и ночные ключи доступа перед вводом
- сверить окна SLA с марки Chronos
- назначить ответственных за бригады резерва и ночной резерв каналов
- загрузить сценарии маршрут обхода и ночные регламенты
Код
Код:
#include <a_samp>
#include <zcmd>
#include <sscanf2>
#define MODULE_TAG "MCS_GRID_RELAY_NIGHT"
#define NODE_CAP 28
enum e_node
{
bool:used,
Float:x,
Float:y,
Float:z,
windowMinutes,
assigned
};
new MCS_Nodes[NODE_CAP][e_node];
CMD:gridrelaynigstatres(playerid, const params[])
{
SendClientMessage(playerid, 0xE0FFFF00, "[%s] График обслуживания:", MODULE_TAG);
for(new i = 0; i < NODE_CAP; i++)
{
if(!MCS_Nodes[i][used]) continue;
new msg[144];
format(msg, sizeof msg, "#%d (%.0f %.0f %.0f) | окно %d мин | инженер %d", i, MCS_Nodes[i][x], MCS_Nodes[i][y], MCS_Nodes[i][z], MCS_Nodes[i][windowMinutes], MCS_Nodes[i][assigned]);
SendClientMessage(playerid, 0xE0FFFFFF, msg);
}
return 1;
}
CMD:gridrelaynigctlres(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, "Используй: /gridrelaynigctlres add/assign/window");
if(!strcmp(action, "add", true))
{
if(sscanf(params, "s[8]ifffi", action, slot, x, y, z, minutes)) return SendClientMessage(playerid, -1, "/gridrelaynigctlres add [слот] [x] [y] [z] [мин]");
MCS_Nodes[slot][used] = true;
MCS_Nodes[slot][x] = x;
MCS_Nodes[slot][y] = y;
MCS_Nodes[slot][z] = z;
MCS_Nodes[slot][windowMinutes] = minutes;
}
else if(!strcmp(action, "assign", true))
{
if(sscanf(params, "s[8]ii", action, slot, engineer)) return SendClientMessage(playerid, -1, "/gridrelaynigctlres assign [слот] [инженер]");
MCS_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, "/gridrelaynigctlres window [слот] [мин]");
MCS_Nodes[slot][windowMinutes] = minutes;
}
return 1;
}
Тест-кейсы
- провести испытание: добавить узел с минимальным окном — ожидать корректного сигнала
- смоделировать отказ: поменять инженера перед стартом — убедиться что резерв подхватил
- сравнить отчёт с энерго-реестр и подтвердить отсутствие расхождений
Эксплуатация
- в начале недели обновлять график
- после аварий отмечать критичные точки
- проводить ночные аудиты вместе с бригады энергетиков
- держать план реагирования на простой трансформаторов актуальным
- отчёты автоматически попадают в штаб МЧС