断电前明明存了,重启后数不对 —— 参数没丢,是它从来没被设成保持

一台上料设备的计数器和设定值,每次断电重启就回到出厂值。 操作工每天开机后手动重设一遍,设了两年。 厂里一直以为是电池问题,换了电池,照旧 后来把程序打开一看,这些地址从头就没勾保持性
这类情况我们碰到过不止一回。 程序好好的,存储卡也没坏,参数丢是因为这些地址从来没被设成保持 不是丢了,是它本来就不保留
先分清两件事:程序丢 和 数据丢
很多人把这两件事混在一起谈"备份" 其实它们的存在位置和保护机制完全是两套
程序也就是代码块,存在 CPU 的装载存储器里 S7-1200 / S7-1500 插上 SIMATIC 存储卡后,程序主体落在卡上。 只要卡没坏、没被误格式化,程序通常都在
数据不一样。 运行中产生的当前值,比如累计产量、温度设定、报警屏蔽位,活在 CPU 的工作存储器里 断电那一刻能不能留下来,取决于你在软件里有没有给这个地址勾上"保持"
没勾,断电就清。 勾了,才会在掉电时写进保持性存储区,上电后读回来 这一步不在备份里,在编译之前的属性设置里。 去年冬天我们碰到一台老改造设备,接班工程师查了两天电池和存储卡。 最后在 CPU 属性页里看到,保持范围只设到 MB20,而设定值全落在 MB60 往后。 两年里每天手输的数,其实一个都没保住
S7-1200 / S7-1500 保持性设置在哪三个位置
这张表建议存手机里,现场按顺序查:
| 位置 | 怎么看 | 常见的坑 |
|---|---|---|
| M 区 | CPU 属性里的"保持性存储器"页,从某个地址起往后保持 | 只设了起点,没注意范围;默认范围很小,靠后的位不保留 |
| 全局 DB | DB 属性里可整体勾"保持",或每个变量单独勾 | 从老版本移植的块,属性页看不出实际状态,要逐变量核对 |
| 优化块里的单个变量 | 打开 DB,变量表的"保持性"列 | 这一列默认是空的,勾了才保留,漏勾是常见的漏设点 |
再补一条:非优化 DB 和优化 DB 的表现不一样 非优化块可以按整个 DB 一次性设置保持性 优化块要一个变量一个变量地设 从老程序移植过来的项目特别容易在这栽跟头——老程序里以为设过的地址,迁过来就没了
为什么这一步脆
排查现场我们常见三个坑,按出现频率排:
一,改了程序重新下载,下载对话框里选择了"重新初始化保持性数据" 下载是选上去的,当年写程序的同事手一勾,上线第一天的设定值全清零 这种问题查起来特别绕,因为程序本身一点错都没有
二,HMI 上写的设定值和 PLC 里收到的值不是同一个地址。 画面上看着存了,PLC 里那个地址根本不是保持性的。 这和之前写过的一篇"三份参数"是同一个根子——先确认数据住在哪,再谈保不保
三,数据确实勾了保持,但 CPU 断电时的电压跌落曲线不对,保持区写入没完成 这种属于硬件工况问题,占比不高 但要放在排查链的最后,别一上来就换件
一棵现场判断树
数据断电丢失,按这个顺序走:
- 打开程序,查丢的那个地址有没有勾保持性 没勾 → 勾上,重新下载时注意"初始化保持性数据"那个选项,选"不初始化"
- 勾了还丢 → 查下载记录,是不是有人重下程序时初始化了保持区
- 还丢 → 查 M 区保持范围起点,地址是不是落在范围之外
- 都对 → 再怀疑存储介质和 CPU 硬件,这时候才轮到换件
第 1 步能拦下大多数情况。 先把软件层查完,再动硬件,顺序别反

什么情况下不必找我们
上面第 1、2 步你在博图里花半天就能自己查清,不需要外人来 真正拿不准的只有两种:程序被密码锁着打不开属性页,或者在线状态和程序对不上、不敢动 到那一步再联系,我们做的是把程序完整读出来、校验、归档这一层 公司是新的,团队在电气与软件这两行做了三十多年——能不能做、前提是什么,评估完照实说
更多这类速查表,我们会持续整理。