ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PLC编程自学指南:从看教程到独立完成项目

PLC编程自学指南:从看教程到独立完成项目

如果你手里正在囤PLC教程,哪怕一套几十个阶段,我建议你先把一个概念从脑子里拧清楚:学会PLC编程的标准不是“看完全套”,而是“离开教程独立完成一个能跑的项目”。早几年我刚开始碰PLC时也走过同一条弯路,视频存了好几个文件夹,每个章节都按顺序躺得整整齐齐,结果真正进到现场,面对一个简单的电机启停,我还是在梯形图里翻了半天才找到输出点在哪。

这个经历不是个例。我后来发现一个特别典型的规律:资料越全的人,动手越少。PLC编程是一门典型的“手里过一遍才算会”的技能,教程、讲义、视频这些输入手段只能帮你降低理解门槛,真正让你产生经验的,是写代码、接线、查故障、改逻辑这些输出动作。这篇文章不讨论怎么保存资料,只围绕“拿到一套PLC教程之后怎么把PLC编程真正学会”这件事,把学习路径、实操环境和排障方法完整梳理一遍。适合两种人看:一是零基础转行自动化的新手,二是存了不少资料但动手量极少的“下载型学习者”。

1. 囤了一整套PLC教程却写不出程序,问题不在资料少

1.1 三种很常见的“伪学习”状态

先聊聊我见过的三种情况,你可以对照一下自己有没有中招。

第一种叫“看视频理论高潮”。看老师讲解梯形图的时候觉得一切都通了,上升沿、下降沿、置位复位全听得明明白白,但把视频关掉,让你自己封装一个“电机点动”程序,手指悬在键盘上就是不知道从哪里开始。这是因为看视频时,大脑接收的是别人整理过的逻辑,而不是自己从问题倒推出来的逻辑,理解上的“顺”是一种错觉。

第二种叫“背指令等于会编程”。有人把常用指令列表背得滚瓜烂熟,LD、OUT、SET、RST随口就来,但遇到一个电梯门联锁的问题,他连“什么时候用置位,什么时候用线圈输出”都分不清。指令是工具,编程是取舍和组合,光会工具的用法,不等于会盖房子。

第三种叫“收藏夹式自欺”。很多人拿到一套资料后,第一反应是归类、保存、备份,然后就没有然后了。资料在网盘里吃灰,大脑里的知识储备仍然是空的。这就好比你买了一大堆健身器材,但从不练,肌肉不会自己长出来。

这三种状态指向同一个问题:没有形成“输入—练习—产出”的闭环。完整的PLC学习闭环应该是看一讲、仿一遍、改一个参数、写一个独立小程序,最后再回到资料里去查漏补缺。资料不是用来“看完”的,是用来“检索”和“对照”的。

1.2 用输出倒逼输入

我后来调整方法,每看完一节教程,不着急往下看,而是给自己出一个“三问测试”:这节解决了什么问题?用到了哪几条指令?如果去掉其中一个条件,程序会怎么走?

这套做法说白了就是输出倒逼输入。你带着问题去看资料,提取效率远高于从头到尾刷一遍。哪怕你用的是整套视频,也应该跳着看,先明确自己想做一个什么样的功能,再去视频里找对应的章节。比如你的目标是把一盏灯做成按下按钮亮两秒后自动灭,你就去翻输出指令和定时器章节,看完马上去软件里试,试出结果后再回来看进阶部分,这才是教程正确的打开姿势。

1.3 资料分类:别把全部内容都当教程看

拿到一套资料,我建议你按作用分成三类,用三套完全不同的方式处理。

资料类别典型内容推荐处理方式建议占比
指令与原理类基础指令、扫描机制、模块接线边看边做笔记,做指令速查卡30%
案例与项目类电机启停、流水线、恒压供水等照着软件复刻,改参数,重新实现50%
故障与问答类现场问题处理、通讯掉站等遇到具体故障时定向查,不提前刷20%

这个比例是我自己调整过很多次的。案例和项目类内容必须占到一半,因为PLC的学习本质是“看别人怎么做,再自己做一遍”;指令类占三成就够了,太多反而会让你陷入记指令的假努力;故障类内容属于“字典”,遇到问题再翻,强行提前背不仅枯燥,而且很快就忘了。

2. 理解PLC的执行机制,才算完成了从“看教程”到“写程序”的切换

2.1 循环扫描:PLC不是你想的那种“接好线就跑”的设备

很多刚从继电器控制转过来的人会有一个误解,觉得PLC就是“高级点的继电器”,输入一接通,输出立刻就有反应。实际上PLC内部的工作方式是循环扫描,再快的PLC也不可能像硬接线那样“实时”响应。

CPU通电后,大致上就反复做这几件事:读取输入端子状态并存入输入映像区,执行用户程序,把结果写入输出映像区,刷新输出端子,同时处理通信、自诊断、时钟等系统任务。然后从头再来一遍,周而复始。

这个过程你可以理解成一个很勤奋的店员:他每次上班第一件事是把货架上的缺货情况记到本子上,然后按本子上的记录去补货,补完货再更新一遍店面,最后歇口气,马上又开始下一轮盘点。他看到的“缺货信息”永远是上一轮盘点时的状态,而不是此刻的真实情况。如果某个货架在你盘点的瞬间刚好被拿走一样东西,他这轮是看不见的,只能等下一轮。

这个特性直接导致了一个经典问题:程序里某一条指令用到的输入信号,跟你物理端子上刚刚变化的信号之间,存在一个扫描周期的延迟。在大多数普通控制场景里,这个延迟只有几毫秒到几十毫秒,你根本感觉不到,但一旦涉及高速计数、精确定位、多个设备联锁,理解扫描周期就变得非常重要。

2.2 输入采样、程序执行、输出刷新,顺序错了一步结果就不同

PLC程序执行的一个关键点是:对同一段程序,CPU是逐行从上往下扫描的,不是同时执行所有行。这一点对汇编语言有经验的人很容易理解,但对纯粹从梯形图入门的人,往往是个大坑。

举个例子,假设程序里有两个输出线圈都叫Y0:

// 程序第一段 LD X0 OUT Y0 // 程序第二段 LD X1 OUT Y0

如果你的直觉停留在“电路并联”思维,会觉得两个条件只要满足一个,Y0就亮。但PLC不是并联电路,它是顺序扫描的。如果X0和X1同时为ON,程序执行到最后会把第二段的Y0结果覆盖掉第一段的结果,最后的输出取决于后一段程序,而不是前面的那一段。

这种“双线圈覆盖”在编程规范里是要尽量避免的,但它最常见的来源恰恰是初学者照抄多个教程程序,而没有意识到不同教程的代码片段合并到一起之后,输出地址发生了重复。后面我会在排障章节专门讲这个问题,这里你先记住一个原则:PLC程序的最终输出状态,以扫描过程中最后一次写入该输出的结果为准。

2.3 上升沿到底是怎么“记住”按过一下的

教程里上升沿、下降沿指令总是很快带过,但这两个指令其实触及了PLC最核心的“记忆”能力。还是用按钮举例子:一个按钮按下到松开,物理上可能只经历了30毫秒,但对PLC来说,这30毫秒里它可能已经跑了好几轮扫描。你希望达成的效果是“按一下,计数器加1”,如果不用上升沿指令,而是直接读按钮状态,计数器就会在一个扫描周期里因为按钮仍然处于按下状态而重复加好几次。

上升沿指令的本质是:PLC内部记录了一个“上一周期的触点状态”,当本周期的状态从0变1,而上一个周期是0时,才判断为一个上升沿,输出一个仅在当前扫描周期为ON的脉冲。所以上升沿判断依赖的是两个周期之间的比较,而不是某一次的实时读取。

这会带来一个实际注意点:如果你的程序里用上升沿作为触发条件,但对这个脉冲的“宽度”没有概念,后续逻辑就可能丢掉这个触发信号。比如上升沿触发了某个置位指令,但程序在同一个循环里后面又有别的指令把那个位清掉了,整体效果就会变得很诡异。

3. 用一台设备加三个项目,跑通PLC自学的完整闭环

3.1 先从仿真环境开始,但别只停留在仿真

仿真软件是零基础学习阶段成本最低的入门方式。大多数正规PLC品牌都会提供带仿真功能的编程软件,你不需要先买硬件,就能在电脑上体验写程序、下载、监控完整流程。用仿真练习的好处是可以随时改程序、随便点按钮,不用担心烧坏设备或出安全事故。

但仿真有个天然盲区:它连不了真实的接线,看不到真实的传感器信号。程序里你写的那个X0,在仿真环境里只是鼠标点一下的虚拟开关,到了现场,X0可能连接的是一个常闭型接近开关,你按下急停时它反而从ON变OFF。这种接线极性差异,只有在真实设备上才会遇到。

所以我一直建议的顺序是:先用仿真把指令和逻辑搞熟,等有了一定基础,再入一台小PLC,哪怕是最入门的型号,配上几个按钮和指示灯,就足够把“写程序—下载—看动作—改程序”这个真实工作循环跑通了。

3.2 入门硬件怎么选,避开两个极端

硬件选择上我见过两个极端:一种是完全不敢买,一直用仿真,结果到现场连下载线都找不到;另一种是刚开始就买一套超大冗余的模拟量模块、通讯模块,大部分时间都在吃灰。

从“够用且不浪费”的角度出发,我的建议是先买一台带以太网口或者USB下载接口的入门级PLC,输入点数不需要多,关键要包含以下几种资源:至少8个数字量输入、8个数字量输出、若干个定时器计数器、足够的内部继电器区,如果有条件再带一两个模拟量输入通道。同时配两三只按钮、两个指示灯、一个24V开关电源、几种常见的接近开关或光电传感器。

硬件组合并不是越贵越好,而是越匹配你现在的目标越好。你现在要解决的是“程序能控制物理对象”这件事,一个简单平台已经足够。

3.3 三个小项目:一个比一个难,但每个都要完整做完

我自己梳理了一套小项目系列,从简单的到稍复杂的都覆盖,这里完整列出来,每一步都有明确的验收标准。

第一个项目:电机启停与互锁控制。这个项目的功能要求是三段式控制:按一下启动按钮,电机接触器吸合;按一下停止按钮,接触器断开;如果运行中出现急停信号,无条件断开,且急停复位后不能自动启动。程序实现的核心是用自锁保持,同时在启动回路串联停止和急停的常闭条件。做完后要能在纸上画出它的I/O分配表。

第二个项目:双灯顺序闪烁。要求是按下启动按钮后,绿灯亮2秒,红灯亮2秒,绿红交替循环;按下停止按钮后,循环终止,且无论程序停在哪一步,下一次启动都从绿灯开始。这个项目用到定时器和状态顺序控制的思路,开始涉及“状态”概念。重点在于“下一次启动从绿灯开始”这一句,需要你在停止时清空当前状态,否则容易出现第二次启动后从中途状态继续跑的bug。

第三个项目:传送带分拣模拟。用三个输入(启动、停止、靠近传感器)和三个输出(电机、推杆、指示灯)模拟一条传送带,要求货物到达分拣位置时,推杆伸出把货物推到侧边,然后自动缩回;如果没有货物到,推杆不能动作;输送带工作期间,指示灯常亮,停止后指示灯熄灭。这个项目综合了顺序控制、上升沿调用、输出保持与复位的完整流程,做完它你对PLC编程的基本套路就很熟了。

3.4 每个项目做完,用一张表复盘

很多初学者做完项目只是“能动了”就收工,这是一个大遗憾。真正让项目经验沉淀下来的,是做完之后的复盘。我给自己规定了一个复盘模板,每次只填5项。

复盘环节要回答的问题输出物
功能确认项目到底要求控制什么?边界是什么?一到两句话的功能描述
点位设计输入有几个,输出有几个,分别是什么信号I/O分配表
时序梳理按下按钮后的动作顺序是什么粗略时序图/动作表
程序结构分了几段?用了几条定时器?有没有重复输出程序结构说明
验证记录哪次运行失败了?失败现象是什么?怎么改的修改记录

这张表填完之后,你对这个项目的记忆就不是“我做了一个电机启停”,而是“我在电机启停里因为急停串联错了位置,导致复位后自启动,后来改成在自锁回路之前切断急停才解决”。后者才是经验,前者只是日期。

4. PLC进阶三块硬骨头:功能块、模拟量、通信协议

4.1 功能块化编程:别把所有逻辑都堆在一个梯形图里

很多自学教程前期教的都是扁平式梯形图,所有逻辑平铺在主程序里,但到后期你会发现,这种写法一旦项目变大,维护成本会爆炸。比如你有三台同样的水泵,每台都有相同的启停逻辑和故障处理,如果复制三份梯形图,每份400行,光找问题就够你喝一壶的。

功能块化编程的思路是:把水泵启停这个“能力”抽象成一个功能块,输入是启动、停止、故障,输出是运行、报警,程序里调用三次,每个水泵对应一块独立的实例。修改底层逻辑时,三台水泵的公共部分自动全部生效,不会出现改了A泵忘了B泵的情况。

理解功能块的关键,是把它的参数区分为输入、输出、内部变量三部分。外部只负责给输入引脚提供信号,并从输出引脚读取结果,内部变量的变化被封装在里面,外部不需要关心。你用几次就会明白,它和子程序最大的区别在于:子程序没有自己独立的“记忆”,功能块每个实例都可以拥有自己独立的内部状态。

4.2 模拟量的采集与量程换算

模拟量是PLC进阶绕不开的一关,常见信号有4~20mA电流信号和0~10V电压信号两大类。温度变送器、压力传感器、液位计,大部分最终都是把物理量转换成这两种标准信号之一,再由PLC模拟量输入模块读成“原始值”。

这些原始值不是直接的温度数值。类似0~27648、0~4000这类数值范围,具体取决于硬件选型和分辨率。你需要把原始值换算成工程值,公式并不复杂:

工程量 = (原始值 - 零点原始值) ÷ (满度原始值 - 零点原始值) × (工程量上限 - 工程量下限) + 工程量下限

举个例子,一个温度变送器量程是0℃到100℃,在某个硬件配置下,4mA对应原始值0,20mA对应原始值27648。现在读到的原始值是13824,那温度就是50℃。这里一定要注意“零点原始值”的存在,如果传感器输出的是4~20mA信号,4mA对应的是量程下限,不是你直觉中的“0起始”。

我早年踩过最大的坑就是以为原始值从0到满量程直接线性对应工程值,结果接了一个4~20mA的液位计时,罐子里明明还有一半液位,PLC算出来却是0%。这种问题在实车上很难发现,因为你只看数字很容易以为传感器坏了。后来我养成了一个习惯:接模拟量之前先看硬件手册里的原始值范围,再写换算公式,绝不用“大概的数值”去猜。

4.3 通信协议:Modbus是当前绕不开的一门课

PLC和上位机、触摸屏、变频器、仪表之间的通信,现在主流用Modbus及其衍生协议,尤其是RTU和TCP两种形式。Modbus的逻辑并不复杂,核心就是一个主站去读或写从站的寄存器。读操作对应功能码03,写操作对应功能码06或16,你只需要在PLC里配置好通信参数、从站地址、寄存器地址和读写长度就能完成数据交换。

真正让初学者头疼的是“寄存器地址到底怎么填”。不同设备手册里给出的地址,有些是带偏移量的,比如40001、40002这种;有些是直接十六进制地址。你填之前必须先搞清楚PLC编程软件里地址格式是“从0开始”还是“从1开始”,否则会出现一个非常典型的错位现象:读出来的数据不是目标数据,而是在目标地址旁边多出来的那个数据。

通信排障时也有一套固定的顺序:首先确认物理连接正常,链路指示灯正常;其次确认通信参数一致,波特率、数据位、校验位、停止位四项一个都不能错;最后确认从站地址和寄存器地址匹配。只要按这个顺序查,大多数通信问题都能定位到前三层,真正需要抓包分析协议的场景很少。

5. 在线排障手记:程序输出不动、信号乱跳时按这条链查

5.1 排障第一原则:先把现场定格在故障发生的瞬间

PLC程序不会像机械零件那样有肉眼可见的磨损,它的故障往往表现为“输出该动时不动,不该动时乱动”。很多人一上来就急着改程序,反复下载、反复测试,结果越改越乱。更好的做法是先把现场“冻住”:记录故障发生时的输入状态、输出状态、操作步骤和异常现象,然后再开始分析。

为什么先冻结现场这么重要?因为PLC程序是顺序执行的,同一个程序在不同条件下会走出完全不同的分支。如果你没有记录当时的输入组合,改完一轮程序之后发现现象变了,你都不知道是因为改动引起的,还是因为现场条件本来就和上次不同。很多时候,管理员一上来直接改逻辑不但没修好,还引入了新故障,就是因为少了这一步记录。

5.2 按“物理输入—模块指示灯—监控位—逻辑”顺序逐级排查

有一次我看到一台设备出问题:按了启动按钮,输出继电器就是不吸合。值班的人上来就在程序里查启动按钮对应的触点,查了半天没发现异常。我看了一下现场,告诉他按这个顺序查:先用万用表量按钮端子之间的电压,确认按钮本身有没有导通;然后看PLC输入模块对应通道的指示灯亮不亮;再打开在线监控看这个输入位有没有变成ON;最后才是进入程序去看这个触点引出来的逻辑。

结果问题根本不在程序,而是按钮的一根线松了,信号始终没进到PLC。这种情况非常常见,尤其是在振动比较大的设备上,接线端子松脱的概率远比你想象中高。请你一定记住:在线监控看到的输入位状态,是PLC已经采集到的状态,它不等于现场物理信号一定正常。如果程序里已经能看到正确的输入变化,再去查程序逻辑,这样才不会被带偏。

5.3 在线监控和强制输出,用之前先想清楚安全风险

PLC编程软件里通常都提供在线监控和强制功能。在线监控可以让你实时看到输入位、输出位和中间变量的状态变化,这是排查逻辑问题的利器。强制功能则可以强行把某个位置为ON或OFF,用于验证接线和单个输出点是否正常。

但强制功能有一个非常现实的安全风险:它绕过了程序逻辑,如果你强行把一个输出位置为ON,即使程序里的停止条件已经满足,这个输出也不会灭。在调试现场,如果执行机构后面连着高速运转的设备,强制输出可能造成设备突然动作,非常危险。

所以我对强制功能的态度一直是:能不用就不用,必须用时一定先确认执行机构处在安全状态,或者已经断电隔离。验证输出点是否正常,更好用的是“强制输出点断电”这类安全级别的操作,不要在没把握的情况下直接强制一个接触器输出。

5.4 三个最常被忽略的逻辑坑

从程序层面看,故障的根因往往集中在几个物理量上:重复输出、定时器清零条件写错、变量在多个子程序中被意外覆盖。它们各有各的“症状”,我把它整理成一张表:

现象特征可能原因先查什么
输出偶尔正常,但逻辑一换分支就乱同一个输出地址被多个段程序重复赋值全程序搜索该输出地址,看有几处OUT
定时器计到一半就归零,动作总不完成定时器复位条件在扫描过程中被意外触发看复位指令执行条件有没有并联到无关触点
手动模式正常,自动模式失效手动自动状态变量被两段程序分别改写检索状态位所有赋值位置,按时间排序

就拿“定时器永远等不到”来说,我见过一个小例子:程序里用了T0计时5秒,复位条件是X0常闭。表面看没问题,X0不动作时T0应该正常计时。但实际中T0刚计到3秒就归零了,监控才发现X0在一个很短的时间内抖动了一下,常闭条件瞬间断开又恢复,T0被复位后重新开始。解决办法是加上滤波或者改用计数器配合上升沿的方式,而不是简单把常闭条件删掉。

6. 长期做PLC学习规划时,我坚持下来的两个原始习惯

6.1 别跳过I/O分配表,先花十分钟把点位写清

很多自学的人写程序根本不做I/O分配表,直接打开软件就开始拖梯形图。这样在小项目里还能靠记忆撑住,一旦项目涉及几十个点,你会发现自己在查端口时浪费的时间远远超过写程序的时间。

我现在的做法是“一次分配,全程复用”:先把所有输入输出按功能分组,统一编号命名。比如输入信号以“手自动切换”“急停”“启动”“停止”等中文或者拼音缩写命名,输出信号以“接触器”“电磁阀”“指示灯”命名,不管写注释还是查故障,一眼就能定位。即便你只是在做三五个点的小项目,我也建议习惯性地先写这个表,因为到真正的工程项目里,I/O表就是程序的地基。

6.2 每条程序都带注释,每次改动都留记录

我见过太多程序文件叫“最终版”“最终版2”“新建最终版”,打开里面连一行注释都没有,别人接手的时候完全不知道当初为什么这么写。PLC程序本身的可读性已经不算好,如果再没有注释,两个月之后自己都会看不懂。

我的习惯是:程序段落先写一句话注释,说明这段是干什么的;主要变量加上含义说明;每次修改后,在程序文件头部登记修改日期和修改内容。不要相信自己的记忆,改程序这件事最不值钱的成本就是多敲几行注释,但省下来的排查时间可能会是几个小时。每次下载新程序之前,把旧版本另存一下,宁可文件多点,也不要覆盖原程序。

6.3 拆解样例程序的正确姿势:先盖住答案,自己推一遍

最后说说怎么用一套现成的样例程序来提升自己。很多人看样例程序就像看小说,从头到尾一行一行扫过去,看完觉得都会,合上又全忘。正确姿势应该是盖住程序,只看功能描述、输入输出分配表,然后自己独立写一遍。写完之后再打开样例程序,把两个版本逐段对比,找出别人的思路和自己不同的地方。

差异点才是最有价值的学习素材。也许他用了置位复位,而你还停留在保持线圈;也许他用功能块封装了,而你还是一行一行平铺;也许他在程序开头加了安全联锁,而你完全没想到。如果你能做到“看一个样例,自己先写一版,再对比差异并记录”,你进步的速度会比单纯看整套教程快得多。

我在自己独立入门那段时间,就是这么把一个个项目从“照着抄”推到“独立写”的。后面又陆续补了功能块、模拟量、通信这些内容,逐步把零散的指令串成一套能解决实际问题的体系。你现在手里的资料本身并不差,差的只是把它们变成本事的过程。先把手上的全套教程按本文的分法归类,再从第一个小项目开始动手,学PLC这件事,永远是用手学会的,不是用眼睛学会的。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进