1. 从继电器柜到虚拟世界:为什么位逻辑是绕不过去的坎
先说个我在培训现场观察到的现象。每次带新学员,第一周讲指令,大家都能跟上,MOV、ADD、比较指令这些哪怕没见过也能猜个大概。可一旦开始写程序,十个里面有八个会卡在起保停电路上。不是不懂梯形图怎么画,而是脑子里没法把“按钮按下”“继电器吸合”“触点动作”这些物理过程映射到扫描周期里。
这事其实不怪学员笨。PLC本来就是从继电器控制系统演化来的,它所有的逻辑根基都建立在“线圈得电”“触点闭合”这一套物理模型上。你去看三菱的FX系列也好、西门子的S7-200 SMART也好、汇川的Easy系列也好,底层指令集里排在最前面的永远是LD、LDN、A、AN、O、ON、=这些位逻辑指令。那些看起来高大上的PID、运动控制、通信协议,最终落到PLC内部,还是靠成千上万次位状态的置位和复位来驱动的。
所以我把话放在这儿:位逻辑不是PLC编程的一个章节,它是整个PLC的骨架。你后面学的所有数据块、功能块、通信程序,拆到最底层全是位操作。甚至可以说,你把位逻辑搞透了,复杂程序就是一堆位逻辑加上数据处理的组合叠加,一点神秘感都没有。
我见过不少自学PLC的朋友,上来就刷视频学什么FB块、SCADA组态、变频器通信,结果学到一半发现写出来的程序根本不敢往设备上放。为什么?因为连自锁互锁都没写明白,电机启动之后按了停止按钮却不停,这种事真出了是会出人命的。先把这个地基打牢,比什么都重要。
2. 位逻辑到底在学什么:三个核心概念一次讲透
2.1 位——PLC世界里的最小单位
位(Bit)这个概念在所有编程语言里都存在,但在PLC里尤其关键。一个位只有两种状态:0或者1,对应到物理世界就是继电器线圈的断电和得电,触点的断开和闭合,指示灯的死和亮。
别小看这0和1,PLC的所有逻辑运算最终都落在这些01组合上。你在触摸屏上看到的真实值和模拟量,到了CPU内部全要转成一串位的组合。位逻辑指令操作的就是这些单独的位,它不像数据处理指令那样一次折腾16位或32位,而是“一次只看一个开关”。
给新手的比喻:位就是一个小灯泡。编程就是在决定这个灯泡在什么条件下亮、什么条件下灭。条件到位了就亮(置1),条件不满足了就灭(置0)。所有复杂程序都是无数个小灯泡的亮灭组合出来的。
2.2 常开常闭:物理世界带来的陷阱
常开(NO)和常闭(NC)这两个概念让无数人栽跟头,因为它的理解门槛在于:你写的是逻辑,而逻辑状态跟物理状态是反着的。
常开触点未动作时是断开的,逻辑上为0;一但动作就闭合,逻辑上为1。常闭触点反过来,未动作时是闭合的,逻辑上为1;动作后断开,变成0。
很多新手死活想不明白的地方在急停按钮:为什么急停要用常闭触点?因为急停按钮没按下时,它是常闭状态,PLC读到的是1,程序判定“急停没按,一切正常”。一旦急停被按下,触点变开,PLC读到的是0,程序立刻执行停机逻辑。这个设计最妙的地方在于,如果急停回路断线了,PLC同样读到0,也会触发停机——也就是说,断线故障和急停动作被检测为同一个状态,这就是所谓的“故障安全”设计。
这里必须单独强调一下,没有任何例外——急停、安全光幕、安全门开关,全部要用常闭触点接入,并且程序里要用常开指令去读。这是一种设计哲学:用“读到0”来代表“出事了”,因为线路故障大概率也是0,保证故障时程序能做出安全响应。
2.3 扫描周期:理解一切位逻辑问题的钥匙
PLC和传统的继电器电路还有一个本质区别:继电器是并行工作的,按下启动按钮,所有相关继电器同时动作;PLC是串行扫描的,CPU按照程序的编写顺序,从上到下、从左到右逐条执行。
这就带来一个在继电器时代完全不存在的问题:同一扫描周期内,前面的程序结果会影响后面程序的执行,但后面程序的结果不能反过来影响前面已经执行完的部分。所以你必须养成一个习惯:写程序时,逻辑要在脑海中按“从上到下依次过一遍”的方式去推演。
举个例子,A和B是两个输出线圈,程序先写A的输出,再写B=A,那么这一轮扫描里B会被置成跟A一样;如果反过来,先写B=A,再写A,那么B用的是上一轮扫描结束时A的旧值。在实际项目里,这种顺序不同带来的结果差异经常导致设备动作异常。后面我会专门讲一个我实际踩过的坑。
3. 梯形图与继电器电路的对照:学位逻辑的捷径
3.1 继电器电路为什么会过时
二十年前自动化设备的控制柜里,是成排的中间继电器、时间继电器、接触器。现在的控制柜里,这些东西被一个巴掌大的PLC代替了。为什么能做到?因为继电器电路能实现的所有逻辑,PLC用梯形图都能实现,而且改起来不用重新接线,按几个键就行。
理解这层对应关系极其重要。我的经验是:凡是能从继电器电路图上直接翻译过来的梯形图,几乎没有理解障碍;凡是翻译不过来的,说明你还没吃透那个继电器电路的原理。
继电器电路里,每个继电器有一对常开触点和一对常闭触点,PLC里对应的是每个输出线圈可以带无数个常开常闭触点,想用几次就用几次。这就是PLC对继电器系统最直接的优势——不占物理空间、不用接线、想加触点随便加。
3.2 把物理动作翻译成编程逻辑
看一个最简单的起保停电路翻译过程。物理世界里是这样的:按下启动按钮SB1,接触器KM线圈得电吸合,KM的辅助触点闭合,即使松开SB1,电流也能通过KM自身的辅助触点维持线圈得电。按下停止按钮SB2,线圈失电,辅助触点断开,即使松开SB2也不会重新启动——除非再次按下SB1。
翻译成梯形图是这样:启动按钮SB1接PLC输入点X0,停止按钮SB2接X1,接触器线圈接输出Y0,Y0的常开触点并接在X0两端,模拟KM辅助触点的自保持功能。
这段翻译的关键点在哪里?在于“用Y0自己的触点锁住自己”这个思路。很多新手觉得这是“自己在给自己供电”,逻辑上绕不过弯。但你把继电器电路里的辅助触点代入,就通了:Y0线圈得电后,它控制的常开触点就闭合,而这个触点恰好接在自己的供电回路上,所以能持续得电。这就是位逻辑里最核心的“自锁”回路。
3.3 一张图看懂位逻辑五种基础回路
我在培训里总结过,所有业务程序的逻辑基础跑不出这张表的范围:
| 回路名称 | 核心特征 | 典型用途 |
|---|---|---|
| 起保停回路 | 多个启动条件并联、停止条件串联、自身触点并联自锁 | 电机启停、设备运行控制 |
| 互锁回路 | 两个条件互斥,一方得电条件包含另一方的常闭触点 | 正反转控制、双泵切换 |
| 优先回路 | 后动作信号无法覆盖先动作信号(置位优先) | 硬件报警、急停复位策略 |
| 延时回路 | 借助定时器实现得电/失电延后 | 电机星三角转换、顺序启动 |
| 闪烁回路 | 两个定时器交替工作,输出周期性翻转 | 指示灯、蜂鸣器 |
你可以在任何品牌的PLC软件里把这五种回路各写一遍,仿真跑通了再去碰真实设备。我敢说,这五种回路达到闭眼能写的熟练度,底子就相当于练武之人扎稳了马步。
4. 实操环节:三菱与西门子的位逻辑指令对照练习
4.1 两个主流平台的核心位逻辑指令
做PLC这行,三菱和西门子的指令体系迟早都要碰。虽然绝大多数学员刚开始只用一种,但真到项目上,客户指定什么品牌你就得用什么品牌。好消息是:位逻辑指令在这两家之间差异极小,学通一家,另一家对照表直接迁移。
| 功能描述 | 三菱FX系列 | 西门子S7-200 SMART |
|---|---|---|
| 常开触点(读取) | LD(起始)/ AN(串联)/ OR(并联) | LD / A / O |
| 常闭触点(读取) | LDI / ANI / ORI | LDN / AN / ON |
| 输出线圈 | OUT | = |
| 置位 | SET | S |
| 复位 | RST | R |
| 上升沿检测 | LDP / ANP / ORP | EU(Edge Up) |
| 下降沿检测 | LDF / ANF / ORF | ED(Edge Down) |
新手最容易混淆的是常闭触点和“取反”的关系。记住一句话:常闭触点的本质就是“对位状态取反后再读取”。所以如果程序里想表达“当X0没按下时输出Y0”,用常闭触点读X0,或者直接用LD X0加一个取反指令,效果是一样的。但实际项目中尽量用常闭触点直接读,可读性更强,别人维护你的程序时不会骂人。
4.2 手把手写一个电机启停程序
假定需求:按钮X0启动电机,X1停止,电机运行输出Y0,同时Y0控制运行指示灯。要求启动优先于停止(避免启动和停止同时按下时逻辑不确定)。
三菱程序写法:
LD X1 OR Y0 ANI X0 OUT Y0看到没有,这里我用的是“停止常闭串在启动回路上”。当X0(停止)没按下时,常闭触点保持闭合,回路通了,Y0只要被启动信号X1或者自锁触点Y0激活就能保持。一旦X0按下,常闭触点断开,整个回路断电,Y0失电。
西门子写法只有指令名不同,结构完全一样:
LDN I0.0 // 停止按钮,常闭指令 O Q0.0 // 自锁触点 A I0.1 // 启动按钮 = Q0.0 // 输出线圈很多刚学的朋友会问:为什么停止按钮不放在线圈后面?因为在西门子里“=”输出是区域的终点,后面没法再串联了。所以所有条件必须写在输出之前。这也是你在看别人程序时经常看到停止条件放在最前面的原因——不是规则要求,是它天然排在了最合适的位置。
4.3 用仿真软件验证程序的正确性
写完程序先别急着上真机。现在的编程软件都有仿真功能,三菱GX Works2自带仿真器,西门子有S7-PLCSIM。把上面的程序敲进去,用仿真模式下载,然后手动置位X1(启动),观察Y0是否置1;松开,Y0是否保持;再置位X0(停止),观察Y0是否变为0。这个过程反复做,直到你对“自锁”形成肌肉记忆。
这里插一句:很多人在S7-PLCSIM Advanced里遇到实例启动不了的问题。最常见的原因是许可证没有正确安装,另一种是仿真实例和实际PLC固件版本不匹配。还有一个小坑:有些人电脑上装了多个版本的仿真软件,结果项目配置的CPU型号和当前打开的仿真器版本不一致,导致启动报Error 11,这个错误码本意是指实例创建失败,但根源往往就是版本不对应。把这些基础问题提前排查好再开始仿真,能省下大量时间。
5. 位逻辑背后的大局观:从红绿灯到生产线的通用逻辑
5.1 红绿灯程序:位逻辑的经典综合练习
网上关于“十字路口红绿灯PLC程序”的搜索量一直很高,因为这是院校教学和入门实操的经典项目。红绿灯看似简单,却集齐了位逻辑、定时器、计数器三大基础要素,而且逻辑关系清晰、眼见为实,特别适合练手。
先梳理需求:南北和东西两个方向,红黄绿三组灯。正常时序是——南北绿灯亮30秒,然后黄灯闪3秒,再红灯亮30秒;同时东西方向的红灯先亮30秒,接着绿灯亮30秒,再黄灯闪3秒。循环往复。
最容易犯的错误是把两个方向的灯当成独立的逻辑来写。实际上,南北绿灯和东西红灯的时序是互补的,所以最简洁的写法是用一个定时器链,把整个周期切成若干个时间段,每个时间段驱动对应的灯。如果从零开始写,推荐先画时序图再翻译成梯形图,这个习惯到后面做多工步设备时一样受用。
5.2 大棚灌溉系统里的位逻辑实战
再看“基于西门子PLC的大棚灌溉”这类工程型项目。它跟红绿灯的区别在于多了些模拟量处理和手自动切换,但核心控制部分仍然是位逻辑的天下。
需求大致是:土壤湿度低于下限时打开电磁阀灌溉,湿度到了上限就关闭;同时要支持手动模式,人工强制开阀关阀;若是夜间且温度低于冰点,还要禁止灌溉防止冻坏管路。
手动/自动切换的第一原则是互锁:自动模式时手动按钮无效,手动模式时自动条件被旁路。更细一点,电磁阀输出要搞成“双条件”控制:一是模式允许(手自动切换的结果),二是实际的开阀信号(自动状态的比较结果或手动按钮)。这种写法能确保任何时候都只有一条控制路径是通的,不会出现手自动同时动作的尴尬。
5.3 数据世界里同样是位逻辑
你可能觉得“PLC和SCADA怎么连接”“C#怎么读取PLC数据”这种问题跟位逻辑没什么关系。但实际上,通信的本质就是把PLC里的位状态和寄存器值透明地搬到上位机界面上。SCADA画面上的每一个按钮、每一根管道变色、每一个电机的旋转动画,底层对应的都是PLC里某个位的值。你在上位机按一下启动,本质就是把PLC里代表“启动请求”的一个位从0改成1;PLC程序检测到这个位的变化,再去执行对应的设备动作。
汇川AM系列连威纶通触摸屏也好,信捷XD连MCGS也好,方法都一样:先确认PLC和触摸屏的通信协议(Modbus TCP或者专用协议),然后把PLC的位地址映射到触摸屏的位元件上。如果发现触摸屏软件里找不到某个PLC的驱动,那就要到PLC一侧看看是否支持标准的Modbus从站功能——汇川Easy系列和AM系列都原生支持Modbus TCP,直接当成通用从站来连就行。
6. 常见问题排查与避坑心得
6.1 自锁失效:为什么输出不能保持
这是一个高频问题。程序逻辑明明写了输出线圈的自锁触点,下载到PLC里,启动时输出也能得电,但信号一断就掉,自锁完全不起作用。
排查思路按顺序走:第一,确认程序里并接的是不是输出线圈的常开触点,用普通常开还是带保持功能的?第二,确认自锁触点的地址和输出线圈的地址完全一致,Y0的线圈必须并接Y0的触点,串成Y1就是另一个故事了。第三,确认输出线圈的编号没有被其他程序段重复赋值。我见过最离谱的案例是:同一台PLC里两个程序块都对Y0做了赋值,块A的逻辑没错,但块B在一个不满足的条件下把Y0重新写成了0,等于每轮扫描都有人去“掐”一下输出,自锁自然失效。这种情况用软件里的“交叉引用”功能一查便知。
6.2 扫描顺序的坑:位置不同结果完全不同
这是老生长谈但永远有人踩的坑。前文提过,同一扫描周期内程序的先后顺序会影响结果。具体到实操,写梯形图时,一个输出线圈的控制逻辑尽量放在同一段程序里,不要让同一输出的多个控制条件分散在相隔很远的网络段里。
我自己就吃过一次亏:一台输送带设备,手动点动逻辑写在程序最前面,自动运行逻辑写在中间,结果手动点动时总是会被后面的自动逻辑“抢断”。最后只能把所有跟输送带输出相关的控制块全部合并到一个功能块里,统一管理。这个经历让我养成了一个习惯——程序里每个执行元件只在一个区域被赋值,其他地方只能读取它的状态。这个原则值得每个初学者从一开始就坚持。
6.3 急停和复位逻辑:先想清楚“最后一道防线”
做设备控制逻辑时,我习惯先写急停处理,再写复位流程,最后写正常工艺逻辑。急停信号一旦激活,所有输出全部切断,而且是物理强制——不只是程序逻辑上切断,还要通过外部安全继电器把主回路电源真正断掉。PLC里的位逻辑只能管住程序层面,管不住物理世界的电流,这一点必须清醒。
复位逻辑也经常出问题。最常见的错误写法是:急停复位后设备直接按照急停前的状态继续运行。设想操作工按下急停是因为设备卡住异物,结果手一松设备自己又转起来,异物没清理就二次启动,后果不堪设想。正确的做法是:急停复位后设备处于“待机”状态,操作工必须重新按启动按钮才能再次运行。这种“启动确认”机制在位逻辑里实现起来很简单:把启动信号从输入点直接驱动改为“一个临时中间位”,只有急停复位且启动按钮按下时这个临时位才置1,然后所有运行逻辑都以这个临时位为前置条件。
6.4 上电瞬间的乱跳:输出瞬态问题处理
PLC通电的瞬间,CPU还没有开始扫描程序,输出模块的电平处于不确定状态,可能瞬间给负载一个误动作脉冲。对于气缸、灯之类的设备,这个脉冲周期极短,一般察觉不到;但如果是大功率接触器,或者涉及安全联锁的设备,这个瞬时导通就可能造成严重的机械误动作。
处理方式有二:一是硬件上选用带“输出点强制安全值”功能的输出模块,配置成上电瞬间所有输出点保持断开;二是在程序开头,第一网络段就强制把所有输出线圈复位,然后再进入主逻辑。很多老工程师喜欢在程序开头写一段“初始化网络”:把全部Q/Y置0、关键中间位复位、禁止中断、复位定时器。这一段就是设备上电瞬间的“安全缓冲带”。
6.5 关于位逻辑练习的三个阶段
最后分享一个我教人常用的训练路径,分三个阶段,每阶段练熟再进下一阶段。
第一阶段是抄写。找十份不同设备的成熟程序,只抄位逻辑部分,抄的时候在纸上把每个网络的电流路径走一遍,高亮出每个自锁点、互锁点。抄写的目的不是练打字,是用笔强制自己慢下来,把每一条逻辑都捋清楚。
第二阶段是改错。故意把一份正确程序里的某些触点类型改了——常开改常闭、串联改并联、自锁触点去掉——然后去仿真运行,观察设备动作在整个逻辑链里引发了什么变化。这个阶段磨的是“逆向思维”,你看到异常现象,得能倒推出程序哪一行出了问题。
第三阶段是独立设计。拿一套工艺要求写完整的位逻辑程序,比如“两台电机顺序启动、逆序停止、故障时后启动的优先停”,这题如果能在半小时内无参考写完并仿真通过,你的位逻辑基本功就真正过关了。
7. 串起来了:位逻辑和整个PLC知识体系的关系
说点掏心窝的话。很多人在学PLC时特别急,恨不得两周内把通讯、模拟量、运动控制全啃完,觉得位逻辑太简单、没意思。但根据我在现场摸爬滚打的经验,真正拉开工程师差距的,恰恰是这些基础逻辑的严谨程度。
设备调试时,90%的疑难杂症都不是出在PID参数没调好、通信协议没配对上,而是位逻辑链条上的某些细节没有处理干净。突然停机,排查半天是急停回路里某根线虚接了;设备动作乱跳,查到最后是程序里两个输出点地址重复了;温度异常,发现是某个比较指令的使能位没有在正确时机被置位。
你现在花两周把位逻辑嚼碎吃透,看起来比别人慢了半拍,但后面写复杂程序时会像开了天眼一样流畅。反观那些跳过了位逻辑直接上高级功能的人,写出来的程序你可能第一眼感觉没什么毛病,可一跟踪在线状态就发现各种逻辑漏洞——这个不该得电的线圈得电了,那个该断开的触点还吸着,完全经不起深挖。
我的个人看法是:位逻辑不是PLC编程的入门课,它是PLC编程的核心课。指令手册随时可以查,数据块结构背一背也会用,但“逻辑思维”这个东西没有任何替代品——它只能靠一条一条网络、一个一个触点这样扎扎实实练出来,没有捷径。你觉得你在学指令,其实你在练的是思维方式;等到思维通了,指令换哪个牌子都只是查个表的事,那才是真正出师的时候。