Skip to content

Modbus TCP ​

Modbus TCP 是一种基于以太网的 Modbus 协议版本,它使用 TCP/IP 协议进行通信。与传统的 Modbus RTU 协议不同,Modbus TCP 允许设备直接通过以太网互联,不需要任何专用的硬件或通信接口。因此,Modbus TCP 具有更高的通信速率和更广泛的应用范围。

通用配置步骤见添加南向驱动与组与点位。

该驱动的点位规模与采集周期实测数据,见Modbus TCP 驱动性能测试。

EMQX Neuron 的 Modbus TCP 驱动除了支持以 TCP 客户端的模式主动接入设备进行数据采集;还增加支持了 TCP 服务端模式,允许设备主动接入到 EMQX Neuron,主要用于如 4G DTU,因 4G 网络的 IP 是属于私网 IP,此时只能由 DTU 设备主动连接到 EMQX Neuron。

添加驱动 ​

在 数据采集 → 南向设备 页点击 添加设备,驱动类型选择 Modbus TCP 或 Modbus TCP QH。

驱动
说明
Modbus TCP标准 Modbus TCP 协议实现,支持 TCP 客户端与服务端模式,对设备有更好的兼容性。
Modbus TCP QH定制化 Modbus TCP 协议实现,支持一次最大读取 65530 字节,标准的协议最大一次读取 250 字节。

连接参数 ​

点击驱动卡片进入设备配置页填写:

字段
说明
连接模式选择以太网 TCP 连接时,可以选择 EMQX Neuron 作为 TCP 的客户端或是服务端。
最大重试次数发送读取指令失败后最大重试次数。
指令重新发送间隔发送读取指令失败后重新发送读指令时间间隔,单位为毫秒。
启用 0x16启用或禁用 0x16 功能码,用于保持寄存器按位写入
4 字节字节序32 位数据类型字节序,ABCD 对应 1234。
8 字节字节序64 位数据类型字节序,每个数字代表一字节。
开始地址点位起始地址从 1 开始或从 0 开始。
指令发送间隔发送每条读写指令之间的等待时间。某些串口设备在较短时间内接收到连续指令时,可能会丢弃某些指令。
IP 地址TCP 连接时,设备的 IP 地址(EMQX Neuron 作为客户端);或是 EMQX Neuron 本机的 IP 地址(EMQX Neuron 作为服务端),默认可填 0.0.0.0。
端口号TCP 连接时,设备的端口号(EMQX Neuron 作为客户端);或是 EMQX Neuron 本机的端口(EMQX Neuron 作为服务端)。
连接超时时间等待设备返回指令响应的时间。
校验报文头选择是否对报文头进行校验。选择校验后,遇到报文头错误时 neuron 与设备会重新连接。
设备降级启用或禁用设备降级机制。
降级失败阈值触发设备降级所需的连续失败周期数。
降级恢复时间设备从降级中恢复所需的时间(单位:秒)。
备用 IP 地址选填,当连接异常后会自动尝试连接备用地址,备用地址连接异常会自动尝试连接原地址。
备用端口号选填,当连接异常后会自动尝试连接备用地址,备用地址连接异常会自动尝试连接原地址。

TIP

上述配置可以满足设备的个性化需求:

  1. 重试请求视为同一次请求,即重试成功视为该请求成功。
  2. 在同一读取周期内,如果某个站点号的某个点位未收到回复,则跳过该周期内同站点号下其他点位的请求。
  3. 设备降级触发条件为连续多个周期某站点号的点位未收到设备回复(也可以配置为一个周期失败即触发)。一旦触发,在配置的时间段内,所有该站点的请求将停止发送。

点位配置 ​

以下为本驱动支持的数据类型与地址格式。

数据类型 ​

  • INT16
  • UINT16
  • INT32
  • UINT32
  • INT64
  • UINT64
  • FLOAT
  • DOUBLE
  • BIT
  • STRING
  • BYTES

地址格式 ​

SLAVE!ADDRESS[.BIT][#ENDIAN][.LEN[H][L][D][E]][.BYTES]

SLAVE ​

必填,指从机地址或者是站点号。

ADDRESS ​

必填,指寄存器地址。Modbus 协议有四个区域,每个区域最大有 65536 个寄存器,每个区域的地址范围如下表所示。注意:实际应用中,一般 PLC 厂家普遍采用 10000 以内的地址范围,请注意根据设备的区域及功能码,正确填写点位地址。

区域地址范围属性寄存器大小功能码数据类型
Coil(线圈)000001 ~ 065536读/写1Bit0x01,0x05,0x0fBIT
Input(离散量输入)100001 ~ 165536读1Bit0x02BIT
Input Register(输入寄存器)300001 ~ 365536读16Bit,2Byte0x04BIT,INT16,UINT16,INT32,UINT32,INT64,UINT64,FLOAT,DOUBLE,STRING
Hold Register(保持寄存器)400001 ~ 465536读/写16Bit,2Byte0x03,0x06,0x10BIT,INT16,UINT16,INT32,UINT32,INT64,UINT64,FLOAT,DOUBLE,STRING

.BIT ​

选填,寄存器中的特定 bit,例如:

地址数据类型说明
1!300004.0bit指站号为1,输入寄存器区域,地址为 300004,第 0 位。
1!400010.4bit指站号为1,保持寄存器区域,地址为 400010,第 4 位。
2!400001.15bit指站号为2,保持寄存器区域,地址为 400001,第 15 位。

#ENDIAN ​

选填,字节顺序,适用于 int16/uint16/int32/uint32/float 数据类型,详细说明见下表。

符号字节顺序支持的数据类型备注
#B2,1int16/uint16
#L1,2int16/uint16不填,默认字节顺序
#LL1,2,3,4int32/uint32/float不填,默认字节顺序
#LB2,1,4,3int32/uint32/float
#BL3,4,1,2int32/uint32/float
#BB4,3,2,1int32/uint32/float

字节顺序同样适用于 int64/uint64/double 数据类型,每个数字代表一字节,详细说明见下表。

符号字节顺序支持的数据类型备注
#LL12,34,56,78int64/uint64/double不填,默认字节顺序
#LB21,43,65,87int64/uint64/double
#BL78,56,34,12int64/uint64/double
#BB87,65,43,21int64/uint64/double

TIP

点位字节序优先级高于节点字节序配置。即点位配置字节序后,字节序按照点位的配置,忽略节点配置。 字节顺序可能用 ABCD 表示,只需将 1234 对应 ABCD 即可。例如 ABCD 对应默认字节序 1234 (#LL)。

.LEN[H][L][D][E] ​

当数据类型为 STRING 类型时,.LEN 是必填项,表示字符串需要占用的字节长度,每个寄存器中包含H,L,D 和E 四种存储方式,如下列表格所示。

符号说明
H一个寄存器存储两个字节,高字节在前低字节在后。
L一个寄存器存储两个字节,低字节在前高字节在后。
D一个寄存器存储一个字节,且存储在低字节。
E一个寄存器存储一个字节,且存储在高字节。

.BYTES ​

选填,读写 bytes 类型数据的长度,适用于 bytes 数据类型。

TIP

Modbus 驱动的一个寄存器包含 2 个 bytes,在以 bytes 数据类型读取和写入 Modbus 寄存器数据时,请保证 bytes 参数设置为偶数。

地址示例 ​

地址数据类型说明
1!300004int16指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #L
1!300004#Bint16指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #B
1!300004#Luint16指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #L
1!400004int16指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #L
1!400004#Lint16指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #L
1!400004#Buint16指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #B
1!300004int32指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #LL
1!300004#BBuint32指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #BB
1!300004#LBuint32指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #LB
1!300004#BLfloat指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #BL
1!300004#LLint32指站号为 1,输入寄存器区域,地址为 300004,字节顺序为 #LL
1!400004int32指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #LL
1!400004#LBuint32指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #LB
1!400004#BBuint32指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #BB
1!400004#LLint32指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #LL
1!400004#BLfloat指站号为 1,保持寄存器区域,地址为 400004,字节顺序为 #BL
1!300001.10String指站号为1,输入寄存器区域,地址为 300001,字符长度为 10,字节顺序为 L,即占用的地址为 300001 ~ 300005
1!300001.10HString指站号为1,输入寄存器区域,地址为 300001,字符长度为 10,字节顺序为 H,即占用的地址为 300001 ~ 300005
1!300001.10LString指站号为1,输入寄存器区域,地址为 300001,字符长度为 10,字节顺序为 L,即占用的地址为 300001 ~ 300005
1!400001.10String指站号为1,保持寄存器区域,地址为 400001,字符长度为 10,字节顺序为 L,即占用的地址为 400001 ~ 400005
1!400001.10HString指站号为1,保持寄存器区域,地址为 400001,字符长度为 10,字节顺序为 H,即占用的地址为 400001 ~ 400005
1!400001.10LString指站号为1,保持寄存器区域,地址为 400001,字符长度为 10,字节顺序为 L,即占用的地址为 400001 ~ 400005
1!400001.10DString指站号为1,保持寄存器区域,地址为 400001,字符长度为 10,字节顺序为 D,即占用的地址为 400001 ~ 400010
1!400001.10EString指站号为1,保持寄存器区域,地址为 400001,字符长度为 10,字节顺序为 E,即占用的地址为 400001 ~ 400010

应用场景 ​

您可通过 PeakHMI Slave Simulators 模拟 Modbus 设备测试到 EMQX Neuron 的连接,具体步骤,见快速入门。

您也可通过 Modbus Slave 从机模拟器测试到 EMQX Neuron 的连接,具体步骤,见 Modbus Salve 模拟器。