第四阶段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 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-5
网络·安全·web安全
8K超高清2 小时前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
C2H5OH6663 小时前
WebSocket-练习1
网络·websocket·网络协议
狂奔的sherry3 小时前
Socket vs WebSocket
网络·websocket·网络协议
仰望—星空3 小时前
MiniEngine学习笔记 : CommandListManager
c++·windows·笔记·学习·cg·direct3d
下午见。3 小时前
C语言结构体入门:定义、访问与传参全解析
c语言·笔记·学习
im_AMBER3 小时前
React 16
前端·笔记·学习·react.js·前端框架
我是苏苏3 小时前
C#基础:如何从现有类库复制一个新的类库,并且加入解决方案
开发语言·c#
lkbhua莱克瓦244 小时前
Java基础——常用算法5
java·开发语言·笔记·github