1. 为什么“位逻辑”才是PLC编程的真正分水岭
干了十几年工控,带过的徒弟少说也有二三十个,有个现象我观察了很久:绝大多数人学不会PLC编程,卡住他们的从来不是那些花里胡哨的复杂指令,而是最基础的位逻辑没学透。你让一个新手去写PID、写运动控制、写Modbus通讯,他可能照着例程改改还能跑起来;但你让他用常开常闭、线圈、置位复位搭一个简单的启保停或者互锁回路,他反而会犯迷糊——为什么这里要用常闭?为什么双线圈会出问题?为什么扫描周期会影响我的逻辑判断?
这些问题,往深了挖,全是位逻辑的根。而市面上大部分PLC入门教程,一上来就讲指令表、讲功能块、讲各种高级应用,唯独对位逻辑这块一笔带过,好像这东西天生就会一样。结果就是,很多人学了三菱FX系列、学了汇川Easy系列、学了西门子S7-1200,指令背了一堆,真到现场写程序的时候,逻辑漏洞百出,设备动不动就撞机、误动作、停不下来。
我写这篇东西,就是想把这个被大多数人忽略的“地基”重新挖出来,掰开揉碎了讲清楚。不管你是刚入行的电气小白,还是已经能写一些简单程序但总觉得逻辑不够扎实的从业者,这篇文章都会帮你把位逻辑这根筋给捋直了。我会从底层原理讲到实操细节,从常见误区讲到排查技巧,尽量用现场案例和实际代码来说话,让你看完就能上手改自己的程序。
1.1 位逻辑到底在解决什么问题
先把这个概念说透。位逻辑,英文叫Bit Logic,本质上就是处理“是”与“否”、“通”与“断”、“1”与“0”这几种状态的组合运算。在PLC里,每一个输入点、输出点、内部继电器、定时器触点,归根结底都是一个位(Bit),它的值不是0就是1。位逻辑要做的,就是根据这些0和1的组合,决定下一个位该是0还是1。
听起来简单得不行,对吧?但问题就出在“组合”这两个字上。一个按钮按下是1,松开是0,这是最简单的。但如果你有两个按钮、三个传感器、四个限位开关,它们之间的逻辑关系就会变得复杂起来。什么时候该动,什么时候该停,什么时候该互锁,什么时候该自锁,这些判断全部依赖位逻辑来实现。
我举个最经典的例子:电机启保停控制。启动按钮I0.0,停止按钮I0.1,输出Q0.0。逻辑是:按下启动,Q0.0得电;松开启动,Q0.0保持;按下停止,Q0.0失电。这个逻辑用位逻辑写出来就是:
// 梯形图逻辑(以西门子S7-200 SMART风格为例) Network 1: I0.0 Q0.0 Q0.0 |---| |---+---|/|--------( )---| | | | Q0.0 | |---| |---+翻译成白话就是:启动按钮常开触点与停止按钮常闭触点串联,再与输出线圈的自锁触点并联。这里面的每一个触点类型选择、每一个串并联关系,都是位逻辑的核心内容。你如果不懂为什么停止按钮要用常闭而不是常开,不懂自锁触点为什么要并联在启动按钮两端,那这个程序你抄一百遍也还是不会自己设计。
1.2 为什么复杂指令救不了基础不牢的人
现在很多教程喜欢讲高级指令,什么PID自整定、什么运动控制轴配置、什么SCADA数据采集,听起来很高大上。但你去现场看看,真正让设备跑不起来、让工程师半夜被叫去救火的,往往不是这些高级功能出了问题,而是最基础的逻辑互锁没做好、信号滤波没处理、扫描周期没考虑。
我见过一个案例:某包装线用汇川AM系列PLC做控制,程序里用了大量的功能块和复杂运算,结果调试的时候发现气缸偶尔会误动作。查了两天,最后发现是一个简单的互锁逻辑写反了——该用常闭的地方用了常开,导致两个气缸在特定条件下同时得电。就这么一个位逻辑错误,让整条线停了十几个小时。
还有更隐蔽的:双线圈问题。同一个输出线圈在程序里出现了两次,PLC按照扫描顺序执行,后面的会覆盖前面的状态。新手往往看不出来,因为程序编译不报错,运行时却时好时坏。这种问题,你懂再多高级指令也没用,必须回到位逻辑的层面去排查。
所以我的观点很明确:PLC编程的地基就是位逻辑,地基不牢,上面盖什么楼都会塌。你先把常开常闭、置位复位、上升沿下降沿、自锁互锁这些玩明白了,再去学复杂指令,那叫如虎添翼;反过来,基础没打牢就急着上高级功能,那叫空中楼阁。
2. 位逻辑的核心元件与底层运行机制
要真正学透位逻辑,光知道梯形图怎么画还不够,你得知道PLC内部是怎么处理这些位的。这一块很多人忽略,但恰恰是理解位逻辑的关键。
2.1 输入映像区、输出映像区与扫描周期
PLC的工作方式是循环扫描,一个扫描周期分三个阶段:输入采样、程序执行、输出刷新。在输入采样阶段,PLC把所有物理输入点的状态读入输入映像区(Input Image Register);在程序执行阶段,CPU按照程序顺序逐条执行逻辑运算,运算结果写入输出映像区(Output Image Register);在输出刷新阶段,再把输出映像区的状态统一送到物理输出点。
这个机制意味着什么?意味着在同一个扫描周期内,即使物理输入发生了变化,输入映像区的值也不会变。你的程序看到的永远是采样那一刻的状态。很多新手写的程序逻辑上没问题,但运行时表现异常,就是因为没考虑扫描周期的影响。
举个例子:你用两个按钮控制一台电机,要求同时按下才启动。如果你在程序里写“I0.0接通且I0.1接通,则Q0.0输出”,看起来没问题。但如果两个按钮按下的时间差小于一个扫描周期,PLC可能只采到一个按钮的信号,逻辑就不成立。这时候就需要用上升沿检测或者状态机来处理,而不是简单的与逻辑。
2.2 常开常闭的本质:不是物理状态,是逻辑判断
这是我要重点强调的一点:梯形图里的常开触点和常闭触点,跟物理按钮的常开常闭完全是两码事。梯形图里的常开触点,意思是“如果这个位是1,则逻辑导通”;常闭触点,意思是“如果这个位是0,则逻辑导通”。它是对位状态的判断,不是对物理触点的描述。
很多新手在这里栽跟头。比如一个停止按钮,物理上是常闭的(不按时导通,按下时断开)。接到PLC输入点I0.1上,不按的时候I0.1=1,按下的时候I0.1=0。你在程序里想用这个按钮来停止设备,应该用什么触点?答案是常闭触点。因为当I0.1=0(按钮按下)时,常闭触点导通,停止逻辑生效。
但如果你把物理常闭按钮接到了PLC输入端,然后在程序里又用了常闭触点,那就变成了“不按的时候逻辑导通,按下的时候逻辑断开”,跟你的意图正好相反。这种错误在现场太常见了,尤其是新手接线的时候没注意,程序里又没对应调整。
提示:接线之前先确定按钮的物理触点类型,然后在程序里选择对应的逻辑触点。物理常开接常开逻辑,物理常闭接常闭逻辑,这是最不容易出错的做法。
2.3 置位复位与自锁互锁的区别
置位(Set)和复位(Reset)是一对指令,置位让位变成1并保持,复位让位变成0并保持。它们和自锁电路的区别在于:自锁是靠触点并联实现的,置位复位是靠指令实现的。两者都能实现保持功能,但适用场景不同。
自锁电路适合简单的启保停控制,逻辑直观,容易排查。置位复位适合需要多个条件触发、多个条件复位的复杂场景,比如一个报警位可能由多个故障源置位,由复位按钮统一复位。在实际项目中,我通常建议新手先用自锁电路练手,等逻辑熟练了再用置位复位。
互锁则是防止两个或多个输出同时动作的保护逻辑。最常见的就是电机正反转控制:正转接触器和反转接触器绝对不能同时吸合,否则就是相间短路。互锁的实现方式很简单,就是在正转的输出逻辑里串入反转输出的常闭触点,在反转的输出逻辑里串入正转输出的常闭触点。
// 正反转互锁逻辑 Network 1: 正转 I0.0 I0.1 Q0.1 Q0.0 |---| |---+---|/|----|/|--------( )---| | | | Q0.0 | |---| |---+ Network 2: 反转 I0.1 I0.0 Q0.0 Q0.1 |---| |---+---|/|----|/|--------( )---| | | | Q0.1 | |---| |---+注意这里用了双重互锁:I0.1和I0.0是按钮互锁,Q0.1和Q0.0是输出互锁。按钮互锁防止同时按下两个按钮,输出互锁防止接触器故障粘连时同时吸合。这种双重保护在现场是标配,少一个都可能出大事。
3. 从零搭建一个可复用的位逻辑框架
光讲原理不够,我把自己这些年带徒弟用的训练方法整理出来,你照着练,位逻辑这块基本就能过关了。
3.1 第一步:把物理接线和逻辑触点对应清楚
这是最基础也是最容易出错的一步。我要求每个新手在写程序之前,先画一张输入输出分配表,把每个物理设备、PLC地址、物理触点类型、程序逻辑触点类型全部列清楚。
| 设备名称 | PLC地址 | 物理触点类型 | 程序逻辑触点 | 功能说明 |
|---|---|---|---|---|
| 启动按钮 | I0.0 | 常开 | 常开 | 按下启动 |
| 停止按钮 | I0.1 | 常闭 | 常闭 | 按下停止 |
| 急停按钮 | I0.2 | 常闭 | 常闭 | 按下急停 |
| 限位开关1 | I0.3 | 常开 | 常开 | 到位检测 |
| 电机接触器 | Q0.0 | - | 线圈 | 控制电机 |
这张表看起来简单,但能帮你避免80%的低级错误。我见过太多人程序写完了才发现停止按钮的逻辑写反了,回头改程序改得一头汗。提前把这张表填好,后面写程序就是照表填空。
3.2 第二步:用状态机思维替代流水账逻辑
新手写程序最容易犯的毛病是流水账:第一步做什么,第二步做什么,第三步做什么,全部用定时器和计数器串起来。这种写法在简单设备上还能凑合,一旦设备动作复杂一点,程序就会变成一团乱麻,改一个地方牵动全身。
正确的做法是用状态机。把设备的运行过程拆分成若干个状态,每个状态有明确的进入条件、执行动作和退出条件。状态之间的切换用位逻辑来实现。
比如一个简单的气缸推料动作,可以拆成四个状态:等待、推出、保持、缩回。用位逻辑写出来就是:
// 状态机示例 // M0.0=等待,M0.1=推出,M0.2=保持,M0.3=缩回 Network 1: 等待状态进入 I0.0 M0.1 M0.2 M0.3 M0.0 |---| |---+---|/|----|/|----|/|--------( )---| Network 2: 推出状态进入 M0.0 I0.3 M0.1 |---| |---+---| |--------------------( )---| Network 3: 保持状态进入 M0.1 T37 M0.2 |---| |---+---| |--------------------( )---| Network 4: 缩回状态进入 M0.2 I0.4 M0.3 |---| |---+---| |--------------------( )---| Network 5: 回到等待 M0.3 I0.5 M0.0 |---| |---+---| |--------------------( )---|这种写法逻辑清晰,每个状态独立,调试的时候一眼就能看出卡在哪个状态。而且扩展方便,要加一个状态就在中间插一段逻辑,不会影响其他部分。
3.3 第三步:用仿真软件验证逻辑再下载
我强烈建议新手养成先仿真后下载的习惯。不管是西门子的PLCSIM、三菱的GX Simulator,还是汇川AutoShop自带的仿真功能,都能帮你在电脑上验证逻辑,避免反复下载折腾设备。
仿真的时候重点看几个东西:状态切换是否正常、互锁是否生效、急停是否可靠、边界条件是否处理。比如你把启动按钮和停止按钮同时按下,程序应该怎么响应?限位开关在动作过程中突然断开,设备应该立即停止还是继续运行?这些边界条件在仿真的时候就要测到,不要等到现场调试才发现问题。
注意:仿真能验证逻辑,但不能完全替代现场调试。实际接线中的信号抖动、干扰、接触器动作时间等因素,仿真里是模拟不出来的。仿真通过只是第一步,现场调试还是要留足时间。
4. 现场调试中那些教科书不写的位逻辑坑
这一块是我最想分享的,因为全是真金白银换来的教训。
4.1 信号抖动与防抖逻辑
机械按钮和限位开关在动作瞬间会产生抖动,触点会在几毫秒内反复通断。如果PLC的扫描周期比较快,可能会采到多个上升沿,导致计数器多计或者状态机误切换。
解决办法有两种:硬件防抖和软件防抖。硬件防抖是在输入端加RC滤波电路,软件防抖是用定时器延时确认。我一般用软件防抖,因为灵活、成本低。
// 软件防抖示例:输入信号持续50ms才确认有效 Network 1: 防抖定时器 I0.0 T37 T37 |---| |---+---|/|--------------------(TON)---| PT:=50ms Network 2: 确认信号 T37 M0.0 |---| |------------------------------( )---|这段逻辑的意思是:I0.0接通后,定时器T37开始计时,50ms后如果I0.0仍然接通,T37输出,M0.0置位。如果I0.0在50ms内断开,定时器复位,M0.0不会动作。这样就能过滤掉大部分抖动信号。
4.2 扫描周期导致的逻辑竞争
前面提过扫描周期的影响,这里展开说一个实际案例。某设备用汇川Easy系列PLC控制,程序里有两个气缸,要求A气缸伸出到位后B气缸才能伸出。逻辑写的是“A到位信号接通,则B气缸输出”。调试的时候发现,偶尔B气缸会在A气缸还没完全到位的时候就动作。
查了半天,最后发现是A到位信号和B气缸输出在同一个扫描周期内处理,A到位信号刚变成1,程序立刻执行B气缸输出,但此时A气缸的机械动作还没完全稳定。解决办法是在A到位信号和B气缸输出之间加一个定时器延时,或者用上升沿触发。
// 加延时确认 Network 1: A到位后延时100ms I0.3 T38 |---| |------------------------------(TON)---| PT:=100ms Network 2: B气缸输出 T38 Q0.1 |---| |------------------------------( )---|这个100ms的延时,就是给机械动作留出稳定时间。具体延时多少,要根据气缸的实际动作时间来定,一般留20%到30%的余量。
4.3 双线圈与逻辑覆盖问题
双线圈是指同一个输出线圈在程序中出现多次。PLC按扫描顺序执行,后面的线圈状态会覆盖前面的。如果两个线圈的驱动条件不同,就会出现“前面接通了,后面又断开了”的情况。
我见过一个程序,Q0.0在三个地方被驱动:手动模式、自动模式、报警复位。写程序的人以为三个地方互不干扰,实际上只要有一个地方不满足条件,Q0.0就会被断开。正确的做法是一个输出只在一个地方驱动,把所有驱动条件用或逻辑合并到一起。
// 错误写法:双线圈 Network 1: 手动驱动 I0.0 Q0.0 |---| |------------------------------( )---| Network 2: 自动驱动 M0.0 Q0.0 |---| |------------------------------( )---| // 正确写法:合并驱动条件 Network 1: 合并驱动 I0.0 Q0.0 |---| |---+--------------------------( )---| | | | M0.0 | |---| |---+4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 输出时有时无 | 双线圈覆盖 | 搜索输出地址出现次数 | 合并驱动条件 |
| 按钮按下无反应 | 物理触点与逻辑触点不匹配 | 检查输入指示灯和程序监控 | 调整逻辑触点类型 |
| 设备误动作 | 互锁逻辑缺失 | 检查相关输出的互锁条件 | 增加互锁触点 |
| 计数器多计 | 信号抖动 | 监控输入信号波形 | 增加防抖逻辑 |
| 状态机卡死 | 状态切换条件不完整 | 逐个状态监控 | 补充边界条件处理 |
| 急停后无法复位 | 急停逻辑自锁 | 检查急停回路 | 增加复位逻辑 |
5. 从位逻辑到复杂程序的进阶路径
位逻辑学透之后,你会发现后面学什么都会快很多。因为PLC编程的本质,就是用位逻辑去组织数据流和控制流。
5.1 定时器和计数器的位逻辑本质
定时器和计数器看起来是功能指令,但它们的输出本质上还是一个位。定时器到达设定时间,输出位变成1;计数器到达设定值,输出位变成1。你在程序里用定时器的常开触点,跟用普通输入点的常开触点,逻辑上没有任何区别。
理解了这一点,你就能把定时器和计数器当成普通的位来用,组合出各种复杂的时序逻辑。比如用两个定时器交替计时实现闪烁,用计数器配合比较指令实现位置控制,这些都是位逻辑的延伸应用。
5.2 数据处理指令中的位操作
再往上走,你会接触到数据处理指令,比如MOV、ADD、CMP。这些指令处理的是字(Word)或双字(Double Word),但它们的执行条件仍然是位逻辑。什么时候执行MOV,什么时候执行ADD,取决于前面的位逻辑判断。
而且数据处理指令的结果,最终还是要通过位逻辑来输出。比如你算出一个位置值,跟当前位置比较,大于就正转,小于就反转,等于就停止。这个比较和判断的过程,就是位逻辑。
5.3 通讯与SCADA中的位映射
到了SCADA和PLC通讯这一层,位逻辑依然无处不在。SCADA读取PLC的数据,本质上就是读取一个个位的状态。你在SCADA画面上做一个按钮,按下的时候写一个位到PLC,PLC根据这个位执行相应的逻辑。PLC的状态反馈到SCADA,也是一个位一个位地传。
所以你看,从最简单的启保停,到最复杂的SCADA系统,位逻辑贯穿始终。你把位逻辑玩明白了,整个PLC编程的体系就通了。
6. 给不同阶段学习者的实操建议
最后这部分,我按不同基础的人分别给一些建议,你对照自己的情况看。
6.1 零基础新手:先动手,再理论
如果你完全没接触过PLC,我的建议是先找一个仿真软件,把最基本的启保停电路搭出来,跑通,然后再去理解为什么这么搭。不要一上来就啃理论书,那些扫描周期、映像区的概念,你在没写过程序之前是理解不透的。
具体路径:下载一个汇川AutoShop或者西门子TIA Portal的试用版,跟着教程写一个电机启保停程序,用仿真跑起来,观察每个触点的状态变化。然后试着改逻辑,比如把停止按钮从常闭改成常开,看看会发生什么。这种“试错式”学习,比看十遍书都管用。
6.2 有基础但逻辑不扎实:回头补课
如果你已经能写一些程序,但总觉得逻辑不够严谨,经常出bug,那说明你的位逻辑还有漏洞。建议你找几个经典的逻辑电路——启保停、正反转、星三角启动、红绿灯控制——用不同的方式实现,然后对比哪种写法更清晰、更可靠。
比如红绿灯控制,你可以用定时器串起来写,也可以用状态机写,还可以用移位寄存器写。每种写法都试一遍,你就能体会到位逻辑的灵活性和威力。
6.3 进阶提升:读别人的程序
当你自己的逻辑没问题了,下一步就是读别人写的程序。找一些开源项目或者同事的成熟程序,一行一行地看,理解人家的逻辑是怎么组织的。遇到看不懂的地方,就自己画时序图,把每个位的状态变化画出来。
我个人的经验是,读一份写得好的程序,比自己写十份程序收获还大。因为你能看到别人是怎么处理边界条件、怎么做互锁、怎么组织状态的。这些经验,光靠自己摸索,可能要踩很多坑才能总结出来。
6.4 现场调试的几条铁律
最后分享几条我在现场调试中总结的铁律,都是血泪教训:
- 先查接线,再查程序。80%的现场问题都是接线问题,不要一上来就怀疑程序。
- 先手动,再自动。手动模式下逐个测试每个输出,确认接线和逻辑都正确,再切自动。
- 先单步,再连续。单步运行确认每个动作都正确,再连续运行。
- 急停回路必须独立。急停信号不要经过PLC逻辑,直接切断输出电源,这是安全底线。
- 改程序之前先备份。现场改程序是常事,但改之前一定要备份,否则改乱了想回退都回不去。
这些经验,教科书上不会写,但每一条都能帮你省下几个小时的排查时间。位逻辑是PLC编程的根,根扎得深,后面的路才能走得稳。我在实际带徒弟的过程中发现,那些位逻辑扎实的人,学什么新指令、新平台都快得惊人;而那些基础不牢的人,换个PLC品牌就得重新学一遍。所以别急着往上爬,先把脚下的地基打牢。