这段时间在调一套小型自动化设备,PLC需要根据工艺曲线自动修改电机转速,天天让人跑去变频器面板上按上下键根本不现实。所以我把台达DVP ES系列PLC(手头这台是ES2)和台达MS300变频器通过RS-485串了起来,用Modbus RTU协议做主从通讯。整套方案不复杂,但涉及到硬件接线、变频器参数、PLC通讯格式、指令编程、现场调试这一整条链路,中间有不少坑。这篇文章就把这次实战从头到尾捋一遍,从“为什么这么选型”讲到“每根线怎么接”“参数怎么设”“程序怎么写”,最后再聊聊我踩过的几个典型问题。适合正在做类似项目的电气工程师、设备调试人员和刚入门自动化通讯的新手,按这个流程走一遍,基本能把通讯跑通。
1. 项目背景与整体方案选型
1.1 为什么要做PLC与变频器通讯
最常见的变频器控制方式有几种:面板操作、外部端子控制、模拟量给定、通讯控制。面板操作最简单,但只能人工干预,设备要按工艺自动调速的时候就废了。外部端子控制能实现多段速,但段数有限,调速精度也受限于端子组合,不能实现无级连续给定。模拟量给定(比如0~10V或4~20mA)是比较传统的自动化方案,但是模拟量容易受干扰,线路上有压降,而且精度和分辨率都一般,还要额外占用PLC的模拟量模块。
通讯控制的优势在于:一条双绞线就能同时完成启停、正反转、频率给定、状态监视、故障读取,还能组网带多台变频器,成本低、接线少、信息量大。对于需要经常修改转速、远程集中控制、或者要和触摸屏上位机联动的设备,通讯几乎是必选方案。
1.2 为什么选Modbus RTU和RS-485
Modbus RTU是工业现场最普及的通讯协议之一,PLC和变频器两侧都是原生支持,不需要额外加通讯模块。协议本身是主从问答式:主站发请求,从站应答,一个问一个答,逻辑简单清晰,调试的时候拿串口助手就能把报文抓出来分析。
物理层选RS-485而不是RS-232,是因为RS-485是差分信号传输,抗干扰能力强,传输距离可以达到1200米(低速时),而且支持多点组网,一台PLC可以挂几十台变频器。RS-232虽然接线更简单,但传输距离只有十几米,点对点,现场根本不够用。
这套方案的架构就是:PLC作为Modbus主站,通过COM2口的RS-485总线连接MS300变频器的通讯端子,变频器作为从站。PLC按工艺逻辑周期性地向变频器写入运行命令和频率指令,同时读取变频器的运行状态和当前频率,实现闭环监视。
2. 硬件准备与接线规范
2.1 关键硬件清单
做这个项目之前先把硬件列清楚,省得到现场发现缺东西。我这次用的配置如下:
| 硬件 | 型号/规格 | 作用 |
|---|---|---|
| PLC | 台达DVP-ES2系列(带COM2 RS-485口) | Modbus主站,逻辑控制 |
| 变频器 | 台达MS300系列 | 驱动电机,Modbus从站 |
| 通讯线 | 双绞屏蔽线(推荐RVSP 2×0.5或以上) | RS-485信号传输 |
| 终端电阻 | 120Ω电阻2个(也可以买成品终端电阻头) | 抑制信号反射 |
| 编程电缆 | USB转RS-232/485或台达专用编程线 | PLC程序下载 |
| USB转RS-485调试器 | 常用国产品牌即可 | 单独调试变频器通讯 |
DVP ES2系列的标准型主机本身就带两个通讯口,COM1是RS-232,COM2是RS-485,不需要额外扩展通讯板,这是选它做这类项目的很大优势。如果用的是不带RS-485的型号,那就得加通讯扩展卡,成本和接线复杂度都会上来。
2.2 RS-485接线:A接A,B接B,别接反了
RS-485是两线差分,一般标A(或D+、DATA+)和B(或D-、DATA-)。PLC的COM2端子上找到D+和D-,MS300变频器的通讯端子上找到S+和S-(有些批次标MOD+和MOD-),然后把D+接S+,D-接S-。
这里最容易犯的错就是把A和B接反,接反之后现象很典型:通讯完全没反应,变频器不报错,PLC也不报错,就是数据写不进去。排查的时候第一个就要怀疑是不是线序反了,把两根线对调一下再试。我现场调试时在通讯端子旁边贴了个小标签,写明哪根是正哪根是负,免得后面维护的人再踩这个坑。
还有一点容易被忽视:屏蔽线的屏蔽层要如何处理。通常做法是屏蔽层单端接地,也就是只在PLC这边接地,变频器那边悬空,避免形成接地环路。如果两边都接地,地电位差会产生环流,反而引入干扰。
2.3 走线规范与终端电阻
通讯线一定要远离动力线,尤其是变频器输出侧到电机的那段电缆,那是现场最大的干扰源。我见过一个项目,通讯线跟电机电缆捆在一个线槽里走了十几米,结果是变频器一启动通讯就丢包,后来把通讯线单独走槽,问题才解决。
如果通讯距离比较长,或者现场变频器台数多,RS-485总线的两端要各接一个120Ω终端电阻。终端电阻的作用是吸收信号在电缆末端产生的反射,没有它,高速通讯时数据容易出错。距离短(几米以内)或者只有一台从站的情况下,不接终端电阻通常也能跑,但现场环境复杂时还是老老实实接上。我这次PLC到变频器距离不到两米,就没有加终端电阻,通讯一直很稳定。
3. 通讯参数配置:两头必须对齐
3.1 MS300变频器侧要改哪些参数
变频器出厂默认是面板控制,不改参数的话,PLC就算通讯上了也控制不了它。MS300上关键要设置这几项:
| 参数 | 设置值 | 说明 |
|---|---|---|
| 00-20 | 1 | 通讯地址(从站号),多台设备时依次编1、2、3… |
| 00-21 | 9600bps对应档位 | 通讯波特率,我这里对应值为1,具体以面板或手册为准 |
| 00-22 | 8-E-1 | 通讯数据格式:8数据位、偶校验、1停止位 |
| 05-00 | 2 | 第一运行指令来源设为“通讯” |
| 05-01 | 2 | 第一频率指令来源设为“通讯” |
这里重点提醒:不同批次固件的MS300参数编号可能有细微差异,比如波特率对应的档位数值,有的固件里9600对应1,有的对应3或4,一定要按手头那台机器面板上的选项表核对,别照抄网上别人的参数。我习惯把变频器参数修改前先拍一张出厂值照片,改坏了可以恢复。
05-00和05-01这两个参数特别关键。05-00决定运行指令(启停、正反转)从哪里来,05-01决定频率指令从哪里来,都改成“通讯”之后,面板上的RUN键可能就不好用了,因为控制权已经交给通讯。调试的时候如果出现“PLC发命令但变频器没反应”,先检查这两个参数是不是还是面板或端子控制。
3.2 PLC侧通讯格式:D1120寄存器怎么算
台达DVP ES2的COM2通讯格式是通过特殊寄存器D1120来设置的。这个寄存器的每一位都有含义,所以不能乱写一个数进去,要按位定义去拼。
D1120的常见位定义是这样的:bit0~bit2是波特率,bit3是数据长度(0为7位,1为8位),bit4~bit5是校验方式(00为无校验,01为奇校验,11为偶校验),bit6是停止位(0为1位,1为2位),bit7是通讯模式(0为主站,1为从站)。
我要设置的格式是:9600bps、8位数据、偶校验、1停止位、主站模式。按位拼起来就是:
- 波特率9600:bit0~bit2 = 010
- 8位数据:bit3 = 1
- 偶校验:bit4~bit5 = 11
- 1停止位:bit6 = 0
- 主站模式:bit7 = 0
组合后的二进制是00111010,十六进制就是H3A。所以程序初始化里写 MOV H3A D1120。如果你的通讯格式不一样,比如7位数据、无校验、2停止位,那拼出来的值就完全不同,千万不要照抄。建议拿到PLC手册,翻到通讯设置那页,对着位定义表自己算一遍,以后换型号也不慌。
3.3 两端参数必须完全一致
Modbus RTU通讯的本质是双方按同一个波特率、同一种数据格式收发数据。PLC设成9600、8、E、1,变频器也必须设成完全一样的值,哪怕只有校验位不一样,数据就解析不对。
这里分享一条调试经验:我先把USB转RS-485调试器接到变频器上,用串口调试助手直接发Modbus报文,确认变频器通讯正常后再接PLC。这样可以把问题范围缩小——如果调试助手能控制变频器,说明变频器没问题,问题在PLC侧;如果调试助手都不行,那就先排查变频器参数和通讯线。不要一上来就把PLC和变频器接在一起调试,两边都不通的时候根本不知道怪谁。
4. PLC程序设计与实现
4.1 MODRW指令:读写变频器寄存器的钥匙
台达ES2的通讯程序最常用的是MODRW指令,专门用来做Modbus读写,比用RS指令自己拼报文简单得多。指令格式是:
MODRW S1 S2 S3 S4 S5- S1:通讯口编号,K1是COM1,K2是COM2,我这里用K2
- S2:从站地址,也就是变频器的通讯地址,1号机就写K1
- S3:Modbus功能码,K3是读保持寄存器(03H),K6是写单个寄存器(06H),K16是写多个寄存器(10H)
- S4:寄存器地址,这里要用十六进制,比如H2000
- S5:对于写单个寄存器,S5是要写入的数据(常数或寄存器都行);对于读寄存器,S5是读取结果存放的寄存器首地址
我用项目里最常用的几个寄存器地址来举例。台达MS300变频器的通讯地址表里,2000H是运行命令寄存器,写1正转启动、写2反转启动、写0停止;2001H是频率指令寄存器,单位是0.01Hz,也就是写5000代表50.00Hz;2100H是状态字寄存器;2102H是当前输出频率寄存器。
4.2 启停控制程序:最基础也最关键
启动和停止的逻辑我建议做成脉冲触发,不要一直写。因为MODRW如果每个扫描周期都在执行,通讯线上会不停地发报文,频率非常密,容易造成总线拥堵,也会占用PLC扫描时间。我这里用PLS指令把启动按钮信号转成上升沿脉冲,脉冲触发一次MODRW,写一次就停。
// 正转启动:M0按下后,通过M20上升沿触发一次写操作 LD M0 PLS M20 LD M20 MODRW K2 K1 K6 H2000 K1 // 停止:M1按下后,触发一次写0命令 LD M1 PLS M21 LD M21 MODRW K2 K1 K6 H2000 K0这里面有个细节,写K1是正转启动,写H0(或者K0)是停止。如果你想让变频器停止时不是自由停车而是减速停车,那要在变频器参数里设停车方式,通讯只管下发命令,停车曲线由变频器自己执行。
我调试时还发现一个现象:如果启动和停止之间的时间间隔太短,变频器可能还没来得及响应上一条命令,下一条就来了。所以如果工艺上有快速启停的需求,程序里最好加一个最小间隔时间限制,我用一个定时器保证两次通讯写操作之间至少间隔50ms,实测运行稳定很多。
4.3 频率给定:注意单位和数值换算
频率指令寄存器2001H的单位是0.01Hz,这是新人最容易翻车的地方。如果你想给50Hz,往2001H里写K50,那变频器实际收到的就是0.50Hz,电机动都不带动一下,还以为通讯坏了。
正确做法是先把目标频率乘以100再写入。比如目标频率50.00Hz,程序里计算得到5000,写入2001H。
// 初始化时把目标频率放到D0,单位0.01Hz LD M1002 // 首次扫描脉冲 MOV K5000 D0 // 50.00Hz // 频率写入:M22上升沿触发,把D0的值写入2001H LD M22 MODRW K2 K1 K6 H2001 D0如果HMI触摸屏上操作员输入的是Hz整数,比如直接输入50,那程序里要先做一次乘法:
// D2是触摸屏输入的整数Hz值,D0是实际写入的0.01Hz值 LD M1002 MUL D2 K100 D0这样操作员界面友好,程序内部又符合变频器的数据格式。如果涉及到小数频率,比如输入50.50Hz,那HMI的数据格式要设置成两位小数,D2里存的就是5050,走上面的流程也能对上。
4.4 状态与频率读取:别让变频器变成黑盒
控制只是单向的,如果不知道变频器现在实际输出多少频率、有没有在运行、有没有故障,那这套系统就是开环的,不安全。我习惯周期性地读取变频器的状态字和当前频率。
// M1013是台达PLC的1秒时钟脉冲 LD M1013 MODRW K2 K1 K3 H2102 D11 // 读取当前输出频率到D11 LD M1013 MODRW K2 K1 K3 H2100 D10 // 读取状态字到D10读取到的D11单位同样是0.01Hz,显示的时候除以100就是实际的Hz数。状态字D10的bit0一般是运行中标志,可以用位测试指令去判断:
LD D10.0 // 读取状态字bit0,运行中 OUT Y0 // 驱动运行指示灯这里就要说到轮询的问题了。如果程序里同时有好几条MODRW读取指令,尽量不要把它们放在同一个扫描周期里连续执行,否则总线上的报文发送太密集,容易产生冲突。我实际的做法是用M1013的1秒时钟配合一个计数寄存器,把“读频率”和“读状态”两个操作错开:第一个1秒周期读状态,第二个1秒周期读频率,轮流来。这样虽然数据刷新不是实时的,但对大多数监控场景完全够用,而且总线负载低,稳定得多。
4.5 完整程序框架与启动时序
把上面的模块拼起来之后,程序的基本流程是:上电初始化(设D1120通讯格式、给D0赋默认频率),然后进入主循环。主循环里处理启动停止按钮、频率变更触发、周期读取状态和频率、处理通讯超时标志。
启动时序上,我的习惯是“先给频率,再给运行”。因为有些变频器如果运行指令先到而频率指令还没更新,可能会用上一次的频率甚至0Hz启动一下,虽然时间极短,但对设备总归是个冲击。所以程序里做一个顺序:M0按下后,先把D0的频率值写入2001H,延时80ms左右再写2000H运行命令。80ms这个值不用很精确,只要让变频器有时间处理完上一条写频率的命令就行。
// 频率写入后延时100ms再启动 LD M20 OUT T0 K10 // 100ms延时(10ms为1个单位) LD T0 PLS M23 LD M23 MODRW K2 K1 K6 H2000 K1实测这样处理之后,变频器每次启动都是按设定频率平滑加速,没有出现“先抖一下再上去”的情况。
5. 调试过程与常见问题排查实录
5.1 完全通讯不上的排查思路
如果PLC程序写好了,变频器参数也设了,但通讯就是没反应,按这个顺序排查:
第一步,先把PLC摘掉,用USB转RS-485调试器直接接变频器,用串口调试助手发一条命令。比如发01 06 20 00 00 01,这是往1号从站的2000H寄存器写1,变频器应该立即启动。如果这条命令能让变频器转起来,说明变频器侧的通讯设置和接线都正常,问题在PLC侧。如果没反应,检查变频器的通讯地址是不是1、通讯来源是不是设成通讯、波特率和数据格式是不是跟调试助手一致。
第二步,检查PLC和变频器的线序,A/B是否接反。用万用表量一下PLC的D+到变频器的S+是不是通的,D-到S-是不是通的,别只看线色。
第三步,检查PLC的D1120设置。很多情况下是D1120没写进去,或者位定义算错了,导致PLC实际按另一种格式在发数据。用在线监控看D1120当前的数值,对照位定义表确认。
第四步,确认MODRW指令到底有没有执行。在MODRW前面加一个计数器或者置位一个内部继电器,在线监控里看程序走到这一步没有。这一步能区分是程序逻辑问题还是物理链路问题。
5.2 数据错位与格式问题
能通讯但不正常,十有八九是数据处理的问题。
最常见的是地址进制搞错。台达的MODRW指令中S4寄存器地址要用十六进制,H2000就是十六进制的0x2000。如果你心里想的是“2000号寄存器”,结果写成了K2000,那在Modbus报文里地址就是0x07D0,完全不是同一个寄存器。我最初调试的时候就在这里栽过跟头,写频率指令一直没反应,查了半天才发现是K2000和H2000的区别。指令地址必须用H前缀的十六进制。
第二个常见问题是频率单位。2001H以0.01Hz为单位,写5000才是50.00Hz,写50那只有0.50Hz。这个前面强调过了,但在现场看到电机不转的时候,人的第一个念头往往是“通讯坏了”,而不是“数据算错了”。所以我给所有跟频率打交道的寄存器和变量都在注释里标明单位,D0后面标注“×0.01Hz”,这样回头查程序不会一头雾水。
第三个问题是校验和格式不匹配。PLC设成8E1,变频器设成8N1,这种配置错误的现象是:变频器会收到报文但解析失败,有时候会回异常码,有时候干脆不应答。把两边的数据格式统一成一样的就行了。
5.3 通讯不稳定的处理实录
通讯完全不通的问题相对好查,最烦人的是那种“时通时断”“变频器一会儿有反应一会儿没反应”的情况。
我在一个现场遇到过:变频器启动瞬间通讯丢包,频率指令写不进去,电机转速不稳定,PLC偶尔还会报通讯超时。查到最后发现是通讯线和变频器的动力输出线走了同一个线槽,变频器一加速,输出电流变化大,电磁干扰全耦合到通讯线上来了。解决办法是把通讯线单独走槽,跟动力线保持至少20cm以上的距离,最好用屏蔽双绞线并做好屏蔽层接地,问题彻底消失。
还有一个典型案例是设备运行几小时之后开始通讯异常,重启PLC又好了。这种一般是通讯报文发太密,长期跑导致从站来不及响应,或者线路上有干扰积累。处理办法是降低通讯频率,把MODRW的轮询间隔从几百毫秒放宽到1秒左右,同时对MODRW增加超时和重试逻辑,超时就重发一次,而不是干等。
5.4 常见问题速查表
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| PLC发命令变频器无任何反应 | 通讯线A/B接反 | 对调D+和D- |
| PLC发命令变频器无任何反应 | 变频器运行/频率来源不是通讯 | 05-00、05-01设为2 |
| PLC发命令变频器无任何反应 | PLC的D1120通讯格式与变频器不一致 | 核对波特率、数据位、校验位 |
| 能启停但频率上不去 | 频率指令没写入或单位错了 | 确认写的是2001H,数值×100 |
| 可以控制但数据偶尔错乱 | 校验位两端不匹配 | 统一为8-E-1 |
| 变频器启动时通讯丢包 | 通讯线离动力线太近 | 分开走线,用屏蔽线并单端接地 |
| 通讯超时频繁报警 | 发送频率太高或总线负载大 | 加长轮询间隔,增加重试逻辑 |
| 距离超过几十米或设备多台 | 缺少终端电阻 | 总线两端各加120Ω终端电阻 |
6. 实战心得与扩展方向
6.1 几个能明显提升可靠性的细节
第一个细节是通讯超时标志的判断。台达PLC在执行MODRW时,如果从站长时间不应答,会置位M1129通讯超时标志。程序里可以在MODRW后面加一个判断,M1129一ON就计数,连续超时几次就停机报警。这样如果现场出现通讯线松动、变频器故障等情况,设备能及时停下来,而不是带着错误频率继续跑,避免安全事故。
第二个细节是通讯参数设置不要只写在初始化段里。我习惯用首次扫描脉冲M1002来写D1120和D0初值,但有些情况下,比如PLC程序被强制停止后再运行,初始化段不一定会再执行一遍。所以关键通讯参数也可以放在一个“上电后延时1秒自动执行一次”的逻辑里,确保每次PLC运行都重新初始化一遍通讯格式。
第三个细节是保存变频器参数。MS300可以把参数批量存储到内部某个参数组,或者用面板的复制功能把参数备份到SD卡(如果支持的话)。每次调试完,把变频器参数表打印一份放在电控柜里,后面维护时省很多事。我在现场见过因为电池没电导致变频器参数全部恢复出厂设置的情况,没有备份的话整个参数重新调一遍,半天时间就没了。
第四个细节是组网时每台变频器通讯地址要唯一。如果有三台变频器,地址分别是1、2、3,然后PLC轮流读取每台的数据,程序里只是把MODRW的S2参数从K1改成K2、K3,结构完全一样。我一般把通讯地址做成分散在电控柜面板上的小标签,哪台是1号、哪台是2号,一眼就能看明白,调试和排障都方便。
6.2 后续还能怎么扩展
这套通讯方案跑通之后,扩展方向很多。最直接的是加触摸屏,把PLC读回来的频率、电流、状态显示在HMI上,同时通过HMI修改目标频率并写入D0,再由PLC下发给变频器,人机交互就完整了。
还可以接上位机做数据采集。PLC作为网关,把多台变频器的运行数据汇总,再通过以太网模块上传到上位机或者云端平台。这样设备管理人员在办公室就能看到每台电机的运行状态,不用去现场一台一台抄表。
如果后续要控制更多类型的从站设备,比如智能仪表、温控器,只要它们支持Modbus RTU,通讯程序的结构完全不用变,换一下从站地址和寄存器地址就行。Modbus这个协议的通用性就在这里,学会一套,整个工控通讯的大门就算打开了。
最后说一个我自己总结的经验:调试通讯项目,心态要稳。不要想着一步到位,先把链路单独调通,再和PLC联,联通了再优化时序,最后再做监控页面。一步一步来,问题出在哪一步,就回到哪一步查,效率反而最高。这次PLC和变频器通讯的过程虽然有些波折,但跑通之后再回头看,整个方案其实很清晰。希望这篇实战记录能让你少走几个弯路。