Блог

Проект CODESYS скачался, но ПЛК ведёт себя иначе: онлайн, retain и порядок загрузки

Вы загрузили проект с ноутбука, 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, warm, online: что реально меняется

Cold download (полная загрузка с остановом) обычно останавливает выполнение, заливает образ, перезапускает runtime. Переменные без retain получают начальные значения из VAR_INIT или из объявления. Retain-область сохраняется на носителе, если не выбрано «удалить retain» и питание/батарея в порядке.

Warm download загружает код при работающем или частично работающем цикле (зависит от платформы и настроек). Часть оперативного состояния может сохраниться, что удобно для мелких правок, но опасно, если изменились размеры структур или карта памяти - тогда «старое» состояние накладывается на «новую» логику.

Online Change меняет код без полной остановки, где это поддерживается. Не всё можно изменить online; экземпляры FB с новыми полями, изменение retain-секции, смена task - часто требуют полной загрузки. После online автомат может остаться на том же шаге, а новая логика перехода уже другая - симптом «завис на шаге».

На объекте фиксируйте в наряде: какой тип загрузки делали. «Я только online поменял константу» и «я залил весь проект cold» - разные последствия для уставок.

Retain: что должно пережить перезагрузку

Переменные с атрибутом RETAIN или PERSISTENT (в терминологии CODESYS 3.5) сохраняются в энергонезависимой области. Уставки рецепта, счётчики наработки, время последнего обслуживания - типичные кандидаты. Без retain после cold start вернутся значения из := в объявлении или 0/false.

Типовые причины потери retain при «я же не менял уставки в коде»:

  • в диалоге загрузки отмечено сбросить retain или полная инициализация;
  • села батарея CR2032/батарейный модуль (retain в RAM с батарейкой);
  • изменили имя или тип retain-переменной - смещение в области памяти, старые байты не интерпретируются;
  • заменили ПЛК или плату без переноса retain-области;
  • загрузили проект другой версии с другой картой памяти.

Проверка: до пуска прочитать retain-переменные в online; сравнить с журналом уставок; измерить батарею по регламенту.

Подробнее про отладку состояния после перезапуска - в материалах «Отладка ПЛК» и «Отладка HMI: объект, симуляция, force».

Инициализация и первый scan

Код в PROGRAM с флагом первого цикла (first scan, bFirstRun, GVL_Init) выполняется один раз после старта. Если вы перенесли инициализацию уставок из retain в «при первом пуске установить 100», cold start перезапишет уставки дефолтами из кода.

Функциональные блоки при создании экземпляра вызывают инициализацию. После полной загрузки все экземпляры «родились заново». Если FB не использует retain для внутреннего состояния, таймеры и шаги сброшены - даже при том же теле программы.

Порядок вызова POUs и task влияет на то, кто кого перезаписывает в первом цикле: GVL_Init → Main → HMI exchange. Гонка «HMI записал уставку с экрана в тот же цикл, что Init сбросил в ноль» выглядит как «после загрузки всё не то».

Версии библиотек и boot project

Проект на ноутбуке собран с библиотекой Standard 3.5.16.40, на ПЛК осталась старая ветка после прошлой загрузки - редко, но возможны отличия в FB таймеров и строк. Симптом: «таймер ведёт себя иначе» без изменения вашего кода.

Boot project (загрузочный проект) стартует runtime до application или задаёт аппаратную конфигурацию. Загрузили только application, забыли boot - модули I/O в другой конфигурации, каналы не те. Или наоборот: boot новый, application старый - несовпадение карты устройств.

Порядок на пуске объекта: сверить Target и Device в проекте с фактическим железом; одна версия CODESYS на команду для релиза; библиотеки из репозитория проекта, не «что на ноуте нашлось».

Online Change: что можно и что нельзя

Online Change в CODESYS 3.5 удобен для правки констант, мелкой логики, отдельных сетей LD/FBD/ST, если компилятор не требует rebuild all. Нельзя полагаться на online при: изменении интерфейса FB, добавлении retain-переменных, смене task configuration, изменении размера массивов, замене библиотеки с другой сигнатурой. Симптом «загрузилось, но шаг автомата из другой вселенной» часто значит, что нужен был cold download.

После online сравните checksum или дату сборки в свойствах проекта на ПЛК с git-коммитом. Если не совпадает - online мог не примениться к части POUs.

MasterSCADA 4D: те же принципы, другой диалог

На одном железе СТАБУР можно заказать среду 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 при старте связи записывает в ПЛК значение из локального кэша, первый цикл после загрузки перезапишет retain старым числом с панели. Симптом: «загрузили проект, уставка из прошлого года». Проверьте скрипты инициализации HMI и направление Modbus-записи при connect.

Единый источник - retain в ПЛК; HMI читает до явной команды «записать уставку» с журналом.

Сравнение поведения после power cycle и после download

Краткое отключение 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, и перенести этот чек-лист на объект.

Ссылки по теме

Обсуждение