前面第13讲,我们把置位、复位、翻转、保持讲透了。
那一讲解决的是一个“程序运行中,状态怎么被记住”的问题:
运行命令怎么保持
故障怎么锁存
模式怎么记住
步骤怎么保留
什么时候该用 SET/RST
什么时候不能乱用
但 PLC 程序写到现场以后,真正让很多人头疼的,还不只是“运行时怎么保持”,而是另一个更贴近现场、也更容易出事故的问题:
设备断电了,再上电以后,这些状态还在不在?
你会发现,很多现场问题都不是出在逻辑本身,而是出在“重启以后状态不对”:
为什么刚上电,电机自己就想启动
为什么上次没做完的步骤,这次开机后还卡在那里
为什么故障灯明明昨天已经有了,今天开机还亮着
为什么参数没丢
为什么有些计数没了
为什么有些模式还记着,有些模式又恢复默认了
为什么程序逻辑平时都没问题,一重启就乱
这些问题背后,实际上都指向 PLC 编程里一个非常关键、但初学者很容易忽略的主题:
掉电保持、上电初始化、首次扫描。
这一讲,我们就把这个特别实用、特别工程化的内容彻底讲明白。
如果说第13讲讲的是:
状态在程序运行中要不要记住
那么这一讲讲的就是:
断电以后,这些状态还要不要继续记住;重新上电时,程序第一步应该怎么处理。
这是 PLC 从“会写逻辑”走向“会做现场设备”的关键一步。
因为真实设备不是一直不断电运行的。
它会停电、检修、急停、断电重启、换班重开、维护后复位。
如果你不考虑这些场景,程序平时再顺,一到现场也可能出大问题。
一 先把最根上的问题讲清楚:为什么设备重启后,程序经常会乱
很多初学者对 PLC 的想象是这样的:
程序写好了
逻辑通了
平时能跑
那就没问题了
但现场设备不是只在“连续运行”这一种理想状态下工作。
它会遇到很多实际情况:
突然停电
人为断电检修
控制柜断电重启
急停后重新上电
PLC 程序下载后重新启动
设备换班重新开机
故障后断电排查再开机
这时候,程序就会碰到一个很现实的问题:
上一次运行留下来的那些状态,现在到底还在不在?
比如:
自动模式是不是还记着
运行命令是不是还保持着
步骤号是不是还停在上一步
报警锁存是不是还在
计数值是不是还要保留
参数设定值是不是不能丢
配方是不是还应该保留
某些临时标志是不是应该清零
如果这些事情没想清楚,重启以后程序就会出现非常典型的混乱:
该保留的没保留
不该保留的却保留了
该清零的没清
不该清的被清掉了
所以设备“重启后乱”,本质上不是 PLC 神秘,
而是你没有在程序里明确规定:
哪些数据掉电后要保留,哪些状态上电后必须重新初始化。
二 什么叫掉电保持
先把概念讲清楚。
所谓掉电保持,简单说就是:
PLC 断电以后,某些数据或状态不会丢;重新上电时,它们还能恢复到断电前的值。
比如:
参数设定值
累计产量
配方号
运行小时数
设备校正值
某些工艺参数
某些需要长期保存的统计值
这类数据,往往就适合掉电保持。
因为你不希望设备每次断电重启后,全部参数都恢复成零或者默认值。
那样现场根本没法用。
所以掉电保持,本质上是在说:
哪些东西要跨越一次断电,继续记住。
三 什么叫上电初始化
上电初始化可以简单理解成:
PLC 刚上电时,先把某些状态、变量、流程条件恢复到你规定的“安全起点”。
也就是说,设备不是一上电就直接接着昨天的所有状态继续跑,
而是要先进入一个受控、明确、可预测的初始状态。
例如:
运行命令清零
输出全部回到安全状态
某些临时步骤清除
单次触发脉冲清除
中间计算缓存清除
测试模式退出
某些未完成流程标志清除
提示操作员重新确认启动条件
这就叫上电初始化。
所以掉电保持和上电初始化不是一回事。
掉电保持是在问:
哪些东西要保留下来
上电初始化是在问:
重新上电以后,哪些东西必须重新整理
很多程序乱,就是因为这两个概念没分开。
四 什么叫首次扫描
这个概念特别关键。
PLC 上电后,不是一下子就“进入稳定运行”,
它也是一轮一轮扫描程序的。
所谓首次扫描,就是:
PLC 刚启动完成,正式进入程序扫描后的第一轮扫描。
很多 PLC 品牌都提供“首次扫描标志”或类似机制。
它的意义是什么?
意义就是让你在程序刚启动的第一轮里,
去做那些“只需要在上电那一刻处理一次”的动作。
比如:
清零某些临时位
初始化某些步骤
恢复默认模式
清空单次触发脉冲
把某些输出命令复位
检查并重建启动条件
根据配方重新装载参数
执行开机自检标志置位
注意重点:
这些事通常不是每一轮扫描都做,
而是只在刚上电那一轮做一次。
这就是首次扫描的价值。
五 掉电保持不是越多越好,上电清零也不是越狠越好
这一句一定要先记住。
很多初学者一学到这个主题,容易走两个极端。
第一种极端
怕丢数据,于是什么都想掉电保持
结果会怎样?
上次运行留下来的临时状态、步骤状态、故障中间位、运行命令,全都带着进下一次开机。
设备一重启,程序直接“接上次的记忆继续跑”,现场就很危险。
第二种极端
怕乱,于是什么都上电清零
结果会怎样?
配方没了
设定值没了
累计量没了
校正值没了
用户参数全恢复默认
设备每次开机都要重新输入一遍
这同样不现实。
所以真正合理的做法不是“全保留”或者“全清零”,
而是做分类:
该长期保留的,保留
该临时存在的,清掉
该重新确认的,重新确认
该回到安全位的,回到安全位
这才是工程思维。
六 先建立一个最重要的分类思路:PLC 里的数据可以分成哪几类
这一段特别重要。
你以后只要遇到“这个值断电后要不要保留”,就可以按这个思路来判断。
第一类 长期参数类
比如:
工艺设定值
温度设定值
压力设定值
配方参数
报警阈值
延时设定值
标定系数
补偿值
设备编号
用户设定的运行上限下限
这类东西通常应该掉电保持。
因为它们不是“某次运行的临时过程”,而是“设备的长期设定”。
第二类 累计统计类
比如:
总产量
总运行小时
总启动次数
维护累计时间
历史故障计数
总用量累计
这类很多时候也应该掉电保持。
因为它们本来就是跨班次、跨天、跨月统计的。
断一次电就清零,显然不合理。
当然,也有些统计值需要分层,比如:
总累计保留
班次累计可清零
日累计可清零
这个后面我们还会讲。
第三类 当前运行状态类
比如:
运行命令
当前自动模式保持位
步骤 3 正在执行
当前夹紧命令
某动作完成标志
本轮启动允许
当前手动动作指令
某个中间保持位
这类通常要非常谨慎。
大多数情况下,不建议简单掉电保持。
为什么?
因为这些是“上一次运行现场过程中的状态”,
不是长期配置。
设备断电后,再上电时是否还应该继续沿用这些状态,必须非常小心。
很多时候,答案是:
不应该直接恢复为“继续运行中”。
尤其涉及电机、气缸、加热、运动机构时,更要保守。
第四类 中间逻辑缓存类
比如:
某次比较结果
某次单次触发脉冲
某个临时计算值
当前扫描中的判断位
临时传送完成位
某个短时互锁标志
这类通常不应该掉电保持。
因为它们只是程序运行过程中的中间结果。
上电后理应重新计算。
第五类 报警与故障类
这类要分情况。
比如:
历史故障计数可以保留
当前故障锁存是否要保留,要看设备设计
严重保护类报警有时需要保留并要求人工确认
普通过程报警有时可以根据当前条件重新判断
所以报警类不是一句话能全说完,
必须根据安全性和工艺要求来定。
七 一个最常见的错误:把“运行命令”做成掉电保持
这个问题特别典型,也特别危险。
假设你有一个运行命令 M10。
程序里是这样理解的:
只要 M10 = 1,电机就可以运行
平时用 SET/RST 没问题。
但如果你又把 M10 设置成掉电保持,会发生什么?
可能昨天断电前,M10 正好是 1。
今天一上电,M10 还是 1。
如果你的程序没有额外的上电安全处理,
那么设备就可能一上电就直接带着“运行命令”状态回来。
这在很多设备上是非常不合适,甚至危险的。
因为操作员通常的直觉是:
断电重启以后,设备应该先回到安全待机状态,
然后由我重新确认,再启动。
所以对于“运行命令”“动作命令”“当前执行位”这类状态,
大多数工程里都不建议简单掉电保持。
更常见的做法是:
参数保留
累计保留
但运行命令上电清掉
必须人工重新启动
这个习惯非常重要。
八 另一个典型问题:步骤状态掉电后到底要不要恢复
这在顺控项目里很常见。
比如某设备有 8 个步骤。
断电前,系统正运行在步骤 5。
这时候突然掉电。
再上电时,步骤号到底应该回到 5,还是回到 1,还是回到待机状态?
这件事没有一个“永远统一”的答案,
但有一个很重要的判断原则:
是否适合从中途自动续跑,要看设备的工艺和安全性。
一些多数情况下更保守的设备
比如:
机械动作复杂的自动线
带气缸夹具的设备
有运动轴的位置机构
涉及加热、压力、刀具、搬运的设备
这类很多时候更适合:
上电后回到安全初始状态
由人工确认现场状态
再重新复位、回原点、重新启动
为什么?
因为断电那一刻,机械可能已经停在不确定位置。
如果程序只凭一个“步骤号 = 5”就继续后面的动作,
很可能跟真实现场状态已经不一致。
哪些场景可能允许恢复
比如一些相对安全、状态容易确认、工艺允许续做的过程,
有时可以设计成断电记住进度,再由人工确认恢复。
但这里的重点是:
不是简单把步骤位掉电保持就完事了,
而是必须同时考虑机械真实位置、工件真实状态、执行机构状态、安全确认。
所以顺控掉电恢复,是一个很工程化的课题。
基础阶段你先记住一个原则就行:
步骤状态能不能恢复,不是看程序方便不方便,而是看现场是否安全、状态是否可确认。
九 为什么有些参数必须保留,但有些临时值必须清掉
这个问题从用户体验角度非常重要。
例如一个烘箱设备:
目标温度
高温报警值
超温保护值
风机延时值
升温保温时间设定
这些都是用户调好的工艺参数。
如果每次断电都丢,操作员会非常崩溃。
所以这类参数一般应该保留。
但像这些东西:
本轮升温完成标志
本步加热完成位
当前启动命令
本次消音状态
本轮定时进行中
当前脉冲触发位
这些多数属于运行过程中的临时状态。
上电后应该重新建立,而不是直接照搬昨天断电前的瞬间状态。
所以你要慢慢建立一个习惯:
参数是“设备长期记忆”
临时位是“本次运行过程记忆”
这两种记忆不能混。
十 上电初始化为什么首先要考虑“安全输出”
这个点特别关键,尤其是现场设备。
程序一上电,你最先该想的,不是“这个计数要不要清”,
而是:
输出是不是安全。
比如:
电机能不能突然转
电磁阀能不能突然动作
加热管能不能突然通电
气缸能不能突然伸出
蜂鸣器要不要乱响
制动器要不要误释放
变频器启动信号会不会误给出
真实设备里,最怕的就是上电瞬间带着某些遗留状态,
导致执行机构突然动作。
所以很多工程里的基本原则都是:
上电后先让控制命令进入安全默认态
输出需要重新满足条件、重新启动,才允许动作
你会发现,这和前面讲的“运行命令不要轻易掉电保持”是连在一起的。
十一 什么叫“安全默认状态”
这是一个特别工程化的概念。
安全默认状态,不一定等于“全部清零”,
但通常意味着:
设备上电后,应先回到一个不会突然产生危险动作的状态。
例如:
电机停止
加热关闭
气缸动作命令撤销
自动运行命令清除
报警根据实际情况重新判断
模式可保留也可回默认,但不能导致自动动作
输出允许链必须重新满足
人机界面显示当前待机状态
也就是说,上电初始化的目标,不是把程序变“空”,
而是把系统放回一个“可控、安全、可重新开始”的起点。
这和只会写功能逻辑,是两个层次。
十二 首次扫描最常用来做什么
这一段要讲实用一点。
首次扫描最常见的用途,通常有下面几类。
1 清除临时脉冲和中间瞬时位
比如:
上升沿辅助位
下降沿辅助位
单次触发脉冲
一次性执行完成位
某些只在运行中有意义的短时位
这些通常上电后不该继续保持。
2 清除运行命令和动作保持位
比如:
自动运行命令
某电机启动命令
某气缸动作保持位
某手动动作命令
本轮流程开始标志
多数时候,上电后这些应重新由操作员下达,而不是自动延续。
3 初始化步骤或流程状态
比如:
回到待机步
回到步骤 1
清除当前临时流程位
置位“待复位”状态
要求人工回原点或确认
这个在顺控里特别常见。
4 装载默认值或检查参数合理性
有些设备第一次启动,某些参数必须有默认值。
如果发现参数区是空的、非法的、超范围的,可以在首次扫描时做一次整理。
例如:
没有设定过的延时值,给一个默认值
超出范围的参数,夹到合法区间
配方号无效时,回到默认配方
5 启动上电自检流程
比如:
置位“系统初始化完成前禁止启动”
置位“请检查气压/原点/急停/门状态”
启动一些开机自检定时或检测逻辑
十三 一个非常典型的现场现象:为什么程序下载后设备行为和正常开机不一样
很多初学者会发现,程序刚下载进去或者 PLC 刚切运行时,
设备的表现和自己平时想的不太一样。
这背后常常就涉及:
首次扫描
变量初始值
掉电保持区恢复
非保持区默认清零
输出刷新顺序
程序刚启动时的中间状态
也就是说,程序“刚起来”的那一瞬间,其实是一个特殊时刻。
这个时刻如果你没有专门处理,上电和日常运行的行为就可能不一致。
所以工程上真正稳的程序,往往都会主动考虑:
刚启动这一下我要怎么接住
这就是首次扫描逻辑存在的意义之一。
十四 一个完整小案例:水泵控制柜为什么上电后不该直接沿用上次运行命令
咱们用一个很典型的水泵例子来讲。
场景要求
水泵系统平时有自动模式
自动模式下压力低于启动值时,启动水泵
压力高于停泵值时,停止水泵
系统参数要保留
总运行小时要保留
但设备断电重启后,不允许水泵立刻自动沿用断电前的运行命令
必须重新判断压力条件,并在安全逻辑允许下再决定是否启动
逻辑分析
应该保留的:
启动压力设定值
停泵压力设定值
低压报警值
高压报警值
总运行时间
总启动次数
不建议直接保留的:
水泵运行命令
当前自动启动保持位
本轮启动中间状态
本轮延时完成位
上电处理思路
PLC 刚上电时:
先清掉运行命令
清掉本轮临时状态
保留参数
保留累计值
重新读取当前压力
重新判断是否满足启动条件
如果工艺允许自动恢复,也应在重新判断和必要延时确认后再动作,而不是简单继承旧命令
你看,这就非常清楚:
参数要记住
动作不要盲目继承
十五 另一个典型小案例:报警锁存掉电后到底要不要保留
这个问题很多现场都会碰到。
比如设备有“超温保护报警”。
如果昨天晚上因为超温停机,操作员关机检查。
今天再开机,这个报警锁存到底该不该还在?
这要分情况。
一种常见做法
严重保护类报警在掉电后继续保留,
开机后仍提示“上次因超温保护停机”,
要求人工检查并复位。
这种更安全,也更有利于排查问题。
另一种做法
如果报警只是普通过程报警,且重新上电后已经没有实际故障条件,
则可以不继续保留,只根据当前状态重新判断。
所以你会发现:
报警要不要掉电保持,不是按“它是不是报警”来决定,
而是按“它的重要性、安全性、排障需求”来决定。
可以帮助判断的一个问题
这个报警如果断电后一清空,会不会让操作员失去重要信息,或者让系统不安全?
如果会,那就更倾向于保留或保留历史痕迹。
如果不会,可以考虑重新上电后按当前条件判断。
十六 为什么很多设备上电后要先“待复位”,而不是直接“待运行”
这是一个非常好的工程习惯。
所谓“待复位”,意思是:
设备刚上电,先不直接进入允许运行状态,
而是要求操作员先做一次复位确认,
让系统把当前安全条件、原点状态、门状态、气压状态等重新梳理一遍。
这种设计的好处很大:
能避免上电后直接带着旧状态动作
能让设备重新建立“我已经准备好”的干净起点
能让现场人员明确知道设备现在处于什么状态
能把一些未完成的旧流程彻底切断
特别是下面这些设备,更常见这种思路:
带运动轴的设备
带气缸夹具的设备
多步顺控设备
上电后可能有误动作风险的设备
需要重新原点确认的设备
所以以后你写程序时,可以多问自己一句:
这个设备上电后,是不是更适合先进入“待复位”,而不是直接允许启动?
这个问题非常有价值。
十七 一个特别容易忽略的点:计数和累计也要分“本次”和“总计”
很多人学到掉电保持时,只会想“计数要不要保留”。
其实更好的工程做法常常是分层。
例如:
本次运行计数
班次计数
日计数
总计数
这些逻辑意义不同,对掉电保持的需求也不同。
例如
总计数通常应掉电保持
班次计数可以由换班时人工清零
本次运行计数可能在开机或复位时清零
日计数可能由上位机或时间逻辑处理
如果你全部混成一个数,要么不方便管理,要么掉电策略会很混乱。
所以掉电保持不只是“保不保”,
更是“不同层级的数据怎么分开设计”。
十八 参数初始化和参数保留,有时候要同时存在
这听起来好像矛盾,其实不矛盾。
举个例子。
设备第一次出厂时,某些参数肯定要有默认值。
但后面用户调过以后,这些参数又应该被保留下来。
那怎么办?
常见思路是:
第一次启动时,发现参数区还没有有效值,就写入默认值
以后正常运行时,再按掉电保持保存用户修改值
上电时还可以顺便检查参数是否越界,如果越界则修正回合法范围
你看,这就形成了一个完整的参数管理逻辑:
默认值
用户修改
掉电保留
开机检查
非法修正
这比单纯一句“参数要保留”更完整。
十九 为什么首次扫描特别适合做“非法状态纠正”
这是很实用的一个点。
有时设备断电、程序修改、异常停机后,
某些变量可能会落在一个“不合理但又不是完全空”的状态。
比如:
步骤号不是 1 也不是 0,而是某个非法值
模式位互相矛盾
某组参数超出正常范围
某个计数值异常大
某个保持位组合不可能同时成立
这时候首次扫描就很适合做一次“状态整理”。
例如:
如果步骤号非法,则回待机
如果自动和手动同时为 1,则清自动保留手动或进入待复位
如果参数超上限,则夹到上限
如果某些互斥状态同时成立,则统一清理
这种思路非常工程化。
它会让你的程序更有韧性,而不是只能在“理想状态”下运行。
二十 一个完整小案例:带气缸的顺控设备上电后应该怎么处理
咱们用一个更贴近自动化现场的小案例来讲。
场景要求
设备有自动步骤流程:
待机
来料检测
气缸伸出
夹紧
加工
松开
退回
完成
运行中若断电,再上电后不能直接从断电前的步骤继续往下做。
因为此时气缸真实位置、工件是否还在、夹紧是否已经完成,都可能和程序记忆不一致。
上电后应进入待复位状态,要求人工确认,再重新回初始位置后才能启动。
设计思路
应该保留的:
工艺参数
加工时间设定
总产量
总故障次数
不应直接恢复的:
当前步骤号
气缸动作命令
本轮流程完成位
本轮来料已确认位
当前自动运行命令
首次扫描时:
清除运行命令
清除当前流程步骤保持
置位“待复位”状态
要求人工执行复位动作
待检测到原位、夹具释放、安全条件都正常后,才允许进入待机
这就是非常典型的“上电不续跑,而是先重建安全起点”。
二十一 初学者最容易踩的几个坑
这一段你后面做项目时会非常有感触。
1 什么都想掉电保持
结果上次运行状态全带回来,设备上电后表现非常诡异,甚至危险。
2 什么都上电清零
结果参数、配方、累计量全没了,用户根本没法用。
3 忘了区分“参数”和“状态”
把运行命令和工艺参数放成同一类,这是很容易出问题的。
4 运行命令掉电恢复
这是典型风险点。
尤其是电机、气缸、加热、运动控制相关逻辑。
5 步骤状态直接恢复,却没核对机械真实状态
程序觉得在步骤 5,现场机械却未必真是步骤 5 的物理位置。
6 首次扫描什么都不做
结果上电瞬间的中间状态、临时位、流程位没人接管,程序容易乱。
7 报警要不要保留完全没设计
导致有的该追踪的报警丢了,有的普通报警却一直挂着。
8 没有“待复位”概念
上电后直接进入允许运行,很容易把上次未完成流程带进来。
二十二 怎么设计会更稳:给你一个实用的判断顺序
以后你只要碰到一个变量,就按这个顺序问自己。
第一步
它是参数,还是状态,还是中间结果,还是统计值?
第二步
它断电后还应不应该记住?
第三步
如果记住了,上电后会不会带来风险?
第四步
如果不记住,会不会影响使用体验或数据完整性?
第五步
它上电后是该自动恢复、自动重建,还是人工确认后再恢复?
这个判断顺序特别有用。
能帮你把“掉电保持”和“初始化”真正设计出来,而不是靠感觉写。
二十三 本课小结
这一课你最少要真正吃透下面这些点。
第一,设备重启后程序会乱,很多时候不是逻辑本身错,而是没有分清哪些数据该保留、哪些状态该初始化。
第二,掉电保持是让某些数据断电后继续保留,上电初始化是让系统重新回到一个明确、安全、可控的起点。
第三,参数设定、配方、补偿值、累计量这类长期数据,通常更适合掉电保持。
第四,运行命令、动作保持位、步骤状态、中间脉冲、临时逻辑位这类运行过程状态,通常要谨慎处理,很多时候不适合直接掉电保持。
第五,首次扫描是处理上电瞬间特殊逻辑的重要时机,常用来清临时位、清运行命令、回待机、做参数检查、启动自检。
第六,程序上电后首先要考虑的不是“功能能不能跑”,而是“输出是不是安全、系统是不是在安全默认状态”。
第七,步骤能不能断电恢复,不能只看程序方便不方便,必须看现场机械真实状态、工艺连续性和安全性。
第八,真正稳的程序,不是全部保留或全部清零,而是按“长期参数、累计数据、运行状态、中间结果、报警类型”去分类处理。
二十四 学完这一课后,你应该能做到什么
学完这一课,你至少应该能做到这些事情:
知道为什么设备重启后有时会出现状态混乱
知道哪些参数通常应该掉电保持
知道哪些运行命令和中间状态不该轻易恢复
知道首次扫描为什么重要
知道上电初始化首先要考虑安全输出和安全默认状态
知道顺控设备为什么很多时候上电后应先待复位,而不是直接续跑
知道一个变量断电后要不要保留,不能凭感觉,要看它的类型和风险
如果这些你已经顺了,后面写出来的程序就会更像真正能落地的现场程序。
二十五 下节预告
下一课我们继续往下走,讲的是:
PLC 基础课 第15讲
手动、自动、急停、复位:设备模式切换逻辑该怎么设计
这一课会把很多设备“能跑但不好用”的根源讲清楚。
因为前面这一讲讲的是“断电重启后,系统应该站在哪里”;
下一讲要讲的是:
设备平时运行时,手动和自动怎么切,急停和复位怎么衔接,为什么很多程序不是不会跑,而是模式逻辑没设计好。
推荐阅读:
PLC 基础课 第16讲 程序分段与结构化:主程序、子程序、功能块,怎么让程序更好维护
PLC 基础课 第14讲 掉电保持、上电初始化、首次扫描:设备重启后,程序为什么会乱?
PLC 基础课 第10讲 比较指令与区间判断:大于、小于、等于,现场逻辑怎么写更稳妥
PLC 基础课 第9讲 PLC 数据类型与寄存器:位、字节、字、双字,M X Y D T C 怎么分工
PLC 基础课 第 8 讲|一个完整小项目:水泵控制柜,从电气原理图到 PLC 梯形图
PLC 基础课 第 7 讲|报警与状态:怎么写出一个好用的报警逻辑 + 保留最后一次故障