NModbus4可以实现ModbusRtu、ModbusTcp等通信,组件使用很方便,封装很好,不需要了解底层协议的具体格式内容,便于软体工程师使用。
在此使用C#与modbus slave进行modbusRtu通信,需要了解协议格式的,可以在modbus slave中监控协议内容。C#实现代码如下:
private static IModbusMaster master;
private static SerialPort serialPort = new SerialPort();
static void Main(string[] args)
{
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
master=ModbusSerialMaster.CreateRtu(serialPort);
if(!serialPort.IsOpen)
serialPort.Open();
#region ReadCoils
// while (true)
// {
// Thread.Sleep(3000);
// var result = ReadCoils();
// Console.WriteLine("start");
// foreach (var p in result)
// {
// Console.WriteLine(p?1:0);
// }
//
// Console.WriteLine("close");
// }
#endregion
#region ReadInputs
// while (true)
// {
// Thread.Sleep(3000);
// var result = ReadInputs();
// Console.WriteLine("start");
// foreach (var p in result)
// {
// Console.WriteLine(p?1:0);
// }
//
// Console.WriteLine("close");
// }
#endregion
#region ReadHoldingRegisters
// while (true)
// {
// Thread.Sleep(3000);
// Console.WriteLine("start");
// var result = ReadHoldingRegisters();
// foreach (var p in result)
// {
// Console.WriteLine(p);
// }
// Console.WriteLine("close");
// }
#endregion
#region WriteSingleCoil
//WriteSingleCoil();
#endregion
// WriteSingleRegister();
// WriteArrayCoil();
WriteArrayRegister();
}
下面代码为常用功能的方法:01-读线圈,02-读离散量输入,03-读保持型寄存器,04-读输入寄存器,05-写单个线圈,06-写单个寄存器,15-写多个线圈,16-写多个寄存器
/// <summary>
/// 01 读线圈
/// </summary>
/// <returns></returns>
private static bool[] ReadCoils()
{
return master.ReadCoils(1, 7, 3);
}
/// <summary>
/// 02 读离散量输入
/// </summary>
/// <returns></returns>
private static bool[] ReadInputs()
{
return master.ReadInputs(1, 7, 3);
}
/// <summary>
/// 03读保持型寄存器
/// </summary>
/// <returns></returns>
private static ushort[] ReadHoldingRegisters()
{
return master.ReadHoldingRegisters(1, 0, 10);
}
/// <summary>
/// 04读输入寄存器
/// </summary>
/// <returns></returns>
private static ushort[] ReadInputRegisters()
{
return master.ReadInputRegisters(1, 0, 10);
}
/// <summary>
/// 05 写单个线圈
/// </summary>
private static void WriteSingleCoil()
{
master.WriteSingleCoil(1, 2, true);
master.WriteSingleCoil(1, 3, true);
master.WriteSingleCoil(1, 4, true);
}
/// <summary>
/// 06 写单个寄存器
/// </summary>
private static void WriteSingleRegister()
{
// Rx:001138-01 06 00 04 00 32 49 DE 收到报文
// Tx:001139-01 06 00 04 00 32 49 DE 相应报文
master.WriteSingleRegister(1, 4, 50);
}
/// <summary>
/// 15 写多个线圈
/// </summary>
private static void WriteArrayCoil()
{
List<bool> result = new List<bool>(){true,false,true,true};
master.WriteMultipleCoils(1, 0, result.ToArray());
}
/// <summary>
/// 16 写多个寄存器
/// </summary>
private static void WriteArrayRegister()
{
List<ushort> result = new List<ushort>(){30,40,50,60};
master.WriteMultipleRegisters(1, 0, result.ToArray());
}