资讯动态

三菱FX PLC通过MODBUS RTU与多台变频器通讯的完整实战方案

发布时间:2026/10/21 9:45:30 来源:尧图企业网站定制
做设备改造这几年凡是手里一台PLC要带好几台变频器的活儿十有七八最后都会落到MODBUS RTU这条路上。这不是谁拍脑袋定的而是现场条件逼出来的——老柜子里没有那么多富余的模拟量模块走线槽已经塞得满满当当再给每台变频器拉一路4-20mA信号线从成本和工时就先输了。于是几百块钱一块的RS-485通讯板两根屏蔽双绞线就能把三菱FX系列PLC和多台变频器串在同一条总线上。下面这套程序是我在几个输送线、泵组项目里反反复复改过之后沉淀下来的版本核心思路是用FX的RS指令自己组MODBUS-RTU主站帧然后一主多从轮询总线上的每台变频器支持FX1S、FX1N、FX2N、FX3U这几个常用机型。只要你手里的变频器支持标准MODBUS协议把站号、串口参数、寄存器映射表对照改一下基本可以直接套用。刚接触通讯编程的朋友可以把这当作一份完整模板已经写过RS指令的老手重点看第4节的轮询兜底设计和第6节的排查套路那部分是真正出过事、返过工的地方。1. 为什么最终选了MODBUS-RTU现场条件与成本的双重考量1.1 硬线模拟量方案为什么先被否掉最传统的做法是给每台变频器送一路模拟量给定信号常见的是4-20mA或者0-10V另加一路模拟量反馈用来读运行状态和输出电流。听起来干净利落一到现场就露馅。第一是模块不够用。三菱FX的模拟量输出模块一个模块通常才两路或四路五台变频器就得装两块加上模拟量输入模块导轨上直接多出一排东西柜内空间立刻紧张。第二是线太多。每台变频器少则两路多则四路信号线五台就是二十来根全部要从PLC柜拉到变频器柜中间还要过接线端子、过线槽。调试时对着图纸找一根信号线能找半个小时。更麻烦的是后期扩展。今天五台明天加一台后天再加一台模拟量模块的数量跟着往上堆PLC的扩展总线和电源余量迟早出问题。我在一个项目里就吃过这个亏原设计留了两个模块位结果现场实际多出三台变频器最后只能拆掉一个空闲的通讯模块才塞进去整个柜子重新布线工期直接往后推了一周。1.2 RS-485一总线方案的优势MODBUS RTU走RS-485物理层最大的特点就是省线。所有变频器并接在同一对A/B线上从PLC的485通讯口出去一根两根线从头串到尾接线量直接减少一个数量级。成本上更是肉眼可见的差距。按五台变频器算项目硬线模拟量方案MODBUS RTU方案模拟量扩展模块需要2~3块成本高不需要485通讯扩展板不需要一块几百元信号线/端子/工时多布线复杂两根屏蔽线半小时搞定抗干扰能力模拟量长距离易衰减数字差分信号抗共模干扰好再扩展一台的成本可能还要加模块只要站号够线照旧很多人担心485总线不稳定实际上在几十米到几百米的柜内通讯距离上9600bps或19200bps下是非常稳的。真正不稳定的大多数是接地、接线、参数没配对这些低级问题这个放到后面第6节详细说。1.3 为什么不用三菱自家的专用变频器协议而是MODBUS三菱PLC配三菱自家的变频器确实有更省事的专用协议帧结构固定写起来简单。但问题是甲方一旦换个变频器品牌或者现场混着国产、台系、韩系好几个牌子的变频器专用协议就全废了主站程序得重写。MODBUS RTU是公开协议几乎所有带通讯口的变频器都支持不只变频器——软启动器、电表、温控器、流量计遍地都是MODBUS设备。用这套协议做主站以后想往总线上挂别的设备程序框架完全不用动只要改功能码和寄存器地址。还有一个很实际的考虑三菱FX3U有一条ADPRW指令专门做MODBUS主站确实方便但FX1S、FX1N、FX2N这些老机型并不支持。标题里特意点名支持FX1S/FX1N/2N/3U就是因为用RS指令自己组帧可以通吃整个FX家族。一台老设备柜里躺着FX1N你也照样能用这套逻辑。这是通用性换来的最大底气。2. 先讲清楚物理层和参数约定接线不好后面全是玄学2.1 RS-485接线到底怎么接RS-485是差分信号两根线分别标A、B也有标D、D-的还有标485、485-的叫法五花八门本质都一样。从PLC的485端子开始A接A、B接B把所有变频器手拉手串起来最后一台再返回PLC形成一条总线。这里有两个问题一定要原地说清楚一个是A/B接反。很多变频器手册上A、B的位置画得不够显眼或者和PLC模块的标注习惯不一样接反了的表现是通讯完全没反应或者收到一堆CRC错。排查时第一件事就是对调A/B试一下。另一个是屏蔽层怎么接。485线通常用屏蔽双绞线屏蔽层原则上单端接地比如只在PLC这一端接地另一端悬空。两头都接地容易形成地环路变频器柜和PLC柜的地电位一旦有压差屏蔽层上会跑地环流反而引入干扰。实际项目中很多噪声问题都是从这里来的。还有两个细节一个是手拉手串接不要搞成星型。一旦从某个分支出去分成两路总线阻抗不连续信号反射厉害高速率下尤其明显。另一个是终端电阻标准做法是总线两端各接一个120欧左右的电阻很多变频器内部有拨码开关拨到ON就是接入终端电阻具体看手册。2.2 串口参数约定与D8120换算MODBUS RTU在RS-485上跑串口参数必须完全一致否则根本握手不上。最常用的组合是9600、8数据位、偶校验、1停止位写成习惯的简写就是9600-8-E-1也有不少人用8-N-1无校验。我个人的倾向是能上偶校验就上偶校验多一位校验位帧的正确性更有保障。在三菱FX里串口参数由特殊寄存器D8120控制不同型号的bit定义略有差异但大框架一致。我以FX3U的手册定义为例几个常用配置参考值如下串口参数D8120参考值9600, 8, N, 1H05019600, 8, E, 1H506119200, 8, N, 1H060119200, 8, E, 1H6061别看这个十六进制值很随机其实是按bit拼出来的低字节的bit0决定数据长度bit5、bit6决定校验bit7决定停止位高字节的低4位决定波特率。所以改参数的时候不要直接用参考值最好按手册的bit定义验算一遍尤其FX1S和FX1N的老手册里个别保留位的写法不完全一样。程序里还要置位M8161把串行通讯切换成8位模式。这个很关键MODBUS RTU的帧是按字节组织的8位模式下RS指令按字节处理收发缓冲区组装帧和解析帧都直观很多否则按16位字处理高低字节顺序会让你疯掉。2.3 每台变频器要设置的几个参数变频器侧要设置的参数不同品牌叫法不一样但逃不出这几项通讯协议选MODBUS RTU有些变频器里叫MODBUS有些叫RTU有些是07通讯协议总之一句话别选成ASCII模式。本机站号从1开始编5台就是1到5。站号0是广播地址变频器收到广播帧不会回复所以不能把站号设成0当常态使用。波特率、数据格式必须和PLC的D8120完全一致。运行指令来源改成通讯给定否则PLC发启动命令过去变频器面板上的启动按钮还占着控制权命令根本执行不了。频率指令来源同样改成通讯给定。通讯超时动作这是最容易被忽略的一项。意思是总线上一段时间收不到报文之后变频器怎么做常见的可选项是保持当前运行、减速停车、按故障停车。这个要根据工艺来定安全的做法是评估设备停机的风险不要一概而论。站号重复的问题要单独说一句。总线上两台变频器设成同一个站号发送请求时会互相抢应答结果就是你收到一堆乱帧CRC错误满天飞。设备安装时拿标签纸把站号写在每台柜门上比几个月后对着说明书猜省太多时间。2.4 功能码和寄存器映射03、06、10H三个就够MODBUS功能码一大堆做变频器主站其实用不了那么多我实际项目里来来去去就三个功能码名称用途03读保持寄存器读运行状态、输出频率、输出电流、母线电压06写单个寄存器写一个设定值比如给定频率10H写多个寄存器一次把运行命令和频率同时写进去为什么用03读状态因为变频器的运行状态、故障代码、输出频率、电流这些数据都是放在保持寄存器里的03一条请求可以把连续几个寄存器读回来一次刷新一片数据。比如站号1、功能码03、起始地址0x0000、数量0x0006就能一次读回前6个寄存器里面通常就是状态字和频率字。06和10H的区别在于06一次只能写一个寄存器10H可以连续写多个寄存器。拿“启动给定频率”这种最常见的操作来讲用06必须分两帧写先写运行命令再写频率设定用10H的话一帧搞定起始地址指向运行命令寄存器数据区里带上两个寄存器的值总线占用少发号施令的即时性也更好。寄存器地址这件事上不同变频器手册的写法最容易把人绕晕。有的是协议侧地址比如0x0000、0x1000这种十六进制有的直接给你PLC侧地址比如40001、40002这种十进制。如果手册写40001对应到协议侧的地址就是40001减40001等于0也就是0x0000写40002则协议地址是1。组帧时填的一定是协议侧的十六进制地址千万别把40001当成实际地址直接填进去。3. FX系列PLC程序整体架构与收发时序拆解3.1 初始化段与软元件分配程序用RS指令做主站整体架构分三段初始化段、轮询发送段、接收解析段。初始化最好放在M8002首次扫描脉冲上只在PLC上电时执行一次。要做的事情就三件置位M8161切8位模式把D8120写入串口参数定义RS指令的收发缓冲区。缓冲区用D元件从某个地址开始连续占一块我给一个参考分配方案软元件用途D1000当前轮询到的台号索引D1001重试计数D100~D107发送缓冲区一帧8个固定区D120~D131接收缓冲区预留24字节D60~D64每台变频器的当前频率缓存D70~D74每台变频器的运行状态缓存M80~M84每台变频器的在线标志M50轮询流程的发送触发标志M51接收完成处理标志M52超时/异常标志RS指令本身放在主程序里写法是LD M8002 SET M8161 MOV H5061 D8120 // 9600,8,E,1以你的PLC手册为准 MOV K1 D1000 RS D100 K8 D120 K24这里有人说RS指令不是要在主程序里一直调用吗其实RS指令只是定义收发缓冲区的起始地址和长度PLC在后台自动完成硬件的收发动作梯形图里扫描到这一句把它执行一遍就生效不需要每个扫描周期都刷。有一点要提醒8位模式下RS指令的K值是按字节算的D100到D107虽然是8个D元件但作为缓冲区实际存放8个字节的数据。如果某个老型号PLC的手册写法和这个不完全一致记得按自己手上那台的手册转换一下见过有人把K8写成K4结果帧只发了一半。3.2 RS指令的收发控制时序RS指令背后的工作逻辑是这样发送缓冲区里放好要发的数据后把M8122置ONPLC自动把缓冲区的内容从485口发出去发完M8122自动复位。接收的情况类似每收到一帧有效数据M8123置ON告诉你接收完成用户程序处理完数据以后要手动把M8123复位等待下一帧进来。这里最容易搞错的是复位时机。M8123置ON后如果一直不复位整个接收功能就锁死了后面的帧进不来总线上一大堆请求全部石沉大海。所以解析完数据的第一件事就是RST M8123。发送段的梯形图逻辑大致是这样LD M50 // 轮询触发该给当前台号发请求了 AND M8123 // 上一轮接收处理完毕 ANI M8122 // 发送不在进行中 SET M8122 // 启动发送接收完成段的处理LD M8123 SET M51 // 标记有响应需要解析 RST M8123 // 立刻复位让接收功能恢复理解了这套时序后面的轮询就好办了发一帧、等一帧、处理完再发下一帧永远是一问一答闭环推进。3.3 CRC16校验子程序MODBUS RTU的每一帧末尾都带两个字节的CRC16校验码计算的是整帧从站号到最后一个数据字节的所有内容算法是CRC-16/MODBUS初值0xFFFF多项式0xA001低位在前发送。如果用电脑写程序这个算法三行就搞定CRC16计算逻辑 1. CRC寄存器初值 0xFFFF 2. 对帧内每个字节 CRC CRC XOR 当前字节 重复8次 如果CRC最低位为1 CRC (CRC 1) XOR 0xA001 否则 CRC CRC 1 3. 帧末尾先发CRC低字节再发CRC高字节在FX的梯形图里实现同样的逻辑思路是用一个计数器做8次循环逐一判断CRC寄存器的最低位。三菱的位处理指令做这件事不算太费事但要注意别把移位搞成循环移位SHR和ROR是两回事移位过程中移出去的那一位是判断条件不能参与下一次运算。还有一点很坑CRC的两个字节低字节在前、高字节在后。很多第一次写的人按习惯先发高字节结果变频器永远报CRC错。不要问我怎么知道的现场拿电脑调试助手一帧一帧对过就懂了。3.4 组帧与拆帧一帧报文到底长什么样以读请求为例站号1功能码03读从寄存器0x0000开始的6个寄存器完整帧是01 03 00 00 00 06 CRC_L CRC_H一共8个字节。写单个寄存器比如把站号1的频率寄存器0x0001写成5000对应50.00Hz完整帧是01 06 00 01 13 88 CRC_L CRC_H写多个寄存器比如站号1从0x0000开始连续写2个寄存器数据是0x0001和0x138801 10 00 00 00 02 04 00 01 13 88 CRC_L CRC_H收到的响应帧同样按字节解析。03的响应是01 03 02 00 01 13 88 CRC_L CRC_H其中第3字节是数据字节数后面跟数据。06的响应是原帧返回一模一样。10H的响应是01 10 00 00 00 02 CRC_L CRC_H只回地址、功能码、起始地址和数量。拆帧的时候还要判断功能码的异常响应。如果请求的功能码加上0x80返回比如收到0x83或0x86代表变频器返回的是异常帧后面的数据是异常码不是正常数据。程序里要把它当成错误处理不要硬解析成频率或电流。4. 多台从站轮询与异常兜底逻辑4.1 轮询状态机简单却要命的顺序控制多台变频器的核心不是怎么发一帧而是怎么让好几台变频器有条不紊地轮流通讯。我的做法是用D1000保存当前轮询到的台号索引从1开始处理完这台之后加1超过最大台数就回到1。每台的处理流程固定为组帧、发送、等待响应、解析、下一台。梯形图里不要用乱七八糟的跳转把轮询写成一团乱麻建议用CALL调子程序的方式。组帧子程序根据当前台号把站号填进发送缓冲区再按功能码把寄存器地址和数据填好最后调用CRC子程序算出校验值。发送成功后程序进入等待状态。等待状态是轮询的关键。发完请求不能立刻发下一台必须等变频器应答或者等超时判定完成否则总线会乱套。RS指令本身就有M8123接收完成和超时标志M8129没有M8129的机型可以自己用定时器T设置一个等待窗口比如50毫秒到100毫秒。4.2 超时、重试与掉线判断变频器不响应的情况太常见了从站没上电、站号写错、线松了、地址不对任何一种都可能让请求石沉大海。所以轮询里必须有超时兜底不然程序卡在等待状态整条总线瘫痪。超时的逻辑是发送请求后给一个定时窗口比如80毫秒窗口结束还没收到M8123置位就认为这一台超时。超时后重试同一条请求重试计数加1连续3次都没有响应判定这台掉线置对应的M80台号掉线标志然后强制跳过这台继续轮询下一台。为什么要强制跳过因为如果不跳程序就会一台一台地死等轮询周期被无限拉长正常的那几台变频器也跟着遭殃触摸屏上的数据全部定格。掉线的台号该报警报警但总线资源不能始终耗在它身上。轮询周期可以粗略估算9600bps下一个字节要1毫秒左右一帧8字节加间隔约10毫秒变频器响应时间通常在10到30毫秒一台一个来回算50到80毫秒五台跑一圈也就是0.3到0.5秒。这个刷新率对触摸屏显示频率、电流、状态来说完全够用人眼看不出延迟。4.3 读写分离读要勤写要省一开始做的版本是每个轮询周期把状态、电流读了顺手也把频率写一次结果发现一个隐患触摸屏上每一次微小的数据刷新都会触发一次写请求总线上全是写帧读帧反而被挤占。后来把读写任务分开调度读操作每个轮询周期都做保证画面上的状态、频率、电流始终新鲜写操作只在设定值变化时才发。具体做法是触摸屏写入的目标值先放到一个软元件缓冲比如D50程序里拿D50和D55保存的上次成功写入值比较有变化才组帧发送发送成功后再把D55更新为D50。这样设计的好处很明显正常运行时总线上一圈全是读请求轻快干净只有人工改了频率或者点了启动按钮才插入写帧而且写帧在整个轮询周期里的优先级要做高处理别让它被读请求排队排到天荒地老。4.4 在线状态怎么给触摸屏每台变频器的在线标志是一个位M80对1号机M81对2号机以此类推。触摸屏上做一个报警显示条件就是M80到M84任意一个为ON文本提示是“1号变频器通讯失败”“2号变频器通讯失败”这样。频率、电流的缓存放在D60到D64这样的连续区HMI直接做软元件关联即可。注意这里有个原则触摸屏不要直接和变频器通讯。有些项目图省事让触摸屏的串口再接一条总线出去直接读变频器一旦触摸屏软件或者变频器通讯参数有变化最容易引发总线冲突。PLC已经把所有数据都读回来了HMI直接从PLC取数是风险最低的架构。5. 频率给定与数据格式0.01Hz、负数和字节顺序5.1 频率值换算与16位上限变频器频率给定的寄存器单位最常见的是0.01Hz也就是说50.00Hz对应的寄存器数值是5000。如果你要给定35.50Hz写入的值就是3550这个换算关系看着简单但真在程序里手写乘除法时反而最容易出低级错误。有个问题必须提前处理16位寄存器能表示的最大正数是32767最大无符号值是65535。如果变频器支持到400Hz用0.01Hz单位就是40000超过32767了。你以为写进去的40000会变成-25536变频器直接判定为非法频率或者报通讯故障。处理办法有两种一是看看变频器是否支持双字32位频率给定起始地址连续占两个寄存器调用10H写多个寄存器一次写完二是台上限换一种单位比如0.1Hz单位400Hz就是4000完全在16位范围内代价是给定精度只能到0.1Hz低速时可能不太够用。具体选哪种取决于现场工艺对频率精度的要求。5.2 反转和负数怎么给很多变频器的频率寄存器是无符号的正值正转、反转不是靠频率正负来区分的而是靠运行命令字。命令字写1是正转写2是反转写0是停止频率给定始终给正数。这种情况下组帧最简单方向控制单独一个寄存器频率值永远是0到最大值之间的正整数。也有一部分变频器的频率寄存器用有符号数表示负值代表反转换算的时候要小心补码。FX里MOV K-5000到一个D元件十六进制存的就是补码直接往发送缓冲区里填没有问题。但解析回读的数据时如果读回一个大于32768的数记得把它按有符号数处理成负数否则画面显示65536减去5000这种莫名其妙的读数。不管哪种方式最稳的做法是在调试阶段先用手动给定让变频器面板显示一个已知频率然后PLC去读同一个寄存器看看读回来的值和面板显示能否对上。对不上就先搞数据格式别急着往下编。5.3 高低字节顺序的坑标准MODBUS也挡不住不同实现MODBUS RTU标准规定16位寄存器发送时高字节在前、低字节在后也就是大端序。你一帧写0x1388线上数据应该是13 88。但有一部分变频器的实现偏偏是按低字在前来的你发13 88过去它解析成0x881334835对应频率348.35Hz轻则报故障重则直接冲上去过流跳闸。排查这个问题的标准动作是先写一个小数进去比如1.00Hz对应的100也就是0x0064线上是00 64。如果变频器面板显示的不是1Hz而是25600Hz0x6400那就是高低字节反了。高低字节顺序这个坑还牵连到接收方向。03读回来的频率字同样存在字节顺序问题有的变频器回的是标准的13 88有些回的却是88 13。所以收发两个方向都要验证一遍不要觉得读请求和写请求能各自正常工作就万事大吉那只能说明刚好你选对了组合。6. 现场联调中的实际问题排查6.1 完全无响应时的排查链路遇到“PLC发请求变频器一点反应没有”别急着改程序按这个顺序查基本不漏接线把A和B对调一下这是成本最低的试验。很多所谓通讯不通换一下线就好。在线端子处量一下A-B之间的电阻如果终端电阻都已经正确接入总线两端的等效电阻应该在60欧左右两端120欧并联。阻值明显不对说明有不正常的分支或者缺终端电阻。变频器站号是否设置正确站号0不会单独应答两台站号重复一定会乱。串口参数D8120和变频器侧波特率、帧格式是否一致包括校验位。用电脑USB转485加一个串口调试助手直接对变频器发一帧03读请求通不通一目了然。看M8123和M8129的状态。M8123一直不复位或者M8129频繁置位说明程序侧的逻辑也有问题。在线监控里盯一眼就清楚。这里强烈建议常备一套USB转485调试工具发帧收帧看得明明白白比PLC在线监控直观太多。很多现场问题电脑上一试就知道是变频器的问题还是PLC的问题。6.2 CRC错误一抓一大把CRC错多通常不是算法问题而是通讯链路质量不行。之前写过一套CRC写完从没出过错但现场一上电就报CRC错最后发现是485线从变频器的主回路动力线槽里走了一百米干扰全部耦合进来了。常见原因和对策现象主要原因对策稳定CRC错A/B接反、参数不一致、站号冲突对调A/B核对参数查站号频繁CRC错干扰、线太长、速率过高降波特率双绞屏蔽远离动力线偶尔CRC错屏蔽层接地不当、端电阻缺失单端接地总线两端接120欧电阻星型分支布线阻抗不连续改成手拉手菊花链CRC错的排查要善用统计。如果错误均匀分布、毫无规律基本就是链路质量如果集中在某台设备启动或某个接触器吸合的瞬间那就是干扰源找到了在该处加磁环或者把通讯线移开问题往往立竿见影。6.3 偶发掉线但重启又正常这种毛病最烦人因为重现不了经常是现场跑一两个小时才掉一次重启又好了。大概率方向是干扰和时序不是逻辑错误。重点观察掉线时刻和什么动作重合是某台变频器启动瞬间是大功率接触器吸合瞬间还是触摸屏上正好有人点了启动按钮如果是这种瞬态干扰要在硬件上吸收——磁环、屏蔽层接地、双绞线都是老办法。程序侧还有一些需要检查的地方D8129超时时间是不是给得太短导致正常响应稍微慢点就被误判为超时M8123有没有可能因为干扰收到一个错误帧后没有来得及复位RS指令是不是被放在某个只在特定条件下执行的分支里导致扫描到它的时机不稳定。最后还有一个很隐蔽的问题变频器的通讯超时动作。如果设成了“通讯超时后自由停车”总线上一旦因为干扰丢了一两帧变频器可能直接停下来但现场看起来就是“偶发掉线”。这种设置有时候是符合安全要求的但如果工艺上不允许突然停车要和甲方仔细确认清楚。6.4 程序调试的顺序建议最后分享一套我自己固定的调试顺序每次新接多台变频器都照这个走极少返工只接一台变频器关掉其他从站。先用电脑调试助手发03读请求确认寄存器地址和数据格式都对。用PLC发只对这台变频器的读请求观察M8123是否置位解析出来的数据是否和变频器面板一致。读通了再测写先写一个不容易出事故的寄存器最好是频率给定给定一个很小的值确认面板显示正确。顺序写启停命令和安全逻辑的寄存器只发单台不挂别的台。单台完全通过后接入第二台再把站号逐个确认然后逐步增加台数观察整轮轮询周期和每台的数据刷新率。如果第2步就卡住了在线监控里看D8120的值是不是你写进去的那个看M8122能不能正常置位看M8123有没有置位过。一切“程序按理说没问题”但总是不通的时候回到第1步用电脑测变频器这种排查手段能省下半天时间。最后说一句掏心窝的话程序里的逻辑再怎么绕真正决定项目成败的往往是现场那根485线。我这些年踩得最深的坑是以为代码能解决一切最后发现不过是一块485扩展板的螺丝没拧紧、屏蔽层没接地。先把每台变频器用电脑调试助手单独测通再让PLC上总线一个小时能顶在设备柜前耗一整天。站号记在纸上不如贴在柜门上通讯设备也会好好地感谢你。

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

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

免费获取报价 →
↑