PLC编程入门:梯形图、扫描周期与电机正反转实战
PLC编程入门这件事,说难不难,说简单也真不简单。我在车间里见过只用三天就能让电机正反转跑起来的新人,也见过啃了半年教材、一上手就卡在“输入点不亮”的人。差别不在于聪不聪明,而在于有没有人告诉他:这东西本质上是给“会看图、懂设备”的人准备的软件工具,不是一门需要从头背到尾的理论课。
这篇文章面向的是刚接触PLC编程入门的几类人:机电一体化或自动化相关专业的学生、从电工岗转设备维护的师傅、做机械设计想补电控短板的工程师,以及想接点小项目练手的自由职业者。我会把从硬件选型、软件环境搭建、梯形图逻辑思维、第一个完整程序、模拟量与通讯,到现场排查坑位的整套链路拆开讲透,参数怎么算、为什么这么选、哪里最容易翻车,都写清楚。看完你至少能做到两件事:自己搭一套能跑的练习台子,以及独立写出一段带互锁、急停、过载保护的电机控制程序并调试成功。
1. 入门之前先想明白:PLC到底在替谁干活
很多人一上来就问“学哪个品牌的PLC好”,这个问题本身就问偏了。PLC是可编程逻辑控制器的简称,它的历史使命非常明确:把控制柜里那一堆中间继电器、时间继电器、计数器用软件逻辑替掉。你要是没搞清楚它在替代什么,学起来就只能是背指令。
1.1 用“继电器柜的软件替身”理解它的底层逻辑
传统继电器控制柜里,一个自锁回路要占用一个中间继电器、若干接线端子和一堆线;要加个延时,得再塞一个时间继电器;逻辑改一次,电工得拿螺丝刀重新排线。一个中等复杂度的柜子,几十上百个元件,故障排查基本靠经验和万用表一路一路量。
PLC干的事情就是把这些“触点”“线圈”“延时”全部搬到内存里。程序里写一万个触点也不额外花钱,改逻辑只需要改几行代码,这就是它最核心的价值。理解到这一层,你就会明白为什么梯形图的画法和电气原理图长得那么像——它压根就是照着继电器电路的样子设计出来的,目的是让当年的电工能零成本迁移。
运行时它干的事很朴素,循环做三件事:采样输入(把所有输入端子当前的通断状态一次性读进内存映像区)、执行程序(从上到下一条一条算)、刷新输出(把算完的结果一次性写到输出端子)。这三步循环往复,一圈叫一个扫描周期。这个机制是后面所有“玄学问题”的源头,比如为什么按钮按一下程序没反应、为什么两个线圈同时驱动同一个输出会打架,根子都在这里。
1.2 五种编程语言,为什么入门死磕梯形图
按国际电工委员会的标准,PLC有五种编程语言:梯形图、功能块图、顺序功能图、结构化文本、指令表。新手最容易犯的错是听人说“结构化文本像C语言,更高级”,然后一头扎进去,结果连个启保停都写不利索。
我的判断很直接:如果你未来要做现场维护、设备改造、产线调试,梯形图是必修课,没有替代方案。原因有三。第一,现场故障排查时你打开程序监控,梯形图的通断状态一眼就能对上电气图纸,哪个触点没闭合、哪个线圈没输出,所见即所得;结构化文本你只能看变量值,逻辑走向要靠脑补。第二,绝大多数存量设备的老程序都是梯形图写的,你看不懂就没法接手。第三,梯形图的“图形化”特性天然限制了你的写法,反而不容易写出绕来绕去的逻辑。
结构化文本当然要学,但它更适合处理数组运算、配方管理、复杂算法这类梯形图写起来很别扭的场景。合理的路径是:梯形图打底,能独立写完整逻辑之后,再补结构化文本。顺序功能图适合流程型设备(比如清洗机、装配线),等你有了一定基础再上手,会觉得很顺。
1.3 把预算和时间账先算清楚,别一上来就买贵的
我见过太多人第一件事是下单买一台中型机,花了小几千,结果发现还得再配电源、配编程电缆、配扩展模块,最后台子搭起来了,人却因为“太复杂”放弃了。入门阶段的硬件投入,控制在几百到一千多块钱就完全够用,二手的小型一体机是最优解——本体自带十几个输入点、十几个输出点,够你练几乎所有基础逻辑。
时间投入上给个实在的参考:每天一到两小时,坚持一个月,能到“看懂别人写的程序、独立写小逻辑”的水平;能独立做完整小项目(含IO分配、图纸、程序、调试),通常要三到六个月,而且必须有真机实操。光看视频不动手,看一年也是白搭,因为PLC这行的知识有大量是“手感型”的,比如接线端子拧多紧、传感器指示灯闪几下代表什么,这些只能上手。
| 阶段 | 建议投入 | 目标产出 |
|---|---|---|
| 第1周 | 硬件到位、软件装好、点亮第一个输出 | 打通工具链,会联机下载 |
| 第2-3周 | 启保停、正反转、定时器计数器 | 能写带互锁的基础逻辑 |
| 第4-6周 | 模拟量、通讯、配方 | 能读传感器、能跟上位机通信 |
| 第2个月起 | 完整小项目实战 | 独立完成选型到调试 |
2. 台子怎么搭:硬件选型与软件环境的实操细节
搭练习台子是整个入门过程里最容易劝退的环节,因为坑集中在“买了不能用”和“接上不通”这两件事上。这一章把选型的账和接线的坑一次性说清楚。
2.1 硬件选型:IO点数怎么数、输出类型怎么挑
选型第一步不是看品牌,是数点。把你的练习目标拆成最小的功能单元,比如“三个按钮控制两个接触器、一个指示灯、一个传感器”,那就是4个输入、3个输出。在这个基础上加30%左右的余量,落到8进6出或者12进8出的本体上就够。余量不是浪费,是给你留出“临时加个急停、加个指示灯”的空间,也避免将来扩一个点就得再买模块。
输出类型是最容易选错的地方,必须记牢:继电器输出能带交流负载,比如220V的接触器线圈、指示灯,通用性强,但机械触点有寿命,动作频率高的场合会提前磨损;晶体管输出只能带直流负载,但响应快、寿命长,做高速脉冲输出(控制步进、伺服)必须用它。入门练习台我建议选继电器输出,因为你一开始接触的负载基本都是接触器和灯,交流直流都能怼。等你开始玩步进电机,再单独买一台晶体管输出的本体或者扩展模块。
还有两个参数要留意:一是输入类型,市面上分漏型(源型)输入和源型(漏型)输入,说人话就是“公共端接正还是接负”,这直接决定你配的传感器是PNP还是NPN,选错了就是接上去点不亮。二是供电电源,本体一般是24V直流或220V交流供电,24V供电的需要单独配一个开关电源,功率按“本体功耗+所有输出负载+传感器功耗”加起来再放一倍余量。一个24V/2A的开关电源,带本体加几个传感器和指示灯绰绰有余。
提示:买二手本体的时候一定问清楚有没有编程电缆、端子排是否齐全。端子排单独配一套的价格有时候能顶上半个本体,这个坑很多人踩过。
2.2 接线基础:干接点、PNP/NPN和一上电就烧的那几个地方
先讲输入侧。按钮、行程开关、继电器触点这类干接点,本质上就是一个开关,不区分极性,串在输入回路里就行,接线最省心。麻烦的是接近开关、光电开关这类晶体管输出的传感器,它们分PNP和NPN两种:PNP输出高电平(动作时输出正电压),NPN输出低电平(动作时把信号线拉到0V)。你的PLC输入公共端接法必须和传感器匹配,否则要么一直亮、要么一直不亮。
这里有个实操经验:接线之前先用万用表量一遍传感器。给传感器供上24V,用万用表直流电压档量信号线对0V的电压,遮挡一下感应面,看电压有没有变化。有变化说明传感器是好的,再确认变化方向(0→24V是PNP,24V→0V是NPN),然后决定输入端公共端怎么接。这一步花三分钟,能省掉后面半小时的抓瞎。
输出侧的坑更贵。继电器输出带感性负载(接触器线圈、电磁阀)时,触点在断开瞬间会产生反向电动势,长期下来会烧触点或者干扰本体。解决办法很便宜:在负载线圈两端并一个RC吸收回路或者压敏电阻,几块钱的事。晶体管输出带感性负载必须反并续流二极管,否则第一次断电就可能击穿输出管。另外,输出公共端如果分组(比如每4个点一组),不同组的负载电压可以不同,这是设计上的便利,但接线时别把不同电压的负载并在同一组的公共端上。
注意:上电之前一定用万用表通断档量一遍24V和0V之间有没有短路,尤其是刚接完线、端子还没拧紧的时候。烧一个开关电源几十块,烧一个输出模块几百块,最亏的是烧了之后你还不知道哪根线接错了。
2.3 软件安装与联机:驱动、通讯参数和仿真器的边界
厂商随硬件提供的编程软件通常是免费的,安装本身不难,难的是联机。老款本体常用串口(RS232/RS485),现在多用USB或网口。串口方案需要一根USB转串口线,装完驱动后到设备管理器里确认端口号,然后在软件里选对COM口、波特率、数据位、校验位、停止位和站号。这几个参数必须和本体里的设置完全一致,有一个对不上就连不上。
实测下来最常见的联机失败原因是三个:COM口选错(电脑上插了别的USB设备导致端口号变了)、驱动没装上(设备管理器里有黄色感叹号)、本体站号被改过(二手设备尤其常见,前主人可能改过默认站号)。排查顺序就是:设备管理器看端口→软件里选同一个端口→参数全部用默认值试一遍→还不行就用软件里的“自动搜索”功能扫一遍站号。
没有真机的时候可以先用仿真器练逻辑。仿真器能跑通大部分基础指令,适合刚开始熟悉梯形图画法。但它有个明确的边界:外部IO是假的,你在软件里手动置位输入,体会不到“传感器信号抖动”“按钮按下时间太短”这类真实世界的问题;模拟量采集、通讯、高速计数这些基本仿不了。所以仿真器只能当过渡,真机该买还得买。
2.4 上电检查清单:五步走,别跳步
我把每次上电前的检查固化成五步,养成习惯之后几乎没再烧过东西:
- 断电状态量短路:万用表通断档,量24V与0V、量输出公共端与各输出点,确认没有直通。
- 核对电源极性:开关电源的L/N接对,输出侧的+24V/0V别接反,传感器三线制的棕蓝黑别搞混。
- 确认接地:本体接地端子接柜体接地排,这一步很多人省掉,后面干扰问题能耗你半个月。
- 空载上电:先不接负载,只给本体和传感器供电,看电源指示灯、运行指示灯是否正常。
- 逐路带载:一路一路接负载,接一路测一路,别一次性全接上再上电。
这个清单看着啰嗦,但每一条背后都有代价。我见过有人把24V直接怼进输入端子的公共端和输入点之间,上电瞬间冒烟——输入回路的光耦是有耐压极限的,超了就是一片一片地坏,而且坏的位置还很随机,排查起来极其难受。
3. 梯形图的核心要素:从“电路图思维”切换到“扫描思维”
会用电气原理图的人学梯形图有先天优势,但也有一个必须先破除的思维惯性:电路图是“电流流过就动作”的物理过程,梯形图是“从上到下算一遍再刷新”的计算过程。这两者的差别,造就了新手 80% 的逻辑错误。
3.1 软元件体系:X、Y、M、T、C、D这套“通用语言”
不同厂商的软元件前缀不一样,但下面这套符号是行业通行的叫法,你换个品牌也只是前缀字母变化,含义基本对应:
| 符号 | 名称 | 通俗理解 | 典型用途 |
|---|---|---|---|
| X | 输入继电器 | 外部信号的镜像 | 按钮、传感器、限位 |
| Y | 输出继电器 | 驱动外部负载 | 接触器、电磁阀、指示灯 |
| M | 中间继电器 | 程序内部的“草稿变量” | 状态标志、逻辑中转 |
| T | 定时器 | 延时元件 | 星三角切换、延时启停 |
| C | 计数器 | 计数元件 | 产量统计、脉冲计数 |
| D | 数据寄存器 | 存数字的抽屉 | 参数、模拟量、配方 |
理解这张表的关键是分清“映像”和“实物”。X 不是那根接在端子上的线,它是程序里的一份拷贝,扫描周期的采样阶段才会更新;Y 也不是直接驱动接触器,程序算完之后统一刷新到端子上。你写LD X0的时候,读的是内存里的状态,不是实时电平。这个认知建立起来,很多“为什么我按了按钮程序没反应”的问题就能自己解释——按钮按下的持续时间短于一个扫描周期,或者程序里同一时刻有别的逻辑把它覆盖了。
中间继电器 M 是新手最容易浪费的资源。说白了它就是内存里的一个位,想用多少有多少,作用是把复杂逻辑拆成“分段施工”。比如你先用一堆条件算出一个“可以启动”的标志位存到 M0,后面所有地方都引用 M0,而不是到处重抄那堆条件。这样改需求的时候只改一处,程序可读性也高得多。
3.2 扫描周期与双线圈:新手第一个逻辑事故现场
扫描周期到底有多长?小型机执行一千条基本指令,通常在零点几毫秒到一毫秒的量级,具体取决于指令类型和本体性能。这个速度对人类来说很快,但它确实存在,而且会咬人。
最典型的翻车场景是双线圈:同一个 Y 输出在程序的两个不同位置被OUT驱动。因为程序是从上往下执行的,先执行的那次结果会被后执行的那次直接覆盖,最终输出只认最后一次。表现出来就是“我明明写了这个条件,怎么不动作”,然后你盯着那段逻辑看半天,怎么看都对——因为问题根本不在那儿。
解决办法有两个,我推荐第一个:一个输出只在一处驱动,把所有启动条件、保持条件、停止条件合并到同一段逻辑里,这样程序结构清晰,改起来也不会牵一发动全身。第二个办法是用中间继电器做“汇总”,各处逻辑先算到 M 上,最后统一LD M0 OR M1 ... OUT Y0,本质上是同一个思路。
还有个相关的坑叫扫描顺序依赖。程序里 A 段的计算结果被 B 段用到,那 A 必须写在 B 前面。梯形图不是声明式语言,它老老实实按书写顺序执行。所以养成一个习惯:初始化、状态判断、输出驱动三段分开写,顺序固定下来,别今天这么排明天那么排。
3.3 六个必练的基础指令组合,练熟了能覆盖八成小项目
我把入门阶段最该练熟的模式归纳成六组,每一个都建议你在仿真器或者真机上自己敲一遍,别抄,敲完自己改参数看效果。
自锁(启保停)——LD 启动 OR 输出 AND 停止 AND 其他条件 OUT 输出。这里的停止条件要用常闭触点串联,对应电气图里停止按钮接常闭。现在越来越多的设备把停止做成常开进 PLC、程序里取反,两种做法都行,但同一个项目里必须统一,混着用就是灾难。
互锁——两个不能同时动作的输出,各自串联对方的常闭触点。软件互锁 + 接触器辅助常闭触点做硬件互锁,双重保险,这是强制要求,不是可选项。
边沿检测——上升沿触点只在信号从 0 变 1 的那个扫描周期导通一次,用来实现“按一下切换状态”“按一下加一”。用普通触点做计数,按一次会加好几个数,就是因为它保持了多个扫描周期。
置位/复位——SET/RST指令。好处是写起来短,坏处是程序里到处都是 SET 之后,你很难追踪一个位到底在哪儿被复位的。我的建议是:启保停优先用自锁,SET/RST 留给状态机式的流程控制。
定时器——分通电延时和断电延时。通电延时最常用,要注意定时器的“使能条件消失就复位”这个特性,很多“延时突然不走了”的问题都是因为使能条件在延时过程中断了。
计数器——注意复位方式的区别,有的靠复位指令,有的靠计数到目标值自动复位。做产量统计时还要考虑停电保持,普通计数器断电就清零了。
3.4 数据类型与寻址:为什么“1”和“1.0”不是一回事
位(bit)、字节(8位)、字(16位,也叫寄存器)、双字(32位)——这个概念不理解清楚,后面做模拟量和通讯会寸步难行。
位就是一个开关,只有 0 和 1,用于 X/Y/M 这类量。字用来存数字,比如模拟量采集值、计数值、配方参数,对应 D 寄存器。一个 D 寄存器是 16 位,能表示范围有限(有符号的话大概正负三万出头),存更大的数(比如累计流量)就得用双字。
这里有三个高频误区。第一,整数和浮点数不能混着算。有的指令只吃整数,你把浮点数喂进去要么报错,要么被截断成整数,精度全丢。做模拟量换算和比例计算时,老老实实走浮点运算指令。第二,BCD 和 BIN 别搞混。BCD 码是用十六进制形式表示十进制数,老式数码管显示、拨码开关输入经常用这个格式,你直接当二进制算会得到离谱的结果。第三,地址重叠。某些型号里,D0 这个字由 D0 和 D1 两个字节组成,双字又由 D0、D1 两个字组成,你写双字运算的时候如果又把相邻的字当独立变量用,数据就会互相踩。
4. 动手写第一个完整程序:三相电机正反转联锁
光看指令说明没用,得有个具体活儿练手。我选“三相异步电机正反转”作为入门第一题,因为它同时包含了按钮、接触器、互锁、过载、急停这几个最核心的要素,而且和你以后要做的绝大多数设备在逻辑骨架上是同构的。
4.1 需求拆解与 IO 分配表
需求先说清楚:一台电机可以正转、可以反转,正反转不能同时吸合(否则相间短路),有停止按钮,有过载保护,有急停。操作方式为按钮点动控制。
IO 分配表是这个项目里最该花时间的一步,表定错了后面全得返工。分配原则我总结为三条:输入按“信号类型”分组(按钮一组、传感器一组),输出按“负载类型”分组(接触器一组、指示灯一组),地址留空方便以后插入。
| 地址 | 名称 | 类型 | 说明 |
|---|---|---|---|
| X0 | 正转启动 | 按钮常开 | 点动 |
| X1 | 反转启动 | 按钮常开 | 点动 |
| X2 | 停止 | 按钮常闭 | 串在回路中 |
| X3 | 热继电器 | 常闭 | 过载时断开 |
| X4 | 急停 | 常闭 | 拍下即断 |
| Y0 | 正转接触器 | 继电器输出 | 带 AC220V 线圈 |
| Y1 | 反转接触器 | 继电器输出 | 带 AC220V 线圈 |
顺着这张表说一个极其重要的设计原则:安全相关的信号一律用常闭触点接入。停止按钮、急停、热继电器,都接常闭。为什么?因为常闭回路在“线断了”“端子松了”“按钮坏了”的时候,表现和“被按下”一样,设备会自动停机——这叫失效安全。如果你接常开,线断了设备反而以为一切正常,那就危险了。注意,接常闭之后,程序里对应的触点要用常开触点(因为外部正常时信号是通的,为 1),这一点新手最容易反过来。
4.2 逐行写逻辑,每一行都要能说出为什么
先给正转那段。下面用通用指令表形式写,各家语法略有差异,但逻辑完全一致:
// 正转控制 LD X0 // 正转启动按钮 OR Y0 // 正转自锁 AND X2 // 停止(外部常闭,正常为1) AND X3 // 热继电器(外部常闭,正常为1) AND X4 // 急停(外部常闭,正常为1) ANI Y1 // 反转互锁:反转吸合时禁止正转 OUT Y0 // 驱动正转接触器一行一行读:第一行等启动按钮;第二行把 Y0 自己的状态并进来形成自锁;第三到五行是三个串联的“允许条件”,任何一个断开都会让整条通路断掉;第六行是互锁,ANI是“与非”,意思是 Y1 为 1 时这一行不通。反转那段把 X0/X1、Y0/Y1 对调即可。
这里要解释一个很多人写错的地方:互锁为什么放在自锁后面。放在自锁后面,意味着只要反转在运行,即使你按正转按钮,通路也不成立;而一旦你按了停止让反转断开,正转按钮按下去就能立即启动。如果把互锁放在启动按钮前面,逻辑上也能工作,但调试的时候你会觉得“按钮好像不灵”,因为互锁在运行中是一直断着的,看起来像按钮坏了。这个细节不影响功能,影响的是可维护性。
再看一个更隐蔽的问题:急停的处理。上面这段把急停串进了逻辑,急停拍下后 Y0 会断开,接触器释放,电机停转。但严格来说这还不够——急停的行业惯例是直接切断接触器线圈的控制电源,走硬件回路,不依赖 PLC。PLC 里的急停信号是“第二道保险”,用来让程序知道发生了急停,好在复位后要求人工确认。所以正确的做法是:硬件回路上用急停的常闭触点直接串在接触器线圈回路里,同时把急停信号送进 PLC 一个输入点做状态判断。两套并行,才叫真正的安全设计。
4.3 硬件互锁不能省,软件互锁不能只靠软件
正反转最容易出的事故是相间短路:两个接触器同时吸合,380V 电源直接短路,轻则烧接触器,重则炸柜子。软件互锁能防住“程序逻辑写错”的情况,但防不住“接触器触点粘连”这种硬件失效。触点粘连的时候,即使线圈已经断电,主触点还是吸合状态,这时另一个接触器一吸合,短路照样发生。
所以硬件互锁是必须的:把正转接触器的辅助常闭触点串在反转线圈回路里,反转的辅助常闭串在正转线圈回路里。这样即使 PLC 输出错了,物理上也不可能同时吸合。另外加一个中间继电器做输出隔离也是个好习惯:PLC 的 Y 点驱动中间继电器,中间继电器再去驱动接触器线圈,这样烧的是几十块的中间继电器,不是几百块的 PLC 输出点。
还有一个参数要算:热继电器的整定电流。以一台 7.5kW、380V 三相异步电机为例,额定电流大概在 15A 上下(经验公式:功率千瓦数乘 2 得到安培数,7.5×2=15)。热继电器整定到额定电流的 1.0 到 1.1 倍,也就是 15 到 16.5A,取 15.5A 左右。接触器按额定电流的 1.5 到 2 倍选,18A 或 25A 规格,主要考虑启动电流冲击和电寿命。这些数字不是拍脑袋,是《低压电器选用》这类手册里的常规做法,你按这个来基本不会出错。
4.4 从仿真到上机:一套可复现的调试流程
写完之后别急着上电,按这个流程走一遍:
第一步,仿真跑逻辑。手动置位 X0,看 Y0 是否自锁;置位 X1,看 Y0 是否断开、Y1 是否吸合;置位 X2(模拟按下停止,实际是让他变成 0),看是否全部断开。重点是测边界:同时按 X0 和 X1 会怎样?运行中按 X3 会怎样?断开后再恢复,会不会自己重新启动?
最后这个测试特别关键。很多老设备出事故就是因为“急停松开后设备自己又跑起来了”——原因就是自锁逻辑没处理好,恢复供能的瞬间条件又成立了。正确的做法是加一个“启动确认”标志:急停或过载动作后,必须重新按一次启动按钮才允许运行,而不是条件恢复就自动跑。这个可以在程序里用一个 M 位实现,也可以在硬件上用带自锁的按钮。
第二步,空载上电测 IO。只接本体和按钮,不接接触器。用手按每个按钮,看程序监控里对应的 X 点是否变化,这一步验证接线和地址分配。
第三步,带接触器但不带电机。接上接触器,听吸合声音,用万用表量接触器主触点通断,验证互锁是否生效。这一步能抓出“接触器辅助触点接错”的问题。
第四步,带电机空载试转。脱开机械负载,短时间点动,确认转向。转向反了?任意对调两相电源线,别在程序里改。
第五步,带载运行并观察。运行十几分钟,摸一下接触器和电机温度,听有没有异响。这一步别省,我见过接完线直接带满载跑、结果热继电器整定值设错、电机烧了的。
5. 跨过第一道坎:模拟量、通讯和数据处理
只会数字量,你能做的项目就停留在“按按钮、动气缸”这个层面。真实的设备要读温度、压力、流量,要和触摸屏、变频器、上位机通信,这部分是入门到能干活的分水岭。
5.1 模拟量采集与量程换算:公式只有一个,但要会灵活用
模拟量模块把 4-20mA 或 0-10V 的连续信号,转换成一个整数码值存到寄存器里。不同厂商的码值范围不一样:常见的有 12 位模块(0 到 4095)、16 位模块(0 到 27648 或者 -32768 到 32767)。你不需要记住每个厂商的具体数值,但要会查手册并套用下面这个通用公式:
工程值 = (当前码值 - 零点码值) / (满量程码值 - 零点码值) × (量程上限 - 量程下限) + 量程下限拿一个具体例子算一遍。某压力变送器量程 0 到 1.0MPa,输出 4-20mA,接到 12 位模块的电流输入通道(模块把 0-20mA 映射到 0-4095)。那么:
- 4mA 对应的码值 = 4/20 × 4095 ≈ 819,这是零点码值
- 20mA 对应的码值 = 4095,这是满量程码值
- 量程跨度 = 1.0 - 0 = 1.0MPa
实测读到码值 2458,代入公式:
工程值 = (2458 - 819) / (4095 - 819) × 1.0 + 0 = 1639 / 3276 × 1.0 ≈ 0.500 MPa验算一下:2458 对应的电流是 2458/4095×20 ≈ 12mA,4-20mA 区间里 12mA 正好是中点,也就是 0.5MPa。对得上。
如果你用的是 16 位模块(0-27648 对应 0-20mA),零点码值就是 27648×4/20 ≈ 5530。公式不变,只是数字换了。
三个实操要点。第一,断线检测:如果读到的码值低于零点码值(比如 500,明显低于 819),说明传感器断线或者短路,程序里应该报故障,而不是把它当成负数用。第二,滤波:模拟量信号天然带噪声,最简单的做法是连续采 8 次求平均,或者用滑动平均(新值进来,把最老的值挤出去),能明显压住跳变。第三,标定:上面的公式是理论值,实际使用中会有零点漂移和增益误差,正规做法是在现场用标准信号源或者实际工况下的人工读数做两点标定,把实际测量的零点和满量程码值写进程序参数里,而不是写死。
5.2 通讯入门:以 Modbus RTU 为切口理解“报文对话”
工业现场最常见的串行通讯协议之一是 Modbus RTU,它的好处是简单、公开、几乎所有设备都支持。理解它,你就理解了绝大部分主从式通讯的套路:主机发问,从机回答,一问一答,不会抢话。
一帧典型的读取请求长这样(十六进制):
01 03 00 00 00 02 C4 0B拆开看:01是从站地址(站号 1),03是功能码(读保持寄存器),00 00是起始地址,00 02是读 2 个寄存器,最后两字节C4 0B是 CRC 校验(注意低字节在前)。从站正常回复的格式是:站号 + 功能码 + 字节数 + 数据 + CRC。
这里有个新手必踩的坑:地址偏移。有些设备手册标的是 40001 这种“1 基”的寄存器编号,但实际报文里要减 1 变成 0,因为协议本身是从 0 开始编址的。手册上写 40001,报文里得发00 00;手册写 40002,报文发00 01。这个偏移搞错,你会一直读到“非法数据地址”的异常码。
第二个坑是参数必须完全一致:波特率、数据位、校验位、停止位、站号,五样里有一样不对就通不上。调试时先确认硬件接线(A 接 A、B 接 B,有的设备 A/B 标反,接不通就对调试试),再用串口调试助手手动发一帧报文,能收到回复说明链路通了,再回到 PLC 程序里做轮询。
第三个是轮询节拍。一个主机带多个从站的时候,程序里要按顺序一个个问,每个从站中间留够响应超时时间(一般 200 到 500ms),超时就跳过继续下一个,不能让某一个从站掉线把整个轮询卡死。这个逻辑用定时器加步序号实现,是新手写通讯程序时最该照抄的骨架。
5.3 数据处理的三个实用套路
滑动平均滤波:用一个长度为 8 的缓存区,每次采样把最老的数据挤出去,然后求平均。梯形图里可以用移位指令或者间接寻址实现,也能用结构化文本写循环,看你的程序风格。
报警限值管理:不要在现场程序里到处写> 100,把限值放到 D 寄存器里做成参数,触摸屏上可以改。上下限、回差(防止在限值附近反复报警)都要做成参数,这是“能交付的项目”和“练手程序”的区别。
配方管理:设备要生产不同规格的产品,每个规格对应一组参数(时间、温度、压力、速度)。做法是把参数按顺序存到连续的 D 寄存器区,配方切换就是把这组数从存储区搬到运行区。入门阶段的简化版就是“三组参数用三个起始地址,用选择开关切换”,很容易实现。
6. 常见问题与排查技巧实录
这一章是我踩过的坑里最值钱的部分,都是文档上不会写、但现场一定会遇到的。
6.1 输入不亮、输出不动,按这个顺序查
输入点不亮,排查顺序是:先量输入端子上有没有电压(有电压说明外部线路通,问题在模块或地址)→ 再看模块上那个点的指示灯亮不亮(灯亮但程序里没变,说明地址写错了)→ 然后查公共端接法对不对(漏型/源型搞反,灯永远不亮)→ 最后量传感器供电是否正常(三线制接错,传感器根本不工作)。
输出点不动,排查顺序是:程序监控里看 Y 点有没有输出(没有,是程序逻辑问题;有,往下走)→ 量输出端子对公共端有没有电压(没有,模块可能坏了或者输出分组电源没接)→ 直接短接输出端子和电源,看负载动不动(动,说明模块输出级有问题)→ 负载不动就量负载本身的线圈电阻(断了就是烧了)。
这个顺序的核心思路是从“程序内部”到“模块”再到“外部负载”逐层缩小范围,而不是一上来就拆线。
| 现象 | 最可能的原因 | 验证动作 |
|---|---|---|
| 输入灯不亮,程序不变 | 公共端接反 / 传感器类型不匹配 | 万用表量信号线电压变化 |
| 输入灯亮,程序没反应 | 地址写错 / 程序里被别处覆盖 | 监控里直接看该 X 地址 |
| 输出有指示,负载不动 | 输出分组电源未接 / 负载烧毁 | 量端子电压、量负载电阻 |
| 输出无指示,程序有驱动 | 双线圈覆盖 / 该段逻辑未执行 | 程序末尾检查重复 OUT |
| 运行一段时间随机停机 | 24V 电源容量不足 / 干扰 | 量电源电压波动、查接地 |
| 通讯时通时断 | 终端电阻未接 / 屏蔽线未单端接地 | 加终端电阻、改接地方式 |
6.2 逻辑类问题的三个“反直觉”真相
第一个:定时器不走,不一定是定时器坏了。定时器的使能条件必须是“持续为真”的,如果中间断了哪怕一个扫描周期,定时器就复位重来。常见场景是:你用某个按钮的上升沿去启动定时器,按钮松手后条件就没了,定时器当然不走。正确做法是用自锁后的状态去驱动定时器。
第二个:计数器一次加了好几个数,也不是计数器坏了。那是因为你用了普通触点而不是上升沿。按钮按下期间信号保持了成百上千个扫描周期,每个周期都加一次。换成上升沿触点就正常了。
第三个:程序里明明写了对的输出,实际就是不动,可能根本不是程序的问题。检查一下有没有在别处用 SET 把它置位了却没复位,或者有没有在其他程序块(中断、子程序)里也对这个输出做了操作。程序规模一大,这类问题就特别隐蔽,所以我一直强调“一个输出只在一处驱动”。
6.3 现场调试的几条硬经验
程序一定要有版本管理。别用“程序1”“程序2”“程序最终版”“程序最终确认版”这种命名,用日期加改动说明,比如20240512_加了急停确认。每次改完下载到设备之前,先把老程序读回来存一份。我吃过一次亏:现场改了几行逻辑,改崩了想退回,发现老程序已经被覆盖,只能凭记忆重写。
接地和屏蔽线是干扰问题的九成答案。模拟量跳变、通讯偶发错误、输入点误动作,八成以上和干扰有关。做法是:模块的模拟量信号用屏蔽双绞线,屏蔽层只在 PLC 侧单端接地(两端接地会形成地环流,反而更糟);信号线和动力线分管走线,平行距离越远越好;变频器输出线用屏蔽电缆,屏蔽层两端接地。
24V 电源的容量永远要算一遍。本体、每个传感器(一般二三十毫安)、每个中间继电器(几十毫安)、触摸屏(几百毫安),加起来往往比你想象的多。电源带不动的时候,表现是“设备一切正常,但偶尔莫名复位”,特别难查。
下载程序前确认设备处于安全状态。程序下载过程中输出会全部断开,如果设备正在运行,突然停机可能造成工件报废甚至机械损伤。养成习惯:下载前先让设备停在安全位,把模式开关打到手动。
备份三份,存在三个地方。现场电脑一份、U 盘一份、公司服务器一份。这话听着老派,但真出事的时候,你会感谢自己。
7. 学习路线怎么排,以及几个能少走弯路的建议
写到这里,把路线串一遍。第一个月,把硬件台子搭起来,把 X/Y/M/T/C/D 这套东西用熟,启保停、互锁、边沿、定时计数器练到闭着眼睛能写;第二个月,做两三个完整小项目——电机正反转、气缸顺序动作、红绿灯或者传送带分拣,重点练 IO 分配和调试流程;第三个月开始啃模拟量和通讯,把“读书籍手册”和“上机验证”绑在一起做,看一段就敲一段。
有件事我想单独说说:别迷信“学完再做”,要“边做边学”。PLC 这行的知识结构是从现场往上长出来的,你把一本教材从头看到尾,效果不如接一个真实的活儿,被一个真实的 bug 卡住三天。我自己的经验是,每学一个新指令,立刻找一个应用场景把它用掉,哪怕是给一个指示灯加个闪烁,也比干看强。
另外提醒一句关于教程选择的事。网上那些“十分钟精通 PLC”的内容,基本都是把别人写好的程序念一遍,你看完会有一种“我懂了”的错觉,一上手就发现连软件界面都找不到。判断一份教程值不值得看,标准很简单:它有没有展示调试过程和出错时怎么排查。只展示最终正确结果的,参考价值有限。
最后留个小技巧给手头暂时只有一台设备的同学:拿这台设备当练习对象,把它的控制逻辑反推出来,画成 IO 表,自己重新写一遍,然后和原程序对比。这是性价比最高的练法——你不用买任何新硬件,就能接触到真实项目的复杂度,而且能立刻看出自己和“写这个程序的人”差在哪儿。我带过的新人里,用这个法子进步最快的那位,两个月就能独立处理现场的小故障了。