Leave Your Message
新闻类别
专题新闻

什么是 Modbus-TCP 协议

2025-12-16

为了进行通信,我们家定义了一种非常简单的数据结构,称为“协议数据单元”(Protocol Data Unit,PDU)。

协议数据单元由功能码和数据组成,如下图所示:

图1.jpg

功能码长度为 1 字节,用于指示要执行的功能。例如,常见的功能码有:01 读取线圈;02 读取离散输入值;03 读取保持寄存器的值;05 写入单个线圈等等。

数据部分的长度范围为 0 到 252 字节。它表示要读取的地址或要写入的值。不同的功能码对应不同的数据。例如,功能码 01 的数据为 4 字节,其中前两个字节表示要读取的线圈地址,后两个字节表示要读取的线圈数量。功能码 05 的数据也为 4 字节,前两个字节表示要写入的线圈地址,后两个字节表示要写入的值。

协议数据单元有三种类型:请求 PDU(请求 PDU)、响应 PDU(响应 PDU)和异常响应 PDU(异常响应 PDU)。

协议数据单元是我们家族通用的数据结构,它独立于底层物理结构。我们三兄弟都使用相同的协议数据单元。然而,当我们通信时,始终依赖于物理网络。因此,协议数据单元需要映射到物理网络,从而形成应用数据单元(ADU)。由于底层网络的差异,我和两位哥哥的应用数据单元也不同。他们的ADU结构如下图所示:

图2.jpg

我的附属住宅单元(ADU)结构如下:

图3.jpg

可以看出,我的应用数据单元基于协议数据单元,并添加了一个名为“MBAP 头部”的结构。“MBAP”是英文单词“ModBus Application”的缩写,即应用数据单元。

可以看出,我的应用数据单元基于协议数据单元,并添加了一个名为“MBAP 头部”的结构。“MBAP”是英文单词“ModBus Application”的缩写,即应用数据单元。

MBAP 头部结构由 7 个字节组成,如下表所示。

图4.jpg

他们之中:

传输标识符:用于标识应用程序数据单元,即请求和响应之间的配对;客户端初始化此部分,服务器将其复制到自己的 ADU 中。

协议标识符:系统之间的协议标识符,0=Modbus;

长度:接下来要发送的数据的长度,即单元标识符 + PDU 的总长度,以字节为单位。

单元标识符:用于系统间的站点寻址,例如以太网+串行链路网络中远程站点的地址

这是我的ADU结构,即:MBAP头部+PDU。是不是很简单?我的数据传输采用了一种称为“客户端/服务器”的模式。这也是上表中出现客户端/服务器功能描述的原因。事实上,许多网络通信都采用了这种方法,例如著名的西门子S7通信协议。在串行链路中,这种方法也称为主从通信。

此时,您可能会有疑问。既然在网络通信中我们通常需要指定 IP 地址和端口号,为什么我的 ADU 中没有相关内容呢?

事实上,这是因为我是应用层协议,而 IP 地址和端口号属于传输层/网络层协议。请看这张图片。

图5.jpg

从逻辑上讲,我位于 TCP 层。发送数据时,我的应用数据单元首先会随 TCP 协议消息一起传递到传输层,然后随 IP 协议消息一起传递到网络层,最后向下传递到数据链路层和物理层。接收过程则完全相反。来自相应层的消息会逐层从物理层传递,直到到达应用层。因此,使用我进行数据传输时,必须配合 TCP/IP 协议使用。通常,如果您使用计算机编程,则需要使用 Socket 技术。如果您使用 PLC 编程,通常制造商已经将底层通信封装到库指令中,您只需直接调用即可。例如,像西门子 S7-200 SMART/1200/1500 这样的 PLC 都提供了现成的 Modbus-TCP 指令库。还有一点需要特别注意。我使用的端口号是502。请确保该端口号已为我保留,未被他人占用。