第4章:PLC与变频器通信:Modbus RTU协议基础、PLC读写变频器频率指令

各位同行,咱们今天聊聊PLC和变频器怎么“对话”。

说实话,做纺织张力控制,最核心的就是让PLC能随时告诉变频器:“哥们,现在给我跑这个频率!”反过来,变频器也得告诉PLC:“收到,我现在实际跑了多少。”这个对话,靠的就是Modbus RTU协议。

4.1 Modbus RTU协议基础

Modbus RTU,说白了就是一种“主从问答”式的通信方式。PLC是主站,变频器是从站。主站问,从站答。不问,不答。

物理层:通常用RS485总线。两根线(A+、B-),半双工,距离能到1000多米。我在项目里遇到过,有些新手把A和B接反了,结果死活通信不上。嗯,这个坑我踩过。

数据帧格式:每个报文长这样:

地址码 功能码 数据区 CRC校验
1字节 1字节 N字节 2字节

常用功能码:

  • 03H:读取保持寄存器。比如读变频器当前频率。
  • 06H:写单个寄存器。比如写目标频率。
  • 10H:写多个寄存器。批量设置参数时用。

重点:变频器的参数地址,每家厂商定义不同。比如台达VFD-M系列,频率指令地址是2001H。三菱FR-D700系列,地址是H2000。一定要查手册!

4.2 PLC读写变频器频率指令

我以三菱FX3U系列PLC为例,给大家演示一下怎么读写频率。

第一步:PLC通信参数设置

用编程软件设置D8120特殊寄存器。我习惯这样配:

D8120 = 0C8E  (H0C8E)
含义:9600波特率,8数据位,无校验,2停止位,RS485通信

第二步:写频率指令(06功能码)

假设变频器站号是1,频率指令地址是H2000,目标频率是30.00Hz(对应数值3000)。

发送报文:01 06 20 00 0B B8  (CRC校验码由PLC自动计算)
01:从站地址
06:写单个寄存器
20 00:寄存器地址高8位、低8位
0B B8:数据(3000的十六进制)

在PLC里,我用RS指令实现:

LD M0          // 触发写频率
MOV H2000 D100 // 寄存器地址
MOV K3000 D101 // 频率值
RS D100 K4 D200 K8 // 发送4字节,接收8字节

我的经验:写频率时,记得把浮点数转成整数。比如30.00Hz,变频器内部通常用3000表示。你直接写30,它可能只跑0.30Hz。这个坑,我见过好几个工程师栽过。

第三步:读当前频率(03功能码)

读变频器当前运行频率,地址同样是H2000。

发送报文:01 03 20 00 00 01  (CRC自动计算)
01:从站地址
03:读保持寄存器
20 00:起始地址
00 01:读取1个寄存器

PLC接收到的返回报文:

01 03 02 0B B8  (假设当前频率30.00Hz)
01:从站地址
03:功能码
02:数据字节数(2字节)
0B B8:频率值3000

PLC程序处理:

LD M1          // 触发读频率
MOV H2000 D100 // 起始地址
MOV K1 D101    // 读取数量
RS D100 K4 D200 K8 // 发送4字节,接收8字节
// 接收到的数据在D201(高字节)和D202(低字节)中

4.3 避坑指南

我曾经遇到过的几个典型问题:

  • 通信超时:变频器响应慢,PLC超时设置太短。我一般设500ms以上。
  • CRC校验错误:数据线太长或干扰大。加终端电阻(120Ω)能解决。
  • 地址冲突:多台变频器站号重复。我习惯用拨码开关设置,现场改起来方便。
  • 数据类型搞混:有些变频器频率用16位整数,有些用32位浮点数。查手册!查手册!查手册!

4.4 实战小技巧

你想想看,张力控制中频率变化很频繁。我建议这样做:

  1. 建立心跳机制:每100ms读一次当前频率,确保闭环控制及时。
  2. 写频率前先校验:别让PLC写出超出变频器范围的频率值。
  3. 用数组管理多台变频器:比如D100-D199存1号变频器参数,D200-D299存2号。程序写起来清爽多了。

我个人习惯,在程序开头加一段初始化通信的代码。上电后先发一条空指令,确认变频器在线。如果没回应,直接报警停机。为什么?因为通信断了,张力控制就失控了,纱线会断得一塌糊涂。

好了,这一章就到这里。下一章咱们聊聊怎么用PID指令配合变频器做恒张力控制。那个更有意思。

本章核心要点:

  • Modbus RTU是主从协议,PLC做主站
  • 03功能码读频率,06功能码写频率
  • 频率值要转成整数(如30.00Hz→3000)
  • 通信参数、地址、CRC校验,一个都不能错

公众号:蓝海资料掘金营,微信deep3321