一、安装依赖
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3e2f610a03c9b95a1d54d35291c219ae.png)
二、C# 工具类完整代码(可直接使用)
public class ModbusTool : IDisposable
{
private bool disposed = false;
private ModbusClient modbusClient;
private string comString = "COM6";
public ModbusTool(string com)
{
comString = com;
modbusClient = new ModbusClient();
}
public void moubusConnect()
{
try
{
modbusClient.SerialPort = comString;
modbusClient.Baudrate = 9600;
modbusClient.Parity = System.IO.Ports.Parity.None;
modbusClient.StopBits = System.IO.Ports.StopBits.One;
modbusClient.Connect();
}
catch (Exception e)
{
modbusClient.Disconnect();
Console.WriteLine("Modbus-设备连接异常:" + e.Message);
}
}
public bool[] moubusReadCoils(Byte slaveId, int function, int startNum, int num)
{
try
{
modbusClient.UnitIdentifier = slaveId;
if (function == 1)
{
bool[] b = modbusClient.ReadCoils(startNum, num);
return b;
}
else
{
Console.WriteLine("读取数据功能码设置错误");
return new bool[0];
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return new bool[0];
}
}
public int[] moubusReadHolds(Byte slaveId, int function, int startNum, int num)
{
try
{
modbusClient.UnitIdentifier = slaveId;
if (function == 3)
{
int[] b = modbusClient.ReadHoldingRegisters(startNum, num);
return b;
}
else
{
Console.WriteLine("读取数据功能码设置错误");
return new int[0];
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return new int[0];
}
}
public void moubusWrite(Byte slaveId, int function, int startNum, bool[] coils)
{
try
{
modbusClient.UnitIdentifier = slaveId;
if (function == 5)
{
Console.WriteLine("写单个线圈" + slaveId + "_" + startNum);
modbusClient.WriteSingleCoil(startNum, coils[0]);
}
else if (function == 15)
{
modbusClient.WriteMultipleCoils(startNum, coils);
}
else
{
Console.WriteLine("读取数据功能码设置错误");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void moubusWriteAsync(Byte slaveId, int function, int startNum, int[] nums)
{
try
{
modbusClient.UnitIdentifier = slaveId;
if (function == 6)
{
Console.WriteLine("写寄存器" + slaveId + "_" + startNum);
modbusClient.WriteSingleRegister(startNum, nums[0]);
}
else
{
Console.WriteLine("读取数据功能码设置错误");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
protected virtual void Dispose(bool disposing)
{
try
{
if (!disposed)
{
if (disposing)
{
modbusClient?.Disconnect();
}
disposed = true;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~ModbusRead()
{
Dispose(false);
}
}
三、代码的使用方法举例
var modbusToolObj = new ModbusTool("COM2");
modbusToolObj.moubusConnect();
- 读取保存寄存器
var dataInfo = modbusToolObj.moubusReadHolds(
hardwareDAO.slaveId,
hardwareDAO.func,
hardwareDAO.startAds,
hardwareDAO.quantity);
- 写入单个保存寄存器
modbusToolObj.moubusWriteAsync(2, 6, 8192, new int[1] { 18 });