C#使用NModbus4库实现ModbusRtu通信

1 篇文章 0 订阅
1 篇文章 0 订阅

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());
        }
 

 

 

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的NModbus是一个流行的.NET,用于读写Modbus RTU(Remote Terminal Unit)通信协议的数据。Modbus RTU是一种工业通讯协议,常用于自动化控制系统中设备间的通信使用NModbus进行读取操作,你需要以下几个步骤: 1. 引入NuGet包:在你的C#项目中,首先需要安装NModbus的NuGet包。你可以通过NuGet Package Manager或命令行(`dotnet add package NModbus`)来添加。 ```csharp using NModbus; using NModbus.Packets; ``` 2. 创建连接:你需要创建一个`NModbusSerialMaster`对象,指定Modbus设备的串口配置,如波特率、校验方式等。 ```csharp string portName = "COM1"; // 替换为实际的串口号 int baudRate = 9600; // 通常Modbus RTU的默认波特率 NModbusSerialSettings settings = new NModbusSerialSettings { PortName = portName, BaudRate = baudRate, DataBits = 8, StopBits = StopBits.One, Parity = Parity.None }; ModbusSerialMaster master = new ModbusSerialMaster(settings); ``` 3. 发送请求:调用`ReadCoils()`或`ReadHoldingRegisters()`方法来读取寄存器数据,根据需要选择相应的函数代码。 ```csharp ushort_slaveId = 1; // 设备的(slave ID) ushort_address = 0x0001; // 需要读取的寄存器地址 ushort numberOfPoints = 1; // 一次读取的点数 ushort[] coilsOrValues = await master.ReadCoilsAsync(slaveId, address, numberOfPoints); ``` 4. 解析响应:收到数据后,`coilsOrValues`数组会包含读取到的结果。根据数据类型(布尔值(Coils)或数值(Registers))进行解析。 5. 关闭连接:完成操作后,记得关闭连接以释放资源。 ```csharp master.Close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值