C# 使用NModbus4、EasyModbus
NModbus4
安装 NModbus4
稳定版v2.1.0
c#
using Modbus.Device;
using Modbus.Message;
namespace Sample {
internal class NModbus4Helper {
byte _DeviceId = 8;
ModbusMaster master;
/// <summary>
/// 读取单个寄存器
/// </summary>
/// <param name="regAddr"></param>
/// <param name="value"></param>
/// <returns></returns>
public byte[] ReadSingleRegister(ushort regAddr)
{
try
{
ReadHoldingInputRegistersRequest readRegistersReq = new ReadHoldingInputRegistersRequest(0x03, _DeviceId, regAddr, 1);
//获取响应报文
ReadHoldingInputRegistersResponse readRegistersRes = master.ExecuteCustomMessage<ReadHoldingInputRegistersResponse>(readRegistersReq);
return readRegistersRes.ProtocolDataUnit;
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 读取多个保持型寄存器
/// </summary>
/// <returns></returns>
public Task<byte[]> ReadHoldingRegisters(ushort regStartAddr, ushort regEndAddr)
{
try
{
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
return Task.Run(() =>
{
ReadHoldingInputRegistersRequest readRegistersReq = new ReadHoldingInputRegistersRequest(0x03, _DeviceId, regStartAddr, Lenth);
//获取响应报文
ReadHoldingInputRegistersResponse readRegistersRes = master.ExecuteCustomMessage<ReadHoldingInputRegistersResponse>(readRegistersReq);
return readRegistersRes.ProtocolDataUnit;
});
}
catch (Exception ex)
{
return null;
}
}
public byte[] ReadRegister(ushort regAddr)
{
try
{
ushort Lenth = 1;
ushort[] rec = master.ReadHoldingRegisters(_DeviceId, regAddr, Lenth);
byte[] recByte = new byte[rec.Length];
Buffer.BlockCopy(rec, 0, recByte, 0, rec.Length);
return recByte;
}
catch (Exception ex)
{
return null;
}
}
public byte[] ReadRegisters(ushort regStartAddr, ushort regEndAddr)
{
try
{
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
ushort[] rec = master.ReadHoldingRegisters(_DeviceId, regStartAddr, Lenth);
byte[] recByte = new byte[rec.Length];
Buffer.BlockCopy(rec, 0, recByte, 0, rec.Length);
return recByte;
}
catch (Exception ex)
{
return null;
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
EasyModbus
安装 EasyModbusTCP
5.6.0
c#
using EasyModbus;
namespace Sample {
internal class NModbus4Helper {
byte _DeviceId = 8;
ModbusClient modbusClient = null;
object _transferLockObj = new object();
public void OpenSerialPort()
{
try
{
modbusClient = new ModbusClient("COM1");
modbusClient.UnitIdentifier = _DeviceId;
modbusClient.Baudrate = _baudRate;
modbusClient.Parity = Parity.None;
modbusClient.StopBits = StopBits.One;
modbusClient.ConnectionTimeout = 500;
modbusClient.Connect();
}
catch (Exception ex)
{
}
}
/// <summary>
/// 写入单个寄存器并获取响应
/// </summary>
public byte[] WriteSingleRegister(ushort regAddr, ushort value)
{
try
{
lock (_transferLockObj)
{
modbusClient.receiveData = null;
modbusClient.WriteSingleRegister(regAddr, value);
byte[] Rec = modbusClient.receiveData;
return Rec;
}
}
catch (Exception ex)
{
return null;
}
}
/// <summary>
/// 读取寄存器
/// </summary>
public int[] ReadRegisters(ushort regStartAddr, ushort regEndAddr)
{
try
{
lock (_transferLockObj)
{
ushort Lenth = (ushort)(regEndAddr - regStartAddr + 1);
int[] rec = modbusClient.ReadHoldingRegisters(regStartAddr, Lenth);
return rec;
}
}
catch (Exception ex)
{
return null;
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69