1. C#上位机开发中的TCP通讯基础
1.1 三次握手与四次挥手详解
在C#上位机开发中,理解TCP连接的建立和断开过程至关重要。三次握手和四次挥手是TCP协议确保可靠连接的核心机制。
1.1.1 三次握手建立连接
三次握手过程确保了通信双方都具备收发能力:
- 第一次握手:客户端发送SYN=1,seq=x(随机序列号)
- 第二次握手:服务器回应SYN=1,ACK=1,seq=y,ack=x+1
- 第三次握手:客户端发送ACK=1,seq=x+1,ack=y+1
实际开发中,C#的TcpClient类会自动完成这个过程。当调用Connect()方法时,底层就会执行三次握手。
1.1.2 四次挥手断开连接
四次挥手确保数据完整传输后才断开:
- 第一次挥手:主动方发送FIN=1,seq=u
- 第二次挥手:被动方回应ACK=1,ack=u+1
- 第三次挥手:被动方发送FIN=1,seq=v
- 第四次挥手:主动方回应ACK=1,ack=v+1
在C#中,Close()方法会触发这个过程。工业应用中建议使用using语句确保连接正确关闭:
csharp复制using (TcpClient client = new TcpClient())
{
// 通讯代码
} // 自动调用Dispose()关闭连接
1.2 线程状态管理与生命周期
上位机开发中,合理管理线程状态对系统稳定性至关重要。线程的五个状态及其转换关系如下:
- 新建(New):Thread对象刚创建
- 就绪(Runnable):调用Start()后等待CPU调度
- 运行(Running):正在执行代码
- 阻塞(Blocked):等待I/O、锁或Sleep
- 终止(Terminated):执行完成或异常退出
mermaid复制graph TD
A[新建] -->|Start| B[就绪]
B -->|获取CPU| C[运行]
C -->|I/O等待| D[阻塞]
D -->|I/O完成| B
C -->|执行完成| E[终止]
在上位机开发中,建议使用Task替代直接操作Thread,它提供了更高级的抽象和更好的性能:
csharp复制// 不推荐
Thread thread = new Thread(WorkerMethod);
thread.Start();
// 推荐
Task.Run(WorkerMethod);
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C#与PLC通讯实战
2.1 Modbus TCP通讯实现
Modbus是工业领域最通用的通讯协议,几乎所有的PLC都支持。以下是完整的Modbus TCP通讯实现:
2.1.1 环境配置
首先通过NuGet安装NModbus库:
bash复制Install-Package NModbus
2.1.2 核心通讯代码
csharp复制using System;
using System.Net.Sockets;
using Modbus.Device;
public class ModbusMaster
{
private TcpClient _tcpClient;
private ModbusIpMaster _master;
public bool Connect(string ip, int port = 502)
{
try
{
_tcpClient = new TcpClient(ip, port);
_master = ModbusIpMaster.CreateIp(_tcpClient);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {ex.Message}");
return false;
}
}
public ushort[] ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort length)
{
return _master.ReadHoldingRegisters(slaveId, startAddress, length);
}
public void WriteSingleRegister(byte slaveId, ushort address, ushort value)
{
_master.WriteSingleRegister(slaveId, address, value);
}
public void Disconnect()
{
_tcpClient?.Close();
}
}
2.1.3 地址映射表
不同PLC的地址对应关系:
| PLC类型 | Modbus寄存器 | 对应区域 |
|---|---|---|
| 西门子 | 4xxxx | DB块 |
| 三菱 | 4xxxx | D寄存器 |
| 欧姆龙 | 4xxxx | DM区 |
| 通用 | 0xxxx | 线圈 |
| 通用 | 3xxxx | 输入寄存器 |
2.2 西门子S7协议通讯
对于西门子PLC,S7.NET库提供了更高效的通讯方式:
2.2.1 环境配置
bash复制Install-Package S7.NET
2.2.2 核心通讯代码
csharp复制using S7.Net;
public class S7Pl
