NModbus使用示例

NModbus使用示例 

一、什么是ModBus通讯协议

Modbus协议是应用于电子控制器上的一种通用语言,此协议支持传统的RS-232、RS-422、RS-485和以太网设备。

  ModBus功能码

01 READ COIL STATUS
02 READ INPUT STATUS
03 READ HOLDING REGISTER
04 READ INPUT REGISTER
05 WRITE SINGLE COIL
06 WRITE SINGLE REGISTER
15 WRITE MULTIPLE COIL
16 WRITE MULTIPLE REGISTER

二、ModBus通讯协议的.Net实现

推荐一个github的开源实现类库:NModBus,github地址:https://github.com/NModbus/NModbus。针对TCP、UDP、RTU等的ModBus通讯方式都有实现。

读写方法:

方法名 作用 所需参数 返回值 对应功能码
ReadCoils 读取DO的状态 从站地址(8位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[]01
ReadInputs读取DI的状态从站地址(8位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

bool[]02
ReadHoldingRegisters读取AO的值从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[]03
ReadInputRegisters读取AI的值从站地址(8 位)

byte slaveAddress

起始地址(16位)

 

ushort startAddress

读取数量(16位)

ushort numberOfPoints

ushort[]04
WriteSingleCoil写入值到DO从站地址(8位)

byte slaveAddress

线圈地址(16位)

ushort coilAddress

写入值(布尔型)

bool value

无返回值05
WriteSingleRegister写入值到AO从站地址(8位)

byte slaveAddress

寄存器地址(16位)

ushort registerAddress

写入值(16位)

ushort value

无返回值06
WriteMultipleCoils写多线圈寄存器从站地址(8位)

byte slaveAddress

起始地址(16位)

ushort startAddress

写入值(布尔型数组)

bool[] data

无返回值15
WriteMultipleRegisters写多个保持寄存器从站地址(8位)

byte slaveAddress

 

起始地址(16位)

ushort startAddress,

寄存器值(16位整型数组)

ushort[] data

无返回值16
ReadWriteMultipleRegisters读写多个保持寄存器从站地址(8位)

byte slaveAddress

读起始地址(16位)

ushort startReadAddress

 

读取数量(16位)

ushort numberOfPointsToRead,

写入起始地址(16位)

ushort startWriteAddress,

写入值(16位整型数组)

ushort[] writeData

ushort[]23

每个方法都有各自的异步方法实现。

三、NModBus Master 示例

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
private static void Main(string[] args)
        {
            try
            {
                ModbusSerialRtuMasterWriteRegisters();
                ModbusTcpMasterReadInputs();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey();
        }
        /// <summary>
        /// Simple Modbus serial RTU master write holding registers example.
        /// </summary>
        public static void ModbusSerialRtuMasterWriteRegisters()
        {
            using (SerialPort port = new SerialPort("COM3"))
            {
                // configure serial port
                port.BaudRate = 9600;
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                port.Open();
                var factory = new ModbusFactory();
                IModbusMaster master = factory.CreateRtuMaster(port);
                byte slaveId = 1;
                ushort startAddress = 100;
                ushort[] registers = new ushort[] { 1, 2, 3 };
                // write three registers
                master.WriteMultipleRegisters(slaveId, startAddress, registers);
            }
        }
        /// <summary>
        ///     Simple Modbus TCP master read inputs example.
        /// </summary>
        public static void ModbusTcpMasterReadInputs()
        {
            using (TcpClient client = new TcpClient("127.0.0.1", 502))
            {
                var factory = new ModbusFactory();
                IModbusMaster master = factory.CreateMaster(client);
                // read five input values
                ushort startAddress = 100;
                ushort numInputs = 5;
                bool[] inputs = master.ReadInputs(0, startAddress, numInputs);
                for (int i = 0; i < numInputs; i++)
                {
                    Console.WriteLine($"Input {(startAddress + i)}={(inputs[i] ? 1 : 0)}");
                }
            }
            // output:
            // Input 100=0
            // Input 101=0
            // Input 102=0
            // Input 103=0
            // Input 104=0
        }

 

example: https://github.com/NModbus/NModbus/tree/develop/Samples

NModbus使用示例 – NiKaFace – 博客园 (cnblogs.com)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/314947.html

(0)
上一篇 2天前
下一篇 2天前

相关推荐

发表回复

登录后才能评论