当前位置:首页 > 万物互联

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, 15M, S, TS, CS, Y, X
离散输入 (Discrete Inputs)只读02X
保持寄存器 (Holding Registers)读写03, 06, 16D, R, TN, CN, M, S, Y, X
输入寄存器 (Input Registers)只读04D (特殊区域)

核心原则:写入(Write)操作只能针对“线圈”和“保持寄存器”这两个读写区;读取(Read)操作可以针对所有四个区。

二、默认地址映射表(出厂设置)

如果你没有做任何自定义配置,FX3U会按照出厂默认的地址映射表来分配。以下是最常用的部分(十六进制):

位软元件默认映射

MODBUS地址 (Hex)映射的FX3U软元件说明
0x0000 - 0x1DFFM0 - M7679通用内部继电器
0x1E00 - 0x1FFFM8000 - M8511特殊内部继电器
0x2000 - 0x2FFFS0 - S4095状态继电器(步进)
0x3000 - 0x31FFTS0 - TS511定时器触点
0x3200 - 0x32FFCS0 - CS255计数器触点
0x3300 - 0x33FFY0 - Y377输出(八进制)
0x3400 - 0x34FFX0 - X377输入(八进制,只读区)

注意:X0-X377只在离散输入区可读;在线圈区,X地址段是被保留的,不能写入

字软元件默认映射

MODBUS地址 (Hex)映射的FX3U软元件说明
0x0000 - 0x1F3FD0 - D7999通用数据寄存器
0x1F40 - 0x213FD8000 - D8511特殊数据寄存器
0x2140 - 0xA13FR0 - R32767文件寄存器(需扩展)
0xA140 - 0xA33FTN0 - TN511定时器当前值
0xA340 - 0xA407CN0 - CN19916位计数器当前值
0xA408 - 0xA477CN200 - CN25532位计数器当前值(占双字)

三、自定义地址分配(当默认映射不够用时)

默认映射虽然能用,但有时候现场设备有特殊需求:比如你希望把D100固定映射到MODBUS地址40001,让上位机不用去记那个复杂的偏移量。这时候就需要用到自定义分配功能。

配置方法

自定义分配通过初始化程序写入特殊寄存器 D8470 - D8485 来实现。这16个寄存器分成8组,每组可以映射一个PLC软元件区到MODBUS地址空间。

每组配置占两个寄存器:

D847x:高4位是设备代码,低12位是块大小(映射的软元件数量)

D847x+1:PLC起始软元件地址

设备代码速查

代码 (Hex)映射到线圈 (Coils)代码 (Hex)映射到保持寄存器 (Holding Reg)
0HM (特殊M)6HM (特殊M)
1HS7HS
2HTS8HTS
3HCS9HCS
4HYAHY
5HXBHX
CHD (特殊D)
DHR
EHTN
FHCN

配置示例

假设你想把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 生成或收集于网络,内容仅供参考。

扫描二维码推送至手机访问。

版权声明:本文由要悟要算要上发布,如需转载请注明出处。

本文链接:https://151313.com/iot/88.html

分享给朋友:

“FX3U MODBUS地址:默认映射与自定义分配” 的相关文章

ESP8266模块介绍

ESP8266模块介绍

ESP8266 是一款由乐鑫科技推出的经典Wi-Fi芯片,最大的特点是低成本、高集成度,它将无线网络功能和微型控制器整合在一起,是许多物联网爱好者入门智能设备开发的首选。简单来说,它就像一个“联网小管家”。你可以通过编程,让它自己独立工作,也可以通过串口指令,为其他普通设备(如STM32单片机)增加…

家里的电器,是怎么悄悄连成一张网的?

家里的电器,是怎么悄悄连成一张网的?你有没有想过,家里的空调、冰箱、洗衣机,它们之间其实可以“说话”?下班路上用手机提前打开空调,回到家已经是舒适的温度;冰箱发现牛奶快过期了,自动在你手机的购物清单里加了一项;洗衣机洗完衣服,客厅的智能音箱会喊你一声“衣服洗好了”。这些场景听起来像科幻,但背后的技术…

智能晾衣架:从“手摇”到“会思考”的阳台进化史

智能晾衣架:从“手摇”到“会思考”的阳台进化史

智能晾衣架:从“手摇”到“会思考”的阳台进化史晾衣服这件事,曾经是每个家庭躲不掉的体力活。踩凳子、摇手柄、够不着、晾不干——这些琐碎的烦恼,催生了一个不算新鲜但一直在进化的品类:智能晾衣架。它本质上是在传统手摇晾衣架基础上发展而来的集成式多功能家居电器,通过电机驱动实现自动升降,同时把照明、风干、烘…