1. 引用包
2.编写接口
public class NModbus
{
#region 属性
private static byte Address = 0x01;
private static IModbusSerialMaster ModbusMaster;
private static SerialPort Serial;
#endregion
#region 方法
public NModbus() { }
public static bool WriteData(ushort addr, ushort[] data)
{
try
{
if (Serial == null || !Serial.IsOpen)
{
MessageBox.Show("串口未打开");
return false;
}
ModbusMaster.WriteMultipleRegisters(Address, addr, data);
return true;
}
catch (Exception err)
{
MessageBox.Show("WriteData", err.Message);
}
return false;
}
public static ushort[] ReadData(byte funcCode, ushort addr, ushort numberOfPoints)
{
try
{
ushort[] res = null;
if (Serial == null || !Serial.IsOpen)
{
MessageBox.Show("串口未打开");
return null;
}
switch (funcCode)
{
case 0x03:
res = ModbusMaster.ReadHoldingRegisters(Address, addr, numberOfPoints);
break;
case 0x04:
res = ModbusMaster.ReadInputRegisters(Address, addr, numberOfPoints);
break;
default:
break;
}
return res;
}
catch (Exception err)
{
MessageBox.Show("ReadData", err.Message);
}
return null;
}
public static bool IsOpen()
{
return Serial != null && Serial.IsOpen;
}
public static void openModbusRtu(string com, int baud)
{
try
{
if (Serial != null && Serial.IsOpen)
{
closeModbusRtu();
}
Serial = new SerialPort();
Serial.BaudRate = baud;
Serial.PortName = com;
Serial.DataBits = 8;
Serial.Parity = Parity.None;
Serial.StopBits = StopBits.One;
Serial.ReadBufferSize = 4096 * 10;
ModbusMaster = ModbusSerialMaster.CreateRtu(Serial);
if(ModbusMaster == null)
{
MessageBox.Show("初始化ModbusSerialMaster失败");
}
if (!Serial.IsOpen) Serial.Open();
ModbusMaster.Transport.Retries = 10;
ModbusMaster.Transport.ReadTimeout = 1500;
ModbusMaster.Transport.WriteTimeout = 1500;
ModbusMaster.Transport.WaitToRetryMilliseconds = 1500;
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
public static void closeModbusRtu()
{
try
{
if (Serial != null && Serial.IsOpen)
{
Serial.Close();
}
if (ModbusMaster != null)
{
ModbusMaster.Transport.Dispose();
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
public static ushort crc16(byte[] pByte)
{
ushort crc = 0xFFFF; // Initial value of CRC
for (int i = 0; i < pByte.Length; i++)
{
crc ^= pByte[i]; // XOR byte with CRC
for (int j = 0; j < 8; j++)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001; // Polynomial for Modbus CRC-16
}
else
{
crc >>= 1;
}
}
}
return crc;
}
#endregion
}