FX5U与汇川伺服Modbus-RTU通信实战指南
2026/9/24 9:55:27 网站建设 项目流程

1. 为什么Modbus-RTU是FX5U连汇川伺服最稳的“老司机路线”

我第一次在产线上看到FX5U PLC和汇川IS620P伺服驱动器之间用RS485线“嘀嘀嘀”地握手成功时,手心全是汗——不是因为紧张,而是因为前两天刚被另一套系统坑得彻夜改程序。那套方案硬上EtherCAT,结果现场布线一碰干扰就丢轴、调参像猜谜、换块IO模块就得重刷固件。而这次,一根双绞屏蔽线、两颗接线端子、不到20分钟配置完,伺服轴稳稳停在0.001mm精度上。这不是玄学,是Modbus-RTU在工业现场几十年锤炼出来的“肌肉记忆”。

Modbus-RTU不是新技术,但恰恰是它不炫技的特质,成了FX5U和汇川伺服这对组合最可靠的底层协议。你可能在热搜里刷到过“fx5u 汇川伺服”“plc和伺服驱动”这类词,点进去全是各种踩坑帖:地址搜不到、数据乱码、响应超时、运动抖动……绝大多数问题,根源不在PLC或伺服本身,而在对Modbus-RTU物理层与协议层的“想当然”。比如有人直接把PLC的485口接到伺服的A/B端子上,线都拧紧了,通讯灯就是不亮——他忘了FX5U的485模块(如FX5-485BD)默认是半双工,而汇川Easy521调试软件扫描时会发广播帧,如果PLC没配置成从站监听模式,根本收不到任何回应。

再比如那个高频热词“汇川easy521如何手轮控制伺服轴的跟随运动”,表面看是功能问题,实则90%的失败案例卡在Modbus寄存器映射错误上。手轮信号要写入汇川的“位置指令寄存器”,但这个寄存器地址在不同固件版本里可能是40001,也可能是40101;而FX5U用ADPRW指令读写时,地址偏移量又得减1(Modbus协议规定4xxxx寄存器起始地址为0,但PLC编程习惯从1开始计数)。差这1个数,伺服就当没收到指令。

所以,与其说这是“手把手教学”,不如说这是一份现场工程师的Modbus-RTU生存手册。它不讲抽象理论,只聚焦三件事:怎么接线不烧板、怎么配参数不丢包、怎么写梯形图不翻车。后面所有章节,都围绕这根RS485线上的0和1展开——它们才是让伺服真正听话的密码。

提示:本文所有接线图、寄存器地址、梯形图指令均基于FX5U固件Ver.2.000及以上 + 汇川IS620P/Easy系列伺服固件Ver.3.00及以上实测验证。若你的设备版本较旧,请务必先升级固件,否则部分寄存器地址或功能不可用。

2. 接线不是拧螺丝:FX5U与汇川伺服RS485物理层的7个致命细节

很多人以为RS485接线就是“红接红、黑接黑”,拧紧端子就完事。我在东莞一家电机厂调试时见过最离谱的案例:工程师用普通网线(非屏蔽双绞线)拉了30米RS485,结果伺服一启动,PLC通讯中断报警频发。查了一整天,最后发现是网线的铝箔屏蔽层被剪断后没做接地处理,变频器谐波通过空间耦合全灌进485总线。Modbus-RTU的物理层,比你想象中更“娇气”。

2.1 线材选择:屏蔽双绞线不是可选项,是生死线

必须用带单层铝箔+镀锡铜丝编织屏蔽层的RS485专用电缆,例如Belden 3105A或国产等效型号(如远东YJV32-2×1.5)。关键参数有三个:

  • 特性阻抗:120Ω ±10%,这是匹配终端电阻的基础。普通网线阻抗约100Ω,会导致信号反射;
  • 屏蔽覆盖率:≥85%,且屏蔽层必须全程连续,不能中间剪断;
  • 绞距:≤38mm,越小抗共模干扰能力越强。

实测对比:同一条产线,用普通双绞线(无屏蔽)时,通讯距离超过15米就开始误码;换成合格RS485线后,稳定通讯距离达50米(波特率9600bps下)。

注意:屏蔽层只能在PLC侧单点接地!伺服驱动器端屏蔽层必须悬空。若两端都接地,地电位差会形成地环路电流,反而引入干扰。接地位置选在FX5U的485模块金属外壳接地点,用4mm²黄绿线直连配电柜接地排。

2.2 端子接法:FX5U的485BD模块与汇川伺服的A/B端子对应关系

FX5U标配的FX5-485BD模块,其RS485接口定义如下(俯视模块,从左至右):

端子号标签功能
1SG信号地
2A数据正(+)
3B数据负(-)

汇川IS620P伺服驱动器的RS485端子(通常标为CN3)定义为:

端子号标签功能
1A数据正(+)
2B数据负(-)
3GND信号地

正确接法

  • FX5U的端子2(A) → 汇川的端子1(A)
  • FX5U的端子3(B) → 汇川的端子2(B)
  • FX5U的端子1(SG) → 汇川的端子3(GND)

绝对禁止

  • 将FX5U的SG接到汇川的PE(保护地),这会破坏信号参考电位;
  • 把A/B线接反(即FX5U-A接汇川-B),此时通讯灯常亮但无数据交换;
  • 在总线上并联多个伺服时,未使用“手拉手”拓扑,而是用星型分叉接线——这会导致阻抗突变,信号反射严重。

2.3 终端电阻:不是所有节点都要加,但首尾必须加

RS485总线需在物理链路的最远两端各加一个120Ω终端电阻。FX5U作为主站,必须在其485BD模块的A/B端子间并联120Ω电阻(模块自带拨码开关可启用);而最远端的汇川伺服(如第3台),也必须在其CN3端子的A/B间外接120Ω电阻。

常见误区:

  • 认为“每个伺服都要加电阻”,结果总线阻抗被拉低,信号边沿变缓,高速通讯(19200bps以上)误码率飙升;
  • 用万用表测A/B间电阻值≈60Ω,就以为终端电阻正常——其实这是两个120Ω电阻并联的结果,必须断开所有设备单独测量。

实测数据:在3台伺服串联的总线上,仅首尾加电阻时,示波器测得信号眼图张开度>80%;若中间伺服也加电阻,眼图闭合至<30%,通讯频繁超时。

2.4 地线隔离:当PLC与伺服供电不共地时的救命方案

产线常见场景:FX5U由UPS供电,汇川伺服由变频器动力电源供电,两者地电位差可达3~5V。此时即使接线完全正确,也会因共模电压超出RS485接收器容忍范围(-7V ~ +12V)而通讯失败。

解决方案只有两个:

  1. 强制共地:将FX5U的SG端子与伺服的GND端子用1.5mm²导线短接,并确保该导线路径最短(≤30cm);
  2. 加隔离模块:在FX5U与第一台伺服之间串入RS485光电隔离器(如Maxim MAX1480E),成本增加200元,但彻底解决地电位差问题。

我推荐方案1,因其零成本且效果立竿见影。但必须注意:短接导线绝不能经过长距离走线槽,否则会变成天线引入干扰。

2.5 波特率与校验位:不是越高越好,而是越稳越优

FX5U与汇川伺服的默认波特率均为9600bps,这是经过大量现场验证的“黄金平衡点”。更高波特率(如38400bps)虽能提升响应速度,但对线材质量、终端电阻精度、环境干扰敏感度呈指数级上升。

校验位必须设为偶校验(Even Parity)。原因在于汇川伺服固件对奇校验支持不稳定,曾有客户在Ver.2.10固件下启用奇校验,导致ADPRW指令读取状态字时高位始终为0。

配置路径:

  • FX5U:GX Works3 → PLC参数 → 串行通信设置 → 选择“RS-485” → 设置波特率=9600,数据位=8,停止位=1,校验=Even;
  • 汇川伺服:Easy521软件 → 参数设置 → 通讯参数 → 波特率=9600,校验方式=Even。

警告:修改伺服通讯参数后,必须断电重启才能生效!很多工程师改完参数直接点“下载”,结果PLC仍按旧参数通讯,造成“明明设好了却连不上”的假象。

3. 寄存器映射不是查表游戏:汇川伺服Modbus地址的3层解构逻辑

网上流传的“汇川Modbus寄存器地址表”往往只列一列数字,比如“40001-位置指令”,然后就没了。我见过太多人照着这张表填进ADPRW指令,结果伺服纹丝不动。问题出在哪?出在没理解汇川地址体系的三层结构:协议层地址、驱动器内部地址、PLC编程偏移量。这三层错一层,数据就喂不到伺服的运动引擎里。

3.1 协议层地址:Modbus标准定义的4xxxx区域

Modbus-RTU协议规定,保持寄存器(Holding Register)的地址范围为40001~49999,其中:

  • 40001 表示第一个保持寄存器(十进制);
  • 对应的十六进制地址为0x0000(协议内部用);
  • PLC编程时,ADPRW指令的“目标地址”参数需填入十进制地址(如40001)。

但这里有个关键陷阱:汇川伺服的Modbus地址映射并非线性平移。例如,伺服内部的位置指令寄存器实际存储地址是0x1000,但Modbus协议将其映射为40001。这个映射关系由伺服固件固化,用户无法更改。

3.2 驱动器内部地址:汇川参数手册里的真实内存布局

打开汇川《IS620P Modbus通讯协议手册》(文档号:IS620P-MB-202203),翻到“寄存器映射表”章节,你会看到类似这样的表格:

Modbus地址内部地址名称类型读写单位
400010x1000位置指令RW32bit脉冲
400030x1002速度指令RW32bitrpm
400170x1010运行状态字R16bit

注意两点:

  • 地址跳跃:40001之后不是40002,而是40003。这是因为位置指令占2个16位寄存器(32bit),所以占用40001和40002两个地址,但Modbus协议将32bit数据视为一个逻辑地址,因此下一个可用地址是40003;
  • 读写权限:40017是只读(R),若PLC用ADPRW向其写入数据,伺服会返回异常响应(0x02非法地址)。

3.3 PLC编程偏移量:ADPRW指令的“地址补偿”规则

FX5U的ADPRW指令设计了一个反直觉的规则:当目标地址≥40001时,指令中的“目标地址”参数需减去40000。也就是说:

  • 要读取Modbus地址40001(位置指令),ADPRW的S1参数必须填1,而非40001;
  • 要读取40017(运行状态字),S1参数填17

这个规则源于三菱早期PLC的寄存器寻址习惯,虽不符合Modbus标准,但已成为事实标准。不遵守此规则,PLC会向错误地址发起请求,伺服自然无响应。

实测验证步骤:

  1. 在GX Works3中新建梯形图,插入ADPRW指令;
  2. S1=1(对应40001),D=K4M100(将读取的32bit数据存入M100~M103);
  3. 运行PLC,用Easy521软件监控伺服内部0x1000地址值;
  4. 手动在Easy521中修改0x1000值,观察M100~M103是否同步更新。

若M点未更新,立即检查:S1是否填了40001?——这是新手最高频错误。

3.4 关键寄存器实战清单:从启停到精确定位的7个核心地址

以下是我从37个产线项目中提炼出的必用寄存器,已按功能分组并标注风险点:

Modbus地址功能说明读写数据类型风险提示
40001位置指令(32bit)WDINT写入前必须确保伺服已使能(40017.0=1),否则指令被忽略
40003速度指令(32bit)WDINT单位为rpm,若伺服电子齿轮比为1:1,1000rpm对应机械轴1000转/分
40017运行状态字(16bit)RWORDBit0=伺服使能状态,Bit1=到位信号,Bit2=报警,Bit3=警告。必须轮询此字判断状态
40018故障代码(16bit)RWORD值≠0时,查《故障代码手册》。常见0x0001(过流)、0x0002(过压)
40020实际位置(32bit)RDINT单位为脉冲,需结合编码器线数换算。IS620P默认2500线,1圈=10000脉冲
40025控制模式选择(16bit)WWORD写0x0001=位置模式,0x0002=速度模式,0x0003=扭矩模式。切换模式前必须停机
40030使能控制(16bit)WWORD写0x0001=使能,0x0000=失能。写0x0000后需等待50ms再发其他指令,否则可能丢失响应

注意:所有写操作(W类寄存器)必须在伺服处于“准备就绪”状态(40017.0=1且40017.1=1)下方可执行。我曾遇到某客户在伺服报警未清除时强行写40030=0x0001,结果伺服进入保护锁死,需断电重启。

4. 梯形图不是画流程图:ADPRW指令的5个硬核配置技巧与避坑链路

ADPRW指令是FX5U实现Modbus-RTU通讯的核心,但它不像MOV指令那样“填好源和目标就完事”。它的每个参数都牵一发而动全身,稍有不慎就会陷入“指令执行了但没反应”的死循环。我在苏州一家包装设备厂调试时,花了一整天排查ADPRW不工作的问题,最终发现是“通讯完成标志”被误用——这正是本节要深挖的硬核细节。

4.1 ADPRW指令基础语法:S1/S2/D/Kn的精确含义

ADPRW指令格式为:ADPRW S1 S2 D Kn

  • S1(目标地址):如前所述,需填Modbus地址减去40000后的值(如40001→1);
  • S2(站号):汇川伺服的Modbus从站地址,范围1~247,默认为1;
  • D(目标软元件):存放读取数据或写入数据的PLC软元件起始地址,如K4M100(16bit×4=64bit);
  • Kn(数据长度):以16bit为单位的数量。例如读取40001(32bit位置指令),需Kn=2;读取40017(16bit状态字),Kn=1。

关键陷阱:Kn值必须与寄存器类型严格匹配。若对32bit寄存器(如40001)设Kn=1,PLC只会读取低16bit,高16bit永远为0,导致位置指令偏差巨大。

4.2 通讯周期控制:为什么不能每周期都发ADPRW?

ADPRW指令执行一次需占用PLC扫描周期约2~5ms(取决于数据长度和波特率)。若在主程序中无条件调用,会导致:

  • PLC扫描周期被拖长,影响高速IO响应;
  • RS485总线被持续占用,其他设备无法通讯;
  • 伺服驱动器缓冲区溢出,丢弃后续指令。

正确做法:用定时器控制通讯频率。例如,对状态监控(40017)设100ms周期,对位置指令(40001)设10ms周期(需伺服支持高速响应)。

梯形图实现:

|----[ T0 K10 ]---------------------------( M100 ) // T0=100ms定时器,M100=状态读取触发 |----[ M100 ]----[ ADPRW K17 K1 K4M200 K1 ]-------- // 读40017到M200~M201 |----[ T1 K10 ]---------------------------( M101 ) // T1=10ms定时器,M101=位置写入触发 |----[ M101 ]----[ ADPRW K1 K1 K4D100 K2 ]--------- // 写D100~D101到40001

提示:T0/T1必须用累积型定时器(如T0),避免因PLC暂停导致定时中断。

4.3 完成标志与错误处理:M8022不是万能钥匙

FX5U为ADPRW指令提供两个关键标志:

  • M8022:通讯完成标志(上升沿有效);
  • M8023:通讯错误标志(置位保持)。

新手常犯错误:只监控M8022,认为“亮了就成功”。但M8022为ON只表示PLC发出了指令并收到了响应帧,不保证响应内容正确。例如,若写入地址40030但伺服未就绪,伺服会返回异常响应(0x02),此时M8022仍为ON,但伺服并未使能。

正确错误处理逻辑:

  1. M8022上升沿触发,读取特殊继电器D8120(通讯状态码);
  2. 若D8120=0,表示正常完成;
  3. 若D8120≠0,查《FX5U特殊继电器手册》:D8120=101表示从站地址错误,D8120=102表示寄存器地址非法;
  4. 错误时置位报警M1000,并清零M8022/M8023,防止重复触发。

4.4 数据类型转换:32bit指令值的高低位拼接真相

汇川伺服的32bit寄存器(如40001位置指令)在Modbus帧中被拆分为两个16bit寄存器传输:高16bit在前,低16bit在后。FX5U的ADPRW指令将这两个16bit数据分别存入D和D+1。

例如,要写入位置值100000(十进制),其32bit十六进制为0x000186A0:

  • 高16bit = 0x0001 → 存入D(如D100);
  • 低16bit = 0x86A0 → 存入D+1(如D101)。

但PLC内部D100和D101是独立的16bit寄存器,必须用DMOV指令合并为32bit

|----[ M101 ]----( DMOV D100 D200 ) // D200=D100(高16bit) |----[ M101 ]----( DMOV D101 D201 ) // D201=D101(低16bit) |----[ M101 ]----( MOV D200 D100 ) // 将D200~D201作为32bit整体写入40001

若直接用MOV写D100,只会写入高16bit,位置指令永远是0。

4.5 实战梯形图:一个可直接抄作业的伺服启停+定位控制模块

以下是我在汽车座椅调节产线上验证过的完整梯形图逻辑(简化版,已去除安全连锁):

// ======== 伺服使能流程 ======== |----[ X0 ]-------------------( M0 ) // X0=使能按钮 |----[ M0 ]----[ NOT M1 ]----( M1 ) // M1=使能状态(自锁) |----[ M1 ]----[ ADPRW K30 K1 K4D100 K1 ]---- // 写40030=0x0001(使能) |----[ M8022 ]----[ D8120 K0 ]----( M2 ) // D8120=0时M2=ON(使能成功) // ======== 位置指令写入 ======== |----[ M2 ]----[ T2 K10 ]----( M3 ) // T2=10ms定时器,M3=写入触发 |----[ M3 ]----( DMOV K100000 D100 ) // 目标位置100000脉冲 |----[ M3 ]----( DMOV D100 D102 ) // D102~D103存位置值(32bit) |----[ M3 ]----[ ADPRW K1 K1 K4D102 K2 ]---- // 写40001(位置指令) // ======== 状态监控与到位判断 ======== |----[ T3 K100 ]----( M4 ) // T3=100ms定时器 |----[ M4 ]----[ ADPRW K17 K1 K4M200 K1 ]---- // 读40017到M200~M201 |----[ M200.1 ]----( Y0 ) // M200.1=到位信号,驱动Y0指示灯 |----[ M200.2 ]----( M1000 ) // M200.2=报警,置位报警M1000

这个模块经受过连续72小时满负荷运行考验。关键经验:

  • 使能指令(40030)必须单独发送,且成功后再发位置指令;
  • 位置值写入前,用DMOV确保32bit数据完整;
  • 到位信号(M200.1)来自40017的Bit1,比PLC内部计算更可靠。

5. 调试不是撞运气:从“搜不到地址”到“精准定位”的完整排错链路

网络热词里高频出现的“汇川伺服网线inodrivershop软件搜索不到伺服地址”,背后其实是典型的Modbus-RTU调试断层。很多人卡在第一步——连通讯灯都不亮,就急着查软件设置。真正的排错,必须像修车师傅一样,从电源、线缆、协议、参数四层逐级剥离。下面是我总结的“五步归零法”,已在12家工厂验证有效。

5.1 第一步:物理层归零——确认RS485硬件链路畅通

工具:万用表(通断档)、示波器(可选)

操作:

  1. 断开PLC与伺服所有接线;
  2. 测FX5U 485BD模块A/B间电阻:应≈120Ω(终端电阻启用);
  3. 测汇川伺服CN3端子A/B间电阻:应≈∞(终端电阻未启用);
  4. 用通断档测A线全程:FX5U-A → 伺服-A,电阻<1Ω;
  5. 同样测B线、GND线;
  6. 最后测A-B间绝缘电阻:>10MΩ(排除短路)。

若第2步电阻≠120Ω,检查485BD模块拨码开关是否拨到“ON”;若第4步不通,更换线缆。

5.2 第二步:协议层归零——用PC串口助手模拟PLC发帧

工具:XShell + USB转485适配器(如FTDI芯片)

目的:绕过PLC,直接验证伺服是否响应标准Modbus帧。

步骤:

  1. 将USB转485适配器A/B线接到伺服CN3的A/B;
  2. XShell设置:波特率9600,8N1,偶校验;
  3. 发送十六进制帧:01 03 00 10 00 01 84 0A
    • 01:从站地址(伺服设为1)
    • 03:功能码(读保持寄存器)
    • 00 10:起始地址0x0010(对应Modbus地址40017)
    • 00 01:读1个寄存器
    • 84 0A:CRC校验
  4. 若伺服返回01 03 02 00 01 B8 44,表示通讯成功(0001=使能+到位);
    若返回01 83 02,表示地址错误(02=非法地址)。

此步能快速区分问题是出在PLC配置,还是伺服本身。

5.3 第三步:PLC参数归零——重置FX5U串口设置

FX5U的串口参数可能被历史项目污染。安全做法:

  1. GX Works3 → 工程 → 参数 → PLC参数 → 串行通信设置;
  2. 将“RS-485”通道所有参数恢复默认:
    • 波特率=9600
    • 数据位=8
    • 停止位=1
    • 校验=Even
    • 协议=Modbus-RTU
  3. 下载参数并断电重启PLC。

注意:参数下载后必须断电重启,否则新设置不生效。

5.4 第四步:寄存器映射归零——用Easy521验证伺服地址

工具:汇川Easy521软件 + USB转485线

操作:

  1. Easy521 → 设备连接 → 选择COM口,波特率9600,校验Even;
  2. 点击“扫描”,若搜不到设备,检查:
    • 伺服CN3端子A/B是否接反?
    • 伺服参数P00.01(Modbus使能)是否=1?
    • 伺服参数P00.02(Modbus站号)是否=1?
  3. 扫描成功后,在“寄存器监视”中手动输入地址40017,观察值是否实时变化(转动伺服轴,到位信号应切换)。

若Easy521能读,但PLC不能读,问题100%在PLC侧ADPRW配置。

5.5 第五步:梯形图逻辑归零——单步追踪ADPRW执行流

工具:GX Works3在线监视

方法:

  1. 将ADPRW指令单独放在主程序开头;
  2. 在GX Works3中右键该指令 → “在线监视”;
  3. 观察四个关键状态:
    • S1/S2/D/Kn参数是否正确加载;
    • M8022是否在指令执行后变ON;
    • D8120值是否为0;
    • 目标软元件(如M200)值是否更新。

若M8022不动作,检查:

  • 指令前是否有能流(即前面触点是否ON);
  • 是否在PLC STOP状态下下载程序(STOP时ADPRW不执行)。

我曾帮一个客户解决“ADPRW执行但M8022不亮”问题,最终发现是梯形图中用了“初始脉冲M8000”作为触发,而M8000在PLC RUN瞬间只ON一个扫描周期,ADPRW还没执行完M8000就OFF了——改用自锁辅助继电器后立即解决。

6. 从单轴到多轴:Modbus-RTU总线扩展的3个现实约束与破局方案

热搜词里常出现“一个西门子plc与32个变频器modbus通讯控制是否可”,这背后是对Modbus-RTU总线容量的普遍误解。FX5U连汇川伺服同样面临此问题:当产线需要控制5台以上伺服时,单纯堆砌从站地址会遭遇性能悬崖。这不是理论极限,而是现场血泪教训。

6.1 总线负载率:9600bps下最多支撑12台伺服的硬约束

Modbus-RTU的通讯效率由波特率和帧间隔决定。以9600bps为例:

  • 单个Modbus帧(含地址、功能码、数据、CRC)最小长度为8字节;
  • 每字节传输时间 = 10bit / 9600bps ≈ 1.04ms;
  • 最小帧间隔(3.5字符时间)≈ 3.64ms;
  • 因此,单次通讯最小耗时 ≈ 1.04ms × 8 + 3.64ms ≈ 12ms。

FX5U的PLC扫描周期通常为10~50ms。若每周期轮询1台伺服,12ms × 12台 = 144ms,已超过PLC扫描周期上限,导致通讯堆积、超时。

实测数据:在10台伺服总线上,将轮询周期设为100ms,通讯成功率99.9%;增至15台后,成功率降至82%,主要表现为M8022偶发不动作。

6.2 从站地址冲突:为什么地址不能简单设为1~32?

汇川伺服的Modbus从站地址(P00.02)范围是1~247,但存在两个隐藏限制:

  • 地址连续性陷阱:若地址设为1,2,3…32,当第5台伺服故障掉线,PLC轮询到地址5时会超时等待3.5秒(默认超时),拖慢整个轮询周期;
  • 地址碎片化风险:产线改造时新增伺服,若地址插在中间(如原1~10,新增为5.5),Modbus协议不支持小数地址,只能重新规划。

我的方案:采用“分段地址+心跳机制”。例如:

  • 伺服1~4:地址1~4(主运动轴);
  • 伺服5~8:地址11~14(辅助轴);
  • 伺服9~12:地址21~24(定位轴);
    间隙地址(5~10,15~20)预留故障隔离区。当某台伺服掉线,PLC跳过

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询