一、整体层级架构核心认知从底层到上层依次递进所有高层类均基于原生Socket封装原生底层SocketTCP/UDP通用自由度最高高层封装TCP体系TcpListener服务端监听、TcpClient客户端通信UDP体系UdpClient无连接报文通信Modbus协议层NModbus4基于TcpClient/串口封装专属工业协议核心区别TCP面向连接、可靠有序、存在粘包问题UDP无连接、不可靠、无粘包、单报文单次收发NModbus4仅支持TCP/串口RTU/ASCII不支持UDP通用命名空间// 基础网络 using System.Net; using System.Net.Sockets; // NModbus4 工业协议 using Modbus.Device; using Modbus.Data;二、原生 Socket 全套API同步异步1. 构造方法// TCP 套接字 new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // UDP 套接字 new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);2. TCP 核心方法同步方法Bind()绑定本机IP和端口服务端必备Listen(int backlog)开启TCP监听Accept()阻塞等待客户端连接返回新通信SocketConnect()客户端连接服务端Send()/Receive()收发字节数据异步 Task 方法推荐TaskSocket AcceptAsync(SocketAsyncEventArgs e); Task ConnectAsync(EndPoint remoteEP); Task ConnectAsync(string host, int port); Taskint SendAsync(ArraySegmentbyte buffer, SocketFlags socketFlags); Taskint ReceiveAsync(ArraySegmentbyte buffer, SocketFlags socketFlags);3. UDP 核心方法UDP无连接无需握手支持指定远端收发同步方法Bind()绑定本地端口接收数据必备SendTo(byte[], IPEndPoint)指定地址发送报文ReceiveFrom(byte[], ref IPEndPoint)接收并获取发送方地址Connect()锁定远端地址简化后续收发异步 Task 方法Taskint SendToAsync(ArraySegmentbyte buffer, SocketFlags socketFlags, EndPoint remoteEP); Taskint ReceiveFromAsync(ArraySegmentbyte buffer, SocketFlags socketFlags, EndPoint remoteEP);4. Socket 通用方法Shutdown(SocketShutdown.Both)优雅关闭收发通道Close()/Dispose()释放套接字资源SetSocketOption()设置超时、缓冲区、端口复用等三、TCP 高层封装TcpListener服务端1. 核心功能封装Socket的BindListen专门用于TCP服务端监听不直接收发数据2. 全套API同步Start()、Stop()异步TaskTcpClient AcceptTcpClientAsync(); TaskSocket AcceptSocketAsync();使用流程Start() → 异步Accept获取客户端通道 → 基于TcpClient通信四、TCP 高层封装TcpClient客户端/会话通道1. 核心功能封装TCP连接和数据流是NModbus4 TCP主站的核心依赖2. 全套API同步Connect()、Close()、GetStream()异步连接方法Task ConnectAsync(string host, int port); Task ConnectAsync(IPAddress address, int port); Task ConnectAsync(IPAddress[] addresses, int port);数据流异步读写NetworkStreamNetworkStream stream tcpClient.GetStream(); Taskint ReadAsync(byte[] buffer, int offset, int count); Task WriteAsync(byte[] buffer, int offset, int count);常用属性Connected连接状态、Client获取底层原生Socket五、UDP 高层封装UdpClient1. 核心功能简化UDP报文收发无连接模式单报文独立传输无粘包2. 全套API同步Send()、Receive()、Connect()、Close()异步核心方法TaskUdpReceiveResult ReceiveAsync(); Taskint SendAsync(byte[] datagram, int bytes); Taskint SendAsync(byte[] datagram, int bytes, IPEndPoint endPoint);备注UdpReceiveResult 包含 Buffer数据、RemoteEndPoint发送方地址六、NModbus4 全套异步API工业Modbus TCP/RTU1. 核心角色说明ModbusIpMasterModbus TCP 主站客户端主动读写设备ModbusSerialMasterModbus RTU/ASCII 串口主站ModbusTcpSlaveModbus TCP 从站服务端模拟设备关键限制NModbus4不支持UDP无任何UDP相关封装2. ModbusIpMaster 全套异步读写API最常用// 01 读线圈 Taskbool[] ReadCoilsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 02 读离散输入 Taskbool[] ReadInputsAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 03 读保持寄存器 Taskushort[] ReadHoldingRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 04 读输入寄存器 Taskushort[] ReadInputRegistersAsync(byte slaveAddress, ushort startAddress, ushort numberOfPoints); // 05 写单个线圈 Task WriteSingleCoilAsync(byte slaveAddress, ushort address, bool value); // 06 写单个保持寄存器 Task WriteSingleRegisterAsync(byte slaveAddress, ushort address, ushort value); // 15 写多个线圈 Task WriteMultipleCoilsAsync(byte slaveAddress, ushort startAddress, bool[] values); // 16 写多个保持寄存器 Task WriteMultipleRegistersAsync(byte slaveAddress, ushort startAddress, ushort[] values); // 拓展小众接口 Taskbyte ReadExceptionStatusAsync(byte slaveAddress); TaskModbusCommEvent ReadCommEventCounterAsync(byte slaveAddress); TaskModbusSlaveIdentity ReportSlaveIdentityAsync(byte slaveAddress);3. Modbus 主站创建方式// 方式1内部自动创建TcpClient最简 ModbusIpMaster master ModbusIpMaster.CreateIp(127.0.0.1, 502); // 方式2复用自定义TcpClient推荐可控连接生命周期 TcpClient tcp new TcpClient(); await tcp.ConnectAsync(127.0.0.1, 502); ModbusIpMaster master ModbusIpMaster.CreateIp(tcp); // 超时配置 master.Transport.ReadTimeout 1500; master.Transport.WriteTimeout 1500;4. Modbus 从站SlaveAPI从站无异步读写接口直接操作内存寄存器同步运行// 创建从站并启动监听 ModbusTcpSlave slave ModbusTcpSlave.CreateTcp(1, IPAddress.Any, 502); slave.DataStore ModbusDataStoreFactory.CreateDefault(); slave.Listen(); // 直接操作寄存器 slave.DataStore.HoldingRegisters[0] 100; slave.DataStore.CoilDiscretes[0] true; // 停止服务 slave.Stop(); slave.Dispose();5. Modbus RTU 串口主站方法签名与TCP主站完全一致仅创建方式不同ModbusSerialMaster rtuMaster ModbusSerialMaster.CreateRtu(serialPort); // 同样调用 ReadXXXAsync / WriteXXXAsync 系列方法七、核心使用注意事项高频避坑粘包问题TCP、TcpClient、Modbus TCP均存在粘包需手动分包UDP无粘包UDP限制NModbus4不支持Modbus UDP如需使用需手动基于UdpClient拼装解析报文版本区分ModbusIpMasterTCP无CRC、ModbusSerialMasterRTU带CRC不可混用连接管理NModbus4依赖TcpClient连接连接断开后需重新创建主站无法自动重连异常处理所有Async方法超时、断线、设备异常均会抛异常必须try-catch资源释放TcpClient、UdpClient、Modbus主从站均需Dispose释放套接字资源SlaveId规则Modbus TCP常规设备SlaveId填1串口RTU需严格匹配设备地址八、最终层级速查表类名通信模式核心异步方法适配NModbus4Socket(TCP)底层TCPAcceptAsync、ConnectAsync、SendAsync、ReceiveAsync需包装为TcpClientSocket(UDP)底层UDPSendToAsync、ReceiveFromAsync不支持TcpListenerTCP服务端监听AcceptTcpClientAsync支持自定义从站TcpClientTCP客户端ConnectAsync、ReadAsync、WriteAsync✅ 核心依赖UdpClientUDP报文通信ReceiveAsync、SendAsync不支持ModbusIpMasterModbus TCP主站全系列Read/WriteAsync——ModbusTcpSlaveModbus TCP从站无异步接口——
企业数字化 ERP 产品动态
相关推荐
ESP32+MQ-2烟雾传感器:从原理到应用,零基础自制物联网报警装置 想给厨房装个能联网报警的烟雾检测装置,又不想直接买成品,于是把目光落在了ESP32开发板和MQ-2烟雾传感器上。这两个组合可以说是零基础入门物联网的经典开局:MQ-2不涉及复杂的I2C、SPI通信协议,只输出一路模拟电压,接上… · 2026/9/25 14:59:45
C# 海康摄像头SDK开发完整笔记(初始化/登录/预览/云台控制/截图/录像) 一、项目整体概述1.1 项目功能基于海康官方SDK(CHCNetSDK)实现Windows窗体摄像头基础操作,全套功能包含:SDK初始化、设备登录/退出、实时视频预览/停止预览、云台PTZ上下左右控制、JPG/BMP截图、实时MP4录像/停止录像、程序退出资… · 2026/9/25 14:59:39
2026年闺蜜机差异化选购理由,帮你轻松做决策 作为百度旗下深耕智慧家庭的AI硬件品牌,小度为用户提供覆盖全场景需求的AI智能闺蜜机产品,让一台大屏满足全家多元生活需求。 上海小度技术有限公司依托百度二十余年人工智能领域积累,以AI为核心、硬件为载体、场景为落地,聚焦家庭… · 2026/9/25 14:59:33
把资深 BA 装进团队:BA Master 工程化实战手册(TaoToken 配置篇) /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 15:27:43
AutoCAD拖拽打开DWG失效?UAC权限隔离与修复方案详解 把DWG文件直接从资源管理器拽进AutoCAD窗口,这动作不少老用户用了十年以上,几乎成了肌肉记忆。可从Windows 8那代系统开始,这个操作就时不时闹脾气:鼠标拖到命令行或绘图区,指针变成带斜线的圆圈,一松手&am… · 2026/9/25 15:27:43
3C产线高度与台阶检测:接触式位移传感器原理、集成与维护全解析 1. 3C产线上的高度与台阶检测,难在哪做3C自动化这些年,我最怕听到的一句话就是“这个产品不需要测高度吧,又不复杂”。等真正把机台架到产线上,半天调不稳数据的时候,大家才开始意识到:在手机中框、耳机仓、… · 2026/9/25 15:27:37
阿里云轻量应用服务器部署 OpenClaw 完整教程:从镜像选择到 TaoToken 统一 Key 接入 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 15:27:30
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37