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

TL;DR

Энергия больше не буферизируется большими батареями, которые могут поддерживать станцию часами. Станция уязвима для крупных колебаний сети, если они происходят. Батареи есть, но им нужно время, чтобы «разогнаться» для удовлетворения спроса, если питание внезапно отключается.

Высокоуровнево

Как оборудование реагирует на нехватку питания

Когда оборудование получает полное количество энергии, оно работает в обычном режиме. Когда питания нет, оборудование полностью отключается (должны ли у машин быть выключатели питания?). Это состояние без питания такое же, как у незакреплённого потребителя. Когда происходит понижение напряжения (brownout), оборудование реагирует в зависимости от типа потребителя. Каждая машина имеет потребляемую мощность; понижение напряжения происходит только для машины, если доступная ей мощность меньше потребляемой. Это независимое событие для каждой машины в сети.
  • Если потребитель — аналоговое устройство, такое как двигатель/зарядное устройство, оно снизит свою скорость (каждая машина определяет, что это означает), но будет продолжать работать в обычном режиме. Обычно у таких потребителей нет электроники.
  • Если потребитель — цифровое устройство (большинство машин/терминалов на станции, всё, что можно подключить к сети), у него будет встроенная функция, переводящая его в цикл включения питания. Он выключится на ~5 секунд, а затем проверит, может ли снова включиться, повторяя до восстановления питания.
  • Если потребитель — лампа накаливания, она уменьшит свой радиус освещения, по сути затемняясь. Это линейная зависимость от дефицита энергии, без мерцания.
  • Если потребитель — люминесцентная лампа (большинство освещения на станции, они используют трубки), то она будет мерцать вкл/выкл с частотой, зависящей от дефицита. При реализации этого, вероятно, нужна некоторая случайность, и не делайте мерцание слишком быстрым, это не стробаскоп.
  • Продвинутые машины, такие как ускоритель частиц/излучатели, могут иметь сниженную скорострельность в зависимости от входной мощности (идея в том, что им нужно заряжать внутренние конденсаторы). Вероятно, должна быть какая-то форма кривой, так что при 50% мощности получается 25% скорости стрельбы или что-то подобное. Или они накапливают заряд внутри себя для выстрела (невидимые встроенные конденсаторы), что будет более реалистично реагировать на частые колебания и предотвратит метагейм с импульсами питания (см. эксплойты ONI).
Некоторые машины будут иметь внутренний элемент батареи, который может накапливать/предоставлять энергию, что может смягчить эти эффекты.

Хранение энергии на станции

Из-за размеров станции и количества мощных потребителей на ней следует ожидать больших колебаний спроса на энергию. Поскольку большинство генераторов не могут быстро реагировать на это, энергию необходимо хранить, чтобы обеспечить бесперебойное обслуживание остальной станции. Основное устройство хранения — SMES. Ожидается, что в инженерии будет группа таких устройств для буферизации энергии для всей станции. Другие критически важные отделы могут иметь один SMES рядом в техничке, чтобы в случае нехватки энергии они могли продолжать работать. Коридоры и другие зоны с низким приоритетом не будут иметь выделенного SMES, поэтому в случае нехватки энергии они отключатся. Мы хотим избежать чрезмерного использования этого, чтобы колебания питания на станции имели эффект реального времени на свет и машины. Здесь придётся найти хороший баланс.

Раскрутка/замедление подачи энергии

Оборудование подачи энергии (батареи или генерация) должно соответствовать нагрузке своей сети, в стиле Barotrauma. Если к цепи подключается новая нагрузка, оборудование подачи должно «раскрутиться», чтобы соответствовать спросу (при условии, что оно может его удовлетворить). Это занимает время, в течение которого сеть будет недополучать энергию, что приведёт к эффектам понижения напряжения, описанным выше. Также должна быть «импульсная» раскрутка для обработки небольших колебаний. В целом, батареи смогут соответствовать этому изменению спроса быстрее, чем реальное генерирующее оборудование. Это означает, что батареи APC, батареи подстанций (если мы решим их сделать) и SMES добавляют «фильтрацию» от внезапных колебаний питания. Но они не волшебство: если питание двигателя полностью отключится, все на станции увидят, как свет сильно моргнёт на несколько мгновений, пока SMES и APC разгоняются, чтобы заполнить внезапную дыру в подаче энергии. Следует отметить, что батареи считаются «пропускающими» всю энергию, которая не идёт через внутреннее хранилище. То есть, если у вас нагрузка 10 кВт, подача 10 кВт и полная батарея: когда подача отключается, батарея считается подающей 0 Вт и должна разгоняться отсюда. Из-за иерархической сети электропитания, если наука делает что-то странное и внезапно требует дополнительный мегаватт, они, вероятно, вызовут мерцание только в своих собственных светильниках до того, как двигатель/SMES смогут разогнаться. В настоящее время у меня нет идей для «проблем», вызванных перенапряжением (в Barotrauma перенапряжение/понижение напряжения приводит к износу распределительных коробок и необходимости ремонта). Понижение напряжения очевидно. Пусть монитор питания гневно мигает инженерам, полагаю.

Лимит мощности на подстанциях

Подстанции смогут ограничивать мощность. Таким образом, если наука установит машину, которой нужно 100 МВт, они навредят только себе. будем надеяться, что они не взломают устройство, чтобы отключить ограничение тока. Мы могли бы даже реализовать раскрутку/замедление для проходящей мощности на подстанции, чтобы наука могла использовать 10 МВт, которые есть у двигателя в запасе, но не быстрее, чем двигатель может разогнаться. Таким образом, наука может получить свои дополнительные 10 МВт, но без негативных последствий для остальной станции.

APC

APC управляют несколькими каналами питания, которые по умолчанию переключаются в зависимости от процента заряда внутренней батареи. В SS13 эти каналы: оборудование (компьютеры, производственные машины и т.д.), освещение, среда (двери/венты). Оборудование отключается при 30% заряда APC, освещение — при 15%. В идеале сеть должна саморегулироваться так, чтобы освещение выключалось (но ничего больше), если питания достаточно только для работы всего, кроме освещения. Не уверен, насколько хорошо это сработает на практике. Я предлагаю поменять местами освещение и оборудование для атмосферных эффектов. Моя текущая идея заключается в том, что APC распределяют питание по всем включённым каналам равномерно, поэтому, если доступно только 50% требуемой мощности сети, все каналы получат 50% равномерно, вместо того чтобы среда получала 100%, а оборудование, скажем, 10%. APC всё равно будут отключать каналы на основе процента батареи, что, как я полагаю, может вызвать забавное колебательное поведение в сетях с низким питанием. Посмотрим, как это сработает.

Глоссарий для Swept

Понижение напряжения (Brownout): свет хочет энергии, получает только часть = свет работает только частично. Но вместо света — всё.

Стратегии решения энергосети

Фактическая реализация этой модели требует немного больше нюансов, чем простая электрическая модель в SS13/MC модах, где батареи являются идеальными буферами с мгновенно изменяющейся скоростью подачи. Есть две стратегии, которые я придумал для расчёта или «решения» энергосетей:
  1. GraphWalkSolver: Моя первая идея, пытается обрабатывать электрическую сеть как дерево (*) и пытается обходить его вверх/вниз для расчёта нагрузок сети вверх и проталкивания подачи вниз. Он относительно довольно сложен в реализации и не очень хорошо обрабатывает сети, не являющиеся деревьями (возможно). Был бы в основном последовательным и предсказуемым (*), однако.
  2. BatteryRampPegSolver: Моя вторая идея. На высоком уровне в основном делает модель SS13/MC, но устанавливает нижний предел скорости разгона батареи на уровне её входной скорости. Хотя это порождает более странное/непоследовательное/колеблющееся поведение на графиках энергии, это чрезвычайно легко реализовать. И, честно говоря, эта странность может быть желательной.
В настоящее время BatteryRampPegSolver, вероятно, будет реализован, так как он проще во всех аспектах, но должен очень хорошо выполнять свою работу.

BatteryRampPegSolver

Решает энергосеть, рассматривая каждую сеть и скорости ввода/вывода батарей этих сетей по отдельности. «Нижний предел» для разгона подачи батарей — это вход в ту же батарею, чтобы энергия могла «проходить через», не «проходя через хранилище батареи». Это означает, что если подача энергии на батарею отключается, выход этой батареи также отключается, пока она не разгонится. Кроме того, мы устанавливаем спрос батарей на их стороне нагрузки равным неудовлетворённому спросу их питающей сети (после не-батарейных поставок). Идея в том, что это будет неявно распространять спрос вверх по «дереву» (обратите внимание, что это улучшает равномерность распределения энергии по нагрузкам. Система работает и до этого, но батареи получают очень неравномерное удовлетворение энергии). Что-то вроде того, что GraphWalkSolver делает явно. Есть различные несоответствия в этой модели, такие как очень резкое поведение графика при больших колебаниях сети. Однако всё это является эмерджентным, и, кажется, саморегулируется чрезвычайно хорошо, поэтому я чрезвычайно доволен. Я заметил некоторые бистабильные конфигурации при тестировании, но называю это функцией. Это O(n), так как каждая сеть передаётся один Я серьёзно, когда говорю, что эта модель проще, чем GraphWalkSolver. Эти четыре абзаца выше по сравнению с целой другой половиной этого документа. Выбирайте.

GraphWalkSolver

Это нетривиально реализовать по разным причинам. Я сделаю дамп наших обширных обсуждений в Discord. Первая проблема в том, что эту модель очень легко реализовать, если сеть питания представляет собой дерево. На практике, однако, станция в лучшем случае образует полидерево, а в худшем — полный направленный ациклический граф (DAG). Насколько мы можем судить, «правильное» решение сети питания в основном сводится к анализу электрических сетей с резисторами и тому подобным, что требует сложных матричных решателей и нелегко (и потому что это куча сложных вещей, о которых я ничего не знаю, И вычислительно). Также Acruid упомянул, что это может быть проблема коллапса волновой функции. Так что да, квантовая физика. Кажется, что лучший метод решения этой проблемы — просто иметь строгие правила того, как проходит обход графа нагрузками/источниками/батареями. Если реализовано правильно и хорошо оптимизировано, должно быть возможно эффективно рассчитать в масштабе станции.

Узлы сети

Текущая модель, которую я представляю, предполагает четыре типа узлов:
  1. Поставщики: генерируют энергию в сети
  2. Нагрузки: потребляют энергию в сети
  3. Диоды: соединяют две сети для передачи энергии в одном направлении, потенциально с ограничением пропускной способности.
    1. Батареи: подмножество диодов, обеспечивающее функциональность резервной батареи (думайте APC)
  4. Сети: группы устройств электропитания (поставки, нагрузки), соединённые через диоды.
Для целей всех расчётов поставки и нагрузки внутри сетей можно суммировать, так что каждая сеть представляет собой одного поставщика и одну нагрузку. Это одна из простых форм группировки, чтобы нам не приходилось заботиться об отдельных нагрузках в сети. Мы также могли бы сгруппировать несколько батарей, соединяющих одни и те же две сети, чтобы позволить им разряжаться равномерно (параллельные SMES в SS13, например). На самом деле всё это означает, что у вас есть проход в начале тика питания для суммирования устройств питания и проход в конце для разделения спроса/предложения между ними. Если я упоминаю «поставщик» или «нагрузка» далее в этом документе, я имею в виду «питающая сеть» и «потребляющая сеть». Мы никогда не работаем с отдельными устройствами питания и нагрузки, за исключением двух проходов, описанных выше. Когда я помещаю диаграммы в этот документ, + относится к поставке, - к нагрузке, -|> к диоду (стандартный электрический символ) и X к батарее. Некоторые старые диаграммы не сохраняли различие между диодом и батареей, потому что до написания этого раздела я считал их одним и тем же, так что имейте это в виду. Также, да, диоды/батареи однонаправлены, но на некоторых старых диаграммах я не утруждал себя указанием направления, так что разбирайтесь сами. Батареи и диоды подключены к двум сетям. Чтобы различать их, я называю их «питающими» и «потребляющими». «Питающая» сеть — это сеть, К которой диод поставляет энергию. «Потребляющая» сеть — это сеть, ИЗ которой диод забирает энергию.

Базовая модель

На высоком уровне поставки находят все нагрузки ниже них, суммируют их, а затем равномерно распределяют энергию по этим нагрузкам. Наивный грубый подход было бы довольно легко сломать, чтобы получить экспоненциальное поведение, и поэтому он нежелателен. Мы можем сделать лучше.

«Правильное» пропорциональное распределение

Pow3r не предназначен для моделирования реальных электрических сетей, где энергия движется по путям, пропорциональным сопротивлению или чему-то подобному. Мы пытаемся придумать систему, которая в основном работает предсказуемым образом и легко вычисляется. Это означает, что вещи очень восприимчивы к порядку выполнения по дизайну. Это означает, что сеть восприимчива к несоответствиям в порядке итерации, когда, например, при обходе дерева (какую подсеть оценивать первой). Различное поведение при сортировке поставок на основе глубины дерева (как описано ниже) легко понять. Различное поведение, потому что «левый узел первый в списке дочерних элементов» — нет. Я не уверен, что здесь можно сделать.

Обработка циклов

Эта реализация разработана в предположении, что циклы не могут существовать. Я планирую просто заставить электрическое оборудование сообщать об ошибке «обнаружен цикл» и отключаться, если цикл возникает. В любом случае нет реального допустимого использования циклов в правильной сети электропитания pow3r, так как единственным логическим результатом является то, что батареи в сети разряжаются на потери. Это не стоит пытаться заставить работать, и это значительно усложняет проблему.

Порядок поставок

Поскольку мы не можем решать реальные электрические симуляции, где электричество идёт по пути, пропорциональному сопротивлению, мы должны определить строгий порядок, в котором «доставляется» энергия. Поставки будут оцениваться в порядке высоты их дерева, по возрастанию. Это означает, что если вы поместите генератор в локальную сеть APC, генератор будет обрабатываться раньше, чем остальная станционная сеть. Это имеет два желательных свойства:
  1. Если вы поместите генератор в локальную сеть APC, он действительно снимет нагрузку с основной станционной сети, а не сможет только заполнять понижения/отключения.
  2. Это позволяет избежать восходящих обходов иерархии, как описано ниже. Это не делает их невозможными, но делает их практически несуществующими, если вы активно не создаёте странные сети для запуска этого поведения.

Иерархическое распределение энергии

Как было сказано ранее, поставки суммируют спрос, а затем распределяют свою энергию. Хитрость в группировке по нескольким сетям, чтобы избежать больших навигаций по дереву. Если работать в предположении, что сети питания являются деревом (не чем-то более сложным), процесс довольно прост. Мы проходим дерево снизу вверх, суммируя неудовлетворённый спрос и добавляя удовлетворённый спрос всякий раз, когда в сети есть поставщик. Мы заставляем предков наследовать неудовлетворённый спрос своих детей. Затем, когда мы прошли всё дерево, проходим сверху вниз в ширину, равномерно распределяя удовлетворённый спрос поставщиков вниз. Когда сеть питания вместо этого образует полидерево, требуется немного больше усилий. Прежде всего, первый обход дерева инициируется поставщиками, и поставщики перебираются в ранее обсуждённом порядке. Это делается рекурсивно, сверху вниз. Когда неудовлетворённый спрос сети наследуется её предком(ами), в сети устанавливается «флаг резервирования». Если, перемещаясь по полидереву вниз от другого поставщика, мы натыкаемся на сеть, у которой установлен этот флаг резервирования, нам нужно пройти по графу вверх. Мы поднимаемся по дереву флагов резервирования и немедленно применяем удовлетворённый спрос поставок на иерархии, очищая флаг резервирования по пути. Затем устанавливаем флаг резервирования снова для резервирования для наших собственных вычислений. Это, вероятно, требует более сложного учёта и по-соединённого «уже отправленной энергии» для отслеживания энергии, которая была «немедленно свернута». Просто очистка флагов вверх и указание «уже отправленной энергии» на соединениях может быть достаточно. Этот восходящий обход — немного больное место, но, к счастью, не должен происходить, если вы активно не настраиваете сумасшедшие сети для его создания. Худший сценарий, я полагаю, — это создание двух длинных линий сетей, таких, что они по очереди захватывают флаг резервирования друг друга, вызывая экспоненциальный обход дерева. Может быть, добавить проверку, чтобы избежать этого? Это поведение будет происходить только в таких сетях, которые не часто встречаются на реальной станции: hierarchicalpowerdistribution1.png X: батарея, -: нагрузка, +: подача Подача #2 искусственно «утяжелена» дополнительными батареями для увеличения высоты дерева, чтобы она обрабатывалась после #1. Эти обходы дерева могут учитывать ограничение тока подстанций и тому подобное, просто ограничивая количество неудовлетворённого спроса, которое может пройти через соединение между двумя сетями. Однако этого всё ещё недостаточно для полноценных DAG-сценариев, таких как этот: hierarchicalpowerdistribution2.png Этот случай не может быть прозрачно обработан: ранее обсуждённая модель попыталась бы решить это, «сворачивая» иерархию питания, чтобы немедленно вычислить неудовлетворённый спрос подсети. Но мы ещё не можем этого сделать, потому что мы всё ещё вычисляем спрос сети в первую очередь. Прежде всего, этот случай действительно сложен только при обработке соединений с ограничением тока. Когда путь к такой «присоединяющейся» сети проходит через соединение без ограничения тока, очевидно, нет проблемы, так как вы можете просто пропустить всю энергию через неограниченное соединение, и вам не придётся оценивать сеть второй раз, когда вы с ней столкнётесь. Для соединений с ограничением тока, конечно, это не так просто. hierarchicalpowerdistribution3.png Одна из идей, которая у меня была, — оценить общий предел тока присоединяющейся сети на данный момент. Тогда мы можем сказать: «первое соединение пропустило 2 кВт, мы пропустим остальное, что нужно подсети». Имейте в виду, что пришлось бы оценить общий спрос сети до диода с ограничением тока, а затем назначить соотношение, а не просто min(min_of_current_limits, subnet.demand). Это «сворачивание сети», но другого рода. Мы сворачивали бы сеть для распределения внутри сети, а не фактически поднимались бы к подаче для мгновенной раздачи энергии. Мне нужно подумать более конкретно, чтобы разобраться в этом. В общем, ээээ, если вы сталкиваетесь с сетью во второй раз, вычислите «какое максимальное количество спроса может быть удовлетворено благодаря ограничению тока», а затем возьмите оставшийся неудовлетворённый спрос для сети вместо общего. Мы можем в основном продолжать делать это. Мы не вычисляем распределение энергии здесь, а коэффициенты распределения. Важное различие заключается в том, что этот коллапс сети происходит внутри во время вычисления одного проталкивания. Это означает, что сеть питания будет внутренне согласована в конце, и если «какой-то ботан подключил к ней утяжелённую подачу случайно», и ему нужно свернуть распределение энергии, он может просто свернуть его. Однако логика будет более сложной.

Приоритеты распределения

В настоящее время я думаю о трёх четырёх проходах распределения энергии по сетям питания, в этом порядке:
  1. Подача -> нагрузка
  2. Батарея -> нагрузка
  3. Подача -> батарея
  4. Батарея -> батарея
Батареи могут быть эффективно смоделированы как сквозные (всегда), поставки (при разряде) и нагрузки (при зарядке). Упорядочивание распределения таким образом означает, что поставки всегда максимизируются до того, как используются батареи, и батареи не забирают энергию у машин при зарядке. …За исключением того, что это первоначальная идея. Другая идея, которая у меня была, заключается в том, что ВСЁ обрабатывается за один проход. Это означает, что батареи всегда будут выдавать энергию (например, APC всегда разряжаются в свою собственную сеть), НО мы позволим прямому входному заряду батареи вычитаться для целей расчёта разгона. Таким образом, батарея может подавать 1 кВт (базовый допуск разгона) в свою питающую сеть, но она немедленно ПОЛУЧИТ потребность в 1 кВт для себя, которую должна обработать родительская сеть. Если этот 1 кВт будет удовлетворён, мы избежим увеличения позиции разгона, так что батарея не будет разгоняться. Вы фактически не смогли бы сказать, что это происходит. Это возможно, потому что мы знаем, что батарея всегда обрабатывается раньше, чем что-либо, что может питать её (подача снизу вверх). Однако это усложняет вычисление группировки сети, так как мы сможем вычислять группы сети только после того, как загружающие батареи сети обработают своё распределение энергии. Это сделает код менее элегантным, но не должно быть проблемой. Единственный крайний случай, который я сразу вижу, заключается в том, что это означает, что ситуации с утяжелённой иерархией (описанные выше) будут вести себя иначе. Если у вас есть такой сценарий: distributionpriorities.png Порядок, в котором оцениваются поставки (батареи и обычные поставки), может быть таким, как описано. В этом случае #1 будет разряжаться вместо того, чтобы позволить #4 взять на себя. Я бы сказал, что этот крайний случай не стоит дополнительной сложности и накладных расходов, создаваемых необходимостью в 4 проходах распределения энергии.
Последнее изменение 21 июня 2026 г.