После статей про напыление рентгеновского зеркала с помощью LLM и локальную Qwen 3.8 в роли оператора возникал вопрос: как проверить агента на управлении вакуумной установкой, если нет ни самой установки, ни ПЛК? Мы выложили под лицензией Apache-2.0 пакет APS Control Community — нашу рабочую программу управления напылением, физический эмулятор оборудования и сервер MCP.

Программа работает на обычном ПК с Windows и не требует прав администратора. В комплекте идут три конфигурации: простая камера с двумя магнетронами (Sputter), установка со шлюзом загрузки из нашей прошлой статьи (ADS) и четырёхкамерный кластер с транспортным роботом (Cluster). Управлять клапанами и запускать рецепты можно вручную из окна оператора, а можно подключить через MCP локальную модель или Claude Code.


Эмулятор как отдельный сетевой процесс

Недавно на Хабре выходила статья «Эмуляция АСУ ТП» об отладке самописного софта для бетонного завода без SCADA. Там программа на Delphi при сборке переключается директивой {$IF Emulate=True} между реальным портом ComPort.Write и вызовом Emulator.Send. Вес в окне отладки задаётся ползунком, а задержка шины RS-485 имитируется паузой около 20 мс на модуль (400–1000 мс на цикл опроса). Для одиночного приложения схема простая и удобная.

Мы устроили эмуляцию иначе — вынесли её в отдельный сетевой процесс. В коде самой управляющей программы нет условной компиляции #if EMULATE. Штатные драйверы контроллеров Siemens S7 (порт 102) и периферийных приборов (порты 5025–5033) всегда работают через обычные TCP-сокеты. В лаборатории они подключаются к реальному оборудованию, а на ноутбуке — к запущенному рядом эмулятору на локальных адресах 127.0.0.1–127.0.0.5. Сама система управления не знает, кто отвечает ей по сети — стойка с ПЛК или модель на C#.

Опрос оборудования и физическая модель камеры

Выделенные потоки для шин связи

Частая ошибка в самописных программах управления — отправлять синхронные запросы к железу в общий пул потоков через Task.Run. Пока приборы отвечают быстро, всё работает нормально. Но стоит нескольким линиям подвиснуть на сетевых таймаутах, как свободные потоки заканчиваются. Следом замирают окно оператора и выполнение рецепта.

Поэтому каждой шине у нас выделен собственный постоянный поток (LongRunning) без await и Task.Run. Задержка одного контроллера остаётся внутри его цикла и не мешает соседям. Состояния клапанов читаются с ПЛК одним пакетным запросом за такт. Команды оператора и шаги рецепта идут через планировщик приоритетов — вперёд фонового опроса датчиков. За обновлением цикла следит сторожевой таймер: если связь оборвётся, система поднимет аварию, а не оставит на экране старые цифры.

Как эмулятор считает вакуум и тепло

Эмулятор рассчитывает состояние каждой камеры по общему балансу газа и тепла. Эффективная скорость откачки зависит от открытия дроссельной заслонки квадратично: S_eff = PumpSpeed * (Throttle / 100)^2, а постоянная времени камеры равна tau = Volume / S_eff. Достаточно прикрыть заслонку до 25%, чтобы откачка замедлилась в 16 раз.

Регуляторы расхода газа (MFC) выходят на заданный поток с постоянной времени 0,5 с. Нагрев и остывание подложкодержателя считаются по закону излучения Стефана — Больцмана (T4) отдельно от охлаждения стенок камеры. Ждать откачку и остывание в реальном времени не нужно — модельные часы в окне эмулятора ускоряются в десять и более раз (от штатного 1x). Там же прямо на ходу можно включить перегрев или отказ любого узла и посмотреть, как сработают защиты.

На рисунках 1–3 показана работа профиля ADS (камера со шлюзом загрузки, четырьмя магнетронами и ионным источником) при напылении многослойного зеркала Ru/C.

Рисунок 1. Вкладка System в профиле ADS во время напыления структуры Ru/C: через клапан V2 подаётся 40 sccm аргона, давление в камере 3,00·10−3 Торр, работают магнетроны углерода и рутения (400 и 300 Вт). Ручное управление на панели заблокировано — включён удалённый режим REMOTE.
Рисунок 1. Вкладка System в профиле ADS во время напыления структуры Ru/C: через клапан V2 подаётся 40 sccm аргона, давление в камере 3,00·10−3 Торр, работают магнетроны углерода и рутения (400 и 300 Вт). Ручное управление на панели заблокировано — включён удалённый режим REMOTE.
Рисунок 2. Вкладка Process во время выполнения того же рецепта: карусель подложек на шесть позиций (FL 1–FL 6), графики давления (3,00 мТорр), открытия дросселя (27,2%) и токов магнетронов (707,11 и 612,37 мА), а также шкала напыления слоёв.
Рисунок 2. Вкладка Process во время выполнения того же рецепта: карусель подложек на шесть позиций (FL 1–FL 6), графики давления (3,00 мТорр), открытия дросселя (27,2%) и токов магнетронов (707,11 и 612,37 мА), а также шкала напыления слоёв.
Рисунок 3. Окно эмулятора в профиле ADS: турбонасос TP вышел на рабочие обороты, а прикрытая до 27% дроссельная заслонка удерживает в камере давление 3,01 мТорр.
Рисунок 3. Окно эмулятора в профиле ADS: турбонасос TP вышел на рабочие обороты, а прикрытая до 27% дроссельная заслонка удерживает в камере давление 3,01 мТорр.

Многокамерный кластер на пяти ПЛК

Для многокамерных процессов есть профиль Cluster (рисунок 4). Вокруг шестигранного модуля с транспортным роботом здесь собраны шлюз загрузки и четыре технологические камеры с шиберными затворами. В каждой камере стоят свои мишени: медь и титан в первой, вольфрам во второй, кремний и карбид бора (B4C) в третьей, ещё один медный магнетрон в четвёртой. Эмулятор поднимает для такой схемы пять независимых виртуальных ПЛК Siemens S7. Чтобы провести подложку по маршруту, сценарию приходится согласовывать откачку, выравнивание давлений и открытие шиберов между разными контроллерами.

Рисунок 4. Вкладка Process в профиле Cluster на завершающем шаге стартового рецепта SYSTEM_START (шаг 90 из 90): транспортный модуль с роботом в центре, шлюз LL, четыре камеры с кривыми откачки до 10−7 Торр и графики потоков газа и температур.
Рисунок 4. Вкладка Process в профиле Cluster на завершающем шаге стартового рецепта SYSTEM_START (шаг 90 из 90): транспортный модуль с роботом в центре, шлюз LL, четыре камеры с кривыми откачки до 10−7 Торр и графики потоков газа и температур.

Рецепты и защита от ошибок

Технологический процесс записывается простым текстовым сценарием внутри XML-файла .rcpx. Встроенный редактор подсвечивает синтаксис, а в поставку уже входят штатные программы откачки и запуска установки (например, SYSTEM_PUMP_OUT и SYSTEM_START). Вот проверенный в эмуляторе рецепт напыления пятипериодной структуры Ru/C для профиля ADS:

pump SP1 on
 valve FL open
 valve GVM open
 pump TP on
 MFC Ar1 40
 valve V2 open
 pwait 3mT 90
 set PSU_C Power 300
 power PSU_C on
 set PSU_B Power 400
 power PSU_B on
 loop 5
   deposit Ru 25 Home
   deposit C 25 Home
 endloop
 power PSU_C off
 power PSU_B off
 pwait 0 1
 MFC Ar1 0
 valve V2 close

Логика сценария простая. Включаем форвакуумный насос SP1 и турбонасос TP, открываем клапаны откачки, подаём 40 sccm аргона через V2 и ждём стабилизации давления 3 мТорр. Затем подаём 300 и 400 Вт на магнетроны и в цикле из пяти повторений напыляем поочерёдно по 25 с рутения и углерода — суммарно по 125 с на каждый материал (250 с напыления).

Зачем в конце рецепта, перед закрытием аргона, стоит команда pwait 0 1? Если её пропустить и сразу подать MFC Ar1 0, синтаксис останется верным, но встроенный анализатор validate_recipe выдаст предупреждение ещё до запуска. Обнуление последнего расходомера переводит камеру в дежурный режим (Idle), хотя дроссель всё ещё держит рабочие 3 мТорр. В режиме Idle допускается не более 0,0001 Торр, и через 60 с установка поднимет тревогу по вакууму. Команда pwait 0 1 сперва сбрасывает уставку и полностью открывает заслонку.

На уровень ниже рецептов работают защитные блокировки системы управления. Обойти их нельзя ни из редактора, ни командами по сети. Например, клапан напуска воздуха проверяет восемь условий: автоматика не даст открыть его при открытом шибере турбонасоса или включённом форвакуумном байпасе. А блокировка по давлению (порог 750,0 Торр) не позволит подать высокое напряжение на магнетроны в разгерметизированной камере.

Подключение LLM по MCP и открытый бенчмарк

На этом же профиле ADS мы проверяли локальную Qwen 3.8 на видеокарте с 16 ГБ памяти. Вместе с программой управления мы открыли универсальный навык оператора aps-operator-skill (CC-BY-4.0) и расширенный бенчмарк ads-benchmark (ADS-Bench v2.0). В нём 46 задач (40 коротких упражнений и 6 сквозных сценариев) по всем трём профилям — Sputter, ADS и Cluster, — включая те 22 задачи из прошлой статьи. Любую модель или связку с Claude Code теперь можно проверить в тех же условиях.

По умолчанию сетевой доступ для агентов отключён. Скрипт tools\Enable-AgentAccess.ps1 создаёт конфигурацию локального сервера на 127.0.0.1:8026 (TLS с привязкой сертификата и проверкой ключа по SHA-256) и выводит готовую команду claude mcp add aps-control ... для подключения моста APS.Mcp.exe через stdio.

Семнадцать инструментов MCP разделены на три уровня доступа:

• Read — чтение схемы установки и текущих показаний датчиков (describe_machine, describe_hardware, device_snapshot);

• Recipe — предпусковая проверка, запуск сценариев и выгрузка логов (validate_recipe, start_recipe, list_runs, fetch_run_files); этот уровень включается по умолчанию;

• Manual — прямое управление отдельными узлами (device_command), выдаётся только с флагом -Manual.

Даже с выданным ключом ни одна управляющая команда не пройдёт, пока человек сам не переведёт пульт в режим Online-Remote (на тестовом стенде для этого есть переменная окружения APS_DEV_CONTROL_MODE=Remote). В локальном режиме модель может читать датчики и проверять рецепты через validate_recipe, но открыть клапан или запустить напыление система не позволит.

Ограничения эмулятора

Разумеется, эмулятор считает только общий баланс газа и тепла в объёме камеры, без моделирования плазмы и трёхмерной газодинамики. Для отладки защитных блокировок, логики переключения клапанов, инерционности расходомеров и поведения ИИ-агентов этого вполне хватает. Однако постепенную выработку мишени магнетрона, дугообразование («прострелы») или дрейф скорости напыления в длинной серии процессов такая модель не воспроизводит. О том, как эта же система управления работает на реальном оборудовании, мы рассказывали в статье про цифровизацию нашей лаборатории и в препринте arXiv:2609.12796.

Установка, профили и первый запуск

Исходный код и установщик выложены в репозитории APS Control Community (актуальный релиз — v1.7.2). Программа ставится в профиль пользователя без прав администратора. Интерфейс написан на WinForms, поэтому сборка работает только под Windows и требует .NET 10 Desktop Runtime — базового рантайма без десктопных библиотек не хватит. Цифровой подписи у инсталлятора пока нет, и при первом запуске Windows SmartScreen покажет предупреждение.

В папке Configs\ лежат три готовых профиля оборудования разной сложности:

Профиль

Устройство установки

Схема в эмуляторе

Назначение

Sputter (по умолчанию)

Одна камера (200 л), два магнетрона (DC/PDC и RF), разгон турбонасоса 120 с

1 ПЛК S7 и 2 источника питания

Простой стенд для первого знакомства

ADS

Камера со шлюзом загрузки, 4 магнетрона (Si, C, Ru, Co), ионный источник, дроссельная заслонка и вращающийся подложкодержатель

1 ПЛК S7, 6 источников питания, контроллер дросселя TC1, приводы держателя и заслонки

Установка из наших тестов LLM

Cluster

Шестигранный модуль с роботом TM (100 л), шлюз LL (10 л) и четыре камеры C1–C4 по 30 л

5 независимых ПЛК S7, 6 источников питания и контроллер робота

Многокамерный кластер с перегрузкой подложек

 Для запуска открываем APS Emulator Community, выбираем профиль в меню File -> Open Project... и оставляем галочку Also point Control at this project — править конфиги вручную не нужно. Следом запускаем APS Control Community, и программа управления стартует с выбранной установкой. Встроенный редактор рецептов и режим Online-Remote доступны без файла лицензии.

Если заметите ошибку в профилях или захотите добавить драйвер под своё оборудование — присылайте issue и pull request на GitHub.