[CSharpTips]C# 使用NModbus库创建Modbus从站

使用NModbus库创建Modbus从站

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
using NModbus;
using System;
using System.Net;
using System.Net.Sockets;
 
namespace ModbusSlaveTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //设置从站ID和端口
            byte slaveId = 1;
            int port = 502;
            //创建并配置监听TCP客户端的TcpListener
            var listener = new TcpListener(new IPAddress(new byte[] { 127, 0, 0, 1 }), port);
            listener.Start();
            //创建从站并开启监听
            var factory = new ModbusFactory();
            var modbusTcpSlaveNetwork = factory.CreateSlaveNetwork(listener);
            var slave = factory.CreateSlave(slaveId);
            modbusTcpSlaveNetwork.AddSlave(slave);
            modbusTcpSlaveNetwork.ListenAsync();
 
            //输入寄存器
            slave.DataStore.InputRegisters.WritePoints(0, new ushort[] { 1, 2, 3 });
            //保持寄存器
            slave.DataStore.HoldingRegisters.WritePoints(0, new ushort[] { 3, 2, 1 });
            //线圈
            slave.DataStore.CoilDiscretes.WritePoints(0, new bool[] { true, false, true });
            //离散输入
            slave.DataStore.CoilInputs.WritePoints(0, new bool[] { true, true, true });
 
            Console.ReadKey();
        }
    }
}

使用NModbus库验证从站数据

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
using NModbus;
using System;
using System.Net.Sockets;
 
namespace ModbusMasterTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            using (TcpClient client = new TcpClient("127.0.0.1", 502))
            {
                var factory = new ModbusFactory();
                IModbusMaster master = factory.CreateMaster(client);
 
                //线圈
                Console.WriteLine("Coils: " + string.Join(",", master.ReadCoils(1, 0, 3)));
                //离散输入
                Console.WriteLine("Discrete Inputs: " + string.Join(",", master.ReadInputs(1, 0, 3)));
                //保持寄存器
                Console.WriteLine("Holding Registers: " + string.Join(",", master.ReadHoldingRegisters(1, 0, 3)));
                //输入寄存器
                Console.WriteLine("Input Registers: " + string.Join(",", master.ReadInputRegisters(1, 0, 3)));
 
                Console.ReadKey();
            }
        }
    }
}

输出结果:

Coils: True,False,True
Discrete Inputs: True,True,True
Holding Registers: 3,2,1
Input Registers: 1,2,3

 

 

posted @   xiaoshuye  阅读(471)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-09-23 [CSharpTips]C# 判断一个点是否在线段上
点击右上角即可分享
微信分享提示