关于NModbus(RTU)

本文适用于初学者。

理论


Modbus 是基于主从架构的通信协议。使用RS-485,RS-422,RS-232接口以及以太网TCP / IP网络进行数据传输。

NModbus是一个大型C#库,其中包括所有协议操作模式的实现。用于实现该库类的模型允许您使用任何Modbus设备,但只能使用一个设备,因为库类本身封装了端口,从而防止了多个Modbus对象之间的同步。当为智能家居以及物联网开发不同的外围设备时,此协议非常流行。

队伍
, , TCP/IP .

因此,为了管理某些东西,我们需要知道发送什么和发送到哪里。因此,我们需要一个注册卡。

我将澄清这些寄存器单元为:
1.只读
2.用于读取和写入
3.仅写入(允许确认记录以提供错误代码)

最简单的卡如下所示:
屏幕截图


此外,还有各种说明,例如,可以将最大/最小值发送到该地址等。

实践


我使用Modbus Tools提供的模拟器的试用版以及MOXA具有RS-485接口的COM端口

COM口


创建项目后,需要将NModbus集成到其中。我建议使用VisualStudio,因为使用NuGet相当容易,如下所示:

第一步


第二步


在ModbusTools中,我们需要设置连接参数(它们可能与您有所不同,这些参数适用于我的COM端口):

这些参数在F3或“连接”选项卡上打开。

对于主站和从站,设置应匹配,但带有COM端口的项目除外。

屏幕截图


设置后,您可以单击“确定”,设备将相互连接。要么不会发生这种情况,要么出现连接中断N秒的提示,或者完全不存在。在这种情况下,请检查设置和连接,确保正确安装了COM端口驱动程序并正常工作。

简单程序示例
using Modbus.Device;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Modbus
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort serialPort = new SerialPort(); //Create a new SerialPort object.
            serialPort.PortName = "COM1";
            serialPort.BaudRate = 9600;
            serialPort.DataBits = 8;
            serialPort.Parity = Parity.None;
            serialPort.StopBits = StopBits.One;
            serialPort.Open();
            ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);

            byte slaveID = 1;
            ushort startAddress = 0;
            ushort numOfPoints = 1;
            ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress,
            numOfPoints);
            Console.WriteLine(holding_register);
            Console.ReadKey();
        }
    }
}


屏幕截图


重要提示:如果要开发的内容比上面的示例还要复杂,则必须确保程序包不会丢失。需要计算校验和,您可以在此处阅读

Source: https://habr.com/ru/post/undefined/


All Articles