Дьявол в деталях: почему ИИ в PLC пока опаснее динамита
В 2025 году мой коллега попросил ChatGPT написать простой PID-регулятор на Structured Text. ChatGPT выдал красивый код с вызовом функции PID_CONTROL. Проблема: такой функции не существует ни в одной PLC-среде. Через полгода на тестовом стенде другой инженер скопировал из Copilot процедуру инициализации, которая использовала REAL_TO_DATE — несуществующее преобразование. ПЛК упал в STOP без предупреждения.
Галлюцинации ИИ в промышленном коде — это не забавные баги. Это дни простоя, сгоревшие приводы и сорванные контракты. Стандартные LLM (GPT-4, Claude 3.5, Gemini 2.0) обучались на миллионах строк кода, но лишь <1% из них — PLC-код. Модели не знают, что TON таймер в Siemens отличается от TON в Codesys, что адреса %IW2.4 существуют только в определенных конфигурациях, и что ARRAY[0..10] в Beckhoff — это не то же самое, что в AB Rockwell.
Я прошел путь от разочарования в AI до создания инструмента, который решает эту проблему. В этой статье — весь опыт: архитектура PLC AI Studio, конкретные грабли и рабочий пайплайн верификации.
Суть: PLC AI Studio — это не просто обёртка над API OpenAI. Это система, которая учит LLM не врать про PLC. Fine-tuning на датасетах из реальных проектов, принудительная валидация по IOLIST и статический анализатор, который перехватывает типичные галлюцинации ещё до компиляции.
Боль трёх лет: что именно выдумывает ИИ в коде ПЛК
Перед тем, как показывать решение, давайте разложим по полочкам, с чем мы боремся. Собрал топ-3 типов галлюцинаций по частоте и опасности (данные из внутреннего анализа 5000 сгенерированных фрагментов).
| Тип галлюцинации | Пример от LLM | Реальность PLC | % встречаемости |
|---|---|---|---|
| Несуществующие библиотечные функции | PID_CONTROL(Setpoint, ProcessValue) |
Функция называется PID и требует дополнительной конфигурации |
45% |
| Выдуманные типы и структуры | TYPE MyAnalog : REAL; END_TYPE для аналогового входа |
Аналоговые адреса привязаны к IOLIST, типы — только стандартные | 30% |
| Некорректные адреса и отображение памяти | AT %IW2.4 : INT; для цифрового входа |
Цифровые входы — %IX, аналоговые — %IW, смещение .4 для слова недопустимо |
25% |
Обратите внимание: ни одна из этих ошибок не вызовет ошибку компиляции в 70% случаев. ПЛК просто не включит задачу или будет работать с мусорными данными. Это и есть скрытый технический долг, о котором мы писали в статье "Когда IoT встречает AI" — только там речь шла про облака, а здесь про то, что ИИ может сжечь вам руку.
Архитектура PLC AI Studio: как мы отучили LLM врать
Создавая PLC AI Studio, мы отказались от идеи «скормим модельке побольше данных PLC и она всё поймёт». Это тупик. LLM — это вероятностные машины, они не умеют проверять логику адресации по проектной документации. Мы пошли другим путём: трёхуровневая система фильтрации.
1 Уровень 0: Fine-tuned модель на чистом PLC-коде
Мы взяли за основу Qwen2.5-Coder-7B и дообучили её на датасете из 150 000 строк кода PLC (TwinCAT, Codesys, Siemens TIA Portal, OpenPLC). В датасете только проверенные проекты, размёченные по вендору и версии. Это снизило базовую частоту галлюцинаций с 70% до 25%. Но 25% — всё равно смертельно.
2 Уровень 1: Контекстный инжект IOLIST и SAR
Перед генерацией мы передаём модели схему контроллера в машиночитаемом формате: IOLIST.csv (перечень входов/выходов), SAR.xml (структура аппаратных адресов) и глобальные переменные. Модель видит: "Вход %IW2.4 занят датчиком давления, тип REAL". Генерация привязывается к реальным адресам. Если модель предлагает несуществующий адрес — мы это ловим.
3 Уровень 2: Пост-генерационный статический анализатор
Самая жёсткая проверка. Написанный ИИ код проходит через синтаксический парсер (адаптированный под конкретную среду) и эвристический анализатор, который ищет паттерны галлюцинаций. Например, если в коде встречается несуществующая функция из чёрного списка — анализатор выдаёт предупреждение и предлагает альтернативу. Если структура данных не соответствует IOLIST — код блокируется.
Важный момент: анализатор не идеален. Он не проверяет логику работы — только формальную корректность. За семантику отвечает инженер. PLC AI Studio — это ассистент, а не замена. Как мы писали в статье "Профессиональные практики AI-кодинга", риск-менеджмент должен быть встроен в пайплайн.
Пошаговый гайд: как приручить ИИ в PLC с помощью PLC AI Studio
Предположим, у вас есть проект под TwinCAT 3. Нужно написать FB для управления задвижкой с обратной связью по положению. Делаем по нашему методу.
1 Подготовка контекста
Экспортируйте IOLIST из TwinCAT (Device → Export → CSV). Загрузите в PLC AI Studio. Система автоматически сгенерирует маппинг адресов. Проверьте, все ли входы/выходы описаны. Если нет — дополните вручную.
2 Формулировка запроса
Пишем промпт с привязкой к IOLIST. Плохой промпт: "Напиши FB для задвижки". Хороший промпт: "Создай функциональный блок ValveControl с входами ValveOpen (BOOL, адрес %IX0.2), ValveClose (BOOL, %IX0.3), PositionFeedback (INT, %IW2.5). Выходы: CmdOpen (BOOL, %QX0.0), CmdClose (BOOL, %QX0.1). Алгоритм: при активации ValveOpen включить CmdOpen на 5 секунд, потом проверять PositionFeedback > 2000."
3 Генерация и проверка
Нажимаем "Generate". PLC AI Studio отправляет запрос к fine-tuned модели, инжектит контекст, получает ответ. Дальше — автоматическая верификация. Если анализатор находит ошибку, мы видим сообщение:
⚠ [WARNING] Функция TON не найдена в библиотеке Tc2_Standard. Возможно, вы имели в виду TON_10MS?
⚠ [ERROR] Адрес %IX0.2 не совпадает с IOLIST. В IOLIST: %IX0.2 - кнопка "Аварийный стоп" (BOOL). Проверьте назначение.
После исправления — повторная генерация или правка вручную. Обычно хватает 1-2 итераций, чтобы получить чистый код.
Типовые ошибки при использовании PLC AI Studio (и как их избежать)
Собрал грабли, на которые наступили первые 100 бета-тестеров.
- Игнорирование IOLIST. Если не загрузить корректный экспорт, модель будет опираться на общедоступные данные — и снова галлюцинировать. Как надо: всегда использовать актуальный IOLIST из среды разработки.
- Слепая вера в анализатор. Анализатор проверяет только формальную корректность. Он не поймёт, что вы написали
IF PositionFeedback > 2000 THEN, а нужноIF PositionFeedback > 2000 AND NOT EmergencyStop THEN. Анализатор — это первая линия обороны, но финальное ревью всегда за человеком. - Пропуск семантической валидации. В PLC AI Studio нет симулятора ПЛК. Рекомендую после генерации прогонять код в OpenPLC Runtime (локальный ИИ vs Copilot — там есть раздел про тестовые ПЛК-симуляторы).
- Работа с устаревшей моделью. Мы обновляем fine-tuned модель раз в квартал. Если используете версию от января 2026, а на дворе июнь — модель может отставать от изменений библиотек. Проверяйте версию в настройках.
Что дальше: PLC AI Studio 2.0 и прогноз до 2028
Мы не остановимся на статическом анализе. В планах — динамическая верификация через симуляцию в реальном времени (подключение к виртуальному ПЛК через OPC UA). И, конечно, расширение на FBD и Ladder Diagram — для старых инженеров, которые не любят Structured Text.
Мой прогноз: к 2028 году ИИ будет писать 80% кода ПЛК, но только если в пайплайне встроена жёсткая валидация по IOLIST и семантике. Те, кто будет использовать «сырые» LLM, вернутся к ручному кодингу после пары аварий.
PLC AI Studio — не серебряная пуля. Это инструмент, который требует внимания и ручного контроля. Но если вы хотите повысить продуктивность в 5 раз без риска убить производство — попробуйте. И помните: ИИ галлюцинирует не со зла, а от невежества. Наша задача — дать ему правильные очки (IOLIST) и словарь (статический анализатор).