下面是一个使用C#中的Socket对象来实现Modbus TCP通信的简单库:
using System.Net.Sockets;
public class ModbusTcpClient
private const int DefaultPort = 502;
private const int DefaultTimeout = 5000;
public void Connect(string ipAddress, int port = DefaultPort)
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.ReceiveTimeout = DefaultTimeout;
_socket.Connect(IPAddress.Parse(ipAddress), port);
public byte[] ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort numberOfRegisters)
(byte)(startAddress >> 8),
(byte)(startAddress & 0xFF),
(byte)(numberOfRegisters >> 8),
(byte)(numberOfRegisters & 0xFF)
return SendModbusRequest(request);
public byte[] WriteSingleRegister(byte slaveId, ushort address, ushort value)
return SendModbusRequest(request);
private byte[] SendModbusRequest(byte[] request)
var response = new byte[1024];
int bytesRead = _socket.Receive(response);
var modbusResponse = new byte[bytesRead];
Array.Copy(response, modbusResponse, bytesRead);
var modbusClient = new ModbusTcpClient();
modbusClient.Connect("192.168.0.100");
var numberOfRegisters = 10;
var response = modbusClient.ReadHoldingRegisters(slaveId, startAddress, numberOfRegisters);
Console.WriteLine("Read Holding Registers Response: " + BitConverter.ToString(response));
Console.WriteLine("Failed to read holding registers.");
response = modbusClient.WriteSingleRegister(slaveId, address, value);
Console.WriteLine("Write Single Register Response: " + BitConverter.ToString(response));
Console.WriteLine("Failed to write single register.");
modbusClient.Disconnect();
请注意,上述示例仅演示了如何使用Socket对象进行基本的Modbus TCP通信,实际情况下,您需要根据您的Modbus设备和通信规范来编写相应的代码。此外,还需要根据Modbus协议规范处理不同功能码的请求和响应。
