1、依赖库:NModbus4

https://github.com/NModbus4/NModbus4

2、添加引用

using Modbus.Data;
using Modbus.Device;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;

3、全局变量声明:

/// <summary>
/// 服务器提供的数据区
/// </summary>
public static DataStore Data;/// <summary>
/// Modbus服务器
/// </summary>
public static ModbusSlave modbus_tcp_server;

4、创建ModbusTCP服务:

Data = DataStoreFactory.CreateDefaultDataStore(); //初始化服务数据区
modbus_tcp_server = ModbusTcpSlave.CreateTcp(1, new TcpListener(IPAddress.Parse("0.0.0.0"), 502)); //创建ModbusTcp服务器
modbus_tcp_server.DataStore = Data;//数据区赋值
modbus_tcp_server.ModbusSlaveRequestReceived += _modbusSlave_ModbusSlaveRequestReceived; //接收到查询的事件(供调试显示,非必须)

5、启动服务:(非阻塞方式)

Thread th_0 = new Thread(() =>
{modbus_tcp_server.Listen();//异步 非阻塞 启动服务
})
{IsBackground = true,
};
th_0.SetApartmentState(ApartmentState.STA);
th_0.Start();

6、接收到客户端数据查询的事件(供界面信息显示非必须)

        /// <summary>/// 接收事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void _modbusSlave_ModbusSlaveRequestReceived(object sender, ModbusSlaveRequestEventArgs e){BeginInvoke(new MethodInvoker(() =>{label1.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:fff") + ":" + e.Message.ToString();}));}

7、服务器的数据区赋值(此处仅测试,实际生产环境根据需求做赋值)

            Thread th_1 = new Thread(() =>{SetData(); //数据区数据赋值}){IsBackground = true,};th_1.SetApartmentState(ApartmentState.STA);th_1.Start();
        /// <summary>/// 设置数据/// </summary>private void SetData(){while (true){Data.InputRegisters[1] = (ushort)DateTime.Now.Year;         //年Data.InputRegisters[2] = (ushort)DateTime.Now.Month;        //月Data.InputRegisters[3] = (ushort)DateTime.Now.Day;          //日Data.InputRegisters[4] = (ushort)DateTime.Now.Hour;         //时Data.InputRegisters[5] = (ushort)DateTime.Now.Minute;       //分Data.InputRegisters[6] = (ushort)DateTime.Now.Second;       //秒Data.InputRegisters[7] = (ushort)DateTime.Now.Millisecond;  //毫秒Random ran = new Random();Data.InputRegisters[8] = (ushort)ran.Next(0, 32767);        //产生的随机数///界面显示BeginInvoke(new MethodInvoker(() =>{richTextBox1.Clear();richTextBox1.AppendText($@"30001={Data.InputRegisters[1]}" + "\r\n");richTextBox1.AppendText($@"30002={Data.InputRegisters[2]}" + "\r\n");richTextBox1.AppendText($@"30003={Data.InputRegisters[3]}" + "\r\n");richTextBox1.AppendText($@"30004={Data.InputRegisters[4]}" + "\r\n");richTextBox1.AppendText($@"30005={Data.InputRegisters[5]}" + "\r\n");richTextBox1.AppendText($@"30006={Data.InputRegisters[6]}" + "\r\n");richTextBox1.AppendText($@"30007={Data.InputRegisters[7]}" + "\r\n");richTextBox1.AppendText($@"30008={Data.InputRegisters[8]}" + "\r\n");}));Thread.Sleep(1000);}

8、运行测试:



C#轻松创建ModbusTCP服务器【Slave】,实现工业数据交换接口。相关推荐

  1. sql oraoledb.oracle,无法创建链接服务器XXXXX的 OLE DB 访问接口OraOLEDB.Oracle的实例。 (Microsoft SQL Server,错误7302)...

    无法创建链接服务器"XXXXX"的 OLE DB 访问接口"OraOLEDB.Oracle"的实例. (Microsoft SQL Server,错误: 730 ...

  2. CollectOPC工业数据交换 矿安【2021】2号文重大设备感知数据交互软件

    CollectOPC工业数据交换 矿安[2021]2号文重大设备感知数据交互软件 http://www.mklhrh.com/ 15038005056 联系电话 CollectOPC介绍 依据< ...

  3. c 服务器发送数据源码,c语言实现http服务器和浏览器进行数据交换

    [实例简介] c语言实现http服务器和浏览器进行数据交换,使用post请求 [实例截图] [核心代码] http_server0.1 └── http_server0.1 ├── Debug │   ...

  4. 前置机服务器连通_在数据交换中,前置机是什么,有怎样的作用?

    以下内容来自我司数据平台开发工程师: 1.为什么需要数据交换? 2.什么是前置机,为什么需要前置机? 为什么要数据交换 企业大量的IT投资建立了众多的信息系统,但是随着信息系统的增加,各自孤立工作的信 ...

  5. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...

  6. nodejs获得服务器响应,轻松创建nodejs服务器(6):作出响应

    我们接着改造服务器,让请求处理程序能够返回一些有意义的信息. 我们来看看如何实现它: 1.让请求处理程序通过onRequest函数直接返回(return())他们要展示给用户的信息. 2.让我们从让请 ...

  7. 无法创建链接服务器 ORCL 的 OLE DB 访问接口 OraOLEDB.Oracle 的实例 (错误:7302)...

    原文:https://www.cnblogs.com/tiger2soft/p/6954308.html 在sqlserver中创建oracle的链接服务器时,提示此错误. 按照网上的方案,先后使用了 ...

  8. SQL SERVER导入EXCEL文件:无法创建链接服务器 (null) 的 OLE DB 访问接口 Microsoft.Ace.OLEDB.12.0 的实例。...

    [方法一] --开启导入功能     exec sp_configure 'show advanced options',1     reconfigure     exec sp_configure ...

  9. sql新建oracle链接服务器,oracle 创建链接服务器

    SqlServer下数据库链接的使用方法 有时候我们希望在一个sqlserver下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成这些操作,我们首要的是创建 ...

最新文章

  1. Linux学习笔记8——bash基本概念
  2. 面试官问:Redis变慢了,你会怎么排查?
  3. powershell实例第1讲:判断某个文件夹是否存在,存在则删除
  4. Vim 基本配置和经常使用的命令
  5. Database之SQLSever:T-SQL数据语言操作(数据定义语句DDL、数据操作语句DML、数据控制语句DCL、其他基本语句、流程控制语句、批处理语句)概念及其相关案例之详细攻略
  6. 1、solr包结构介绍,solrCore的安装配置,solr部署到Tomcat,多solrCore配置,配置中文分词器,界面功能介绍,Schema.xml的基本使用,数据导入
  7. MySQL高级 - 案例 - AOP记录日志
  8. 【渝粤教育】广东开放大学 计量经济学 形成性考核 (21)
  9. Python学习14 模块和包
  10. mysql semisync 恢复_mysql半同步复制(semi_sync_replication)搭建及使用
  11. CocoaPods学习系列5——错误集锦
  12. python中match用法_python re.match()用法相关示例
  13. Vue:axios中POST请求传参问题
  14. MySQL数据库基本操作-DDL
  15. linux vi 拷贝多行,vi 整行 多行 复制与粘贴
  16. c语言课程终结考试,C语言课程考核方案.doc
  17. 备考系统集成项目管理工程师经验
  18. 江在川上曰:vue中使用swiper
  19. Python数据分析 第一章 数据分析的概述
  20. 2-5 K8s图形化管理界面dashboard

热门文章

  1. 如何用HBuilderX把uni-app项目运行到微信开发者工具上
  2. Dubbo中暴露服务的过程解析
  3. java的栈区 堆区存放什么_简单整理java中的栈内存, 堆内存是什么?
  4. NFT Insider #70:Paris Hilton与The Sandbox达成合作,YGG经理人杯总决赛圆满结束
  5. 为postgreSQL添加man帮助
  6. 线性代数之——消元法
  7. #泰坦尼克号幸存者预测
  8. 低调的华丽:从服务器开发的角度认识 asp.net 中的回调技术
  9. 记一次虚拟机无妨访问网络的问题-Failed to start LSB:Bring up/down networking
  10. order by、distribute by、sort by、group by、partition by