1_串行端口
指的是运行在串行通信物理层上的 Modbus 协议,主要有两种:
-
Modbus RTU(远程终端单元): 最常用、最经典的串行 Modbus 版本。数据以二进制形式传输,紧凑高效。
-
Modbus ASCII: 一种较老、较少使用的变体。数据以可读的ASCII字符(十六进制)传输,效率较低,但易于调试。
-
工作原理 : 基于 RS-485 (多节点、长距离)或 RS-232 (点对点、短距离)电气标准。是一种点对点 或总线型的物理连接。
-
特点:
-
优点: 简单、可靠、硬件成本低、抗干扰能力强(RS-485)。
-
缺点: 通信速度较慢、传输距离有限(通常<1200米)、布线复杂(尤其是多设备时)。
-
-
典型应用: 传统的工业控制系统,车间内连接PLC、仪表、电机驱动器等设备。
2_Modbus TCP/IP
这是将 Modbus 协议嵌入到现代以太网 TCP/IP 协议栈中的版本。
-
工作原理 : 它把 Modbus 协议(应用层数据)作为有效载荷封装在 TCP(传输控制协议) 数据包中。TCP 是一种面向连接的协议,能确保数据包的顺序和可靠传输。
-
特点:
-
优点: 速度快(以太网速度)、传输距离远(可跨局域网甚至互联网)、布线简单(使用标准网线和水晶头)、支持大量设备连接(理论上可达IP地址上限)。
-
缺点: 需要设备具有以太网端口,协议开销比串行版稍大。
-
-
典型应用 : 现代工厂的信息化层,用于连接车间的控制器与上位的监控系统(SCADA)、制造执行系统(MES)或云平台。是当前最主流的工业以太网协议之一。
3_Modbus UDP/IP
与 Modbus TCP/IP 类似,但使用了不同的传输层协议。
-
工作原理 : 它将 Modbus 协议封装在 UDP(用户数据报协议) 数据包中。UDP 是一种无连接的协议,不保证数据包的顺序或送达。
-
特点:
-
优点: 通信速度极快、协议开销更小(没有建立连接和确认机制)。
-
缺点 : 不可靠,数据包可能丢失或乱序。
-
-
典型应用 : 适用于对实时性要求极高,但可以容忍偶尔数据丢失的场景,例如广播式查询(一个主站同时向多个从站发送指令)或高速数据采集。
4_Modbus RTU Over TCP/IP 与 5. Modbus RTU Over UDP/IP
这两种是"隧道"或"封装"技术,可以理解为"在以太网上跑串行数据"。
-
工作原理 : 它不修改原始的 Modbus RTU 数据帧。而是将整个 RTU 数据帧(包括地址、功能码、数据和CRC校验)原封不动地作为有效载荷,装入一个 TCP 或 UDP 数据包中进行传输。
-
与 Modbus TCP/IP 的关键区别:
-
Modbus TCP 有自己新的帧结构(增加了MBAP头,去掉了CRC校验,改用TCP本身的校验)。
-
RTU Over TCP/IP 只是把串行线上的比特流通过网线来传输。
-
-
特点:
-
优点 : 方便实现串行设备联网。通过一个"网关"或"转换器",可以将传统的串口 Modbus 设备轻松接入以太网,而无需修改设备本身的固件。
-
缺点: 效率低于原生 Modbus TCP,因为保留了冗余的校验和帧结构。
-
-
典型应用:
-
使用串口服务器(Serial-to-Ethernet Converter)将串口设备(如一台Modbus RTU的PLC)连接到网络。
-
一些软件或网关为了兼容性,会选择这种方式来透明传输数据。
-
6_核心区别对比表
| 协议 | 通信类型 / 可靠性 | 速度 | 典型应用场景 | 简单比喻 |
|---|---|---|---|---|
| 串行端口 (Modbus RTU) | 串行线,可靠 | 慢 | 传统设备,车间底层控制 | 写信:一对一或一对多广播,速度慢但可靠。 |
| Modbus TCP/IP | 基于TCP,面向连接,可靠 | 快 | 现代工业网络,设备与上位机通信 | 打电话:先拨号建立连接,保证对话有序不丢失。 |
| Modbus UDP/IP | 基于UDP,无连接,不可靠 | 极快 | 高速广播、实时性要求高的场景 | 大声喊话:快速向一群人喊话,但可能有人没听清。 |
| Modbus RTU Over TCP/UDP | 隧道模式,可靠性取决于底层(TCP/UDP) | 中等 | 串口设备通过网络扩展 | 把信装在快递盒里通过网络寄送:内容还是信(RTU帧),但用了更快的运输方式(网络)。 |
7_Modbus TCP和设备通讯
在使用Modbus TCP和设备通讯时,角色划分: 设备(模拟器)充当了服务器。 开发的软件充当了客户端。 客户端去服务器上请求数据。即:开发的软件从设备上采集数据。
8_示例代码
(1)编写客户端之前,需要设置从机的连接方式为Modbus(TCP或UDP)

(2)与之前Socket(TCP/UDP),SerialPort之间的区别
之前的串口使用Modbus创建主机实例的时候,需要传入SerialPort示例作为参数,现在需要使用TCP或者UDP创建,并使用ModbusIpMaster.CreateIP创建主机,与从机进行通讯
Modbus (RTU OverUDP)需要UDP实例,Modbus(RTUOverTCP)需要TCP实例
示例主要代码
cs
//连接
private void btnConn_Click(object sender, EventArgs e)
{
if (raTCP.Checked)
{
//TCP
//创建了一个tcp客户端
tcpClient = new TcpClient();
//连接
tcpClient.ConnectAsync(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
// ModbusSerialMaster.CreateRtu("串口对象");
master = ModbusIpMaster.CreateIp(tcpClient);
}
else if (raUDP.Checked)
{
// UDP
udpClient= new UdpClient();
udpClient.Connect(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
master = ModbusIpMaster.CreateIp(udpClient);
}
else if (raRUTOT.Checked)
{
// RTU Over TCP
tcpClient = new TcpClient();
tcpClient.ConnectAsync(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
master = ModbusSerialMaster.CreateRtu(tcpClient);
}
else
{ // RTU Over UDP
udpClient = new UdpClient();
udpClient.Connect(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
master = ModbusSerialMaster.CreateRtu(udpClient);
}
}
//实时读取
Task.Run(async () =>
{
while (!cts.IsCancellationRequested)
{
//读取数据
//ReadXXXX() 发的就是请求报文(采集数据,相当于功能码 )0X03)
//WriteXXXX() 发的也是请求报文(更改数据,相当于功能码) 0X06 0X10
ushort [] data = master.ReadHoldingRegisters(1,0,4);
}
},cts.Token);