using LogClass;
using NModbus;
using System;
using System.Net.Sockets;
namespace CCDCount.DLL.Tools
{
public class ModbusTcpClient
{
private TcpClient _tcpClient;
private IModbusMaster _modbusMaster;
public bool IsTcpClientConnected()
{
if (_tcpClient == null || _tcpClient.Client == null)
return false;
try
{
Socket socket = _tcpClient.Client;
bool isReadable = socket.Poll(0, SelectMode.SelectRead);
bool hasNoData = (socket.Available == 0);
// 可读且无数据 = 连接已断开
return !(isReadable && hasNoData);
}
catch (SocketException) { return false; }
catch (ObjectDisposedException) { return false; }
}
///
/// 连接 Modbus TCP 服务器
///
///
///
///
public bool Connect(string ipAddress, int port = 502)
{
try
{
_tcpClient = new TcpClient(ipAddress, port)
{
SendTimeout = 2000,
ReceiveTimeout = 2000
};
// 使用 ModbusFactory 创建 Master(新版本 API)
var factory = new ModbusFactory();
_modbusMaster = factory.CreateMaster(_tcpClient);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"连接失败: {ex.Message}");
return false;
}
}
///
/// 断开连接
///
public void Disconnect()
{
_modbusMaster?.Dispose();
_tcpClient?.Close();
}
///
/// 读取线圈(功能码01)
///
///
///
///
///
///
public bool[] ReadCoilsRegister(byte slaveId, ushort startAddress, ushort numRegisters)
{
if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
try
{
return _modbusMaster.ReadCoils(slaveId, startAddress, numRegisters);
}
catch (Exception ex)
{
Console.WriteLine($"读取线圈失败: {ex.Message}");
FaultLog.RecordErrorMessage($"MainThreadClass-ReadCoilsRegister-ReadCoilsRegister failed:{ex.Message}");
return null;
}
}
///
/// 读取保持寄存器(功能码03)
///
///
///
///
///
///
public ushort[] ReadHoldingRegisters(byte slaveId, ushort startAddress, ushort numRegisters)
{
if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
try
{
return _modbusMaster.ReadHoldingRegisters(slaveId, startAddress, numRegisters);
}
catch (Exception ex)
{
Console.WriteLine($"读取保持寄存器失败: {ex.Message}");
FaultLog.RecordErrorMessage($"MainThreadClass-ReadHoldingRegisters-ReadHoldingRegisters failed:{ex.Message}");
return null;
}
}
///
/// 写入线圈(功能码05)
///
///
///
///
///
public void WriteCoilsRegister(byte slaveId, ushort CoilsAddress, bool values)
{
if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
try
{
_modbusMaster.WriteSingleCoil(slaveId, CoilsAddress, values);
}
catch (Exception ex)
{
Console.WriteLine($"写入线圈失败: {ex.Message}");
FaultLog.RecordErrorMessage($"MainThreadClass-WriteCoilsRegister-WriteCoilsRegister failed:{ex.Message}");
}
}
///
/// 写入单个寄存器(功能码06)
///
///
///
///
///
public void WriteSingleRegister(byte slaveId, ushort registerAddress, ushort value)
{
if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
try
{
_modbusMaster.WriteSingleRegister(slaveId, registerAddress, value);
}
catch (Exception ex)
{
Console.WriteLine($"写入单个寄存器失败: {ex.Message}");
FaultLog.RecordErrorMessage($"MainThreadClass-WriteSingleRegister-WriteSingleRegister failed:{ex.Message}");
}
}
///
/// 写入多个寄存器(功能码16)
///
///
///
///
///
public void WriteMultipleRegisters(byte slaveId, ushort startAddress, ushort[] values)
{
if (_modbusMaster == null) throw new InvalidOperationException("未连接到服务器");
try
{
_modbusMaster.WriteMultipleRegisters(slaveId, startAddress, values);
}
catch (Exception ex)
{
Console.WriteLine($"写入多个寄存器失败: {ex.Message}");
FaultLog.RecordErrorMessage($"MainThreadClass-WriteMultipleRegisters-WriteMultipleRegisters failed:{ex.Message}");
}
}
}
}