C#轻松创建ModbusTCP服务器【Slave】,实现工业数据交换接口。
2020-06-19 16:10
113 查看
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#简单实现实现TCP服务器多线程数据接收
- C#List随机交换取数据(C#实现的洗牌算法)
- c# 用dataset实现XML与数据库的数据交换
- 通过创建SQL Server 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
- PHP、Java、C#实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
- 通过创建SQL Server 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
- C#Tcp多个客户端与服务器数据与文件传输
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- C#实现服务器数据实时推送的功能的原理
- C#异步TCP服务器完整实现
- C#网络编程系列文章(二)之Socket实现同步TCP服务器
- C#中应用DDE技术实现动态数据交换
- C# TCP实现多个客户端与服务端 数据 与 文件的传输
- C#异步TCP服务器完整实现
- C#网络编程系列文章(四)之TcpListener实现同步TCP服务器
- C# TCP实现多个客户端与服务端 数据 与 文件的传输
- C# TCP/IP 连接实现数据收发 Demo (Visual Studio)
- C#网络编程系列文章(一)之Socket实现异步TCP服务器
- C#网络编程系列文章(一)之Socket实现异步TCP服务器
- 用C#接口实现通用的文本数据序列化