资讯动态

三菱FX3U Modbus RTU控制四台变频器通讯实战从零到通

发布时间:2026/10/20 8:36:03 来源:尧图企业网站定制
搞工控的朋友都清楚现场调试最磨人的往往不是梯形图逻辑而是通讯。前阵子我接手了一套“三菱FX3U通讯RTU四台变频器通讯程序”的项目要求FX3U作为Modbus RTU主站分别控制四台变频器的启停、频率设定同时把运行状态、电流信息读回触摸屏。刚开始三天一台变频器都读不回数据后来把协议帧、硬件接线、变频器参数全部理顺之后这套系统连续稳定运行了好几个月。这篇文章就把从零到通的完整过程拿出来“大揭秘”硬件接线、Modbus RTU协议帧、PLC程序、变频器参数、现场排查方法一次性讲清楚。适合正在做FX3U和变频器RS-485通讯的同行尤其是第一次摸Modbus RTU的人。1. 整体方案设计与硬件选型思路1.1 需求拆解四台变频器到底要控什么先看清需求四台三相异步电机分别由四台变频器驱动用在一条输送联动系统上。上位机那边只给了一个触摸屏要求集中控制能单独启停任意一台也能同时给四台设定同一个频率还要显示每台变频器的运行中、故障、电流等状态。如果按老办法做每台变频器拉一路4-20mA模拟量到PLC模拟量模块再拉一路频率反馈四台就需要四路AO、四路AI还不带故障和状态信息。现场一共也就几十米距离但多芯电缆要专门定制施工麻烦后期查线更头疼。用Modbus RTU方案就清爽很多一组RS-485双绞线把所有设备窜起来PLC同时作为主站四台变频器各设一个站号数字量协议既能写频率、写启停也能一次性读回好几个运行参数。省线、省模块、信息量还大这是这个项目最终选择RTU通讯的根本原因。1.2 为什么选Modbus RTU而不是其他方案做方案选型的时候我把几个常见路子都对比了一遍。模拟量方案最传统现场仪表和变频器普遍支持但接线多、线损和干扰问题多高速脉冲方案适合距离很短、要求响应快的场合可FX3U的高速脉冲输出点数有限而且还要自己在PLC里做脉冲-频率换算精度一般CC-Link现场总线确实稳定但要求变频器带CC-Link选件卡成本一下就上去了四台变频器都加选件预算受不了。相比之下Modbus RTU有天然优势首先它通用市面上绝大多数变频器都内置支持不用额外扩展卡其次它只需要两根数据线加一根地线极性接对就能用第三它支持03读保持寄存器、06写单个寄存器、10H写多个寄存器等功能码读状态、参数修改、频率写定都能覆盖。对FX3U来说加一块RS-485扩展板用无协议通讯指令RS就能自己组帧发送连专用协议模块都不需要。成本低、可控性强这是最终拍板的原因。1.3 FX3U的通讯硬件选型FX3U本体其实不带标准的RS-485通讯口需要加扩展板或适配器。常用有三块FX3U-485-BD是扩展板直接插在FX3U前面板支持RS-485/RS-422数据收发占用D8120、M8122、M8123这些特殊软元件用RS指令做无协议通讯完全可以把Modbus RTU报文手动拼出来FX3U-485ADP是独立适配器连接在主机左侧同样用RS指令控制FX3U-485ADP-MB则在内部集成了Modbus主站功能配合专用指令写起来更简单但底层的帧格式和CRC是模块帮你处理的调试时反而看不见细节。我这个项目选的是FX3U-485-BD加RS指令自组帧的方式。原因很简单自己拼帧可以把协议理解透以后不管换什么品牌的变频器只要按Modbus标准组帧挪过来就能用。如果直接用ADP-MB虽然程序简单但遇到报文异常时黑盒子一样不好排查。标题既然叫“大揭秘”底层的东西就得真正揭开来看。1.4 通讯拓扑与接线要点典型主从结构FX3U-485-BD作为主站四台变频器串联在同一对RS-485总线上。三菱485扩展板的端子标号一般是SDA、SDB、RDA、RDB、SG接RS-485时把SDAA接变频器数据SDBB-接变频器数据-SG接通讯地。距离不长四台设备手拉手接不要星型接法。电缆我习惯用RVSP 2×0.75绞合屏蔽线镀锡铜编织屏蔽层单端接地也就是只在PLC这一侧接地。终端电阻看距离和波形网上很多说法是必须120Ω但实际现场几十米内不加也能跑加了更稳。这个项目通讯距离大概40米总线两端各并联一个120Ω电阻波形明显干净了。需要注意的还有485总线上的地线不能和动力线共用变频器出线侧和通讯线一定要分开走线槽中间隔至少20厘米否则变频器一启动通讯就被干扰掉线。2. Modbus RTU协议详解与变频器寄存器映射2.1 Modbus RTU帧格式与常用功能码Modbus RTU的报文很简单所有帧都是“站号 功能码 数据区 CRC16校验”。站号是目标变频器的地址功能码告诉它你要干什么数据区放寄存器地址和数据最后两个字节是CRC。帧与帧之间需要大于3.5个字符时间的间隔通常两个报文之间等5到10毫秒以上。这个间隔很重要很多通讯随机超时就是轮询间隔设得太短从站还没处理完上一帧主站下一帧就来了。这个项目主要用到三个功能码03H03读保持寄存器用来读变频器的运行状态和电流。06H06写单个寄存器用来写启停命令或频率设定简单但一次只能写一个。10H16写多个寄存器比如同时把命令字和频率写进去能减少报文次数。以读1号机状态为例请求帧是“01 03 21 00 00 02 CRC”意思是站号01功能码03从寄存器2100H开始读2个寄存器。响应帧则是“01 03 04 数据1高 数据1低 数据2高 数据2低 CRC”其中04表示后面有4个字节数据。写过一次之后就会对“为什么响应里有个字节计数字段”有很直观的理解了。2.2 CRC16校验的ST实现CRC是很多新手卡住的地方。Modbus RTU的CRC16用的是多项式0xA001初始值0xFFFF报文所有字节按顺序参与计算。计算规则每个字节先和CRC低8位异或然后右移8次每次如果最低位是1就异或0xA001否则直接右移。查表法速度更快但PLC里位运算写起来一样直观。我当时在ST里写了一个CRC计算逻辑方便验证报文核心思路是这样的FUNCTION_BLOCK FB_CRC16 VAR_INPUT buf : ARRAY[0..15] OF BYTE; len : BYTE; END_VAR VAR_OUTPUT crc_out : WORD; END_VAR VAR i : BYTE; j : BYTE; crc : WORD; END_VAR crc : 16#FFFF; FOR i : 0 TO len - 1 DO crc : (crc AND 16#00FF) XOR WORD_TO_BYTE(buf[i]); FOR j : 0 TO 7 DO IF (crc AND 16#0001) 1 THEN crc : (crc SHR 1) XOR 16#A001; ELSE crc : crc SHR 1; END_IF; END_FOR; END_FOR; crc_out : (crc AND 16#FF00) SHR 8 (crc AND 16#00FF) SHL 8;最后一步把高低字节交换是因为Modbus RTU发送时CRC要低字节在前。ST语法在不同版本的软件里略有差异不一定能直接原样编译但算法流程就是这个。强烈建议先在电脑上用Excel或串口助手校验一遍确认CRC计算没有错再接变频器。很多时候文字上看着懂的CRC第一次写出来一定是反的包括我自己。2.3 变频器寄存器地址映射不同品牌的变频器寄存器地址定义不一样但思路都一样。我以项目里用到的一款通用型变频器为例它按行业习惯做了这样的地址安排2000H是运行命令寄存器低字节bit0是启动/停止bit1是正反转方向bit2是故障复位2001H是主频率设定寄存器单位0.01Hz写5000就是50.00Hz2100H是状态反馈寄存器bit0运行中bit1正转中bit2故障2101H是输出电流反馈单位0.1A。下面这个表是我现场调试时贴在本子上的非常管用寄存器地址功能读/写数据格式2000H运行命令写bit0启动、bit1方向、bit2复位2001H主频率给定写0.01Hz500050.00Hz2002H加速时间读/写单位0.1s2100H运行状态读bit0运行、bit1正转、bit2故障2101H输出电流读0.1A2102H母线电压读0.1V用的时候先查变频器手册里的“Modbus通讯地址表”确认寄存器数量和属性。这里要特别注意有些变频器的地址给的是十进制有些是十六进制还有手册把地址写成40001之类的Modbus标准地址换算时别搞错。地址多一个“4xxxx”前缀实际报文里的地址还是低16位只取后四位就行。2.4 频率值转换从多少Hz到多少十六进制变频器给定频率大多是整数单位0.01Hz。比如要设定25.30HzPLC里的十进制数值就是2530转成十六进制是0x09E2。发送时高字节0x09低字节0xE2按顺序放进报文即可。如果变频器支持的单位是0.1Hz那253Hz就是25.3Hz。这地方最坑的是符号问题。频率、电流这些值一般用无符号整数但有些变频器的状态字用有符号数比如母线电压或故障码解析时如果按无符号处理明明是负值会变成一个很大的正数。我一般会在程序里先判断最高位是不是1再按负数处理避免触摸屏上显示一个莫名其妙的65000。3. PLC端通讯程序实现从RS指令到轮询逻辑3.1 通讯格式特殊寄存器D8120与RS指令FX3U的无协议通讯核心是RS指令格式是RS(发送起始地址, 发送长度, 接收起始地址, 接收长度)。但真正干活之前要先设置两个东西D8120确定波特率、数据位、停止位、校验方式M8161决定数据格式是16位还是8位。Modbus RTU是字节流我把M8161置ON让它工作在8位模式。D8120是个位定义的寄存器以项目用的“9600bps、8数据位、偶校验、1停止位”为例常用写法是MOV H0C89 D8120。这个数值不是随便拍的而是按手册里波特率、校验方式、停止位几个位拼出来的。不熟悉的别凭感觉改直接抄成H0C89能通但如果你的校验方式或波特率不同就要老老实实查手册。不同版本硬件的特殊数据寄存器定义也可能有小差异通电后先确认D8120能被写入。RS指令的发送和接收是异步的发送完成后M8122自动复位接收完成后M8123自动置位。所以程序的套路是把一帧报文放进发送区触发M8122开始发送然后等M8123置位进入解析。如果等不到M8123就要控制超时时间然后清接收缓冲继续下一轮不能让一个请求卡死整条总线。3.2 轮询状态机四台变频器不能同时招呼RS-485是半双工同一时刻只能有一个主站说话四台变频器也不能同时应答。PLC程序必须按顺序轮询。我的做法是用一个状态机状态0处理1号机状态1处理2号机状态2处理3号机状态3处理4号机。每个状态内部再分“发送请求-等待应答-解析数据-延时切换到下一台”四个步骤。轮询间隔设多少我实测下来每台变频器从收到请求到返回响应一般在10毫秒以内。留点余量每两块之间等30到50毫秒四台一轮就是120到200毫秒触摸屏显示完全没有卡顿感。如果四台都设了较长的加速时间或者变频器带负载较重导致响应慢间隔就拉大一点。轮询太快并不是好事总线空闲间隔太小容易撞帧。3.3 ST伪代码组帧与轮询示例由于RS指令在梯形图里最直观我用ST把整段逻辑简化写出来方便理解。工程里其实用的是步进梯形图但思路一模一样。(* 轮询状态机step为当前处理站的索引 *) CASE step OF 0: (* 向1号变频器发送读状态请求 *) D100 : H01; // 站号1 D101 : H03; // 功能码03读保持寄存器 D102 : H21; // 寄存器地址高字节 2100H D103 : H00; // 寄存器地址低字节 D104 : H00; // 读2个寄存器 D105 : H02; (* 调用CRC计算结果D106/D107 *) FB_CRC16(...); SET M8122; // 启动发送 step : 10; 10: (* 等待M8123或超时 *) IF M8123 THEN parse_response(); RST M8123; step : 1; ELSIF timeout THEN step : 1; END_IF; 1: (* 切换2号机省略 *) END_CASE;上面只是示意但能看清整体节奏。每个状态里发送区D100-D107、CRC结果D106-D107都要重新组帧不能上一次的报文残留把下一次的站号弄混。发送前最好先把发送区全部清零尤其是CRC的两个字节因为旧CRC留在里面会让新帧校验直接错误。3.4 响应解析两个字节拼成一个16位寄存器从站响应回来之后接收缓冲区里存的是连续的字节。以03功能码为例接收区前三个字节是“站号、功能码、字节计数”后面才是真正的寄存器值。每个寄存器值是16位它在报文里占两个字节字节序是高字节在前。比如状态字2100H返回0x0001时接收缓冲区里的顺序是00 01而不是01 00。我在程序里的解析方法把响应中的高字节取出来左移8位再加上低字节就还原成完整的16位寄存器值。如果用传输的方法可以把X0X1? 不是。用三菱ST写法大致是D220 : (D130 AND H00FF) * 256 (D131 AND H00FF);这里D130是高字节D131是低字节因为8位模式下高8位清零所以用AND H00FF把无效高位屏蔽掉。很多新手在读频率时发现数值差得离谱要么是字节顺序反了要么就是没屏蔽高字节。比如50.00Hz在报文里是13 88拼错顺序就变成了88 13算出来就是348.35Hz一眼看上去完全不知道发生了什么。写频率的命令帧也要做同样的反向操作先把十进制频率值变成16位字再拆成高字节、低字节填入报文。比如25.30Hz25300x09E2发送区里D102装0x09D103装0xE2。三菱PLC里没有直接“拆高低字节”的专用指令最土的办法是除256取商余数就是低字节。我常用的是D102:D200/256D103:D200 MOD 256。简单、直观、不容易错。4. 变频器参数设置与联调步骤4.1 变频器侧必须设的参数程序写得再标准变频器参数不对照样白搭。下面这张表是我每次接入新变频器都会核对的项目参数项典型设置说明控制模式Modbus RTU通讯协议要选对主频率来源通讯给定面板电位器或端子不能盖过通讯运行命令来源通讯控制否则发启动指令无效站地址1~4每台必须不同波特率9600和PLC的D8120一致数据格式8,E,1偶校验、1停止位通讯丢失动作自由停车或减速停止通讯断线时的安全策略特别提醒修改完变频器参数后很多型号需要重新上电才生效尤其波特率和站号。现场经常有人改完直接测通讯发现没反应以为协议错了折腾半天才发现是没断电重启。4.2 485总线的防干扰细节变频器本身是个大干扰源通讯线如果不讲究干扰问题会在电机运行时集中爆发。我的经验是把485线当成动力电缆一样认真对待但实际上很多项目都只当普通信号线随便走。几个细节要注意屏蔽层在PLC侧单端接地不要两端都接通讯线不要和变频器输出线捆在同一个线槽如果必须平行走线间距保持20厘米以上变频器接地PE要做好动力线接地屏蔽层也要和通讯地分开。还有一个容易被忽略的点485总线末端如果没加终端电阻长距离通讯时信号反射会导致跳变沿不干净。加终端电阻后如果还是偶发乱码可以看一下A/B线之间的静态电压正常情况下应该在1.5V到3V之间如果接近0V说明总线偏置有问题。4.3 联调先单台再四台我最开始犯的错就是四台同时接上去调总线上一旦有一台参数不对整个网络都被拖累。正确顺序是先给1号变频器单独上电把PLC程序里的站号固定为1其他站全部拆掉通讯线。用电脑上的串口助手和一台USB转485设备先把PC当主站直接读1号变频器确认变频器侧参数和寄存器地址没问题。然后再把PLC连上总线用监控模式看PLC发出的报文能不能和电脑串口助手收到的一致。这一步相当于把“PLC到底有没有发出正确帧”和“变频器到底能不能正确应答”分开定位。单台通了之后再把2号机接上重复上述过程。四台全部接好后再把轮询程序恢复观察状态切换是否正常。这样即使后面出问题也大概率知道是哪一台的站号或参数有毛病。5. 常见问题与排查技巧实录5.1 现象一四台变频器全部无响应最典型的报错是M8123永远不置位PLC一直发请求但总线上一片寂静。先把问题分成两类PLC有没有发出来以及变频器有没有收到。用万用表测PLC 485端的A/B线电压静态时应该在1.5V到2.5V之间如果为0或非常低先检查扩展板接线和RS指令发送长度。再用电脑串口助手挂在总线上监听如果能看到PLC发的帧说明PLC侧没问题看不到就查D8120设置、M8161、发送触发M8122是否确实被置位。看到PLC帧但变频器不回应重点排查站号、波特率、数据格式和变频器连接端子极性。我遇到过最隐蔽的一次是PLC程序里RS发送长度写多了把CRC后面的残留数据也发了出去变频器收到后校验不通过每帧都回异常帧程序里又没有处理异常码的逻辑于是看起来像“没响应”。所以发送长度一定要和实际字节数严格对应不要贪多。5.2 现象二偶发超时报文错帧率很高刚开始还以为是程序问题后来我用示波器抓波形才发现是干扰。变频器一启动总线上的波形毛刺特别多。处理办法是按第4.2节重新整理通讯线把屏蔽层可靠接地并把通讯线和动力线分开。终端电阻加上以后波形明显改善偶发超时从每分钟几次降到基本为零。另一个原因是PLC和变频器的通讯波特率虽然都标9600但如果变频器侧实际是9930两边误差积累到一定程度就会出问题。重点是先把变频器恢复出厂设置再重新设通讯参数不确定时可以用串口助手连续读100次看看成功率。5.3 现象三写06命令字成功但变频器不启动能读到数据说明通讯链路是通的写命令没动作问题基本都在“命令字本身”或“速度来源”上。先把命令字寄存器读回来确认写入值真的停在寄存器里然后查手册里命令字每一位的含义。很多变频器的启动命令并不是单纯“bit0置1”可能要求“bit0和bit1配合”或者需要先置一个使能位。我遇到的一款变频器只有把启动位置1之后再在下一个周期把方向位置0电机才开始转。如果第一次只发了0x0001它在内部认为方向指令还没设置索性不动。还要确认“频率给定来源”和“运行命令来源”都设为通讯。有些变频器虽然通讯能写频率但运行命令还是面板启停所以你写命令它完全不理。另外如果频率给定是0Hz启动命令发下去电机会因为没有速度给定而保持停止看起来也像没启动。5.4 现象四读回来的频率值跳动或显示成乱码读回的数值有规律地来回变化大概率是高低字节拼反了。例如150.00Hz对应的16进制是3A98如果解析时高字节当低字节就得到983A换算后变成389.70Hz完全不符合常识。另一个容易踩的坑是寄存器数据是无符号还是有符号。启动指令和频率一般是无符号但故障码和母线电压偶尔会有负数表示。解析负数时要先判断符号位再做补码转换。我写了个小功能块去处理直接从寄存器值里提取高低字节再按类型转换触摸屏显示就再没出现“65000”这种数字。5.5 轮询周期优化与故障自动跳过四台变频器轮询一轮的时间由单台响应延迟和站间间隔共同决定。如果PLC程序还同时在做模拟量处理、触摸屏刷新通讯的轮询间隔最好不要小于20毫秒否则RS指令的发送接收逻辑可能被扫描周期拖乱。我的实际配置是每台之间延时30毫秒四台一轮约150毫秒触摸屏显示很流畅。如果要求更高刷新率就用10H功能码一次读写更多寄存器减少轮询次数而不是压缩站间间隔。总线上的从站如果有一台掉线整条轮询还会一直卡在那个站上把其他三台都拖死。所以我在程序里加了超时计数连续3次没有收到响应就把这个站标记为“通讯故障”触摸屏报警提示然后跳过它继续轮询下一台。这样一来单台故障不会影响整条线的控制现场也好排查是哪一台掉线。最后分享一个经验做多从站Modbus通讯千万不要一上来就写完整程序哪怕原理全会也要老老实实先把一个站调通。把报文在电脑上验证透把CRC逻辑用串口助手核对过再扩展不迟。现场那些通讯“玄学”问题十有八九是字节顺序、参数没重启、接线没屏蔽这三个点。把这三个点逐一排除你也能把四台变频器通讯做得稳稳当当。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑