记录|基于Winform的NModbus4通信

1 篇文章 0 订阅


前言

参考来源:
基于Winform的NModbus4通信库解析与应用
网口通讯与串口通讯(内含代码)
环境:Visual Sudio2022 .Net FrameWork 4.7.2


一、基础了解

1. Modbus

Modbus 1979年,是第一个真正用于现场的通用语言。成为了个通讯标准。
是应用层的报文传输协议,有RTU、ASCII和TCP三种通讯协议

通讯方式

通信方式:串口、网口。【详情见:网口通讯与串口通讯(内含代码)
区别:
串口通信需要设置:串口号、波特率、奇偶校验位、停止位。
网口通信需要设置:IP地址、端口。

存储区

  • 存储区:输出线圈、输入线圈、输出寄存器、输入寄存器
    线圈可以理解为一个位bit,那么这个存储区可以认为:存放的是bool型数据才用线圈。
  • 存储区范围:5位(标准地址) 和 6位(拓展地址)
  • 5位:Xxxxx 范围: X0001 - X9999
  • 6位:Xxxxxx 范围:X00001 - X65536

Modbus功能码

  • 功能码是用来标记是哪种动作,读取的是那部分区域。

在这里插入图片描述

2. Modbus RTU通信协议

  • 遵从的报文格式:【RYU / ASCII】
    从站地址(设备编号)+功能码+数据+校验
    1byte +1byte+N byte + 2byte
  • 从站地址:区分是谁
  • 功能码:指定做什么事
  • 数据:具体的细节
  • 校验:验证数据。

二、示例连接Modbus

下面是下载使用了NModbus4依赖包。
采用了winform框架。里面使用了timer定时器,两个文本框Label。

        TcpClient tcp = new TcpClient();
        private IModbusMaster master;

        public ushort[] aa(ushort add, ushort length)
        {
            ushort[] a = null;
            Task.Run(() =>
            {
                do
                {
                    try
                    {
                        if (!tcp.Connected)
                        {
                            tcp.Connect("192.168.1.200", 502);
                            master = ModbusIpMaster.CreateIp(tcp);
                        }
                        a = master.ReadHoldingRegisters(1, add, length);
                    }
                    catch (Exception ex)
                    {
                        tcp.Close();
                        Thread.Sleep(10);
                        tcp = new TcpClient();
                    }
                } while (a == null);
            }).Wait(100); // 超过100ms没执行完,就不等待了,可能是网线掉了。

            return a;
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            ushort[] a = aa(1000, 4);
            if(a != null)
            {
                label1.Test = a[0].ToString();
            }
            else
            {
                label1.Text = "xxxx";
                num++;
                label2.Text = num.ToString();
            }
        }

更新时间

  • 2024.07.18
  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nmodbus4是一个C#的Modbus通讯库,用于在Windows Forms应用程序中实现Modbus协议的通信。下面是一个简单的示例,演示如何使用nmodbus4实现服务端读写寄存器。 首先,需要在项目中安装nmodbus4库。可以使用NuGet包管理器或手动下载和安装库。 接下来,在代码中引用nmodbus4库: ``` using Modbus.Data; using Modbus.Device; using Modbus.Utility; using System.IO.Ports; using System.Threading; ``` 然后,创建一个Modbus服务端并打开通信端口: ``` TcpListener slaveTcpListener = new TcpListener(IPAddress.Any, 502); slaveTcpListener.Start(); TcpClient client = slaveTcpListener.AcceptTcpClient(); ModbusSlave slave = ModbusTcpSlave.CreateTcp(1, client); slave.Listen(); ``` 这段代码创建了一个TCP监听器,等待客户端连接。一旦连接成功,就创建一个Modbus从设备,并开始监听客户端请求。 现在,可以使用以下代码来读写寄存器: ``` ushort[] registers = new ushort[10]; registers[0] = 1234; registers[1] = 5678; //写入寄存器 slave.DataStore.HoldingRegisters.WriteRange(0, registers); //读取寄存器 ushort[] readRegisters = slave.DataStore.HoldingRegisters.ReadRange(0, 2); ``` 这段代码将一个长度为10的ushort数组写入Modbus服务端的保持寄存器(HoldingRegisters),然后再读取前两个寄存器的值。 完整的代码示例: ``` using Modbus.Data; using Modbus.Device; using Modbus.Utility; using System.IO.Ports; using System.Threading; namespace ModbusServer { class Program { static void Main(string[] args) { TcpListener slaveTcpListener = new TcpListener(IPAddress.Any, 502); slaveTcpListener.Start(); TcpClient client = slaveTcpListener.AcceptTcpClient(); ModbusSlave slave = ModbusTcpSlave.CreateTcp(1, client); slave.Listen(); ushort[] registers = new ushort[10]; registers[0] = 1234; registers[1] = 5678; //写入寄存器 slave.DataStore.HoldingRegisters.WriteRange(0, registers); //读取寄存器 ushort[] readRegisters = slave.DataStore.HoldingRegisters.ReadRange(0, 2); Console.WriteLine("Register values: {0}, {1}", readRegisters[0], readRegisters[1]); slaveTcpListener.Stop(); } } } ``` 这个示例演示了如何使用nmodbus4库实现Modbus服务端读写寄存器。当客户端连接到服务端时,可以在保持寄存器中写入数据,并从中读取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值