1. 为什么“位逻辑”才是PLC编程的真正分水岭
1.1 一个被忽视的共性问题
我带过不少刚入行的朋友,也帮一些工厂的电工做过PLC培训。每次聊到学习路径,几乎所有人都会问同一个问题:“指令表那么长,我到底要背多少条才能干活?”这个问题本身就暴露了一个认知偏差——大家默认PLC编程的难点在于指令的数量和复杂度,于是拼命去记MOV、CMP、PID这些看起来“高级”的东西,却对最基础的位逻辑一带而过。
实际情况恰恰相反。我观察下来,绝大多数人学不会PLC编程,卡点根本不在复杂指令上,而是基础位逻辑完全没学透。什么叫没学透?就是给他一个简单的启保停电路,他能画出来,但你让他解释为什么自锁触点要并联在启动按钮上、为什么停止按钮必须用常闭、为什么同一个线圈在程序里出现两次会出问题,他就说不清楚了。这种“会画不会讲”的状态,就是典型的位逻辑没吃透。
位逻辑是PLC编程的地基。地基没打好,后面学定时器、计数器、数据处理、通讯,全都是空中楼阁。你可能会用MOV指令传数据,但一旦程序出现时序问题,你根本不知道从哪查起,因为你对触点通断的时序关系没有形成直觉。这个直觉,只能从位逻辑里练出来。
1.2 位逻辑到底在解决什么问题
用最直白的话讲,位逻辑解决的就是“什么条件下做什么事”的问题。一个按钮按下去,电机转起来;再按一下,电机停。这背后就是位逻辑在起作用。PLC的扫描机制决定了它每个周期都要重新读一遍输入、算一遍逻辑、刷新一遍输出,位逻辑就是描述这个“算”的过程。
我习惯把位逻辑比作电路里的继电器控制回路。你以前用继电器搭过启保停,那套思路搬到PLC里几乎一模一样,只不过触点从物理触点变成了软元件,接线从导线变成了程序里的连线。但这里有个关键区别:继电器回路的通断是并行发生的,而PLC是串行扫描的。这个区别导致了很多新手写程序时觉得“逻辑没错啊,怎么就是不动作”,问题往往就出在对扫描周期的理解上。
举个例子。假设你在程序里写了这么一段:第一行用X0的常开触点驱动Y0线圈,第二行用Y0的常开触点驱动Y1线圈。你按下X0,期望Y0和Y1同时亮。实际结果是Y0亮了,Y1要等到下一个扫描周期才亮。如果你用Y1去驱动别的东西,时序上就会差一个周期。这种细节,不把位逻辑吃透是根本注意不到的。
1.3 不同品牌PLC的位逻辑差异
虽然位逻辑的基本概念是通用的,但不同品牌在实现细节上确实有差异。三菱的FX系列和Q系列在软元件编号上就不一样,汇川的H5U和Easy系列在编程习惯上也有自己的特点。我拿汇川的H5U举例,它的位软元件和字软元件的边界划分比较清晰,M点作为中间继电器用起来很顺手,但如果你从三菱转过来,可能会习惯性地用M点做大量中间状态,结果程序跑起来发现扫描周期变长了。
这里要提一下INPROSHOP这个工具。汇川的INPROSHOP编程软件在位逻辑监控上做得比较直观,你可以直接在梯形图界面上看到每个触点的实时通断状态,这对新手理解位逻辑的时序非常有帮助。我建议刚开始学的时候,不要急着写复杂的程序,就写几个简单的位逻辑回路,然后打开监控,盯着看每个扫描周期里触点的变化。看多了,你对扫描机制的理解就会从“知道”变成“感觉到”。
2. 位逻辑的核心元件与实操拆解
2.1 常开常闭不是“开关”,是条件判断
很多人把常开触点理解成“开关断开”,常闭触点理解成“开关闭合”,这个理解在物理电路里没问题,但在PLC编程里会把你带偏。在PLC程序里,常开触点的含义是“当这个位为1时,条件成立”,常闭触点的含义是“当这个位为0时,条件成立”。它描述的是状态判断,不是物理通断。
这个区别在什么时候会咬你一口?当你用常闭触点做停止按钮的时候。物理上,停止按钮不按的时候是闭合的,按下去才断开。你在程序里用常闭触点,意思是“当这个位为0时条件成立”,也就是按钮没按的时候条件成立,按下去条件不成立。逻辑上是对的,但如果你脑子里想的是“常闭等于闭合”,你就会在调试的时候犯迷糊:明明按钮没按,程序里这个触点怎么是导通的?
我自己的习惯是,在梯形图里看到常闭触点,就在心里默念“这个位现在是0”。看到常开触点,就默念“这个位现在是1”。这个习惯帮我省了很多调试时间。
2.2 自锁回路的三种写法与坑
自锁是位逻辑里最基础也最重要的结构。我见过至少三种写法,每种都有它的适用场景和坑。
第一种是标准写法:启动按钮的常开触点和自锁触点并联,然后串联停止按钮的常闭触点,最后驱动线圈。这种写法最直观,也最不容易出错。但要注意,停止按钮必须用常闭,如果你用了常开,程序一上电电机就转,因为上电时按钮没按,常开触点是断开的,但你的逻辑是“按下才停”,结果就是上电即启动。
第二种写法是把自锁触点放在停止按钮后面。这种写法在逻辑上等价,但在某些品牌的PLC里,如果停止按钮用的是外部常闭接法,程序里再用常闭触点,就会出现“双重取反”的问题。我刚开始学的时候就在这里栽过跟头,外部接常闭,程序里又用常闭,结果按钮按下去程序里反而导通了,电机停不下来。
第三种写法是用SET/RST指令替代自锁。这种写法在汇川和三菱里都很常见,优点是逻辑清晰,缺点是如果SET和RST的条件同时成立,输出状态取决于扫描顺序,容易出问题。我一般建议新手先用标准自锁写法,等对扫描机制有感觉了再用SET/RST。
2.3 中间继电器M点的正确用法
M点是位逻辑里的万金油,但很多人用不好。我见过一个程序,里面用了两百多个M点,每个M点只在一个地方出现一次,完全没有起到中间状态的作用。这就是典型的“为了用而用”。
M点的核心价值在于状态暂存和逻辑分层。比如你有一个复杂的条件判断,涉及五六个输入点的组合,你可以先用几个M点把中间结果算出来,最后再用这些M点去驱动输出。这样做的好处是程序可读性高,调试的时候可以逐个M点监控,快速定位问题。
但M点也不能滥用。我的经验是,如果一个M点只在一个地方出现,那它就没有存在的必要,直接用输入点或者输出点代替就行。M点应该出现在至少两个地方,或者它代表了一个需要被多次引用的中间状态。
还有一个坑是M点的断电保持。不同品牌的PLC对M点的断电保持区域划分不一样,汇川的H5U默认M0到M4999是普通区域,M5000以后是保持区域。如果你把需要断电保持的状态放在了普通区域,设备断电再上电,状态就丢了。这个细节在设备调试阶段特别容易忽略,等到现场出问题了才想起来查。
2.4 边沿检测:位逻辑里的“时间维度”
边沿检测是位逻辑里最容易被忽视的部分。上升沿和下降沿,本质上是在位逻辑里引入了时间维度。没有边沿检测,你的程序只能判断“现在是什么状态”;有了边沿检测,你才能判断“状态刚刚发生了变化”。
我举个例子。假设你要用一个按钮控制电机的启停,按一下启动,再按一下停止。如果你只用常开触点,程序会变成:按钮按下时电机启动,按钮松开时电机停止。这不是你要的效果。你需要的是检测按钮按下的那个瞬间,也就是上升沿。
三菱里的LDP指令、汇川里的上升沿触点,都是干这个的。但这里有个坑:边沿检测需要PLC保存上一个扫描周期的状态,这个状态是存在一个隐藏的位里的。如果你在程序里多次使用同一个输入点的上升沿,有些PLC会报错,因为同一个位的上升沿只能检测一次。解决办法是用一个M点把上升沿结果存下来,后面都用这个M点。
3. 从位逻辑到完整程序的实操路径
3.1 一个红绿灯案例的完整拆解
我拿十字路口红绿灯这个经典案例来演示位逻辑怎么落地。这个案例在热搜里也出现过,说明很多人都在找这方面的参考。
假设东西方向和南北方向各有一组红绿黄灯,要求东西方向绿灯30秒、黄灯3秒、红灯33秒,南北方向与之互锁。这个需求看起来简单,但如果你位逻辑没学透,写出来的程序要么灯不亮,要么两个方向同时亮绿灯。
我的写法是分三层。第一层用定时器做时间基准,T0做1秒脉冲,T1做30秒计时,T2做3秒计时。第二层用位逻辑做状态切换,用一个M点表示“东西方向通行”,另一个M点表示“南北方向通行”,两个M点互锁。第三层用M点驱动输出,东西方向通行时,绿灯亮;计时到30秒,黄灯亮;计时到33秒,切换到南北方向通行。
这里的关键是互锁。互锁的本质是位逻辑里的“非”运算。东西方向通行的条件里必须包含“南北方向不通行”,反之亦然。如果你忘了互锁,两个方向就会同时通行,这在现实里是要出事故的。
3.2 定时器与位逻辑的配合
定时器本身不是位逻辑,但定时器的输出是位逻辑。T1计时到30秒,它的常开触点闭合,这个闭合就是一个位状态的变化。你要做的是把这个位状态的变化接入你的逻辑网络。
我见过很多人写定时器程序,把定时器的输出直接接线圈,然后发现时间到了灯不亮。问题往往出在定时器的触发条件上。定时器需要持续触发才能计时,如果你用了一个瞬间信号去触发,定时器可能还没计完就断了。正确的做法是用一个持续为1的位去触发定时器,或者用自锁回路保持触发条件。
还有一个细节是定时器的复位。如果你不手动复位定时器,它计时到设定值后会一直保持输出。在红绿灯程序里,你需要在一个周期结束后复位所有定时器,重新开始计时。这个复位动作本身也是位逻辑,通常放在状态切换的那一步里。
3.3 用INPROSHOP做在线监控与调试
INPROSHOP的监控功能是我用得最多的。写位逻辑程序,光看代码是看不出问题的,必须在线监控。我一般会把程序下载到PLC或者仿真器里,然后打开监控界面,逐个触点看状态。
具体操作是:在梯形图界面右键,选择“显示触点状态”,然后你会看到导通的触点变成绿色,断开的保持原色。这时候你按一下按钮,观察哪些触点变了、哪些没变。如果某个触点该变没变,你就往前查,看它的驱动条件是什么。这样一层一层往前推,很快就能定位到问题。
我建议新手在学位逻辑的阶段,每写一个程序都做一次完整的在线监控。不要觉得简单就不做,很多坑就是在你觉得“这还用看”的时候踩进去的。
3.4 从位逻辑到功能块的过渡
当你把位逻辑练熟了,你会发现很多逻辑结构是重复的。比如启保停、互锁、延时切换,这些结构在程序里反复出现。这时候就可以考虑把它们封装成功能块。
汇川的H5U支持自定义功能块,你可以把启保停逻辑做成一个FB,输入是启动、停止、自锁条件,输出是运行状态。这样你在主程序里调用这个FB就行了,不用每次都画一遍梯形图。但我要提醒一句:功能块是位逻辑的封装,不是替代。如果你位逻辑没学透,封装出来的功能块大概率是有问题的,而且出了问题你更不好查,因为你看不到里面的触点状态了。
4. 常见问题与排查技巧实录
4.1 程序逻辑对但设备不动作
这是新手遇到最多的问题。程序在监控里看逻辑是对的,但设备就是不动作。我一般按这个顺序排查:
先查输出点。用万用表量PLC的输出端子,看有没有电压。如果没有,说明程序没驱动到输出,问题在程序里。如果有电压但设备不动,问题在外部电路,可能是继电器坏了、接线松了、或者负载电源没开。
再查输入点。如果输出没问题,那就往前查输入。按一下按钮,看PLC的输入指示灯亮不亮。不亮的话,查按钮接线和PLC输入公共端。亮的话,查程序里这个输入点对应的触点状态对不对。
最后查中间逻辑。如果输入输出都没问题,那就是中间逻辑有断点。用监控功能逐个触点看,找到那个该通不通的触点,然后查它的驱动条件。
4.2 同一个线圈多次输出的问题
有些品牌的PLC允许同一个线圈在程序里出现多次,有些会报错。即使允许,我也强烈建议不要这么做。同一个线圈多次输出,程序的可读性会变得极差,而且最后一次输出会覆盖前面的结果,调试的时候你根本不知道哪个条件在起作用。
正确的做法是:一个线圈只在一个地方输出,所有的条件都在这个输出之前用位逻辑组合好。如果你发现一个线圈需要多个条件驱动,那就用并联或者用M点做中间状态,最后统一驱动线圈。
4.3 扫描周期导致的时序问题
前面提到过,PLC是串行扫描的,这会导致一些反直觉的现象。比如你用两个定时器做顺序控制,T1计时到5秒启动T2,T2计时到3秒做某个动作。如果你把T1和T2写在同一行,T2的计时起点会比T1晚一个扫描周期。在大多数应用里这一个周期无所谓,但在高速场合就可能出问题。
解决办法是把有严格时序要求的逻辑放在不同的程序段里,或者用中断程序来处理。但中断程序本身也有坑,中断里的位逻辑不能太复杂,否则会影响主程序的扫描周期。
4.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 上电即启动 | 停止按钮用了常开触点 | 检查停止按钮的触点类型 |
| 按停止没反应 | 外部常闭+程序常闭双重取反 | 统一外部接法和程序触点类型 |
| 输出闪烁 | 自锁触点没接对 | 检查自锁触点是否并联在启动触点两端 |
| 定时器不计时 | 触发条件不持续 | 用自锁回路保持触发条件 |
| 边沿检测失效 | 同一位多次检测边沿 | 用M点暂存边沿结果 |
| 断电后状态丢失 | M点用了非保持区域 | 把需要保持的状态移到保持区域 |
4.5 几个我踩过的坑
第一个坑是外部常闭接法。我刚开始学的时候,看教程里停止按钮都是外部常开、程序常闭,我就照着做。后来去现场,发现设备上的停止按钮是外部常闭接法,我程序里还是常闭,结果按钮按下去程序里反而导通了。这个坑让我明白了一个道理:程序里的触点类型必须和外部接法匹配,不能想当然。
第二个坑是M点的重复使用。我曾经在一个程序里用M100做中间状态,后来改程序的时候忘了M100已经在别的地方用过了,结果两个逻辑互相干扰,查了半天才找到。从那以后我养成了一个习惯:每用一个M点,就在注释里写清楚它的用途,而且尽量按功能分区使用M点,比如M0-M99用于手动逻辑,M100-M199用于自动逻辑。
第三个坑是边沿检测的隐藏位。有一次我用上升沿检测一个输入点,程序里用了两次,结果第二次不生效。查了手册才知道,同一个输入点的上升沿只能检测一次,第二次要用第一次的结果。这个细节手册里写得很小,但实际用的时候很容易忽略。
5. 位逻辑的进阶训练方法
5.1 用仿真软件做无实物练习
如果你手头没有PLC,可以用仿真软件练。三菱的GX Works自带仿真功能,汇川的INPROSHOP也支持仿真。仿真软件的好处是你可以在电脑上随便折腾,不用担心烧设备。
我的练习方法是:找一个经典电路,比如电机正反转、星三角启动、交通灯,先用位逻辑写出来,然后在仿真里跑。跑的时候打开监控,观察每个触点的状态变化。如果逻辑不对,就改,改完再跑。这样反复练,你对位逻辑的直觉就会慢慢建立起来。
5.2 从继电器电路到PLC程序的转换训练
如果你有电工基础,最好的训练方法就是拿一张继电器电路图,把它转换成PLC程序。转换的时候注意几点:物理触点对应软元件,接线对应程序里的连线,继电器线圈对应输出点。转换完之后,对比一下继电器电路和PLC程序的差异,特别是时序上的差异。
这个训练的好处是,你已经有现成的逻辑可以参考,不用从零开始想逻辑。你只需要专注于“怎么用PLC的方式实现这个逻辑”。练多了,你看到任何一个继电器电路,脑子里就能自动浮现出对应的PLC程序。
5.3 用状态机思维重构位逻辑
当你位逻辑练到一定程度,可以尝试用状态机思维来重构你的程序。状态机的核心思想是:把设备的运行过程分成若干个状态,每个状态有明确的进入条件和退出条件,状态之间通过位逻辑切换。
比如一个自动包装线,可以分为待机、进料、封口、出料四个状态。每个状态用一个M点表示,状态之间的切换用位逻辑实现。这样做的好处是程序结构清晰,每个状态只关心自己的逻辑,不会互相干扰。而且调试的时候,你只需要看当前是哪个状态,就知道程序应该执行什么动作。
状态机不是位逻辑的替代,而是位逻辑的组织方式。你仍然需要用位逻辑来实现状态切换,只是你的思路从“一堆触点的组合”变成了“状态之间的流转”。这个思维转变,是我从新手到能独立做项目之间最关键的一步。
5.4 持续练习的建议
位逻辑这个东西,说难不难,说简单也不简单。我的建议是每天花半小时,写一个小程序,不用复杂,就写启保停、互锁、延时这些基础结构。写完之后在仿真里跑一遍,看看有没有问题。坚持一个月,你对位逻辑的理解就会完全不一样。
另外,多看别人的程序。网上有很多开源的PLC程序,你可以下载下来看别人是怎么写位逻辑的。看的时候不要只看逻辑对不对,还要看别人的注释怎么写、M点怎么分配、程序结构怎么组织。这些细节,才是真正体现水平的地方。
最后说一个我自己的体会:位逻辑学透了,后面学什么都会快很多。因为PLC编程的本质就是用位逻辑描述控制过程,其他指令都是在这个基础上做扩展。你把位逻辑练到条件反射的程度,看到任何一个控制需求,脑子里就能自动浮现出对应的触点组合,这时候你才算真正入了PLC编程的门。