После ночного отключения 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 (без модификатора) - оперативная память цикла 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.
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 - проверяйте.
На классических 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.
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 без согласования. Это отделяет «мусор с монтажа» от реальных сбоев питания в эксплуатации.
Version control проекта - Git для ПЛК. Первый старт среды - документация и подключение CODESYS 3.5.
В 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 автоматически.
Уставка на экране может жить в теге 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 ….
Рецепт как 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.
Чтобы один наладчик не сделал 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.