Вы загрузили проект с ноутбука, Online Change прошёл без красных крестиков, отключились от ПЛК - а линия ведёт себя не так, как на стенде. Клапан по умолчанию открыт вместо закрытого, счётчик смены обнулился, автомат на шаге, которого не было вчера. Оператор говорит: «вы что-то сломали загрузкой». Вы отвечаете: «код же тот же». Оба правы в своей плоскости: программа совпала, а состояние контроллера - нет.
Разница между cold download, warm download, полной загрузкой и online change в CODESYS напрямую влияет на retain-переменные, инициализацию экземпляров FB и то, перезапускается ли задача с «первого скана». Плюс версии библиотек и порядок: сначала boot project, потом application, или наоборот. Статья разбирает симптомы после загрузки и что сверить до пуска. Базовое подключение и первый проект - в первом старте CODESYS; отладка поведения после рестарта - в отладке ПЛК. Не заменяет учебник по языкам IEC 61131-3.
Если после загрузки проекта CODESYS ПЛК «ведёт себя иначе» при том же коде, проверьте тип загрузки и судьбу retain. Cold start (холодный старт) сбрасывает большинство переменных в начальные значения из объявления; retain сохраняются только если область памяти не стёрта, батарея/FRAM исправны и загрузка не была «Initialize all». Warm download часто сохраняет часть состояния задачи, но не гарантирует идентичность при смене структуры переменных. Online Change не трогает некоторые глобальные инициализации, но может не применить изменения к уже созданным экземплярам FB. Сверьте: тип download в диалоге, флаги retain в объявлениях, батарею ПЛК, версии библиотек в проекте vs на устройстве, порядок загрузки boot/application. Таблица симптомов ниже.
Cold download (полная загрузка с остановом) обычно останавливает выполнение, заливает образ, перезапускает runtime. Переменные без retain получают начальные значения из VAR_INIT или из объявления. Retain-область сохраняется на носителе, если не выбрано «удалить retain» и питание/батарея в порядке.
Warm download загружает код при работающем или частично работающем цикле (зависит от платформы и настроек). Часть оперативного состояния может сохраниться, что удобно для мелких правок, но опасно, если изменились размеры структур или карта памяти - тогда «старое» состояние накладывается на «новую» логику.
Online Change меняет код без полной остановки, где это поддерживается. Не всё можно изменить online; экземпляры FB с новыми полями, изменение retain-секции, смена task - часто требуют полной загрузки. После online автомат может остаться на том же шаге, а новая логика перехода уже другая - симптом «завис на шаге».
На объекте фиксируйте в наряде: какой тип загрузки делали. «Я только online поменял константу» и «я залил весь проект cold» - разные последствия для уставок.
Переменные с атрибутом RETAIN или PERSISTENT (в терминологии CODESYS 3.5) сохраняются в энергонезависимой области. Уставки рецепта, счётчики наработки, время последнего обслуживания - типичные кандидаты. Без retain после cold start вернутся значения из := в объявлении или 0/false.
Типовые причины потери retain при «я же не менял уставки в коде»:
Проверка: до пуска прочитать retain-переменные в online; сравнить с журналом уставок; измерить батарею по регламенту.
Подробнее про отладку состояния после перезапуска - в материалах «Отладка ПЛК» и «Отладка HMI: объект, симуляция, force».
Код в PROGRAM с флагом первого цикла (first scan, bFirstRun, GVL_Init) выполняется один раз после старта. Если вы перенесли инициализацию уставок из retain в «при первом пуске установить 100», cold start перезапишет уставки дефолтами из кода.
Функциональные блоки при создании экземпляра вызывают инициализацию. После полной загрузки все экземпляры «родились заново». Если FB не использует retain для внутреннего состояния, таймеры и шаги сброшены - даже при том же теле программы.
Порядок вызова POUs и task влияет на то, кто кого перезаписывает в первом цикле: GVL_Init → Main → HMI exchange. Гонка «HMI записал уставку с экрана в тот же цикл, что Init сбросил в ноль» выглядит как «после загрузки всё не то».
Проект на ноутбуке собран с библиотекой Standard 3.5.16.40, на ПЛК осталась старая ветка после прошлой загрузки - редко, но возможны отличия в FB таймеров и строк. Симптом: «таймер ведёт себя иначе» без изменения вашего кода.
Boot project (загрузочный проект) стартует runtime до application или задаёт аппаратную конфигурацию. Загрузили только application, забыли boot - модули I/O в другой конфигурации, каналы не те. Или наоборот: boot новый, application старый - несовпадение карты устройств.
Порядок на пуске объекта: сверить Target и Device в проекте с фактическим железом; одна версия CODESYS на команду для релиза; библиотеки из репозитория проекта, не «что на ноуте нашлось».
Online Change в CODESYS 3.5 удобен для правки констант, мелкой логики, отдельных сетей LD/FBD/ST, если компилятор не требует rebuild all. Нельзя полагаться на online при: изменении интерфейса FB, добавлении retain-переменных, смене task configuration, изменении размера массивов, замене библиотеки с другой сигнатурой. Симптом «загрузилось, но шаг автомата из другой вселенной» часто значит, что нужен был cold download.
После online сравните checksum или дату сборки в свойствах проекта на ПЛК с git-коммитом. Если не совпадает - online мог не примениться к части POUs.
На одном железе СТАБУР можно заказать среду MasterSCADA 4D вместо CODESYS. Retain, cold start и порядок загрузки application по смыслу те же: переменные с сохранением, батарея, тип загрузки. Не путайте: MasterSCADA не «только SCADA» - это полноценная среда ПЛК, взаимозаменяемая с CODESYS. Ошибки retain на объекте выглядят одинаково независимо от заказанной среды.
Дата, время, ФИО, версия проекта (тег git), тип download (cold/warm/online), были ли сброшены retain, отклонения от ожидаемого (сброшенные уставки, шаг автомата). Через год это экономит спор «кто загрузил финальный_3».
| Симптом после загрузки | Вероятная причина | Что сверить |
|---|---|---|
| Все уставки на дефолте из кода | Cold start без retain; Init перезаписал | Атрибут RETAIN; диалог загрузки; GVL Init |
| Только счётчики/рецепт сброшены | Батарея; PERSISTENT не тот тип | Батарея; RETAIN vs PERSISTENT; замена ПЛК |
| Автомат на «чужом» шаге | Warm/Online; состояние шага не в retain | Тип download; retain на шаге FB; cold после смены логики |
| Выходы в небезопасном положении на 1 цикл | Порядок init; DO до межблокировок | Task priority; init outputs safe state |
| I/O «не те» каналы | Boot project не обновлён | Версия boot vs application; Device tree |
| На стенде OK, на объекте иначе | Другая версия библиотеки; другой CPU | Library manager; compile info; checksum |
| Online прошёл, поведение старое | Изменение не online-capable | Build messages; full download |
| После загрузки HMI и ПЛК расходятся | HMI не перезагружали; старые теги | Версия проекта HMI; карта Modbus |
| Retain «мусор» (огромные числа) | Смена типа retain-переменной | Карта памяти; миграция; один раз cold с очисткой retain |
Перед загрузкой: экспорт уставок и retain-списка (скрин, CSV, backup проекта с ПЛК если доступно). Согласовать останов процесса. Выбрать тип загрузки осознанно: мелкая правка - online; смена структур - cold с планом восстановления retain.
После загрузки: не запускать механику сразу. Online - проверить retain, шаг автомата, безопасные выходы. Сверить версию проекта на экране наладчика с git-тегом. Прогнать тестовый цикл без продукта.
Зафиксировать в журнале пуска: дата, тип download, кто загрузил, отклонения.
Если уставка в retain ПЛК, а HMI при старте связи записывает в ПЛК значение из локального кэша, первый цикл после загрузки перезапишет retain старым числом с панели. Симптом: «загрузили проект, уставка из прошлого года». Проверьте скрипты инициализации HMI и направление Modbus-записи при connect.
Единый источник - retain в ПЛК; HMI читает до явной команды «записать уставку» с журналом.
Краткое отключение 24 В при исправной батарее retain часто сохраняет. Cold download с заливкой образа может изменить карту памяти - retain переменные на новых адресах читают мусор или ноль. Если «после отключения света всё OK, после загрузки с ноутбука - нет», сравните тип операции, а не только код.
Перед релизом на объект прогоните на стенде: power off 1 мин, cold download, warm download, online - и запишите, какие GVL/FB изменились.
Online Change всегда безопасен для уставок?
Нет. Он не должен трогать retain, но логика инициализации в первом цикле после частичной перекомпиляции может отличаться. При сомнении - cold с backup retain.
MasterSCADA 4D и CODESYS - разная загрузка?
Среды взаимозаменяемы на железе, но механизм download своий у каждой. Принципы retain и cold/warm те же по смыслу.
Нужно ли перезагружать HMI после загрузки ПЛК?
Если менялись адреса, типы или масштаб тегов - да. Если только внутренняя логика - не всегда, но сверка тегов обязательна.
Почему на симуляторе всё нормально?
Симулятор каждый старт часто «чистый»; retain и батарея не моделируются как на железе.
Чем cold download отличается от Reset ПЛК кнопкой?
Reset перезапускает runtime с тем же образом в памяти; cold download заливает новый образ. Оба могут сбросить non-retain; retain зависит от батареи и опций загрузки.
Нужно ли останавливать OPC при загрузке?
Клиенты OPC могут кэшировать старые значения и записать в ПЛК при reconnect. После загрузки с изменением retain сверьте подписчиков записи.
ПЛК СТАБУР программируются в CODESYS 3.5 или MasterSCADA 4D с одинаковой моделью устройства; перед вводом линии имеет смысл один раз прогнать сценарий cold download на стенде с батареей и без, записать какие уставки должны быть в retain, и перенести этот чек-лист на объект.