Просмотр полной версии : В области RETAIN не сохраняются измененные значения переменных
Здравствуйте. Хочу обратиться за помощью по такому вопросу. Работаю с контроллером ПЛК-210. Есть переменные со установленными значениями, которые находятся в PLC_PRG в области RETAIN. Также есть переменные, которые вводятся с панели СП310-Р и пишутся в эти переменные. После перезагрузки контроллера сохраняются старые значения переменных в области RETAIN. Подскажите, пожалуйста, как сделать, чтобы в области RETAIN сохранялись значения, введенные с панели СП310-Р
kondor3000
27.07.2026, 14:17
У панели есть своя энергонезависимая память PFW256 и выше, можно хранить уставки там и при включении передавать (копировать) в сетевые регистры ПЛК.
В дисплее ввода в панели есть бит уведомлений, по которому можно отслеживать изменения уставок или использовать его для записи в RETAIN ПЛК.
Можно просто отслеживать изменение любой нужной переменной в ПЛК и по изменению записывать в RETAIN.
Alex87
Можете привести кусочек кода, как у вас объявлены переменные, и как организован к ним доступ из панели?
//в GVL
VAR_GLOBAL
Ust_per_nas_panel: WORD;
END_VAR
//в PLC_PRG
VAR RETAIN
Ust_per_nas_plc: WORD :=72;
END_VAR
// в программе PLC_PRG
Ust_per_nas_plc := GVL.Ust_per_nas_panel;
//в PLC_PRG
VAR RETAIN
Ust_per_nas_plc: WORD :=72;
END_VAR
----
При включении ПЛК он сначала читает явное задание первоначального значения, поэтому последующие изменения переменной не сохраняются при выключении\перезапуска. Вернее при каждом старте переменной присваивается явно указанное значение.
Ретайн-переменные обычно объявляются в области GVL. В данный момент нет КДС под рукой, не могу точно правильно подсказать.
Если ретайн-переменная не должна иметь нулевое значение, то можно сделать так:
В начале ПЛЦ_ПРГ однократно вызываем подпрограмму проверки переменных и первичной инициализации
если переменная = 0, то переменная:=значение.
При первом включении после заливки кода в ПЛК переменная=0, подпрограмма инициализации присваивает первичное значение, далее значение переменной может меняться, по выключению ПЛК оно сохранится, но уже не будет нулевым. Следовательно, при последующем включении ПЛК оно и останется таким.
МихаилГл
27.07.2026, 21:32
Я для этого даже не ретэйн использую, а отдельные персистент, которые сохраняют свои значения даже при изменении программы и перепрошивке. Главное структуру этих переменных не менять.
Персистент - это хорошо, но для редко изменяемых переменных. У меня в одном проекте была потребность персистент-переменной, которая в проге менялась до двадцати раз в секунду. Что бы не сжечь память, пришлось при включении плк её считывать, а при выключении сохранять. Причем для этого потребовалось поставить реле контроля напряжения, и дополнительный буфер на БП, позволяющий работать мозгам секунд тридцать после выключения питания установки.
Здравствуйте. Хочу обратиться за помощью по такому вопросу. Работаю с контроллером ПЛК-210. Есть переменные со установленными значениями, которые находятся в PLC_PRG в области RETAIN. Также есть переменные, которые вводятся с панели СП310-Р и пишутся в эти переменные. После перезагрузки контроллера сохраняются старые значения переменных в области RETAIN. Подскажите, пожалуйста, как сделать, чтобы в области RETAIN сохранялись значения, введенные с панели СП310-Р
Если панель мастер, и читает и пишет в одну слейв-переменную
//в GVL
VAR_GLOBAL
Ust_per_nas_panel: WORD;
END_VAR
то
//в PLC_PRG
VAR RETAIN
Ust_per_nas_plc: WORD :=72;
END_VAR
VAR //не ретайн
init : bool;
END_VAR
// в программе PLC_PRG
if not init then
init := true;
GVL.Ust_per_nas_panel := Ust_per_nas_plc;
end_if
...
Ust_per_nas_plc := GVL.Ust_per_nas_panel;
Вернее при каждом старте переменной присваивается явно указанное значение..
.. но это не относится к ретайн-переменной. Инит-значение для них - это значение только в момент первой загрузки.
Панель мастер. Спасибо всем за помощь
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot