FX3U MODBUS地址:默认映射与自定义分配
在工业现场,用FX3U做MODBUS通讯时,最让人头疼的往往不是程序逻辑,而是地址的对应关系。上位机发过来的“40001”到底对应PLC里的哪个D寄存器?触摸屏上填的“线圈地址”怎么就和Y0对上了?这篇文章把FX3U的MODBUS地址分配逻辑拆开讲清楚。
一、FX3U的MODBUS地址是怎么来的?
FX3U本身并不原生支持MODBUS协议。你需要给它加装 FX3U-485ADP-MB 或 FX3U-232ADP-MB 这类MODBUS通讯适配器,才能作为MODBUS从站(Slave)接入网络。
加装适配器后,PLC内部的软元件(M、D、Y、X、T、C等)会被自动映射到MODBUS的四个标准数据区:
| MODBUS数据区 | 读写权限 | 对应功能码 | FX3U映射的软元件 |
|---|---|---|---|
| 线圈 (Coils) | 读写 | 01, 05, 15 | M, S, TS, CS, Y, X |
| 离散输入 (Discrete Inputs) | 只读 | 02 | X |
| 保持寄存器 (Holding Registers) | 读写 | 03, 06, 16 | D, R, TN, CN, M, S, Y, X |
| 输入寄存器 (Input Registers) | 只读 | 04 | D (特殊区域) |
核心原则:写入(Write)操作只能针对“线圈”和“保持寄存器”这两个读写区;读取(Read)操作可以针对所有四个区。
二、默认地址映射表(出厂设置)
如果你没有做任何自定义配置,FX3U会按照出厂默认的地址映射表来分配。以下是最常用的部分(十六进制):
位软元件默认映射
| MODBUS地址 (Hex) | 映射的FX3U软元件 | 说明 |
|---|---|---|
| 0x0000 - 0x1DFF | M0 - M7679 | 通用内部继电器 |
| 0x1E00 - 0x1FFF | M8000 - M8511 | 特殊内部继电器 |
| 0x2000 - 0x2FFF | S0 - S4095 | 状态继电器(步进) |
| 0x3000 - 0x31FF | TS0 - TS511 | 定时器触点 |
| 0x3200 - 0x32FF | CS0 - CS255 | 计数器触点 |
| 0x3300 - 0x33FF | Y0 - Y377 | 输出(八进制) |
| 0x3400 - 0x34FF | X0 - X377 | 输入(八进制,只读区) |
注意:X0-X377只在离散输入区可读;在线圈区,X地址段是被保留的,不能写入。
字软元件默认映射
| MODBUS地址 (Hex) | 映射的FX3U软元件 | 说明 |
|---|---|---|
| 0x0000 - 0x1F3F | D0 - D7999 | 通用数据寄存器 |
| 0x1F40 - 0x213F | D8000 - D8511 | 特殊数据寄存器 |
| 0x2140 - 0xA13F | R0 - R32767 | 文件寄存器(需扩展) |
| 0xA140 - 0xA33F | TN0 - TN511 | 定时器当前值 |
| 0xA340 - 0xA407 | CN0 - CN199 | 16位计数器当前值 |
| 0xA408 - 0xA477 | CN200 - CN255 | 32位计数器当前值(占双字) |
三、自定义地址分配(当默认映射不够用时)
默认映射虽然能用,但有时候现场设备有特殊需求:比如你希望把D100固定映射到MODBUS地址40001,让上位机不用去记那个复杂的偏移量。这时候就需要用到自定义分配功能。
配置方法
自定义分配通过初始化程序写入特殊寄存器 D8470 - D8485 来实现。这16个寄存器分成8组,每组可以映射一个PLC软元件区到MODBUS地址空间。
每组配置占两个寄存器:
D847x:高4位是设备代码,低12位是块大小(映射的软元件数量)
D847x+1:PLC起始软元件地址
设备代码速查
| 代码 (Hex) | 映射到线圈 (Coils) | 代码 (Hex) | 映射到保持寄存器 (Holding Reg) |
|---|---|---|---|
| 0H | M (特殊M) | 6H | M (特殊M) |
| 1H | S | 7H | S |
| 2H | TS | 8H | TS |
| 3H | CS | 9H | CS |
| 4H | Y | AH | Y |
| 5H | X | BH | X |
| — | — | CH | D (特殊D) |
| — | — | DH | R |
| — | — | EH | TN |
| — | — | FH | CN |
配置示例
假设你想把D100开始的10个寄存器映射到保持寄存器的起始地址(0x2140),并让上位机从40001(即地址0)就能读到D100:
// D8470: 设备代码 C (D寄存器) + 块大小 10 (H00A) MOV H000A D8470 // 高4位=0000? 不对,代码C在最高位,所以是 H C 00A = HC00A
正确的十六进制组合是:设备代码在最高位(bit 12-15),块大小在低位(bit 0-11)。所以映射10个D寄存器,代码应为 H C 00A。
MOV HC00A D8470 // 映射10个D寄存器 MOV K100 D8471 // 起始地址 D100
关键点:自定义映射会覆盖默认映射的对应区域。也就是说,一旦你用了自定义分配,D0-D7999在默认保持寄存器地址里的映射就会失效,上位机必须按你自定义的地址去访问。
为什么必须用初始化程序写?
D8470-D8485的值只在PLC上电初始化阶段被读取一次。如果你在程序运行中用MOV去改,值虽然会写进去,但映射关系不会重新建立,必须断电重启才生效。所以这段配置程序通常放在 M8002(初始脉冲) 触发的第一扫描周期里执行。
四、现场调试最容易踩的坑
1. 地址偏移的“减1”问题
这是最经典的坑。MODBUS协议本身对“保持寄存器”的编号是从 40001 开始的(1-based),而实际发送到报文里的地址是从 0x0000 开始的(0-based)。所以:
上位机里填 40001 → 实际报文地址 0x0000 → 对应FX3U的 D0
上位机里填 40002 → 实际报文地址 0x0001 → 对应FX3U的 D1
但不是所有上位机软件都遵循这个规则。有些组态软件(如某些触摸屏)的地址设置是“减1”后的,你填40001它直接发0x0001。调试时如果数据偏了,优先怀疑地址偏移量是否差1。
2. X和Y的八进制陷阱
FX3U的X和Y软元件是按八进制编号的(X0-X7, X10-X17...),但MODBUS地址是十六进制的。默认映射表里,Y0-Y377映射到0x3300-0x33FF,这里的“377”是八进制写法,对应十进制是255。上位机按十六进制地址去读的时候,读到的是连续的255个点,但PLC里实际只有192个Y点(Y0-Y377八进制)。
上位机里填 00001 → 实际报文地址 0x3300 → 对应FX3U的 Y0
上位机里填 00009 → 实际报文地址 0x3309 → 对应FX3U的 Y10
3. 线圈和寄存器的“双面性”
M和Y这类位软元件,既出现在线圈区,也出现在保持寄存器区。区别在于:
在线圈区:按单个位读写(一个地址对应一个位)
上位机里填 010001 → 对应FX3U的 M0
上位机里填 010002 → 对应FX3U的 M1
在保持寄存器区:按16位一组读写(一个寄存器地址对应16个位)
比如M512,它的线圈地址是0x0200。但如果你想一次性读M512-M527这16个位,可以去保持寄存器区找:M512 ÷ 16 = 32 = 0x20,加上保持寄存器区里M的基地址0xA478,得到 0xA498,读这个寄存器就能拿到16个位的状态。
总结
FX3U的MODBUS地址分配,核心就三件事:默认映射表在哪里、自定义怎么配、偏移量怎么算。
现场调试时,最实用的方法是:先拿一个支持MODBUS的调试工具(如Modscan32),连上FX3U,从读一个D寄存器开始。通了,再逐步扩展。地址对不上的时候,先检查偏移量,再检查设备代码和映射区域是否匹配。这两步排除了,剩下的就是通讯参数的事了。
本文由 AI 生成或收集于网络,内容仅供参考。



