第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP

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);
相关推荐
阿巴~阿巴~2 小时前
自定义协议设计与实践:从协议必要性到JSON流式处理
服务器·网络·网络协议·json·操作系统·自定义协议
独行soc8 小时前
2025年渗透测试面试题总结-264(题目+回答)
网络·python·安全·web安全·网络安全·渗透测试·安全狮
jinxinyuuuus9 小时前
GTA 风格 AI 生成器:跨IP融合中的“视觉语义冲突”与风格适配损失
人工智能·网络协议
REDcker9 小时前
tcpdump 网络数据包分析工具完整教程
网络·测试工具·tcpdump
Yawesh_best9 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
若汝棋茗10 小时前
在网络密林中传递轻盈信使 —— TouchSocket 的 UdpSession 探秘
网络
嵌入式-小王10 小时前
每天掌握一个网络协议----ICMP
网络·网络协议·ping
麦麦鸡腿堡10 小时前
Java_网络编程_InetAddress类与Socket类
java·服务器·网络
Awkwardx10 小时前
Linux网络编程—应用层协议HTTP
网络·网络协议·http
4***v21410 小时前
详解 为什么 tcp 会出现 粘包 拆包 问题
网络·tcp/ip·php