资讯动态

PLC编程入门:位逻辑是地基,搞懂条件表才能写出稳定程序

发布时间:2026/10/26 9:39:30 来源:尧图企业网站定制
1. 为什么“看不懂复杂指令”是个伪命题我带过不少刚入行的徒弟也帮朋友救过不少现场。每次有人跟我抱怨“PLC编程太难了那些复杂指令根本看不懂”的时候我都会先让他做一件事把手里那台PLC的程序全部清空然后只写一个最简单的起保停电路。结果十有八九他写出来的东西跑不起来。问题出在哪不是他不懂什么SCL、什么运动控制指令、什么PID自整定而是他连一个按钮按下之后输出为什么能保持住都说不清楚。这就像一个人连加减乘除都没搞明白却天天抱怨微积分太难——方向完全错了。我见过太多人抱着“速成”的心态去学PLC上来就找各种案例十字路口红绿灯、四层电梯、自动化包装线。这些案例本身没问题但如果你连最基础的位逻辑都没吃透看这些案例就只是在“抄程序”而不是在“学编程”。抄完之后换个控制要求你又不会了。所以这篇文章我不打算讲什么高级指令也不打算给你一个完整的项目案例。我想把“位逻辑”这件事彻底掰开揉碎讲清楚它为什么是PLC编程的地基以及绝大多数人到底在哪个环节卡住了。如果你正在学PLC或者带了新人却发现他怎么都教不会这篇文章应该能帮你找到症结。2. 位逻辑的本质不是指令是“条件与结果”的映射关系2.1 从继电器回路到PLC程序的思维转换很多人学PLC的时候脑子里还停留在传统继电器控制的思维模式。这本身不是坏事但问题在于他没有完成从“物理接线”到“逻辑映射”的思维转换。在继电器时代你要实现一个电机的启动和停止需要物理上把启动按钮的常开触点、停止按钮的常闭触点、接触器的辅助常开触点、接触器线圈串联起来。电流从火线出发经过这些物理触点最后到达线圈电机才能转起来。这个回路是看得见摸得着的你拿万用表一量就知道通不通。到了PLC时代这些物理触点变成了输入端子上的电平信号接触器线圈变成了输出端子上的电平输出。但很多人写程序的时候脑子里想的还是“电流怎么流”而不是“逻辑怎么走”。这就导致一个很典型的问题他分不清输入信号的有效状态到底是什么。举个例子。一个急停按钮物理上接的是常闭触点。也就是说正常状态下这个输入点是通的PLC读到的信号是1。当急停被按下时触点断开PLC读到的信号变成0。如果你在程序里写“急停按钮按下时停止设备”你用的是常开触点还是常闭触点很多人在这里就懵了。注意PLC编程里最基础也最容易出错的一件事就是搞清楚每一个输入信号在“正常状态”和“触发状态”下PLC读到的到底是0还是1。这件事搞不清楚后面写什么都是白搭。2.2 常开常闭不是“指令”是“条件判断”我见过很多教程把常开触点、常闭触点、线圈这些东西叫做“基本指令”。这个叫法本身没错但它容易让人产生一个误解以为这些是像“加法”“减法”一样的操作命令。其实不是。常开触点和常闭触点在程序里的本质是“条件判断”。常开触点问的是“这个位现在是1吗”如果是1条件成立后面的逻辑继续走如果是0条件不成立后面的逻辑断开。常闭触点问的是“这个位现在是0吗”如果是0条件成立如果是1条件不成立。你看这跟“指令”完全是两回事。它更像是一个“门卫”在问每一个信号“你现在是什么状态我该不该放行”理解了这一点你就能明白为什么同一个按钮你可以用常开触点写也可以用常闭触点写关键看你的控制逻辑需要什么条件。而不是死记硬背“启动用常开停止用常闭”。2.3 为什么“起保停”是位逻辑的试金石起保停电路也就是我们常说的“自锁电路”是位逻辑最经典的应用。它的逻辑非常简单按下启动按钮输出得电松开启动按钮输出通过自身的常开触点继续保持得电按下停止按钮输出失电。就这么简单的逻辑我见过至少三种典型的错误写法。第一种启动按钮用了常闭触点。结果就是一上电输出就通了因为启动按钮在正常状态下就是闭合的。这种错误通常是因为他没有搞清楚按钮的物理触点类型和程序里触点类型的关系。第二种自锁触点用了常闭。结果就是输出一通自锁触点就断开输出立刻又断了。程序在那里疯狂闪烁像得了癫痫一样。第三种停止按钮用了常开。结果就是停止按钮按下去输出确实断了但一松手输出又通了。因为停止按钮松开后常开触点恢复断开状态条件不成立了但启动按钮那边的逻辑还在输出又被拉起来了。这三种错误本质上都是对“条件判断”的理解不到位。他没有想清楚在每一个时刻哪些条件是成立的哪些是不成立的输出应该在什么条件下得电在什么条件下失电。提示如果你写起保停电路的时候需要反复试错才能写对那就说明你的位逻辑还没有过关。正确的做法是在写程序之前先把逻辑关系用自然语言描述清楚然后再翻译成梯形图。3. 大多数人卡住的三个具体环节3.1 第一个卡点分不清“输入状态”和“逻辑条件”这是最普遍的问题。很多人写程序的时候脑子里想的是“按钮按下”但手上写的是“常开触点”。他没有意识到“按钮按下”这个动作在PLC看来可能是输入点从1变成0也可能是从0变成1取决于按钮接的是常开还是常闭。我举个例子。假设有一个光电开关用来检测物体是否到位。这个光电开关是NPN型的物体到位时输出低电平也就是0。那么在程序里“物体到位”这个条件应该用常闭触点来判断因为常闭触点在输入为0时导通。但很多人会下意识地用常开触点因为他脑子里想的是“物体到位了条件成立”。他没有意识到PLC读到的信号是0不是1。常开触点在输入为0的时候是不导通的所以条件不成立。这种错误在现场调试的时候特别致命。因为你在办公室里用仿真软件测试的时候可能手动强制输入点为1程序跑起来没问题。但到了现场实际传感器信号是0程序就不动了。然后你就开始怀疑人生怀疑PLC坏了怀疑传感器坏了怀疑线接错了唯独不怀疑自己的逻辑写错了。3.2 第二个卡点把“逻辑运算”当成“顺序执行”PLC的程序执行是周期扫描的从上到下从左到右一遍一遍地循环。但很多人写程序的时候脑子里想的是“第一步做什么第二步做什么”把PLC当成了单片机或者电脑程序来写。这种思维差异在位逻辑上体现得特别明显。比如你想实现一个功能按下按钮A输出Y1接通再按下按钮B输出Y1断开同时输出Y2接通。如果你用顺序执行的思维来写可能会写成先判断A是否按下如果按下就接通Y1然后再判断B是否按下如果按下就断开Y1、接通Y2。但问题是PLC的扫描周期非常快可能只有几毫秒。你在第一个扫描周期里接通了Y1第二个扫描周期里如果B还没有按下Y1就继续保持接通。这看起来没问题。但如果A和B同时按下呢或者B按下的时间比一个扫描周期还短呢你的程序就可能出现不可预期的行为。正确的做法是把每一个输出的控制逻辑都写成独立的“条件组合”而不是依赖于程序的执行顺序。Y1接通的条件是“A按下且B未按下”Y2接通的条件是“B按下”。这样写出来的程序不管扫描周期怎么跑逻辑都是确定的。3.3 第三个卡点忽略“扫描周期”对位逻辑的影响扫描周期这个概念很多初学者都知道但真正理解它对位逻辑影响的人不多。我举个典型的例子。假设你想实现一个功能按一下按钮输出接通再按一下按钮输出断开。也就是一个“翻转”功能。很多人会用上升沿指令来实现这没问题。但如果你不用上升沿而是直接用按钮的常开触点去驱动一个“异或”逻辑或者用计数器来实现就可能出问题。因为按钮按下的时间通常远大于一个扫描周期。如果你直接用常开触点去触发翻转那么在按钮按下的这段时间里程序会扫描很多遍每一遍都会翻转一次。结果就是输出在那里疯狂闪烁你根本控制不住。这就是扫描周期对位逻辑的影响。你必须清楚地知道你的逻辑是在“每一个扫描周期”都执行一次还是在“信号变化的那一个扫描周期”执行一次。前者需要你用状态保持或者边沿检测来处理后者才是你真正想要的“按一下翻转一次”。注意如果你写的程序在现场运行时出现“输出闪烁”“动作不可控”“偶尔失灵”这些问题十有八九是扫描周期相关的逻辑没处理好。先检查你的边沿检测指令用对了没有再检查你的逻辑是不是在每个扫描周期都重复执行了。4. 用“条件表”的方法把位逻辑彻底理清楚4.1 什么是“条件表”说了这么多问题那到底怎么才能把位逻辑学透我自己的经验是不要急着写程序先学会画“条件表”。所谓条件表就是把每一个输出对应的所有输入条件用表格的形式列出来。表格的每一行代表一种可能的输入组合表格的最后一列代表在这种组合下输出应该是什么状态。举个例子。一个电机有两个按钮启动按钮SB1停止按钮SB2。还有一个热继电器FR用于过载保护。那么条件表可以这样画SB1启动SB2停止FR热继电机输出00000010010001101001101011001110这里假设SB1和SB2都是常开按钮按下时为1FR是常闭触点正常时为1过载时为0。你看把这张表画出来之后逻辑关系就一目了然了。电机输出的条件是SB1为1SB2为0FR为1。翻译成梯形图就是SB1常开触点SB2常闭触点FR常开触点三个串联然后驱动电机线圈。4.2 条件表怎么处理“自锁”和“互锁”有人可能会问那自锁怎么体现条件表里没有自锁啊。问得好。自锁的本质是把输出自身的状态作为输入条件之一反馈到逻辑中。所以如果你要体现自锁条件表里需要增加一列“电机输出上一周期”。SB1SB2FR电机输出上一周期电机输出当前周期0010000111101011011101100011101110011110这张表就把自锁的逻辑完全描述清楚了。当SB1按下为1SB2未按下为0FR正常为1时不管上一周期输出是什么当前周期输出都是1。当SB1未按下为0但上一周期输出为1且SB2未按下、FR正常时当前周期输出保持为1。这就是自锁。互锁也是同样的道理。两台电机不能同时运行那就是在条件表里把另一台电机的输出作为自己的禁止条件。4.3 从条件表到梯形图的翻译规则条件表画好了翻译成梯形图就非常简单了。规则只有一条所有使输出为1的条件用常开触点表示所有使输出为0的条件用常闭触点表示。然后把这些触点按照“与”逻辑串联“或”逻辑并联。以上面的电机控制为例。使输出为1的条件是SB1为1SB2为0FR为1或者输出自身为1且SB2为0且FR为1。翻译成梯形图就是SB1常开和输出自锁常开并联然后串联SB2常闭和FR常开最后驱动输出线圈。你看根本不需要死记硬背什么“启动用常开停止用常闭”。你只需要老老实实地把条件表画出来然后按照规则翻译就行了。这个方法看起来笨但它能保证你的逻辑百分之百正确而且不管多复杂的逻辑都能用这个方法理清楚。提示我在带新人的时候要求他们前三个月写任何程序都必须先画条件表。刚开始他们觉得麻烦但一个月之后他们自己就发现画条件表花的那点时间比在现场调试时抓耳挠腮要划算得多。5. 几个真实场景下的位逻辑拆解5.1 场景一一个按钮控制两台电机的交替运行这个需求很常见按一下按钮电机A运行再按一下电机A停止电机B运行再按一下电机B停止电机A运行。如此交替。很多人看到这个需求第一反应是用计数器或者移位指令。这当然可以但如果你位逻辑足够扎实用最基础的触点也能实现。我们先画条件表。假设按钮是SB电机A输出为YA电机B输出为YB。按钮按一下状态翻转一次。我们可以用一个中间位M0来记录当前是A运行还是B运行。M0为0时A运行M0为1时B运行。那么M0的翻转条件是什么是SB的上升沿。也就是说每次SB从0变成1的时候M0翻转一次。这个用上升沿指令就能实现。然后YA接通的条件是M0为0且系统处于运行状态。YB接通的条件是M0为1且系统处于运行状态。系统运行状态可以用另一个中间位M1来表示按一下按钮M1置位再按一下M1复位不对这样逻辑就复杂了。其实更简单的做法是YA接通的条件是“M0为0且SB上升沿之后M0已经翻转”。但这样又涉及到时序问题。我换一种思路。我们用两个中间位M_A和M_B。初始状态M_A为1M_B为0。每次SB上升沿M_A和M_B的状态互换。YA直接由M_A驱动YB直接由M_B驱动。那么M_A和M_B的互换逻辑怎么写M_A的当前状态 M_A的上一周期状态 且 非SB上升沿或M_B的上一周期状态 且 SB上升沿。M_B同理。这个逻辑用梯形图写出来就是几个触点的组合。看起来有点绕但如果你条件表画清楚了翻译过来就是对的。5.2 场景二多台设备顺序启动、逆序停止这个需求在流水线上很常见。比如三条传送带启动的时候要求1号先启动2号后启动3号最后启动停止的时候要求3号先停2号后停1号最后停。这个逻辑用位逻辑来实现核心是“顺序”和“条件”的组合。1号启动的条件是“启动按钮按下”。2号启动的条件是“启动按钮按下且1号已经运行”。3号启动的条件是“启动按钮按下且2号已经运行”。停止的时候反过来。3号停止的条件是“停止按钮按下”。2号停止的条件是“停止按钮按下且3号已经停止”。1号停止的条件是“停止按钮按下且2号已经停止”。你看这个逻辑用条件表一画清清楚楚。每一台设备的启动和停止条件都是“按钮状态”和“其他设备状态”的组合。根本不需要什么复杂的指令。5.3 场景三故障信号的锁存与复位现场设备出故障的时候我们通常希望故障信号能够锁存住即使故障消失了也要等操作人员确认之后才能复位。这个逻辑用位逻辑来实现就是一个典型的“置位优先”或“复位优先”的锁存电路。假设故障信号是Fault来自一个传感器的输入。故障锁存位是M_Fault。操作人员确认按钮是Ack。M_Fault置位的条件是Fault为1。M_Fault复位的条件是Ack为1。如果Fault和Ack同时为1谁优先这取决于你的安全策略。通常我们要求故障优先也就是说只要Fault还在Ack按了也没用。那么条件表就是M_Fault为1的条件是“Fault为1”或者“M_Fault上一周期为1且Ack为0”。翻译成梯形图就是Fault常开和M_Fault自锁常开并联然后串联Ack常闭驱动M_Fault线圈。这个逻辑看起来简单但我在现场见过有人写成Fault常开直接驱动M_Fault线圈然后Ack常开直接驱动M_Fault复位。结果就是如果Fault是一个脉冲信号故障闪一下就消失了M_Fault根本锁不住。因为Fault为1的那个扫描周期M_Fault被置位了下一个扫描周期Fault变成0了M_Fault的置位条件不成立了如果没有自锁M_Fault就跟着变成0了。所以锁存逻辑的核心就是要把输出自身的状态作为输入条件之一反馈回来。这就是自锁的本质。6. 进阶位逻辑在复杂程序中的“隐形”作用6.1 为什么说高级指令也离不开位逻辑有人可能会说我现在都用SCL或者ST语言写程序了谁还写梯形图啊位逻辑过时了吧我告诉你一点都不过时。你用SCL写一个IF...THEN...ELSE本质上还是在做条件判断还是位逻辑。你用运动控制指令让伺服电机走一个定位背后还是各种使能位、完成位、错误位的逻辑组合。你用PID指令做闭环控制PID的输出使能、手动切换、报警处理哪一个离得开位逻辑我甚至可以说一个人位逻辑的功底直接决定了他写出来的程序是“能跑就行”还是“稳定可靠”。因为高级指令的调用谁都会查手册就行了。但什么时候该调用、调用之前需要满足什么条件、调用之后怎么处理结果、异常情况怎么恢复这些全都是位逻辑的活儿。6.2 用位逻辑思维排查现场故障我再分享一个实战经验。现场设备出故障的时候如果你位逻辑清晰排查起来会非常快。比如一台设备突然不动了。你首先看PLC的输出点有没有亮。如果输出点亮了但设备不动那是电气回路的问题跟程序没关系。如果输出点没亮那就是程序逻辑的问题。然后你打开程序找到驱动这个输出点的逻辑看看它前面串联了哪些条件。一个一个条件去查是哪个条件不成立是输入信号没进来还是中间位状态不对还是被其他逻辑互锁了这个过程本质上就是在“反推条件表”。你心里有一个预期的条件表然后拿实际的状态去比对很快就能定位到问题。我见过很多新手遇到设备不动第一反应是“程序是不是丢了”“PLC是不是坏了”。然后开始重启PLC、重新下载程序、换模块折腾半天最后发现是一个光电开关被灰尘挡住了。如果他位逻辑清晰打开程序看一眼两分钟就能找到问题。6.3 位逻辑与SCADA、触摸屏的联动现在很多项目都要求PLC和SCADA或者触摸屏联动。触摸屏上要显示设备状态、要能手动控制、要能报警提示。这些功能底层还是靠PLC里的位逻辑来支撑的。比如触摸屏上有一个“启动”按钮你按下去之后PLC里对应的位被置1。这个位怎么用还是位逻辑。触摸屏上要显示“设备运行中”这个状态位怎么来的还是位逻辑。我见过有人做触摸屏项目PLC程序里一堆乱七八糟的中间位自己都说不清楚哪个位是干什么的。结果触摸屏上显示的状态跟实际设备状态对不上操作人员按了按钮设备没反应。这就是位逻辑没理清楚的后遗症。正确的做法是在写PLC程序的时候就把每一个需要跟触摸屏交互的位都规划好。哪些是触摸屏给PLC的命令位哪些是PLC给触摸屏的状态位哪些是报警位。每一个位的含义、触发条件、复位条件都清清楚楚。这样触摸屏那边做起来也简单直接对应就行了。7. 给正在卡壳的同行几句实在话我带了这么多年新人发现一个规律那些学得快的不是脑子有多聪明而是愿意在基础上花时间。他们能把一个起保停电路翻来覆去写十遍每一遍都问自己“为什么这么写”“换个条件还行不行”。而那些学得慢的往往是急着做项目、急着出效果基础还没打牢就往上冲结果冲到一半发现脚下是空的。如果你现在正卡在位逻辑这一关我的建议是停下来别急着往前赶。找一张纸把你能想到的所有简单逻辑都画成条件表然后翻译成梯形图。起保停、互锁、顺序启动、故障锁存、翻转、延时一个一个来。画完之后在PLC或者仿真软件里跑一遍看看跟你预期的是不是一样。不一样就回去改条件表直到改对为止。这个过程可能有点枯燥但你花在这上面的每一个小时都会在你后面做项目的时候加倍还给你。因为位逻辑这东西一旦通了后面学什么都会觉得顺。如果没通后面学什么都会觉得别扭。提示如果你手边有汇川或者三菱的PLC可以用它们的仿真软件来练手。汇川的INPROSHOP和AutoShop都支持仿真三菱的GX Works2也有仿真功能。不用接实物在电脑上就能把逻辑跑通。这对于初学者来说是非常友好的练习环境。最后再说一句。PLC编程这件事说到底就是“用逻辑描述控制需求”。位逻辑是你描述需求的语言。语言不过关想法再多也表达不出来。所以别嫌它简单别嫌它枯燥。把它吃透了后面的事情自然就顺了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑