PLC常用指令解析:从位逻辑到通讯,掌握工业自动化核心 1. PLC指令工业自动化逻辑的基石干了十几年自动化从现场接线、梯形图调试到现在的系统集成我越来越觉得PLC可编程逻辑控制器这玩意儿核心就两样东西硬件I/O和软件指令。硬件是身体指令就是灵魂。你甭管是西门子、三菱、欧姆龙还是咱们国产的汇川、信捷底层逻辑都是相通的——用一套有限的指令集去描述和控制无限复杂的现场逻辑。很多刚入门的朋友一上来就被各种品牌的编程软件、不同的指令叫法给唬住了觉得学不完。其实大可不必指令就像工具箱里的扳手、螺丝刀种类就那些关键看你什么时候用、怎么组合。今天我就抛开具体品牌从最本质的逻辑出发聊聊那些你绕不开的“常用指令”以及它们背后“为什么”要这么设计。无论你是想用Java、C#去读写PLC数据做上位机还是想搞明白嵌入式里CMP指令和PLC比较指令的异同或者是被“汇川机器人怎么和三菱PLC通讯”这种问题困扰理解这些基础指令都是你打通任督二脉的第一步。2. 常用指令全景图从位逻辑到功能块PLC的指令系统可以看作一个金字塔。最底层是处理单个开关信号的位逻辑指令中间是处理数字和时间的定时器/计数器再往上是对数据进行比较、运算、移动的数据处理指令塔尖则是实现复杂工艺的功能指令如PID、运动控制。我们常用的绝大部分都集中在下三层。2.1 位逻辑指令一切控制的起点这是所有PLC程序里出现频率最高的指令没有之一。它处理的就是“开”和“关”、“1”和“0”。常开触点、常闭触点、线圈输出这是最基本的三个元素。常开触点你可以把它想象成一个按钮的“默认断开”状态。只有当它前面的逻辑条件为“真”比如一个物理按钮被按下或者某个内部标志位被置1这条“通路”才导通电流逻辑流才能流过去。常闭触点正好相反它是一个“默认闭合”的开关。当它前面的条件为“真”时它反而会断开阻断逻辑流。它常用于“停止”、“急停”、“安全联锁”等场景。比如急停按钮的常闭触点串在主线路上正常情况下通路按下急停触点断开整个逻辑断掉设备停止。线圈输出这是逻辑的终点。当流向它的逻辑流为“真”时它被“通电”或“置位”可以驱动一个实际的输出点如继电器、接触器也可以将一个内部的辅助继电器M区或数据位D区置为1。实操心得很多新手容易混淆“常开”和“常闭”在程序里的实际表现。记住一个窍门在编程软件里你选择“常开”还是“常闭”取决于你希望这个输入信号在什么状态下激活你的逻辑。如果你希望按钮按下时动作就用常开如果你希望按钮松开时或故障时动作就用常闭。现场接线和程序逻辑必须匹配否则会出现“一上电就动作”或“按了没反应”的诡异问题。置位与复位指令这是对普通线圈输出的增强。置位一旦前面的逻辑条件满足一次它就把指定的输出点或内部位“锁存”在1的状态即使前面的条件不再满足它依然保持为1。复位它的作用就是“解锁存”将指定的点清0。这两条指令一定是成对出现的用来实现“启动-保持-停止”这样的经典电路也叫“启保停”电路。普通线圈输出是“瞬时”的置位/复位是“保持”的。这是实现设备连续运行、状态记忆的核心。上升沿与下降沿检测这是非常关键且容易出错的指令。上升沿只在检测的信号从0跳变到1的那个扫描周期内输出一个短暂的“真”脉冲。下降沿只在信号从1跳变到0的那个扫描周期内输出一个脉冲。它们有什么用举个例子一个按钮按下去要执行某个动作但你希望这个动作只执行一次而不是按住不放就连续执行。这时候就需要用上升沿检测这个按钮的按下动作。再比如计算某个开关动作的次数也必须用沿检测否则一个长信号会被PLC每个扫描周期都计数一次结果就乱套了。避坑指南沿检测指令在大多数PLC里都需要一个专用的“位”来存储上一个扫描周期的信号状态以实现比较。这个“位”必须是唯一的不能重复使用否则检测会失效。编程时最好在它旁边做好注释标明是给哪个信号用的。2.2 定时器与计数器让程序拥有“时间感”和“数量感”如果说位逻辑决定了动作的“是否发生”那么定时器和计数器就决定了“何时发生”和“发生多少次”。定时器核心参数就三个使能条件、预设值、当前值。工作原理当使能条件接通时定时器的当前值开始递增或递减计时。当当前值达到预设值时定时器的“完成”位被置位其常开触点接通常闭触点断开。类型最常用的是接通延时定时器。意思是“使能条件接通后延迟一段时间才动作”。还有断开延时使能条件断开后开始计时、保持型累积计时等。时间基准预设值单位通常是毫秒(ms)或100毫秒(100ms)。比如预设值设为100时间基准是100ms那么定时时间就是10秒。编程时一定要看清时间单位。计数器同样有三个核心参数计数脉冲输入、复位端、预设值。工作原理每检测到一次计数脉冲输入的上升沿注意必须是沿信号当前计数值加1。当计数值达到预设值时计数器的输出触点动作。复位信号到来时当前值清零。类型有加计数器、减计数器、加减计数器。加减计数器有两个脉冲输入一个加一个减。经验分享定时器和计数器都有“掉电保持”和“非掉电保持”之分。对于需要记录设备累计运行时间、生产总数等关键数据一定要选用具有掉电保持功能的定时器/计数器或者将它们的当前值定期传送到具有掉电保持功能的数据寄存器中。否则设备一断电数据全丢。2.3 数据处理指令与数据打交道当控制逻辑不再满足于简单的开关而是需要处理温度、压力、速度等数值时数据处理指令就登场了。比较指令等于、不等于、大于、小于、大于等于、小于等于。这就是PLC里的CMP指令。它比较两个数据寄存器或常数的大小结果输出为一个位真或假。这个“结果位”可以像普通触点一样参与到后续的逻辑控制中。比如当温度传感器数值存储在D100大于设定值比如常数500时启动冷却风扇。传送指令把数据从一个地方搬到另一个地方。这是最常用的指令之一。比如把触摸屏上设定的速度值从通讯接收区传送到控制电机速度的寄存器或者把当前计数值传送到触摸屏显示。数学运算指令加减乘除、三角函数、指数对数等。让PLC能进行简单的运算。例如根据编码器脉冲数计算实际位移或者对多个模拟量采样值求平均滤波。移位与循环指令这在处理流水线、步进控制时非常有用。比如一个16位的寄存器每一位代表一个工位状态。每完成一个节拍就让这个寄存器的值左移一位相当于“物流”向前推进了一个工位。3. 指令的底层逻辑与扫描周期理解了单个指令更要理解它们是如何被PLC执行的这就是扫描周期的概念。这是理解PLC程序为何如此稳定、可预测的关键。PLC的工作是循环往复的一个扫描周期包括以下阶段输入采样PLC一次性读取所有物理输入点的状态如按钮、传感器并存入“输入映像区”。在接下来的整个程序执行阶段即使外部输入信号变化了程序里读到的也还是这个“快照”值。程序执行CPU从上到下、从左到右地逐行执行用户程序梯形图。程序里操作的并不是真实的I/O点而是它们的“映像区”状态。所有的逻辑运算、定时、计数都在这个阶段完成结果写入“输出映像区”。输出刷新程序执行完毕后PLC将“输出映像区”的状态一次性全部输出到物理输出点驱动继电器、指示灯等。核心原理这种“集中输入、集中输出”的模式从根本上避免了因为程序执行顺序导致的信号竞争和冒险问题。这也是PLC比直接用单片机写控制逻辑更稳定、更适用于工业环境的重要原因之一。它牺牲了一点实时性毫秒级换来了极高的确定性和抗干扰能力。这对编程有什么影响双线圈问题在同一个扫描周期内如果同一个输出线圈被多个逻辑路径驱动最终生效的将是最后一条执行的逻辑。这通常会导致不可预知的行为是编程大忌。解决方法是对于同一个输出点所有的控制逻辑都汇总到一处再用一个线圈输出或者使用置位/复位指令来管理。沿检测的依赖正因为输入是周期采样的所以沿检测指令依赖的是本次采样值和上次扫描周期存储值的比较。如果两次采样之间信号发生了多次跳变PLC是捕捉不到的。对于高速脉冲必须使用专用的高速计数器功能。定时器的精度定时器的计时基准是扫描周期。如果一个扫描周期是10ms那么定时器的最小分辨率也就是10ms。对于需要精确定时的场合要考虑使用定时中断或专用时钟脉冲。4. 从指令到程序经典模式与架构掌握了单个指令就像有了砖头。但要盖房子还需要设计图。成熟的PLC程序都有一些经典的模式和架构。“启保停”电路这是所有电机、泵等设备控制的基础。用一组常开触点启动按钮并联上输出线圈的常开触点自锁再串联一个常闭触点停止按钮。这就是置位/复位逻辑的梯形图实现。几乎每个程序里都有它的身影。顺序功能图与步进控制对于按固定顺序一步步执行的流程比如灌装、压合、装配最清晰的方法是使用SFC或步进指令。其核心思想是每一步都有一个“状态位”只有上一步完成且转移条件满足时下一步的状态位才被激活同时上一步的状态位复位。每一步里只执行该步需要输出的动作。这种结构脉络清晰易于调试和维护避免了复杂的互锁逻辑。故障处理与报警机制一个健壮的程序必须有完善的故障处理。这通常是一个集中式的逻辑块。所有可能的故障信号传感器断线、过载、超温、超时都汇集到这里通过置位指令锁定一个“总故障”标志位并触发声光报警。同时这个总故障标志会串入所有主要设备的自动运行回路实现急停。故障复位前设备不能自动启动。模拟量处理框架模拟量输入如4-20mA信号经过AD转换后得到一个原始数字值比如0-16000。程序里通常需要滤波连续采样多次取平均消除抖动。标定转换通过一个线性变换公式将原始值转换成工程值如0.0-100.0℃。公式是工程值 (原始值 - 输入下限) / (输入上限 - 输入下限) * (量程上限 - 量程下限) 量程下限。限幅与报警判断判断工程值是否在合理范围内是否超限需要报警。5. 高级应用与通讯指令当单个PLC不够用需要与人机界面、机器人、其他PLC或上位机如用Java、C#编写的MES系统对话时通讯指令就至关重要了。通讯的本质无论是三菱Q系列与汇川机器人通讯还是西门子PLC与上位机通讯本质都是数据的交换。PLC需要提供一块特定的数据区域比如一组连续的D寄存器作为通讯的“信箱”。对于HMI触摸屏上每一个按钮、输入框、指示灯都对应着PLC里的一个位或一个数据寄存器。HMI通过通讯协议如Modbus TCP/IP、三菱的MC协议、西门子的S7协议周期性地读写这些地址。编程时你需要规划好这些地址避免冲突。对于机器人/其他PLC通常采用主从站或对等通讯。需要设置站号、通讯波特率、数据格式。通讯指令负责将本机指定区域的数据打包发送出去或者将接收到的数据包解包存放到指定区域。例如PLC将目标位置坐标X Y Z写入D100开始的6个寄存器然后置位一个“数据准备好”标志位机器人控制器读到这个标志位后就去读取坐标数据执行完成后再回写一个“动作完成”标志位给PLC。这就是典型的握手协议。对于上位机现在最主流的方式是以太网通讯。PLC作为服务器开放一个端口。上位机作为客户端按照PLC支持的协议格式发送读写命令。你需要仔细查阅PLC的通讯手册了解报文格式。很多高级语言都有现成的库如Java的maven库org.bridjC#的S7NetPlus来封装这些底层协议让你可以像操作本地变量一样读写PLC数据。调试血泪史通讯问题90%出在参数设置不一致上。站号、波特率、数据位、停止位、校验方式两边必须一模一样。另外注意数据的高低位顺序字节序三菱和西门子就经常相反。如果通讯不上先用一个简单的通讯测试软件如Modscan、USS去 ping 一下PLC确认物理链路和基础协议是通的再排查程序问题。6. 编程思想与调试技巧最后分享一些超越具体指令的软性经验。结构化编程不要把所有代码都堆在主程序里。把功能模块化比如“手动操作”、“自动循环”、“报警处理”、“配方管理”分别做成子程序或函数块。这样程序结构清晰修改一处不会影响全局。西门子的FB/FC三菱的“指针”或“子程序调用”都是为此服务的。注释与文档这是给未来的你和你的同事看的。每个网络、每个关键指令旁边用简洁的语言说明“为什么要这么做”。对所有的I/O点、中间变量、数据寄存器建立一份详细的地址分配表说明其用途。没有文档的程序三个月后就是天书。仿真与调试现在大多数编程软件都自带仿真器如三菱的GX Simulator西门子的PLCSIM。在接真实设备前务必先用仿真器跑一遍逻辑。利用断点、单步执行、变量监视功能像侦探一样追踪程序的执行流程和变量变化。对于定时器可以临时把预设值改小加速调试过程。信号去抖与边缘情况物理按钮、行程开关在接通或断开的瞬间会产生机械抖动在PLC看来就是一连串的快速通断。如果不处理一个按下动作可能会被误认为多次。解决方法是在程序里加一个几十毫秒的延时或者用定时器实现一个简单的滤波逻辑。永远要考虑“如果传感器坏了一直为0或一直为1程序会怎样”设计安全的超时保护和默认状态。PLC编程入门容易精深难。它不仅仅是记住指令更是一种严密的逻辑思维和工程化思想的训练。从看懂一条简单的并联串联电路开始到构建一个稳定可靠的复杂控制系统每一步都离不开对这些基础指令的深刻理解和灵活运用。当你不再纠结于某个品牌某条指令的具体写法而是能一眼看穿它要解决的底层逻辑问题时你就真正入门了。剩下的就是在不同的项目和故障中不断积累属于你自己的“指令库”和“避坑指南”。