资讯动态

三菱FX3U+485BD板MODBUS RTU控制变频器:从接线到程序全攻略

发布时间:2026/10/21 23:53:27 来源:尧图企业网站定制
前阵帮朋友搞了一个小改造一台三菱FX3U要远程控制一台三菱变频器既要触摸屏启停又要能设定频率、监视当前输出。现场没有多余的模拟量模块预算也有限我手里正好有一块三菱FX3U-485BD通讯板于是直接用MODBUS RTU方案干完了。PLC做主站、变频器做从站两根线把启停、调速、监视全包了程序里每一段都写了注释包括报文怎么组、CRC怎么算、哪些标志位要复位——因为我很清楚这项目做完三个月后回来看代码的人大概率就是我自己。这套做法适合谁手里有FX3U系列PLC、想低成本接入多台变频器或其他MODBUS RTU从站设备又不想买专用通讯模块的电气工程师、设备调试人员和刚入门工控的爱好者都可以参考。下面我把整个项目的接线、参数、程序结构、调试踩坑全部摊开讲能帮你省掉不少自己翻手册和试错的时间。1. 为什么是MODBUS RTU 485BD板先说说我当时的选型思路1.1 方案对比模拟量、CC-Link、MODBUS RTU当时并列的选项有好几个但分析完基本就剩MODBUS RTU最合适。第一是模拟量控制。启停用端子、频率用0~10V电压或4~20mA电流逻辑看起来简单但麻烦在于FX3U本体不带模拟量输出要扩展模拟量模块成本先上去了其次模拟量信号在变频器附近容易受干扰线要单独走屏蔽接地稍微处理不好频率就会漂第三想读变频器电流、输出电压这些运行参数模拟量端子根本给不出来只能另外加变送器越搞越复杂。第二是CC-Link现场总线。这方案在三菱体系里很正统但主站模块、从站选件卡加起来价格感人而且CC-Link的参数配置比MODBUS繁琐对只控制一两台变频器的项目来说属于杀鸡用牛刀。第三就是MODBUS RTU。三菱变频器基本原生支持MODBUS协议物理层就是RS485而FX3U左侧扩展一个485BD板硬件成本极低装上以后PLC就有了一个RS485口。虽然程序上要自己组报文、算CRC但逻辑不复杂还顺手把“读变频器状态、读电流、读电压”这些功能全包了。所以我当时果断选了这条路。1.2 485BD板安装与接线别小看这两颗螺丝FX3U-485BD是插在PLC机身左侧扩展口上的小板子两颗螺丝固定不占主机输入输出点也不影响正面编程口。这一点实测下来很重要因为调试阶段要频繁用GX Works2上下载程序编程口被占用会非常痛苦485BD板完全没这问题。板上端子标法一般是SDA、SDB旁边有个终端电阻开关TERM。SDA对应RS485的A正SDB对应B负变频器侧接R/R-之类的RS485端子按同名极性对接。注意RS485设备A/B极性定义在不同品牌间偶有差异接完以后如果发现完全收不到响应第一个怀疑对象就是A/B对调。关于终端电阻通讯距离短比如10米以内时TERM开关保持OFF就行线长超过几十米或者现场干扰明显再把板子上的TERM拨到ON同时在总线最远端那个设备的终端电阻也接上。但两端都加电阻后线路负载会变大有些变频器驱动能力一般加了反而通讯不稳。我自己一般先不加跑出问题再加。还有屏蔽层处理。通讯线我用的是屏蔽双绞线屏蔽层只在PLC这一侧单端接485BD板的SLD端子并可靠接地变频器那一侧悬空。这样做的目的是避免形成接地环路——现场变频器和PLC通常不是同一个接地点两点接地会产生环流干扰反而更严重。1.3 先理解MODBUS RTU报文的“骨架”写程序之前得先把MODBUS RTU帧结构搞清楚。它就像寄快递从站地址是收件人功能码是快递业务类型寄存器地址是具体哪个柜子数据是放进去的东西最后的CRC是验货码。典型请求帧结构字段长度说明从站地址1字节目标设备站号一般1~247功能码1字节03读寄存器06写单个寄存器寄存器地址2字节高字节在前低字节在后数据2字节或N字节具体写入值或读取数量CRC校验2字节低字节在前高字节在后控制变频器最常用的功能码就两个03读寄存器06写单个寄存器。不管是启停、给定频率还是读当前频率、电流都是这两个功能码的组合。报文短、结构固定调试时用串口工具一看就知道问题出在哪。2. 参数设置的“先手棋”PLC与变频器各敲哪些2.1 先把PLC的通信格式算明白D8120里藏着的位定义FX3U用RS指令做串口通讯时通信格式由特殊数据寄存器D8120控制。很多人喜欢直接搜一个十六进制数填进去但我觉得还是要把位定义搞明白因为不同项目想要的校验、停止位可能不一样抄错一个位就能让你排查到怀疑人生。D8120是按位定义的数据长度、奇偶校验、停止位、波特率分别占不同的bit。我当时按这个顺序算数据长度8位校验方式无校验最通用先跑通再改带校验停止位1位波特率9600bps逐位组合出来的数值是H0081用MOV指令写进D8120LD M8002 MOV H0081 D8120 // 通信格式9600bps、8位数据、无校验、1位停止位这里我提个醒如果你要偶校验、停止位2之类的组合别直接猜一定打开FX3U编程手册翻D8120的位定义表自己按位推一遍。因为网上流传的很多“常用值”针对的是触摸屏和PLC通讯跟这里485BD板跑MODBUS RTU不一定对得上填错最直接的表现就是变频器完全不响应或响应帧乱码。另外要注意D8120的修改要在RS指令激活之前生效。我习惯用M8002首次扫描脉冲去初始化程序跑起来后不随便改如果调试中改了D8120最好PLC重新上电否则通讯状态可能停留在半旧不新的配置上。2.2 变频器侧要确认的四组关键参数三菱变频器型号不同具体参数编号会有差异但逻辑上就那么几组。调试的时候逐项核对即可参数类型设置目标说明通讯协议选择MODBUS RTU有些型号默认就是MODBUS从站地址设成1~247之间的值和PLC请求帧里的地址一致波特率9600必须和PLC的D8120一致校验/停止位无校验、1停止位必须和PLC的D8120一致有一点容易被忽略部分变频器的通讯参数修改后要重新上电才生效改完不重启参数显示是新的、实际还是旧的通讯自然不通。还有三菱变频器里有个“运行模式选择”参数要把它设为通讯运行。否则就算你把运行指令寄存器写得再漂亮变频器也不会理你。这个参数在调试控制类故障时基本是必查项。2.3 寄存器地址“手册编号”和“报文地址”不是一回事三菱变频器的MODBUS手册里寄存器编号习惯写成40001、40002这种形式但报文里实际传输的寄存器地址是这个编号减1以后的十六进制值。也就是说手册写着40011实际报文地址是0x000A10不是0x0B11。这一位偏移新手几乎必踩而且错得很隐蔽。我当时根据手头三菱变频器的通信手册整理了一张示意寄存器表功能十六进制寄存器地址读写属性运行指令0F01读写速度设定0F02读写输出频率监视0F03只读输出电流监视0F04只读不同系列的三菱变频器寄存器定义会有差异真正写代码前务必以你设备随附手册为准别直接套我这张表。不过报文结构是一样的比如手册说“速度设定”寄存器编号是61442那换算后就是0xF002报文里要传F0 02两个字节。3. 带注释的通讯程序怎么写3.1 程序整体流程初始化、组帧、发送、等待、处理整个通讯程序我拆成几步初始化D8120设置RS指令的发送和接收缓冲区。用轮询逻辑构造请求帧站号、功能码、寄存器地址、数据调用CRC子程序把校验码填入帧尾。置位M8122发送请求PLC自动把缓冲区的数据通过485BD板发出去。等待M8123接收完成标志同时做超时保护防止从站没响应导致程序卡死。收到响应后判断帧长、校验CRC解析数据换算成实际工程值。手动复位接收完成标志准备下一轮通讯。这个流程听起来简单但实际写的时候容易出问题的点在于RS指令是持续有效的而每组报文必须靠发送标志去触发接收完成标志又是软件需要手动复位的。这俩标志搞反了程序要么连续乱发要么收一次就再也不理你。3.2 RS指令怎么用缓冲区、发送请求、接收完成RS指令是FX3U做无协议通讯的核心指令格式不复杂RS D0 K8 D200 K20D0发送缓冲区首地址K8发送点数按我的排布方式一个寄存器存一个字节所以就是发送8个字节D200接收缓冲区首地址K20接收缓冲区容量注意这里的“点数”是三菱的叫法实际使用中我按一个数据寄存器对应线路上一个字节来排布。也就是D0里放帧的第1个字节D1放第2个字节依此类推。高字节不用发送时只取低8位。RS指令本身只要让它在程序里一直有效就行我把它放在初始化段之后通过M8002脉冲激活一次后续它就一直待命。要发送数据时先把报文写进发送缓冲区再置位M8122LD M0 // 某个轮询触发信号 MOV K1 D0 // 从站地址1 MOV H03 D1 // 功能码03读寄存器 MOV H0F D2 // 寄存器地址高字节0F MOV H03 D3 // 寄存器地址低字节03 MOV H00 D4 // 读取数量高字节00 MOV K2 D5 // 读取数量低字节读2个寄存器 CALL P0 // 调用CRC子程序结果写入D6、D7 SET M8122 // 之后发送缓冲区的数据会被自动发出去发送完成后M8122由PLC自动复位不需要手动处理。当从站应答帧到达后M8123接收完成标志会置位同时D8122会保存实际接收到的字节数。这时候就可以做解析了LD M8123 MOV D8122 D100 // 先保存接收字节数防止后续操作把它冲掉 CALL P1 // 调用CRC校验核对收到的帧有没有传错 ... RST M8123 // 解析完必须手动复位接收完成标志这个RST M8123相当关键。我见过不止一个人漏掉这一步结果通讯只通一次后面全卡住查半天发现接收完成标志一直在ON程序逻辑只认边沿不认状态。另外千万别在M8123为ON时马上做下一轮发送。调试时我习惯在发送前加一个“接收空闲”的联锁确保上一帧已经处理完再开始下一帧。3.3 CRC校验通讯可靠性的最后一道闸MODBUS RTU的CRC16算法说起来很简单初始值FFFF对每个字节先与CRC低字节异或再右移8次每次检测最低位若为1则与0xA001异或。计算范围是从站地址开始到数据结束不含CRC本身。附加到帧尾时低字节在前、高字节在后。用伪代码表达就是这样crc 0xFFFF for each byte in frame: crc crc XOR byte for i in 0..7: if (crc AND 0x0001): crc (crc 1) XOR 0xA001 else: crc crc 1 // 附加顺序先发CRC低字节再发CRC高字节在三菱PLC里我用FOR/NEXT循环加位右移指令封装了一个通用CRC子程序站号、功能码、寄存器地址、数据都算进去返回两个寄存器给调用方。子程序里每一行都写了注释包括“当前处理到哪个字节”“移出来的位是什么”。这看起来有点啰嗦但调试CRC不通过的时候打开注释对照伪代码验算比自己回忆逻辑快太多了。调CRC有个笨但很有效的方法先用串口调试工具发一帧给变频器确认报文正确再把同一帧报文拿到纸上按MODBUS CRC算法手算一遍看跟程序算出来的是不是一样。如果手算和程序一致说明算法没问题如果不一致大概率是寄存器字节序或者计算范围出了问题。3.4 注释不是写给同事看的是写给三个月后的自己看的这个项目我把注释写得非常细比如// 运行指令寄存器0F01 // 命令字数据0000停止0002正转0004反转又比如// 速度设定寄存器0F02 // 数据单位0.01Hz例如10.00Hz则写入数值1000即0x03E8为什么强调注释因为通讯程序不像梯形图里的电机控制看不出哪一条是干什么的。报文里的一个字节没有注释的话三个月后看到H03你根本想不起这是读功能码还是写功能码。写清楚以后后期维护甚至换人接手成本都低很多。4. 调试实录前三个晚上基本都在跟“接收不到”干瞪眼4.1 现象一发送看起来没问题变频器完全没有响应这是最常见的情况。我先用PLC程序强制置位M8122确认RS指令在工作然后再查外部。排查顺序A/B有没有接反。SDA接RSDB接R-反了就是彻底静默。变频器通讯参数是否生效。改完参数有没有重新上电。从站地址对不对。PLC发的是1变频器里设了2那当然不理你。变频器的MODBUS通讯功能是否真的开启了。有些型号默认开着有些要单独设协议参数。线路通断。用万用表量一下两端端子是否接触良好屏蔽层有没有搭到信号线上。我那次最后发现是A/B接反。变频器端子的丝印跟PLC板子上的颜色标识容易误导人一着急就按同名端接了实际这俩设备的A/B极性和线色并不统一。4.2 现象二收到响应了但程序一直报CRC错误能收到响应说明物理链路、从站参数都通了问题基本出在报文内容或者数据处理上。先检查接收字节数。如果D8122读出长度和预期不符比如读2个寄存器期望8个字节的应答结果只收到5个那可能是波特率配置不一致导致字符被拆开或者接收缓冲区太小帧被截断了。再检查CRC计算范围。容易犯的错是把“读取数量”也算错或者漏掉一个字节。我调试时在PLC里加了一段临时逻辑把接收到的原始帧逐字节搬到几个数据寄存器里通过监控窗口跟串口抓包工具抓到的帧做对比一字节一字节核对。还有一种情况是485总线上的干扰导致数据帧个别字节出错。表现是CRC错误不是每次都出现而是偶发。这时候优先怀疑屏蔽层接地、通讯线和动力线走得太近、终端电阻没加。4.3 现象三能读到频率但启停指令写进去没反应能读说明读功能码和寄存器地址都对写没反应通常有三个方向。第一功能码用错了。写单个寄存器必须用06不能用03。第二寄存器编号偏移搞错偏移一位就把运行指令写到了别的寄存器里数据进去了但变频器根本不看那个地址。第三变频器运行模式没切到通讯。这个前面提过运行模式参数不改任何MODBUS写运行指令的命令都会被当成耳旁风。另外三菱变频器的运行指令通常不是简单地写一个非零值就行它有命令字的具体位定义。比如正转是0x0002、反转是0x0004、停止是0x0000。我调试时先写停止再写正转用触摸屏上的状态显示确认通讯通路再逐步测试其他命令字。4.4 一个实用的检查法先让变频器当服务器再用PLC当主站排查MODBUS通讯问题我习惯分而治之电脑串口转RS485模块接上变频器的485端子。用MODBUS调试工具手动发一帧读报文比如读输出频率。确认电脑和变频器之间能正常通讯。再把485线接到PLC的485BD板上用PLC发同样的报文。这样可以把问题一分为二。如果电脑能读、PLC不能读问题基本在PLC侧程序或参数如果电脑都不能读那就翻回去查变频器参数和接线。用这个办法很多疑难杂症能快速定位。5. 常见问题速查表与避坑清单调试过程中我整理了一张速查表给后来接手这个项目的人用现象可能原因处理办法完全无响应A/B接反、站号不对、协议未启用查接线、站号、变频器通讯参数偶发无响应干扰、终端电阻缺失屏蔽层单端接地、加终端电阻接收字节数不对波特率不一致、缓冲区太小核对D8120增大接收缓冲区CRC一直不过校验范围错、字节序错对照抓包数据逐字节核对能读不能写功能码错、寄存器只读改用06功能码核对寄存器属性写指令没效果运行模式未切通讯改变频器运行模式参数收一次后不再收漏复位M8123解析完手动RST M8123避坑清单这几条都是我实际踩出来的轮询间隔不要太密。我习惯每台从站发送间隔至少200ms给变频器足够的响应时间。程序里必须做超时和重试。否则总线上某个从站掉线整个轮询会卡死在那等接收完成标志。短距离通讯时终端电阻能不加就不加。有一次加了TERM后变频器响应变慢去掉就恢复因为从站驱动能力和线路阻抗不匹配。修改D8120之前先停掉RS通讯改完重新上电。不然后果不可预期。CRC子程序调好后就不要动它把它当成通用工具函数保留。同一个算法可以复用到其他MODBUS从站设备上。6. 从单台到多台用“轮询表”把程序变得可扩展单台变频器跑通之后我又加了两台把程序改成了轮询结构。核心思路是把每个从站的站号、功能码、寄存器地址、数据内容都放在一张数据表里PLC用一个指针寄存器轮询访问。每轮通讯的流程变成指针指向第一个从站。按当前指针从表中取数据构造请求帧。发送、等待、解析、复位。等待固定间隔后指针加1指向下一台从站。轮到最后再回到第一台。这样做的好处是以后加新变频器不用改梯形图主体只需要在数据表里加几行。坏处是程序里要处理数据表的索引偏移调试时监控不够直观。但对项目维护来说明显是值得的。多台轮询还有个细节别在同一时刻给两台从站发请求。485是半双工总线同时发就是撞车。我用一个“发送完成并且接收处理完成”的中间标志串起整个轮询节奏从程序结构上保证任何时刻只有一帧在总线上。同样的程序架构后面我还接到过温控表、智能电表这类支持MODBUS RTU的设备基本只需要改寄存器地址和数据解析部分。这就是当初把协议解析和业务逻辑分开写带来的好处。我在这个项目里体会最深的一点是MODBUS RTU通讯这东西看起来就是几行报文真正花时间的全在“确认一致”上——参数一致、接线一致、地址一致、字节序一致。把这几个一致搞定了剩下的都是水到渠成。最后再分享一个小技巧调试通讯时把GX Works2的软元件监控窗口侧边栏留一排专门放D8120、M8122、M8123、D8122、接收缓冲区这些关键软元件。每次通讯卡住扫一眼这几个值基本就能判断是没发出去、发出去没收到、还是收到了处理失败。这个习惯比翻一百页手册都有用。

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

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

免费获取报价 →
↑