Блог

Retain в CODESYS 3.5: VAR RETAIN, PERSISTENT и что теряется при Download

2026-07-28 08:23

После ночного отключения 24 V на шкафу оператор утром жалуется: «уставки слетели». Наладчик делает Download «с маленькой правкой в комментарии» - счётчики наработки обнулились, хотя VAR RETAIN вроде бы объявлены. Третий случай: замена CPU, проект залили заново - PERSISTENT рецепты на месте, а часы и календарные метки - нет. Retain в CODESYS 3.5 - не одна галочка, а связка типа переменной, области памяти контроллera, вида загрузки и иногда батареи или суперконденсатора.

Статья разбирает VAR RETAIN и PERSISTENT, cold vs warm download, что переживает перезагрузку питания и что теряется при обновлении проекта. Это не замена официальной справки по памяти target и не про замену батарейки в старых ПЛК - только практика 3.5 на пуске. Смежные темы: пропажа уставок после 24 V и online retain при первой загрузке.

Короткий ответ

VAR RETAIN сохраняет значение при отключении питания (если контроллер поддерживает retain-память и она исправна) и при большинстве перезагрузок runtime; PERSISTENT (VAR PERSISTENT RETAIN в терминологии IEC) переживает ещё и загрузку нового application при сохранении совместимости имён и расположения в памяти. Обычный VAR теряется при каждом restart PLC и при download, который пересоздаёт application. Cold download (полная загрузка) чаще сбрасывает retain-область, чем online change мелкого участка кода. После изменения списка retain-переменных, их типа или порядка в GVL - старые значения могут стать мусором или обнулиться. Чек-лист: что объявлено RETAIN/PERSISTENT, какой тип download делаете, есть ли backup значений перед upgrade, совпадает ли device profile с полем.

VAR, RETAIN, PERSISTENT: что означает каждый модификатор

VAR (без модификатора) - оперативная память цикла PLC. Stop/Run, reboot, download - как правило, начальное значение из инициализации или 0.

VAR RETAIN - переменная хранится в энергонезависимой или защищённой области retain RAM контроллera. Переживает power cycle, если питание retain-схемы держится (батарея, суперконденсатор, встроенная NVRAM на ARM-платформах вроде Linux RT).

VAR PERSISTENT (в CODESYS часто PERSISTENT RETAIN) - рассчитана на сохранение при замене программы, пока структура памяти совместима. Используют для рецептов, счётчиков наработки, калибровок, которые не должны пропадать при обновлении проекта.

Инициализация в коде := 100 для RETAIN срабатывает только при первом вводе или после явного reset retain - не при каждом Run. Новички ждут «сброса к 100» после download - не происходит, если retain сохранился.

Константы и VAR_INPUT не делают retain сами по себе - модификатор только в объявлении GVL/PROGRAM.

Cold download, warm download и online change

Download (полная загрузка application) - зависит от опций: «Only download» vs «Download with reset» / cold start. При cold start retain может очиститься намеренно, если галочка «Initialize retain memory» или аналог в диалоге включена.

Online Change - правка логики без остановки; retain обычно жив, если не меняли карту retain-переменных и не добавили новые PERSISTENT с другим layout.

Изменили тип retain-переменной REAL → LREAL или добавили поле в STRUCT RETAIN - компилятор может сдвинуть карту памяти; старые байты интерпретируются как мусор.

Удалили переменную из GVL и добавили с тем же именем другую - рискованно; лучше версионировать _Recipe_v2.

После «скачался проект, первый online» на новом ПЛК retain пуст - норма, пока не заполните эталоном или импортом.

Что теряется при каких действиях

Отключение 24 V без backup retain: если контроллер без батареи и конденсатор разряжен - RETAIN как RAM. На Linux RT ПЛК с eMMC retain часто в отдельном разделе или файле - переживает кратковременное отключение, но не отсутствие штатного питания часами при дедлайне «сохранить retain» в документации device.

Reset origin / Reset application в CODESYS - отдельные команды; могут стереть retain по выбору.

Замена CPU без clone retain-раздела - PERSISTENT не магия, нужен тот же объём и migration tool.

Firmware upgrade runtime - читайте release notes; иногда требуют export/import retain.

Download только библиотеки без изменения GVL - retain обычно OK. Переименование application - проверяйте.

Отличие от «батарейного RAM» старых ПЛК

На классических PLC с литиевой батарейкой low battery = мигание RETAIN через месяцы. На современных ARM с flash/eMMC картина другая: нет пользовательской батарейки, retain в NVRAM или persistent file. Симптом «пропали уставки» после длительного простоя шкафа без 24 V - не «села батарейка», а полная потеря питания retain-схемы или первый boot после долгого хранения.

Диагностика: system info / device diagnostic - retain size, last shutdown, ошибки filesystem на target.

Не путайте RETAIN с retain на модуле I/O (выходы после restart) - это параметры драйвера модулей, не GVL.

GVL, AT % и порядок переменных

Retain-переменные часто в отдельном GVL_Retain. Порядок объявления влияет на layout в PERSISTENT-памяти. Рефакторинг «красиво отсортировал по алфавиту» без migration = тихая поломка.

Явное AT %MW100 для retain на некоторых target запрещено или игнорируется - следуйте device description CODESYS для СТАБУР/Linux RT.

ARRAY и STRUCT RETAIN: изменение размера массива - классический сброс хвоста или весь блок invalid.

STRING RETAIN - длина фиксирована; обрезание при upgrade.

При первом вводе в эксплуатацию после FAT иногда делают controlled cold start: обнуляют retain, загружают эталонные уставки из CSV, затем запрещают init retain без согласования. Это отделяет «мусор с монтажа» от реальных сбоев питания в эксплуатации.

Чек-лист после обновления проекта

  1. Export retain-значений перед download (online read GVL в CSV или tool vendor).
  2. В диалоге download снять лишние галочки reset retain, если нужно сохранить.
  3. Сверить список RETAIN/PERSISTENT в diff Git - что добавилось, изменился тип.
  4. После download - online watch ключевых уставок, счётчиков, RecipeVer.
  5. Запись в журнал версий: «v1.4 - добавлен RETAIN CalibFlow, требуется однократная калибровка».
  6. FAT-сценарий: power cycle 24 V off 30 s - проверка retain по паспорту.
  7. При cold start оператору - инструкция, какие уставки ввести вручную, если retain сброшен намеренно.

Version control проекта - Git для ПЛК. Первый старт среды - документация и подключение CODESYS 3.5.

Инструменты CODESYS: backup и restore retain

В online режиме через «Write values» можно выгрузить текущие retain в файл перед рискованным download - ручная страховка, если нет vendor tool. После загрузки - «Read values» / write back только если layout совместим; иначе импорт по полям по одному.

Команда reset retain в device menu (название зависит от target) используется на пуске намеренно - зафиксируйте в акте, что retain обнуляли с согласия заказчика. Без записи оператор через неделю уверен, что «ПЛК сам сломался».

При нескольких application в одном controller retain привязан к application instance - переключение active app без миграции не переносит PERSISTENT автоматически.

Связь retain с HMI и SCADA

Уставка на экране может жить в теге SCADA, а в PLC - копия без RETAIN. После reboot PLC SCADA «оживает» первой и пишет старые значения в VAR - кажется, что retain работает, пока не отключите связь и не увидите нули в PLC. Источник правды один: либо retain в PLC и HMI только отображает, либо SCADA archive restore - но тогда пропадание связи должно быть описано в инструкции.

Modbus write holding от SCADA в retain-переменную без read-back - риск рассогласования после power cycle. Проверьте startup: PLC поднимает retain, SCADA через 30 s перезаписывает - кто победил, зафиксировано в логике IF SCADA_Online THEN ….

PERSISTENT для рецептов и счётчиков

Рецепт как STRUCT PERSISTENT RETAIN с полями SP температур, времен, кодов продукта - удобно. RecipeVer отдельной INT RETAIN: при несовпадении с константой проекта - init defaults один раз.

Счётчики наработки (моточасы, циклы) - только PERSISTENT, не обычный VAR, если download частый.

Часы реального времени (RTC) - отдельный сервис runtime; не путать с RETAIN DT переменной LastMaintenance.

Backup через OPC или файл на SD: второй уровень, если PERSISTENT corrupt после некорректного power loss во время write.

Регламент download для бригады из 2–3 человек

Чтобы один наладчик не сделал cold init, а второй искал уставки, повесьте в шкафу QR на wiki: «Download только с галочками …, retain init - согласование с …». В Git tag релиза совмещайте с записью в журнале объекта. После каждого download на работающем производстве - smoke test: 3–5 ключевых retain в watch, сравнение с листом эталона.

При ночных обновлениях предупредите смену: после reboot возможен сброс счётчиков смены, если их не перевели в PERSISTENT. Лучше перенос границы смены в SCADA, а в PLC оставить только технологические totals.

Что сбросилось, тип переменной, действие

Что сбросилось Тип переменной Действие в CODESYS
Уставки после Download VAR без RETAIN Объявить RETAIN или загрузить backup
Всё retain после Download Cold init retain включён Снять галочку init, restore из export
После правки только ST Обычно OK Если тронули GVL layout - проверить watch
После изменения TYPE retain PERSISTENT layout сломан Migration, reset с документированием
После отключения 24 V RETAIN без backup питания Проверить device retain, время hold
Только счётчики Не PERSISTENT Перевести в PERSISTENT RETAIN
Рецепты OK, уставки PID нет Разные GVL PID SP в VAR - ошибка проекта
Online change OK, full download нет Разные опции download Единый регламент для бригады
После замены CPU Нет clone Export/import retain, эталон FAT

Вопросы с объекта

RETAIN и PERSISTENT - ставить на всё?
Нет. Только то, что дорого восстанавливать. Остальное VAR - проще отладка.

Комментарий в GVL сбрасывает retain?
Нет. Меняет layout - только если меняется объявление.

Симулятор на PC сохраняет retain?
Зависит от simulation profile; не эталон для поля.

MasterSCADA и retain ПЛК?
Уставки на панели могут жить в SCADA; retain PLC - отдельный слой. Согласуйте источник правды.

Можно ли восстановить retain после ошибочного download?
Только если был export или backup на SD. Иначе - ручной ввод.

Чем RETAIN отличается от архива SCADA?
Retain живёт в PLC и определяет поведение без связи. Архив - история, не substitute для уставок цикла, если логика читает только PLC.

Cold start после первого ввода в эксплуатацию?
Часто делают намеренно один раз, чтобы обнулить мусор из производства. Дальше - только documented reset.

На практике

ПЛК СТАБУР под CODESYS 3.5 с Linux RT хранят retain в энергонезависимой области согласно паспорту устройства. Перед первым Download на объект зафиксируйте в as-built список RETAIN/PERSISTENT и результат теста power cycle. Модули расширения не заменяют retain CPU - выходы «safe state» при restart настраиваются отдельно в конфигурации I/O.

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