做自动化改造这几年,PLC和变频器通讯是绕不开的活。尤其在老设备升级、小产线联网这类项目里,用三菱FX3U带着变频器走Modbus RTU,几乎是出场率最高的组合。前阵子我正好帮一个朋友把车间里几台独立启停的变频器改成触摸屏远程控制,用的就是FX3U PLC加FX3U-485-BD通讯板这套方案。
这个案例的典型场景是:手头有一台FX3U,想通过RS-485总线控制一两台三菱变频器,完成启停、频率设定、频率和电流读取这些基本操作,同时省去一路一路硬接线的麻烦。适合刚接触PLC通讯的电气工程师、设备维护人员和做小型自动化改造的同行参考。整个方案的核心就三件事:硬件接线、通讯参数配置、ADPRW指令的灵活使用。
先说结论,这套方案成熟可靠,成本也低。485-BD通讯板几百块,一根屏蔽双绞线就搞定,不需要额外买专用通讯模块。但它有一个明显的门槛:Modbus寄存器地址换算和指令格式容易把人绕晕,尤其是第一次接触ADPRW指令时,K1、K2、H2001这些参数看着简单,组合起来很多人第一反应就是懵。
下面我按实际做项目的顺序,把从接线到调试的完整过程拆开讲,包括我踩过的坑和后来总结出来的排查方法。
1. 硬件准备与接线细节
1.1 完整器件清单与选型理由
先列出这套案例用到的全部器件,缺一不可:
| 序号 | 器件 | 型号/规格 | 作用 |
|---|---|---|---|
| 1 | PLC | 三菱FX3U-32MR/ES或类似型号 | 控制核心,执行Modbus主站通讯 |
| 2 | 通讯扩展板 | FX3U-485-BD | 提供RS-485物理接口 |
| 3 | 变频器 | 三菱FR-E700系列或FR-E500系列 | 被控从站设备 |
| 4 | 通讯电缆 | 屏蔽双绞线,0.5mm²以上 | RS-485信号传输 |
| 5 | 终端电阻 | 120Ω,部分场景需要 | 阻抗匹配,防止信号反射 |
选型时注意:FX3U-485-BD只能插在FX3U主机左侧的通讯扩展板插槽里,FX3G、FX3GC这些机型也支持,但FX3U是工程上用得最多的。变频器带不带RS-485接口要看具体型号,三菱E系列和D系列一般都标配,老款A系列可能需要加选件卡,下单前先确认好。
通讯电缆方面,别图省事用普通电线。RS-485是差分信号,屏蔽双绞线的抗干扰能力是普通线的十倍不止。变频器本身是强干扰源,我曾经在同一个电柜里见过用普通两芯线通讯的,频率一上来偶发报警,换了屏蔽双绞线后故障再没出现过。线径选0.5到0.75平方毫米就够,通讯距离几十米内完全没问题。
1.2 485-BD扩展板的安装与接线
FX3U-485-BD是一块很小的扩展板,拆开PLC左侧盖板,直接插到专用插槽上,拧紧两颗固定螺丝就行。安装时要断电操作,带电插拔通讯板是会导致通讯芯片损坏的,这点别犯懒。
接线方法如下:
- PLC侧485-BD板上共有三个端子:SDA、SDB、SG。
- 变频器侧通常是RDA、RDB两个端子,外加一个SD端子用于屏蔽层接地。
- 接线对应关系:PLC的SDA接变频器的RDA,PLC的SDB接变频器的RDB。
- 屏蔽层单端接地,接到电柜的接地排上。
注意,三菱PLC的SDA、SDB和三菱变频器的RDA、RDB端子名称里那个字母A、B,和很多国产设备的A、B定义习惯是一样的,辨别标准就是看谁对应谁。如果换成别的品牌变频器,一定要先查看对方说明书,确认A+和B-的定义,接反了通讯绝对不通,但一般不会烧设备,只是数据收发异常。
接线完成后先别急着上电,再看一眼板上有没有终端电阻的拨码开关。485-BD上有一个用于接入120欧终端电阻的设置点,单台PLC带单台或者少数几台变频器时,直接把终端电阻开关打到ON位置。如果总线上挂了很多台从站,终端电阻应该接在总线最远端的两个节点上,中间节点不需要接,这个原则做过多机通讯后体会更深。
1.3 接地与布线经验
通讯不稳定十有八九是接地和布线的事。
变频器和PLC在同一个电柜里安装时,变频器的输出侧(U、V、W到电机)一定要走独立线槽,别和通讯线绑在一起。变频器的输出是PWM调制波形,谐波干扰非常强,通讯线一旦贴着输出线走,轻则通讯偶尔中断,重则完全连不上。
接地时注意一点:通讯屏蔽层要单端接地,不要两端都接。两端都接地会在屏蔽层里形成地环路电流,反而引入干扰。PLC侧的SG端子一般不需要和变频器的SD端子互接,只需要把屏蔽层处理好就行。
我见过一个很典型的案例:现场老是报通讯超时,查了半天,最后发现是PLC的接地线断掉了,变频器外壳的接地也接到同一条接地排上。重新压好接地端子后,故障消除。自动化设备调试,接地问题往往是隐性杀手,通讯异常时先把万用表打到交流电压档,量一下PLC和变频器的接地排之间有没有电压差,超过1V就要处理了。
2. 通讯参数与指令原理解读
2.1 D8120波特率格式寄存器配置
FX3U做Modbus RTU主站,和变频器通讯前必须先把串口格式寄存器D8120配置好。D8120是PLC内置RS-485通道的通讯格式设置寄存器,里面每一个位段定义了波特率、数据位长度、校验方式、停止位数等参数。
常用配置如下,对应9600bps、8数据位、偶校验、1停止位:
D8120 = H0C0E1这个十六进制数怎么来的?拆开看就清楚了:低4位的二进制是0001,代表9600波特率;bit4和bit5都是1,代表8位数据长度;bit6为0代表偶校验;bit8和bit9为0代表1位停止位。H0C0E1转成二进制是1100 0000 1110 0001,逐位对照就明白。
有些工程师图省事,默认值一填就完事,结果变频器那边参数是偶校验,PLC这边是默认的奇校验,数据怎么都对不上。D8120的配置必须和变频器的通讯参数完全一致,一个位都不能差。配置代码在程序初始化时用MOV指令写入一次即可:
LD M8002 MOV H0C0E1 D8120M8002是PLC的首次扫描脉冲,也就是PLC上电自动执行一次,保证每次启动都能把通讯参数初始化到位。
另一个容易忽略的问题:FX3U用了485-BD后,D8120仍然有效。如果你在GX Works里把通讯协议设置为“专用协议”,D8120的协议相关位还要和设备匹配。Modbus RTU模式下,ADPRW指令是专用的Modbus主站指令,不需要额外勾选什么,但PLC参数中的串口设置建议选为“专用协议”,否则可能会和别的通讯方式冲突。
2.2 ADPRW指令的参数语法拆解
ADPRW是三菱FX3U系列专门用于Modbus RTU主站通讯的指令,不需要装额外的功能模块,指令直接调用,非常方便。指令格式如下:
ADPRW S1 S2 S3 S4 D1 M1各参数拆开说:
| 参数 | 含义 | 示例 |
|---|---|---|
| S1 | 通讯通道指定 | K0表示485BD所在通道 |
| S2 | 从站号 | K1到K255,对应变频器Pr.117站号 |
| S3 | 功能码 | K1写位、K2写寄存器、K3读位、K4读寄存器 |
| S4 | 目标软元件/地址 | 变频器的Modbus寄存器地址 |
| D1 | 数据存储寄存器 | 写入的数据或读取到PLC的D寄存器 |
| M1 | 执行完成标志 | M10表示指令执行完毕 |
指令执行过程可以用一个例子说明:要让1号变频器的运行命令寄存器写入正转信号,指令写成
ADPRW K0 K1 K2 H2000 D0 M10意思是“通过485口,向1号从站的H2000地址写入D0寄存器的值”。指令执行完成后M10会置ON,程序里用M10作为下一步动作的联锁条件。
这里有个新手容易迷惑的地方:S4地址可以用“H”开头表示十六进制,也可以直接用K十进制的数字。比如H2000写成K8192,效果完全一样。实际编程时我习惯统一用H十六进制书写,因为三菱变频器手册里给的Modbus地址都是十六进制,照着抄不容易错。
在写触摸屏画面或者组态软件时,也经常要用到十进制地址,注意转换。我在项目里见过最离谱的接线错误,是有人直接把H2001这个十六进制数当成十进制2001填到程序里,变频器收到的地址完全不对,通讯失败自然也在情理之中。H2001的十进制是8193,填K2001差了6000多个地址。
2.3 功能码K1~K4与Modbus功能码的对应
ADPRW指令里的功能码看着简单,实际上是三菱封装好的Modbus功能码映射。对应关系如下:
| ADPRW功能码 | 对应Modbus功能码 | 功能说明 |
|---|---|---|
| K1 | 05H | 写单线圈(位元件),如启停控制 |
| K2 | 06H | 写单寄存器,如频率设定 |
| K3 | 01H | 读单线圈状态 |
| K4 | 03H | 读单寄存器,如读取输出频率、电流 |
理解这个对应关系非常重要。因为Modbus协议本身只定义了对线圈和寄存器的读写,而变频器的控制命令既可以用线圈方式表达,也可以用寄存器方式表达。三菱变频器的H2000运行命令寄存器,低位bit0是正转命令、bit1是反转命令,你既可以通过写线圈的方式单独操作正转位,也可以通过写寄存器的方式一次写入整个命令字。
实际项目中怎么选?我的建议是:如果只需要正转、反转、停止三个动作,直接用K1写线圈方式最直观;如果后续要扩展多段速、故障复位等复杂控制,用K2写寄存器方式更稳妥,因为你一次就能把命令字的所有位都写进去。
以启停控制为例,用K1写位方式:
ADPRW K0 K1 K1 M0 D0这里的M0是PLC里的位元件,把它作为线圈地址的参考号,写入的数据是D0的值(K1正转、K2反转)。需要说明的是,三菱ADPRW中S4指定位元件时,指令会自动把M元件的编号映射到Modbus线圈地址上,不用自己算偏移,这是它的方便之处。
而用K2写寄存器方式:
ADPRW K0 K1 K2 H2000 D0D0存的是命令字数据,K1正转、K2反转、K0停止。
两种方法都验证过没问题,但如果你同时控制两台以上变频器,我强烈建议用K2方式。原因后面说。
3. 实操案例一:启停控制与频率写入
3.1 变频器侧参数设置
通讯之前,变频器本身也要把Modbus参数设好。三菱FR-E700系列变频器,以下几个参数直接影响通讯:
| 参数号 | 参数名 | 设定值 | 说明 |
|---|---|---|---|
| Pr.117 | 站号 | 1 | 第一个从站设1,第二台设2 |
| Pr.118 | 通讯波特率 | 96 | 对应9600bps |
| Pr.119 | 通讯校验方式 | 2 | 偶校验 |
| Pr.120 | 通讯停止位长 | 1 | 1位停止位 |
| Pr.121 | 通讯数据位长 | 8 | 8位数据 |
| Pr.338 | 运行指令权 | 1 | 1为RS-485通讯 |
| Pr.339 | 频率指令权 | 1 | 1为RS-485通讯 |
这里有个经验:Pr.338和Pr.339非常关键,很多初学者通讯指令写对了,参数也对,但就是控制不了变频器,原因就是变频器根本不允许外部通讯来控制。Pr.338是运行指令权,Pr.339是频率指令权,都设为1才会把控制权交给RS-485口。
还有一点需要注意:Pr.79运行模式设定为外部运行或者组合运行模式时,也要保证它和Pr.338、Pr.339的设定不冲突。最简单的做法是把Pr.79设为2(外部运行模式),同时Pr.338和Pr.339都设为1,实测下来最稳。
Pr.121数据位长要特别提醒,FX3U的D8120里已经明确了数据格式是8位数据,变频器侧就必须也设成8位,如果变频器侧是7位数据,通讯同样不通。
按完参数要重启变频器,变频器参数修改后需要重新上电才能完全生效,这点和PLC程序下载后需要RUN模式类似。
3.2 启停控制:写位元件方式
先做个最简单的单台变频器正反转控制。硬件接线按前面说的,485-BD的SDA接变频器RDA,SDB接RDB。
梯形图逻辑是这样的:
- X0:正转启动按钮
- X1:反转启动按钮
- X2:停止按钮
- D0:命令数据寄存器
- M10:ADPRW写指令执行完成标志
正转启动的指令段:
LD X0 ANI M1 SET M1反转互锁逻辑:
LD X1 ANI M1 SET M2控制逻辑做完后,进入指令执行段,这里要特别留意:ADPRW是脉冲执行型还是持续执行型。程序里我用的是每次完成后复位再触发的写法,保证通讯指令不会在同一扫描周期重复触发:
LD M1 MOV K1 D0 SET M20 RST M1 LD M20 ADPRW K0 K1 K1 M0 D0上面这段的意思是:正转按钮按下时,把D0设为1,然后通过ADPRW指令写到变频器的运行命令位。这里S4用了M0,表示线圈地址基准。
但说实话,这套写法在实际项目里有个隐藏坑:M0作为S4参数时,它代表的线圈地址是三菱固定映射的,如果你的程序里M0还被其他地方使用了,容易产生地址冲突。所以我后来在正式项目里更推荐用K2写寄存器方式,直接对H2000这个寄存器下手:
LD M20 MOV K1 D0 ADPRW K0 K1 K2 H2000 D0这样写的好处是:地址明确,H2000是三菱变频器手册里公开的运行命令寄存器,一目了然,程序的可维护性大大提升。
3.3 频率写入:寄存器方式与数值换算
频率写入是Modbus通讯里最常用的功能。变频器频率设定寄存器是H2001,十进制8193。关键问题是数值换算。
三菱变频器的频率设定分辨率通常是0.01Hz,什么意思?就是你要设定50Hz,写入到H2001的值应该是5000,也就是50乘以100。同理,设定35.5Hz,写入值就是3550。反过来,读取运行频率时,从H2101读回来的值如果是4625,代表46.25Hz。
具体编程逻辑:
- D10:频率设定数据,单位0.01Hz
- 触摸屏输入目标频率后,程序做一次乘法:D11 = 目标频率×100
触摸屏上通常直接显示Hz单位,比如操作员输入50.00Hz,触摸屏传过来的数据可能是50.00这个浮点数的定点化形式。实际项目里我一般把D寄存器按0.01Hz为单位处理,触摸屏的显示格式设置成两位小数,这样通讯侧不用做浮点运算,简单可靠。
频率写入指令:
LD M30 ADPRW K0 K1 K2 H2001 D10D10里存的就是换算后的设定值。
这里有一个容易忽略的点:ADPRW指令执行过程中,D10的数据发出去后,指令自动完成,但如果你在程序里改了D10的值,不会影响已经发出的数据,因为Modbus协议一个报文只包含一个写操作。需要修改频率时,再次触发ADPRW指令即可。
关于指令触发,我个人的习惯是做一个“按要求命令”的节拍,基本逻辑如下:
- 触摸屏上的启动按钮置位M1。
- 程序检测到M1的上升沿,把启动命令寄存器D0写入正转值。
- 触发ADPRW指令。
- 指令执行完成标志M10置位。
- 程序把M10的值反馈给触摸屏,同时复位启动按钮。
用上升沿指令(PLS)触发ADPRW是最稳的,能避免扫描周期内重复触发导致通讯报文堆积。
3.4 完整梯形图逻辑编排
把启停和频率写进一个完整逻辑,软元件分配表如下:
| 软元件 | 功能说明 |
|---|---|
| X0 | 正转启动按钮 |
| X1 | 反转启动按钮 |
| X2 | 停止按钮 |
| X3 | 故障复位按钮 |
| M0 | 触摸屏正转命令 |
| M1 | 触摸屏反转命令 |
| M2 | 触摸屏停止命令 |
| D0 | 运行命令寄存器数据 |
| D10 | 频率设定值(0.01Hz单位) |
| M20 | 命令写入触发标志 |
| M21 | 频率写入触发标志 |
| M8405 | 通讯错误标志(系统专用) |
程序执行的顺序建议这样排:
第一段:从按钮正向逻辑到寄存器映射
LD X0 OR M0 ANI X2 ANI M1 SET M1第二段:反转逻辑
LD X1 OR M1 ANI X2 ANI M0 SET M2第三段:停止逻辑,优先级别最高
LD X2 RST M1 RST M2第四段:命令写入变频器
LD M1 ANI M2 MOV K1 D0 PLS M20 LD M2 ANI M1 MOV K0 D0 PLS M20 LD M20 ADPRW K0 K1 K2 H2000 D0第五段:频率写入
LD M8002 MOV H0C0E1 D8120 LD M10 MOV K5000 D10 PLS M21 LD M21 ADPRW K0 K1 K2 H2001 D10注意频率写入的触发条件,我用的是M10,也就是上电初始化完成标志。实际项目里,频率值一般来自触摸屏或模拟量换算,放在M21触发前赋值即可。
这套逻辑跑起来后,触摸屏上按正转,变频器就以设定频率运行。实测下来整个指令周期在几十毫秒量级,体感上几乎是即时响应。
4. 实操案例二:运行状态读取与轮询
4.1 读取输出频率与输出电流
写命令只是单向控制,如果要在触摸屏上实时显示变频器的运行频率、电流,就得用ADPRW的K4功能码读寄存器。
三菱变频器常用状态寄存器地址如下:
| 功能 | Modbus地址 | 十六进制 | 数据格式 |
|---|---|---|---|
| 输出频率 | 8449 | H2101 | 分辨率0.01Hz |
| 输出电流 | 8450 | H2102 | 分辨率0.01A |
| 输出电压 | 8451 | H2103 | 分辨率0.1V |
| 运行状态 | 8448 | H2100 | 位状态字 |
读取输出频率的指令:
ADPRW K0 K1 K4 H2101 D20指令执行完成后,D20里存的就是读回来的频率值,单位是0.01Hz。需要对触摸屏显示时,程序里做一次除法,把D20除以100,显示到触摸屏的数值框里。
这里要特别注意数值范围。三菱变频器输出频率寄存器读回来的最大值受变频器最大频率参数限制,一般400Hz的机型读回最大值是40000。用FX3U的D寄存器存这个完全没问题,但如果你用触摸屏宏指令直接换算,要注意数据类型,别把整数当浮点数用。
读取电流的指令同理:
ADPRW K0 K1 K4 H2102 D21D21里的值是实际电流乘以100后的整数,比如6.5A读回来就是650。这个数据用于触摸屏显示或者做超电流报警判断都很方便。
4.2 轮询读取多台变频器的站号切换
实际应用中很少只带一台变频器,三台五台很常见。Modbus总线上挂多台从站时,主站程序必须逐台轮询。
轮询的核心思路:站号变化,地址不变。ADPRW前面的S2参数改为动态数据寄存器,每轮询完一台就把站号加1,循环执行。
软元件分配:
- D30:当前轮询站号
- D31:轮询计数器
- D32:轮询总站数
- M30:轮询指令触发标志
梯形图逻辑可以使用FOR/NEXT循环或者递加方式。我习惯用递加加比较的方式,逻辑清晰,不容易出错:
LD M30 MOV D30 D31这里省去FOR/NEXT的复杂嵌套,直接写:
- 初始化时把D30设为1,D32设为3(三台变频器)。
- 触发读取指令,ADPRW的S2参数不写K1而是写D30。
- 指令完成后D30加1。
- D30大于D32时,把D30重新设为1,重新从第一台开始轮询。
这样每次轮询依次读取1号机、2号机、3号机,周而复始。核心指令写法:
LD M30 ADPRW K0 D30 K4 H2101 D20执行完成后,把D30自加一。这个方案的好处是,将来要增加从站数量,只需要改D32的数值,程序本体不用动。
4.3 指令节拍控制与轮询周期估算
轮询程序最关键的一点是控制指令触发节奏。FX3U的ADPRW指令是异步执行的,指令发出后需要等待从站应答。如果指令触发太频繁,前一条还没执行完,后一条又触发,通讯必然乱套。
解决方法是利用指令完成标志做互锁。ADPRW最后一位M1参数指定完成标志,只有这个标志从OFF变为ON,才允许触发下一条指令:
LD M40 ADPRW K0 D30 K4 H2101 D20 M41 LD M41 INC D30 RST M41 LD M41 OUT M40这里M41是上一条ADPRW的完成标志,M40是轮询触发条件。指令完成后,M41置ON,程序立即把站号加1,同时复位M41,准备触发下一次轮询。
这样做可以确保一个时间点只有一条Modbus指令在总线上传输,不会发生两条指令同时试图占用总线的情况。
轮询周期的估算:Modbus RTU 9600bps下,一条读3个寄存器的报文大约是10个字节,加上从站应答的10个字节,总共20个字节左右。每个字节11位(8数据位+1起始+1停止+1校验),就是220位。9600bps时传输耗时约23毫秒。再加上PLC的扫描周期和指令处理时间,一台变频器一个读取周期差不多30到40毫秒。三台变频器轮询一遍约100毫秒,触摸屏上的数据显示肉眼看着已经很“跟手”了。
如果要加快刷新速度,可以把波特率从9600提到19200,报文时间直接减半。但注意,所有从站的Pr.118参数要全部改成192,D8120的低4位也要改成0010对应19200bps。这个改动一两分钟的事,但牵一发动全身,改之前确认现场所有设备都能支持。
5. 常见问题排查与避坑指南
5.1 通讯超时类问题
通讯超时是Modbus调试中遇到最多的一类问题。现象是ADPRW指令发出后,完成标志迟迟不置ON,或者M8405通讯错误标志直接置ON。
排查顺序建议按下面的表格来,从硬件到软件一层层筛:
| 排查步骤 | 检查内容 | 排除方法 |
|---|---|---|
| 1 | 485接线是否牢固 | 用万用表量SDA和SDB之间是否有电压 |
| 2 | SDA/SDB有没有接反 | 对调两根线测试 |
| 3 | 终端电阻是否设置 | 单台设备时485-BD直接把终端电阻开关打ON |
| 4 | 波特率是否一致 | 检查D8120和变频器Pr.118 |
| 5 | 校验方式是否一致 | 检查D8120和变频器Pr.119 |
| 6 | 从站号是否对上 | 检查ADPRW的S2和变频器Pr.117 |
| 7 | 指令触发是否重复 | 查看程序有没有在循环里反复触发ADPRW |
M8405是FX3U串口通讯错误标志,485-BD所在通道通讯错误时自动置ON。程序中加一段检测:
LD M8405 SET M50 MOV D8409 D51D8409是485通道的通讯错误代码寄存器,里面存的值对应不同的错误类型。常见的有帧错误、校验错误、超时错误等,具体代码对应的含义建议对照三菱FX3U手册的附录翻译,不同固件版本可能略有差异,但大方向一样。
确认错误代码后,针对性处理。如果是校验错误,多半是D8120和变频器Pr.119没对上;如果是超时错误,先检查从站号是否存在、从站是否上电、通讯线是否断开。
有一个很隐蔽的坑:PLC的485-BD通道默认使用的D8120设置,但如果你之前用485-BD跑过编程电缆通讯或者别的无协议通讯,D8120里的值可能残留。每次上电初始化程序里重新MOV一次D8120,能避免这种残留问题。
5.2 数据读写不正常的典型原因
通讯通了,但读写回来的数据不对,这类问题也很常见。
第一种情况:能写频率但变频器不动作。检查Pr.338和Pr.339是否设为1,很多变频器出厂默认是面板控制,Pr.338和Pr.339是0,外部通讯指令被忽略。我遇到过不止一次,指令发过去没报错,变频器就是不动弹,最后都是参数问题。
第二种情况:读回来的频率一切正常,但电流不准。检查数据换算比例。输出电流寄存器的分辨率是三菱默认0.01A,读650就是6.5A。有些变频器内部电流显示单位是0.1A,设定不同,读回来的数据含义完全不同。每次换变频器型号,第一件事就是查手册确认寄存器格式。
第三种情况:写频率时稍微改个0.01Hz就跳变。这是数据精度问题。如果你把50Hz写成5000,而变频器的Pr.121数据位长和频率设定分辨率不匹配,可能产生量化误差。解决方法:确认变频器的频率设定分辨率参数,有的变频器提供分辨率选择,比如可以设为0.01Hz或0.001Hz,选定了就要和PLC程序里的换算系数严格对应。
第四种情况:程序里用了相同的D寄存器做多个ADPRW的数据存储。ADPRW指令执行是异步的,如果两个指令共用一个D寄存器,后一个指令执行时会把前一个的结果覆盖掉。除非你确定指令是串行执行的,否则给每条指令分配独立的D寄存器,别省。
5.3 工程实施中的注意事项
结合这几个项目里总结的现场经验,最后补充几条实操层面的建议。
第一条,通讯线和动力线绝对不能走同一个线槽。我在前面提过,这里再强调一次。变频器输出侧那三段线,是整套系统里干扰最强的发射源,让通讯线和它保持至少30厘米的距离。如果实在绕不开,用带屏蔽的通讯电缆并把屏蔽层单端接地。
第二条,PLC程序的初始化部分,一定要有D8120的设置。上电瞬间,D8120里的值是不确定的,如果没有初始化,第一次通讯大概率失败。哪怕后续程序运行中不再改它,初始化这一步也不能省。
第三条,多台变频器的站号分配要做记录。总线上每一台变频器的站号必须是唯一地址,两个设备同站号时,主站发出的指令会被两台从站同时应答,总线上立即冲突。项目调试时把站号和设备编号的对照表贴在电柜门内侧,后期维护能省太多时间。
第四条,调试工具最好备一根USB转RS485的调试线,笔记本装个免费的Modbus调试助手,直接在电脑上先模拟主站和变频器通讯。这样做的好处是把“PLC程序问题”和“变频器参数问题”隔离,如果电脑作为主站能正常读写变频器,问题就锁定在PLC侧;如果电脑都通讯不上,就是接线或者变频器侧参数问题。
第五条,程序里对通讯错误要有处理逻辑。不要指望通讯永远一次成功,M8405置ON后要做的不是单纯复位错误标志,而是要检查D8409的错误代码,记录到掉电保持寄存器里,同时在触摸屏上弹出报警,提醒操作人员检查通讯链路。这样就算半夜设备停机,第二天查报警记录就知道是什么时候开始通讯异常的。
最后再分享一个我后来一直用的习惯:程序里所有Modbus地址都做成标签或者注释,不要裸写H2001这种数字。比如定义一个标签叫“变频器运行命令地址”,写程序时引用标签,将来换变频器型号时只需要改定义处,不用满程序搜地址。项目维护过几次,你会回来感谢这个习惯的。
Modbus RTU这套东西,本质上不复杂,就是个“问和答”的过程。PLC发出请求,变频器回答,只不过问的方式要对、答的格式要匹配。把D8120、Pr.117到Pr.121、ADPRW这几个关键点理顺,大部分问题都能解决。再加上一套好用的调试流程和细心排查,剩下的就是经验积累了。这套方案我现在还在用,老设备改造、小系统联网,低成本高效率,确实值得掌握。