Руки трясутся. Никак не могу перезагрузить этот чёртов сервер. Пытаюсь дозвониться до начальника. Не берёт трубку — конечно, на обеде или ушёл покурить. Слышу, как группа людей в коридоре приближается. «Мне бы минут двадцать, — думаю я, — ещё бы минут двадцать, и всё заработает». Но не сейчас… Я же просил всё проверить, прежде чем присылать мне для наката изменений. Я будто Авгиевы конюшни тут расчищаю… Одна грязь… Так, по ходу, их заболтали… Время ещё есть… Да как же вы так пишете на этом Фортране и деление на ноль не проверяете! Дверь в помещение открылась…
Вот так вспоминается первый год в роли инженера по моделированию систем электроснабжения собственных нужд АЭС

Часть первая — наивная
В компанию по созданию тренажеров операторов для АЭС (а сейчас цифровых двойников) я пришел на позицию инженера по моделированию систем электроснабжения собственных нужд. На дворе 2013 год. Впереди — защита диплома и поступление в аспирантуру, лето, можно сказать — нова глава в жизни, а про AI и прочих искусственных личностей никто не знал. Вот она — сладость воспоминаний.
Как же описать впечатления от первой работы? Коротко — восторг регулярно сменялся разочарованием. Причем не один раз, а с завидной периодичностью. Что‑то вроде колебательного переходного процесса, который никак не хочет выйти на установившийся режим, такой вот эмоциональный маятник. За понятными в резюме задачами по моделированию электроснабжения атомной станции, скрывался свой «удивительный» мир, где находить решения при ограниченных ресурсах приходилось довольно часто.

Тяга к работе с железом, автоматикой и «необычным» путям их решения проявилась еще с детства, а в институте еще и укрепилась. На производственной практике 3 курса нам поставили задачу — запустить монструозный компрессор мощностью около 140 киловатт. По паспорту он был защищен релейной автоматикой по протоку охлаждающей воды. Схема выглядела красиво только в методичке, ибо компрессору, как и всему комплексу было лет 30, а то и больше. Датчик и автоматика работали, а вот контур охлаждения — разомкнут. Запуск машины — чистая импровизация, изолента, палки и гав...переработанные продукты. Мы притащили стандартную двухсотлитровую бочку, затащили ее ниже уровня двигателя за здание цеха, набрали воды — правильнее сказать, натаскали. А задачу принудительной циркуляции решил обычный вибрационный насос «Малыш», подключенный через шланги напрямую в рубашку охлаждения. Автоматика работала «нормально», и руководитель практики пошел включать монстра к распред устройству, ‑что‑то долбануло, искры полетели, но компрессор наконец‑то начала качать воздух в ресивер. Правило усвоено: если система безопасности мешает «производству» дышать, «производство» найдет способ её обмануть продолжить работу. И этот навык находить обходные пути там, где нет бюджета или времени на правильный проект, потом очень пригодился мне при дописывании чужого кода.
Но вернемся к делу. Что от меня требовалось? Модель собственных нужд можно условно разбить на несколько крупных частей: модель установившегося режима, схема собственных нужд, модели генератора и двигателей, а также модели систем управления и прочей РЗиА(релейных защит и автоматики). Масштаб выглядел внушительно и даже вдохновляюще. Вот только с инструментами и с реализацией все было не так гладко, — как и всегда.
Если совсем по‑простому, электрическую систему можно рассматривать как цепь, в которой электроэнергия производится, распределяется и потребляется. Ее элементы делятся на активные: источники ЭДС и тока, то есть генераторы и нагрузки, и пассивные: сопротивления и проводимости, которые задают пути для токов.
Для расчета установившегося режима обычно задают топологию схемы, сопротивления(проводимости) ветвей, значения генерации/нагрузки и напряжение базового узла. После этого нужно определить напряжения узлов и токи в ветвях. Практически удобнее решать не всю систему по ветвям, а переходить к узловым уравнениям. Это экономнее и по числу уравнений, а значит и по вычислительным ресурсам, потому что число ветвей обычно заметно больше числа узлов. Сначала находят узловые напряжения, а затем — токи в ветвях по закону Ома. Лучше всего методы решения описаны в книге Идельчика — всем причастным настоятельно рекомендую ознакомиться.
Про метод узловых напряжений(потенциалов)
В матричной форме система узловых уравнений записывается так:
где Yy — матрица собственных и взаимных проводимостей, U — узловые напряжения, I — токи, Yбаз — проводимости с базовым узлом, Uбаз — напряжение базового узла.
Если узлы (k) и (j) соединены ветвью с проводимостью (Y_i), то взаимная проводимость между ними равна (Y_{kj} = ‑Y_i = -1/Z_i). Собственная проводимость узла (Y_{kk}) — это сумма проводимостей всех присоединенных к нему ветвей, либо, с обратным знаком, сумма его взаимных проводимостей. Задающий ток узла (I_k) — это алгебраическая сумма токов источников в этом узле: генерация и потребление, как водится, имеют разные знаки. Если в модели присутствуют источники ЭДС, то в ток также входят произведения ЭДС на проводимости соответствующих ветвей.
Для сети переменного тока уравнения обычно приводят к системе действительных уравнений порядка (2n), раскладывая комплексные матрицы и векторы на действительную и мнимую части:
Матрица (Y_y) симметрична и разрежена: большинство ее элементов равно нулю, потому что каждый узел связан только с небольшим числом соседей. Учет разреженности критически важен и для экономии памяти, и для ускорения вычислений. На бумаге все выглядит красиво, а вот на железе ВНЕЗАПНО начинает иметь значение каждая мелочь.
Одно дело — решать систему уравнений на компьютере с кружечкой бодрящего чая, и совсем другое — подать питание на реальный стенд. На старших курсах мне разрешили(!) автоматизировать лабораторию горных машин: две установки — вентиляционная и насосная (1,3 кВт и 2,7 кВт). Наверное, потому что проще меня куда‑то направить, чем со мной спорить, а главное — затрат никаких не требовалось, — преобразователь частоты мне достался от отца, который списал его за ненадобностью. Вспоминаем про палки и ту самую субстанцию. Идея была простая: щелкнул тумблером — гоняешь привод от напрямую сети, щелкнул еще раз — переводишь одну из установок на питание от ПЧ. Кустарно, но все было собрано за пару часов. Насос с частотником подружились сразу. Напор номинальный, а форма тока двигателя на осциллографе близка к синусоидальной. Но переключившись на вентилятор, осциллограф показал форму тока, близкую к «акульему плавнику»(смотреть картинку ниже). Проблема оказалась классической для силовой электроники: несогласованность индуктивностей. Четырехкиловаттный инвертор просто не мог корректно сформировать ШИМ‑сигнал для такой легкой и высокоиндуктивной нагрузки, как бы я не менял параметры частоты коммутации. Двигатель то работал, но необходимого момента не развивал. Идеальные, и чаще всего линеаризованные модели, такого не показывают. Опыт был точно полезный — дьявол всегда кроется в параметрах моделируемых объектов, будь то электродвигатель или ядерный реактор. При создании программ он пригодился не раз.

Модели, модельки, моделички мои. К методу узловых потенциалов, описанному выше, есть еще ряд отягчающих обстоятельств для его реализации в тренажерных комплексах. Во‑первых, расчет должен быть строго детерминированным(предсказуемым) и укладываться в жесткие временные ограничения. Это означает, что никакие итерационные методы решения СЛАУ нам не подходят.
Во‑вторых, эта модель описывает только установившийся режим электрической сети. Если добавить уравнения движения электрических машин, мы уже получим электромеханические переходные процессы, то есть учтем инерцию вращающихся масс генераторов и двигателей. При этом электромагнитные переходные процессы в обмотках, как правило, не учитываются, потому что они происходят значительно быстрее, чем скорость реакции оператора и шаг интегрирования в таких системах (порядка 10 — 50 мс). Самое неприятное здесь — моменты генератора при параллельной работе с сетью зависят от напряжения в узле подключения, а это делает систему нелинейной, вызывающей мигрени и без нурофена дальше работать не получалось. А если хочется и электромагнитные процессы воспроизвести, и коммутацию силовой электроники учесть — это уже другой класс симуляторов, предназначенный для HIL/Sil или полунатурного тестирования АРВ (автоматических регуляторов возбуждения) и терминалов защит. Вот кстати, интересная работа по настройке АРВ в другую эпоху.
В‑третьих, нагрузку тоже нужно было моделировать аккуратно. Использовать статическую нагрузку или эквивалентную схему замещения для двигателя через источники тока оказалось нестабильно, а кроме того, требовало дополнительных пересчетов из собственной системы координат в общую. Лишняя работа, лишние телодвижения и как известно — тем вероятнее ошибиться везде. В итоге оказалось, что моделирование нагрузки управляемыми шунтами и проще, и устойчивее. Что характерно, потом этот вывод мне подтвердили специалисты из МРСК на одной из конференций. Всегда приятно, когда ты не один такой и твои небольшие инженерные изыскания находят профессиональное подтверждение.
Несмотря на наличие продвинутых графических инструментов, часть моделей была написана (барабанная дробь) — на Фортране 77. Мой преподаватель по электроприводу и система управления рассказывал, как собирал модель буровой колонны и электропривода буровой установки на АВМ (что то типа такой — тоже классная статья), соединяя проводками и перемычками нужные дифференциальные уравнения, а потом писал программы на этом самом Фортране — в голове сразу промелькнула картинка с перфокартами. Впечатление еще больше усилилось: мне выдали весь этот код еще и в виде пояснительной записки (hand book такой), чтобы было «под рукой». И, несмотря на сомнительные допущения и довольно вольные трактовки уравнения движения ротора синхронной машины, ощущение работы с чем‑то по‑настоящему серьезным и научным не покидало.
После нескольких довольно активных месяцев наступило затишье — лето. Сезон отпусков, когда все впадает в состояние производственного штиля. Пытка тишиной.
Основная работа свелась к монотонному повторению уже пройденных тестов. В такие периоды особенно остро начинаешь задумываться о смене места работы…
Но осенью все изменилось. Пришли данные о моторах и изменениях в схеме собственных нужд. Я уже мысленно готовился к тому, как сейчас мы быстро и красиво все замоделируем. Но, разумеется, реальность не любит слишком оптимистичных сценариев.
Пайплайн сборки модели выглядел примерно так: Редактор → Метаданные → Кодогенератор → Постпроцессор → Компиляция RTE.
Самый веселый момент заключался в том, что компиляция одной модели занимала около шести часов. Шесть! Часов! Карл! Утром ты вносишь пару линий в схему, добавляешь несколько шин или меняешь параметры трансформатора, запускаешь генерацию — и до вечера у тебя есть время подумать о смысле жизни, мечтают ли андроиды об электроовцах и о том, почему все это нельзя было сделать чуть быстрее. На молодого и «зеленого» инженера это производило сильнейшее впечатление: задача выглядела гигантской. Хотя в глубине души меня не отпускало ощущение, что здесь что‑то не так. И, как оказалось, не зря.

Предыдущий автор кодогенератора, матерый гуру моделирования теплогидравлических процессов, но при этом довольно архаичный в подходах к программированию, решил вручную сделать работу компилятора. То есть развернуть все циклы в коде. В результате компактный алгоритм, который должен был укладываться в несколько сотен строк, превращался в огромную простыню в лучших традициях «а давайте просто распишем все руками, и пусть потом кто‑нибудь это поддерживает». Впрочем, и это еще не все.
На сервере в настройках компиляции для GCC была включена оптимизация уровня O3. Вроде бы логично: реальное время, нужна скорость, нужна оптимизация — так мне «взрослые» говорили. А на практике именно это приводило к тому, что одна модель компилировалась по шесть часов. К таким вещам мне, как и положено новичку, приходилось приходить почти вслепую: через книги, через собственные ошибки, через наивное «ну, наверное, так и должно быть». В итоге я попросил сисадмина убрать O3(прочитав об опциях для компилятора, и поняв, что она для моего случая бесполезна), и работать стало заметно быстрее. А вместе с этим пришло и очень полезное чувство: одну конкретную, но важную проблему я все‑таки смог решить.
Часть вторая — закаляемся
Через год случилось это…Первая рабочая командировка. Боевая. Причем не просто так, а еще и за старшего — руководить командой (из двух человек!) в испытаниях на площадке. К этому моменту я уже неплохо понимал общую архитектуру системы, но еще не работал напрямую с железом и с вводом‑выводом имитаторов пульта управления. А именно там меня и ждали сюрпризы — на этот раз от предыдущих моделистов.

Первая особенность проявилась довольно быстро. На площадке оказался настоящий начальник электроцеха, человек с двадцатилетним опытом работы на станции с реактором типа РБМК и при этом с очень сильной теоретической подготовкой. Да, у нас иногда возникали трения, но в целом это был очень приятный человек, который отлично знал свое дело и с которым можно было долго обсуждать «темные электрические силы».
Здесь начинается забавная история. Модели асинхронников писал все тот же наш гуру — магистр законов сохранения масс, энергии и термодинамики. Потом эта подпрограмма несколько раз кем‑то дорабатывалась, «улучшалась и переписывалась». Меня к ней не подпускали: мол, другая система, другая зона ответственности, процессы, регламенты, да и дел у тебя должно хватать. Но любопытство, как известно, плохо совместимо с запретами. Я все‑таки добрался до кода и,‑ ничего не понял.
Там была какая‑то эмпирическая формула вместо более‑менее внятной, например, формулы Клосса для описания момента. Вместо уравнения движения ротора — то ли апериодика первого порядка, то ли что‑то еще в том же духе. А главное — загадочная формула для вычисления косинуса фи. Все это сыграло со мной злую шутку. Тот самый инструктор начал проверять режимы пуска двигателей собственных нужд, чтобы оценить адекватность модели. И задал вполне естественный вопрос: увидим ли мы пусковые токи в 5–7 раз выше номинала? Конечно, говорю, увидим. Все как по учебнику, классика.
Классики, разумеется, не оказалось вообще. Пришлось срочно переписывать эту подпрограмму и внедрять ее уже в работающий тренажер. И вот тут особенно интересно наблюдать, как люди уверенно описывают сложнейшие тепломассообменные процессы, но при этом не всегда могут корректно смоделировать поведение асинхронного двигателя, который по сравнению с ними выглядит почти как топор: простой, понятный и вроде бы без особых нюансов. Хотя, как выяснилось, нюансы там тоже есть, просто хорошо спрятаны.
Вторая задача была связана с подключением особенного прибора — синхроноскопа. Он используется для синхронизации генератора с сетью. Сам по себе прибор не самый экзотический: по сути, штука вполне понятная, состоит из сельсина и сопутствующей обвязки. Но у нас был не настоящий стенд, а тренажер, имитатор. Поэтому по каким‑то причинам для синхроноскопа была разработана специальная плата — фактически генератор управляемого сигнала.
Четыре 16-битных слова управляли состоянием этого генератора: два для напряжений и два для частот. В ответ плата возвращала значение фазы в градусах, которое затем использовалось в модели управляющей логики. Управлять прибором, в общем‑то, несложно. Но физический смысл при такой реализации заметно растворялся.
Разница углов между напряжением генератора и сети уже не была связана с моделью напрямую — она просто имитировалась, потому что генератор был сильно упрощен. И если визуально процесс был похож на реальный и даже позволял отрабатывать навыки, то в модельном смысле все было не так просто. Типичная история: выглядит почти как в жизни, а внутри — компромисс на компромиссе.
Кстати, вот тогда я узнал про «генеральский эффект». Это когда приходит комиссия из уважаемых специалистов, все должно выглядеть красиво и убедительно, а в этот момент у тебя, как назло, не работает ничего. Абсолютно ничего. Так и произошло: во время демонстрации нужно было запустить весь тренажер целиком. И ровно в этот момент одному из инженеров приспичило прислать изменения по своей модели. На вопрос «Точно можно заменить исходники?» был дан ответ: «Точно, все проверил». Не точно, и не проверил.

Не знаю, как именно он там все проверил, но тренажер ушел в критическую ошибку, а полная перезагрузка занимала минут десять. Комиссия стоит в дверях, время идет, а у нас внутри системы — творческий кризис и полный технический перформанс. Спас нас тогда только напарник, который отвлекал гостей, пока мы пытались вернуть все к жизни. Нервных клетки так и не восстановились, зато собственная система «стрессоустойчивости» протестирована в полном объеме.
Часть третья — международная
Справедливости ради, я не хочу говорить, что модели были плохими или, что кто‑то специально закладывал в них грубые допущения. Долгое время к моделям электрической части вообще относились как к второстепенному направлению: главное ведь, что происходит в технологической части. Поэтому на точность схем собственных нужд часто смотрели довольно снисходительно. Примерно, как на старый, но любимый инструмент: вроде уже не идеален, но выбрасывать жалко.
Однако все эти допущения приводили к большому количеству замечаний, бесконечным обсуждениям, переделкам и, что особенно неприятно, к значительным затратам времени. И все же надо признать: тренажеры оставались настоящим инженерным произведением искусства — качественной репликой, сделанной на очень достойном уровне. Просто было очевидно, что потенциал для улучшения там огромный.
В какой‑то момент руководство поставило задачу переписать и кодогенератор, и математические модели. А я ведь, строго говоря, не программист. По крайней мере, тогда — уж точно не «настоящий». Но именно в этом и был интерес. В итоге я свернул алгоритм, чтобы он стал компактнее и удобнее для поддержки. Переписал модель синхронной машины. Сколько же я с ней намучался…Алгоритм то классический, и применяется повсеместно в таких программах как ETAP но вот добиться корректности, устойчивости и нормального поведения в реальном времени с ходу не получалось.
После этого я переписал все модели асинхронников. Добавил подпрограмму для расчета параметров цепи замещения на основе паспортных данных, а также итерационное уточнение для более точного воспроизведения механических характеристик. Затем добавил модели АРВ, АРПН, первичных двигателей, устройств РЗиА, а также модели первичных двигателей, включая дизель‑генераторные установки и их системы регулирования.
Эти улучшения дали сразу несколько эффектов. Во‑первых, повысилась точность. Во‑вторых, выросла устойчивость численного решения. А в‑третьих, открылись возможности для новых продуктов компании. То есть работа перестала быть просто исправлением чужих решений и начала превращаться в платформу для следующих шагов.

Однако внезапно появился и новый «вызов», и, конечно, в образе знаменитого пушистого зверька. Разрабатывая программное обеспечение для тренажёра Тяньваньской АЭС, наши «уважаемые коллеги и друзья» из Siemens кое‑что позабыли — включить в поставку симулятор для ЭЧСР (электронная часть системы регулирования) турбины. Почему? А что ж вы не спросили сразу. Симулятор АСУ нормальной эксплуатации — вот, пожалуйста, получите. А ЭЧСР будет реализован на S1500, для него симулятор стоит отдельно. Стоит сказать, что его просто не было. Хитрые продажники хотели срубить деньжат дополнительных, нагрузив единственного инженера, пусть будет Рафаэля, под создание такого симулятора, а ещё и его интеграцию в состав полномасштабной модели, испытания, поддержку... Но не вышло. У кого было всё хорошо с моделями на проекте и есть время свободное?
У нас (меня и двух девушек‑инженеров, которых выделили мне в помощь) было: десять разных исходных документов, альбом со схемами и техзаданием на автоматизацию, инструкция по функциональным блокам и 3 месяца до сдачи тренажёра заказчику. Что ж, неплохо. Полтора месяца ушло на работу в Москве. Работу по моделированию функциональных блоков я передал одной коллеге, вторая помогала мне с реализацией алгоритмов в соответствии с техзаданием, а сам я сводил всю модель вместе, достраивал и тестировал. Модели ЭГП (электрогидравлических преобразователей), характеристик, уходящие в никуда сигналы, ошибки в описании документации, настройки ПИД‑регуляторов по умолчанию — всё потихоньку поддавалось.
А дальше — 1,5 месяца в Китае на испытания. И не забыть ещё про свою систему, проверить все подключения приборов‑имитаторов к модели, и, конечно, режимы синхронизации генератора, а они без работающей модели ЭЧСР, естественно, не пройдут. В общем, с 8 утра до 8 вечера, по 6 дней в неделю, и китайский колорит (громкая музыка, смешанная из хитов ABBA и приправленная соло Ингви Мальмстина под окнами в 6 утра, запахи уличной еды, постоянные гудки водителей) стали моими напарниками на эти недели. Но главное — тренажёр сдан в срок, да ещё и сэкономили немалую сумму на проекте.

Здесь должен быть какой‑то вывод. Пусть будет такой — да, от наименования ВУЗа многое зависит, но больше зависит от тех преподавателей, которые в нем работают и вашей готовности эти желания «впитывать». Мне с моими с наставниками повезло, и, наверное, поэтому, удалось решить такие разноплановые задачи — моделировать, программировать, и даже немного поруководить.
Часть четвертая — на ход ноги
История, которая, как известно, не знает сослагательного наклонения. Что было бы «если» — пустая трата мысленных ресурсов, всё уже случилось именно так. Сначала — знакомство с моделированием и первые инженерные шишки, потом — испытания, командировки, неожиданные баги и демонстрации, после которых хочется проверить всё ещё раз, а потом — уже системная работа над развитием продукта. Именно из «неидеальных» эпизодов и складывается настоящий опыт. А когда свой путь пройден, дрожь в руках и «генеральский эффект» уже вызываешь ты сам у следующих молодых инженеров — и цикл замыкается.

