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.11按下的时候I0.10。你在程序里想用这个按钮来停止设备应该用什么触点答案是常闭触点。因为当I0.10按钮按下时常闭触点导通停止逻辑生效。但如果你把物理常闭按钮接到了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常闭常闭按下急停限位开关1I0.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画面上做一个按钮按下的时候写一个位到PLCPLC根据这个位执行相应的逻辑。PLC的状态反馈到SCADA也是一个位一个位地传。所以你看从最简单的启保停到最复杂的SCADA系统位逻辑贯穿始终。你把位逻辑玩明白了整个PLC编程的体系就通了。6. 给不同阶段学习者的实操建议最后这部分我按不同基础的人分别给一些建议你对照自己的情况看。6.1 零基础新手先动手再理论如果你完全没接触过PLC我的建议是先找一个仿真软件把最基本的启保停电路搭出来跑通然后再去理解为什么这么搭。不要一上来就啃理论书那些扫描周期、映像区的概念你在没写过程序之前是理解不透的。具体路径下载一个汇川AutoShop或者西门子TIA Portal的试用版跟着教程写一个电机启保停程序用仿真跑起来观察每个触点的状态变化。然后试着改逻辑比如把停止按钮从常闭改成常开看看会发生什么。这种“试错式”学习比看十遍书都管用。6.2 有基础但逻辑不扎实回头补课如果你已经能写一些程序但总觉得逻辑不够严谨经常出bug那说明你的位逻辑还有漏洞。建议你找几个经典的逻辑电路——启保停、正反转、星三角启动、红绿灯控制——用不同的方式实现然后对比哪种写法更清晰、更可靠。比如红绿灯控制你可以用定时器串起来写也可以用状态机写还可以用移位寄存器写。每种写法都试一遍你就能体会到位逻辑的灵活性和威力。6.3 进阶提升读别人的程序当你自己的逻辑没问题了下一步就是读别人写的程序。找一些开源项目或者同事的成熟程序一行一行地看理解人家的逻辑是怎么组织的。遇到看不懂的地方就自己画时序图把每个位的状态变化画出来。我个人的经验是读一份写得好的程序比自己写十份程序收获还大。因为你能看到别人是怎么处理边界条件、怎么做互锁、怎么组织状态的。这些经验光靠自己摸索可能要踩很多坑才能总结出来。6.4 现场调试的几条铁律最后分享几条我在现场调试中总结的铁律都是血泪教训先查接线再查程序。80%的现场问题都是接线问题不要一上来就怀疑程序。先手动再自动。手动模式下逐个测试每个输出确认接线和逻辑都正确再切自动。先单步再连续。单步运行确认每个动作都正确再连续运行。急停回路必须独立。急停信号不要经过PLC逻辑直接切断输出电源这是安全底线。改程序之前先备份。现场改程序是常事但改之前一定要备份否则改乱了想回退都回不去。这些经验教科书上不会写但每一条都能帮你省下几个小时的排查时间。位逻辑是PLC编程的根根扎得深后面的路才能走得稳。我在实际带徒弟的过程中发现那些位逻辑扎实的人学什么新指令、新平台都快得惊人而那些基础不牢的人换个PLC品牌就得重新学一遍。所以别急着往上爬先把脚下的地基打牢。