Files

121 lines
4.4 KiB
C#
Raw Permalink Normal View History

2026-06-14 11:19:15 +08:00
using System;
using System.IO.Ports;
using System.Linq;
using System.Net.Sockets;
using System.Threading;
using EasyModbus;
namespace StandardScene.Utils
{
public class ModbusRtu
{
public bool IsDebug { get; set; }
public byte[] ReceiveAfterSend;
public ModbusClient modbusRtu;
//modbusRtu
public void StartRtu(string com, int baudRate, Parity parity = Parity.None, StopBits stopBits = StopBits.One, int timeOut = 500)
{
modbusRtu = new ModbusClient(com);
modbusRtu.Baudrate = baudRate;
modbusRtu.Parity = parity;
modbusRtu.StopBits = stopBits;
modbusRtu.ConnectionTimeout = timeOut;
modbusRtu.Connect();
}
//modbusTcp
public void StartTcpRtu(string ip, int port)
{
modbusRtu = new ModbusClient(ip, port);
modbusRtu.Connect(ip, port);
}
public void Close()
{
modbusRtu.Disconnect();
}
#region ReadData
public bool[] ReadCoilBuffer_01(byte slaveAddress, ushort startAddress, ushort numberOfPoints)//01 读取单个线圈
{
modbusRtu.UnitIdentifier = slaveAddress;
var data = modbusRtu.ReadCoils(startAddress, numberOfPoints);
return data;
}
public bool[] ReadDiscreteInputs_02(byte slaveAddress, ushort startAddress, ushort numberOfPoints)//02 读取输入线圈/离散量线圈
{
modbusRtu.UnitIdentifier = slaveAddress;
var data = modbusRtu.ReadDiscreteInputs(startAddress, numberOfPoints);
return data;
}
public int[] ReadRegisterBuffer_03(byte slaveAddress, ushort startAddress, ushort numberOfPoints)//03 读取保持寄存器
{
modbusRtu.UnitIdentifier = slaveAddress;
var data = modbusRtu.ReadHoldingRegisters(startAddress, numberOfPoints);
return data;
}
public byte[] ReadRegisterBuffer_03_Byte(byte slaveAddress, ushort startAddress, ushort numberOfPoints)//03 读取保持寄存器
{
modbusRtu.UnitIdentifier = slaveAddress;
var data = modbusRtu.ReadHoldingRegisters(startAddress, numberOfPoints);
byte[] values = new byte[] { };
foreach (var buff in data)
{
values = values.Concat(BitConverter.GetBytes((Int16)buff).AsEnumerable().Reverse()).ToArray();
}
return values;
}
public byte[] ReadInputBuffer_04(byte slaveAddress, ushort startAddress, ushort numberOfPoints)//04 读取输入寄存器
{
modbusRtu.UnitIdentifier = slaveAddress;
var data = modbusRtu.ReadInputRegisters(startAddress, numberOfPoints);
byte[] values = new byte[] { };
foreach (var buff in data)
{
values = values.Concat(BitConverter.GetBytes((Int16)buff).AsEnumerable().Reverse()).ToArray();
}
return values;
}
#endregion
#region Write
public void WriteSingleCoil_05(byte slaveAddress, ushort startAddress, bool Buffer)//05 写单个线圈
{
ReceiveAfterSend = null;
modbusRtu.UnitIdentifier = slaveAddress;
modbusRtu.WriteSingleCoil(startAddress, Buffer);
ReceiveAfterSend = modbusRtu.receiveData;
}
public void WriteSingleRegister_06(byte slaveAddress, ushort startAddress, int Buffer)//06 写单寄存器
{
ReceiveAfterSend = null;
modbusRtu.UnitIdentifier = slaveAddress;
modbusRtu.WriteSingleRegister(startAddress, Buffer);
ReceiveAfterSend = modbusRtu.receiveData;
}
public void WriteMultipleCoils_15(byte slaveAddress, ushort startAddress, bool[] Buffer)//15写一组线圈
{
ReceiveAfterSend = null;
modbusRtu.UnitIdentifier = slaveAddress;
modbusRtu.WriteMultipleCoils(startAddress, Buffer);
ReceiveAfterSend = modbusRtu.receiveData;
}
public void WriteMultipleRegisters_16(byte slaveAddress, ushort startAddress, int[] Buffers)//16 写一组保持寄存器
{
ReceiveAfterSend = null;
modbusRtu.UnitIdentifier = slaveAddress;
modbusRtu.WriteMultipleRegisters(startAddress, Buffers);
ReceiveAfterSend = modbusRtu.receiveData;
}
#endregion
}
}