C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例

这篇具有很好参考价值的文章主要介绍了C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文续上篇Codesys—标准库ModbusTCP Master(客户端)配合C#的NModbus4库的通讯示例

链接:https://blog.csdn.net/wushangwei2019/article/details/136375234?spm=1001.2014.3001.5501

上篇描述在Codesys端的Modbus TCP Master(客户端)的设备添加、IO映射、通讯简单展示等方面,本文记录PC端C#利用NModbus4通讯库创建Modbus TCP Slave(服务器)的方法。

注:本文只记录如何使用NModbus4的部分功能,程序结构较为简单,并不适用于项目工程。

本文分以下几个步骤分享NModbus4的使用:

1.添加NModbus4库

2.ModbusTcpSlave从站的创建

3.事件订阅

4.通讯示例

界面附加显示功能:

1.在收到客户端报文的事件后,将会在信息提示框中显示报文内容,报文内容不包含CRC;在服务器写入完成后,将会在信息提示框中显示写入完成的报文内容。

2.在服务器线程中,获取已连接的客户端的IP地址以及端口号信息,并在最底下显示出来。

软件界面如下,本文针对左侧服务器(从站)端:

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

1.添加NModbus4库 

菜单栏点击【工具】-》【NuGet包管理器】-》【管理解决方案的NuGet程序包】

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

弹出以下画面,搜索【NModbus4】 ,选择需要安装的项目,并点击右下角的【安装】即可。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

在程序中添加如下代码:

using Modbus.Data;
using Modbus.Device;
using Modbus.Extensions.Enron;

 2.使用TcpListener创建服务器

核心代码:

listener = new TcpListener(IPAddress.Parse(textBox2.Text), Convert.ToInt32(textBox3.Text));
listener.Start();
slave = ModbusTcpSlave.CreateTcp(1, listener);
slave.DataStore = DataStoreFactory.CreateDefaultDataStore(); 

slave.Listen();

解析:

1.TcpListener,用于创建服务器,需要输入参数待创建服务器的【IP地址】和【端口号】。

2.ModbusTcpSlave.CreateTcp方法,用于创建ModbusTCP Slave从站,创建后的从站对象为slave。

3.DataStoreFactory.CreateDefaultDataStore()方法,用于清除Modbus TCP Slave的数据存储区,寄存器区值全部写0。

4.slave.Listen()方法,Modbus TCP Slave开始监听请求,我的理解是有客户端连接后,Slave开始响应客户端的报文,此方法应该放在有客户端连接后再使用较好,但在此处调用也能正常运行。


            try
            {
                listener = new TcpListener(IPAddress.Parse(textBox2.Text), Convert.ToInt32(textBox3.Text));
                listener.Start();
                slave = ModbusTcpSlave.CreateTcp(1, listener);
                slave.DataStore = DataStoreFactory.CreateDefaultDataStore();
                WriteInfo("创建服务器成功!" + "线程ID:" + Thread.CurrentThread.ManagedThreadId + "\r\n");
                //订阅数据到达事件,不能获取具体接收到的报文
                //slave.DataStore.DataStoreWrittenTo += DataStoreWrittenToHandle;
                //订阅接收到报文请求事件,可以打印接收到的报文
                slave.ModbusSlaveRequestReceived += ModbusSlaveRequestReceivedHandle;
                //订阅接收到写入完成事件,可以打印写入完成响应
                slave.WriteComplete += WriteCompleteHandle;
                slave.Listen();
                isServerCreated = true;
                WriteInfo("服务器创建成功!" +  "\r\n");
                count2 = 0;
            }
            catch(Exception ex)
            {
                count2++;
                 WriteInfo("创建服务器失败!" + "失败次数:"+count2.ToString()+ "\r\n");
                isServerCreated = false;
                creatServer= false; 
                return;
            }

3.事件订阅

分别说明以下三个事件的功能。

//订阅数据到达事件,不能获取具体接收到的报文
//slave.DataStore.DataStoreWrittenTo += DataStoreWrittenToHandle;
//订阅接收到报文请求事件,可以打印接收到的报文
slave.ModbusSlaveRequestReceived += ModbusSlaveRequestReceivedHandle;
 //订阅接收到写入完成事件,可以打印写入完成响应
slave.WriteComplete += WriteCompleteHandle;

1.DataStore.DataStoreWrittenTo事件:当DataStore通过Modbus命令被写入数据时触发。

2.ModbusSlaveRequestReceived事件:当Slave收到主站报文时触发。

3.WriteComplete事件:当Slave接收到主站报文,并写入完成后触发。

本例主要使用后面【ModbusSlaveRequestReceived事件】和【WriteComplete事件】。

ModbusSlaveRequestReceived事件触发时,调用函数在提示框中打印报文信息,报文信息转换成16进制显示。

        private void ModbusSlaveRequestReceivedHandle(object obj, ModbusSlaveRequestEventArgs e)
        {
            string str = "";
            foreach (var item in e.Message.MessageFrame)
            {
                str += item.ToString("x2").PadLeft(2, '0').ToUpper() + "  ";    
            }
            WriteInfo("服务器收到报文:  " + str + "\r\n");
        }

WriteComplete事件,调用函数在提示框中打印报文信息,报文信息转换成16进制显示。

        private void WriteCompleteHandle(object sender, ModbusSlaveRequestEventArgs e)
        {
            string str = "";
            foreach (var item in e.Message.MessageFrame)
            {
                str += item.ToString("x2").PadLeft(2, '0').ToUpper() + "  ";
            }
            WriteInfo("服务器写入完成:  " + str + "\r\n");
        }

4.通讯示例

在服务器侧画面上,输入【IP】:127.0.0.1,【Port】:502,点击【创建服务器】,可观察到下方提示框中显示【创建服务器成功】。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

打开Modbus Poll软件,在连接设置在远端服务器侧输入【IP地址】和【端口号】,点击确认连接。

连接成功后,PC端软件提示服务器收到报文,报文信息没有包含CRC字节信息;Modbus Poll端软件显示Tx=11,不断增加,这是由于默认使用了03功能读保持寄存器,数量长度为20个字,并循环读取。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

Modbus Poll的配置如下: 

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

根据PC端软件已有功能,进行测试。

从站(服务器)写入,Modbus Poll(主站/客户端)读取:

【Value】输入2,点击【写1~10】,将向保持寄存器地址【1~10】写入值为Value*地址值,如:地址1=2;

地址2=4;

地址3=6;

地址4=8;

依次类推...如下图所示。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

Modbus Poll(主站/客户端)写入,从站(服务器)读取:

Modbus Poll使用03功能码往保持寄存器地址11,写入123。 左侧软件提示框显示“服务器收到报文+收到报文”,此提示是由【ModbusSlaveRequestReceived事件】触发后发出;然后显示“服务器写入完成+收到报文”,此提示是由【WriteComplete事件】触发后发出。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

Modbus Poll使用16功能码往保持寄存器地址11开始写10个寄存器,命令配置如下:

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

观察左侧软件提示框信息:

报文数据中的  00  0B  00  0C  00  0D  00  0E  00  0F  00  10  00  11  00  12  00  13  00  14

转换成10进制为11(00 0B),12(00 0C),13,14,15,16,17,18,19,20。

modbustcpslave c#,Codesys,tcp/ip,服务器,网络协议

至此,基本通讯测试完成。

下面补充服务器端,如何对保持寄存器进行读写,其实很简单,就是直接访问slave.DataStore.HoldingRegisters[i]中的数据即可。

如下为写入代码:

            if (listener != null && slave!=null) {
                for (int i = 1;i<11;i++)
                {
                    slave.DataStore.HoldingRegisters[i] = (ushort)(numericUpDown2 .Value* i);
                }
                WriteInfo("服务器写入1~10完成" + "\r\n");
            }

以下为读取代码:文章来源地址https://www.toymoban.com/news/detail-840575.html

            if(slave!=null)
            {
                string str = "";
                for(int i=10;i<20;i++)
                {
                    str += slave.DataStore.HoldingRegisters[i+1].ToString() + "  ";
                }
                WriteInfo("读取寄存器(地址为10~20):"+str +"\r\n"); 
            }

到了这里,关于C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# Modbus通信从入门到精通(11)——调试软件Modbus Slave和Modbus Poll的使用

    我们在开发Modbus程序的时候,会需要测试以下我们写的Modbus程序有没有问题,这时候就需要使用到Modbus Slave和Modbus Poll这两个软件,Modbus Slave是模拟Modbus从站,Modbus Poll是模拟Modbus从站主站的, 一般情况下我们开发的Modbus主站程序,当我们没有硬件作为从站的时候,我们可以

    2024年02月06日
    浏览(56)
  • Modbus RTU(Remote Terminal Unit)与RS-485协议(rs485)介绍(主站设备(Master)、从站设备(Slave))Modbus TCP、Modbus ASCII

    参考文章:ModBus协议 参考文章:一篇文章了解 RS485 和 MODBUS 的区别,它们有什么不同? Modbus RTU和RS-485是工业通信中常用的两种协议。Modbus RTU 是一种数据表示协议,而 RS-485 则是物理传输标准。尽管这两者有时被并列讨论,但它们在通信系统中的角色却大不相同。以下内容将

    2024年02月05日
    浏览(69)
  • Modbus通信协议介绍以及Modbus Poll、Slave软件使用介绍

    Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。该软件内部封装Modbus协议,通过图形化界面使得操作更为简单。软件支持ModbusRTU、ASCII、TCP/IP协议。

    2024年02月09日
    浏览(47)
  • Modbus简介以及NModbus学习分享

    Modbus以及上位机软件实际运用 Git代码示例:https://github.com/chenheze90/Learning01_Modbus/tree/master Modbus是一种串行通讯协议,通常运用在电子设备之间的通讯上。在许多制造行业中应用极其广泛;进过多年的发展Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业

    2024年02月02日
    浏览(31)
  • C# Modbus通信从入门到精通(21)——Modbus TCP协议原理

    Modbus TCP是走网口的,也可以在同一时间内有多个从站访问主站,并且通过Modbus事务处理标识来区分同一时刻的不同Modbus事务,这是区别于Modbus ASCII和Modbus RTU的地方。 Modbus客户端通常输入Modbus服务器的IP地址和端口号来建立TCP连接,然后根据从站地址来确定具体访问哪个从站

    2024年02月15日
    浏览(64)
  • C# Modbus通信从入门到精通(29)——Modbus TCP(0x10功能码与C#代码实现)

    使用该功能码能将多个保持寄存器的值写入到远程地址中 更详细的格式如下: MBAP报文头+功能码+寄存器起始地址高字节+寄存器起始地址低字节+寄存器数量高字节+寄存器数量低字节+字节计数(1个字节)+寄存器1高字节+寄存器1低字节+…+寄存器N高字节+寄存器N低字节+CRC,一

    2024年02月06日
    浏览(102)
  • C# Modbus通信从入门到精通(22)——Modbus TCP(0x01功能码与C#代码实现)

    使用该功能码能从远程地址中读取1到2000个线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数量由主站读取时指定。 MBAP报文头格式如下: 更详细的格式如下: MBAP报文头+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位,一共12个字节。 更详细的格式

    2024年02月07日
    浏览(67)
  • Python3通过串口服务器读取设备Modbus数据【modbus_rtu_over_tcp】

    工业采集设备支持ModbusRtu 协议,通讯端口为232串口 或485接口,上位机连接采集终端,不方便走线【串口线 、485总线】,利用现有网络,通过串口服务器进行连接。 实现方案: 1、虚拟串口,上位机通过串口直接采集数据, 缺点:需要安装、开启虚拟串口程序,增加不稳定因

    2024年02月11日
    浏览(60)
  • 编写C#程序实现和西门子1500PLC进行Modbus Tcp通讯仿真

    前言 本文章的主题是介绍Modbus Tcp通讯仿真,其中C#编写的程序充当客户端(Client),西门子1500PLC充当的服务器端(Server),有关Modbus Tcp协议的具体内容在此也不再赘述,大家可以自行阅读官方文档。 注:在实现其基本功能的条件下,本文的代码编写以及软件配置均简化。

    2024年02月11日
    浏览(68)
  • TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

    如下图所示,打开TIA博途软件,添加一个1200的PLC,并设置该PLC的IP地址,这里以192.168.0.2为例进行说明, 如下图所示,打开OB1,在通信指令—其他中找到MB_SERVER,并拖拽到OB1中, MB_SERVER指令的具体使用方法可参考以下内容( 管脚的功能定义 ): 如下图所示,添加一个DB块用

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包