三菱FX3U PLC与变频器Modbus RTU通讯实战:ADPRW指令与485-BD详解

📅 发布时间:2026/10/20 18:34:21
三菱FX3U PLC与变频器Modbus RTU通讯实战:ADPRW指令与485-BD详解
做自动化改造这几年PLC和变频器通讯是绕不开的活。尤其在老设备升级、小产线联网这类项目里用三菱FX3U带着变频器走Modbus RTU几乎是出场率最高的组合。前阵子我正好帮一个朋友把车间里几台独立启停的变频器改成触摸屏远程控制用的就是FX3U PLC加FX3U-485-BD通讯板这套方案。这个案例的典型场景是手头有一台FX3U想通过RS-485总线控制一两台三菱变频器完成启停、频率设定、频率和电流读取这些基本操作同时省去一路一路硬接线的麻烦。适合刚接触PLC通讯的电气工程师、设备维护人员和做小型自动化改造的同行参考。整个方案的核心就三件事硬件接线、通讯参数配置、ADPRW指令的灵活使用。先说结论这套方案成熟可靠成本也低。485-BD通讯板几百块一根屏蔽双绞线就搞定不需要额外买专用通讯模块。但它有一个明显的门槛Modbus寄存器地址换算和指令格式容易把人绕晕尤其是第一次接触ADPRW指令时K1、K2、H2001这些参数看着简单组合起来很多人第一反应就是懵。下面我按实际做项目的顺序把从接线到调试的完整过程拆开讲包括我踩过的坑和后来总结出来的排查方法。1. 硬件准备与接线细节1.1 完整器件清单与选型理由先列出这套案例用到的全部器件缺一不可序号器件型号/规格作用1PLC三菱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接变频器的RDAPLC的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功能码功能说明K105H写单线圈位元件如启停控制K206H写单寄存器如频率设定K301H读单线圈状态K403H读单寄存器如读取输出频率、电流理解这个对应关系非常重要。因为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第二台设2Pr.118通讯波特率96对应9600bpsPr.119通讯校验方式2偶校验Pr.120通讯停止位长11位停止位Pr.121通讯数据位长88位数据Pr.338运行指令权11为RS-485通讯Pr.339频率指令权11为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接变频器RDASDB接RDB。梯形图逻辑是这样的X0正转启动按钮X1反转启动按钮X2停止按钮D0命令数据寄存器M10ADPRW写指令执行完成标志正转启动的指令段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地址十六进制数据格式输出频率8449H2101分辨率0.01Hz输出电流8450H2102分辨率0.01A输出电压8451H2103分辨率0.1V运行状态8448H2100位状态字读取输出频率的指令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设为1D32设为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参数要全部改成192D8120的低4位也要改成0010对应19200bps。这个改动一两分钟的事但牵一发动全身改之前确认现场所有设备都能支持。5. 常见问题排查与避坑指南5.1 通讯超时类问题通讯超时是Modbus调试中遇到最多的一类问题。现象是ADPRW指令发出后完成标志迟迟不置ON或者M8405通讯错误标志直接置ON。排查顺序建议按下面的表格来从硬件到软件一层层筛排查步骤检查内容排除方法1485接线是否牢固用万用表量SDA和SDB之间是否有电压2SDA/SDB有没有接反对调两根线测试3终端电阻是否设置单台设备时485-BD直接把终端电阻开关打ON4波特率是否一致检查D8120和变频器Pr.1185校验方式是否一致检查D8120和变频器Pr.1196从站号是否对上检查ADPRW的S2和变频器Pr.1177指令触发是否重复查看程序有没有在循环里反复触发ADPRWM8405是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这几个关键点理顺大部分问题都能解决。再加上一套好用的调试流程和细心排查剩下的就是经验积累了。这套方案我现在还在用老设备改造、小系统联网低成本高效率确实值得掌握。