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

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、运行测试:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个C#ModbusTCP服务器代码示例: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Threading; using HslCommunication.ModBus; using HslCommunication.Core.Net; using HslCommunication.Core; class Program { static void Main(string[] args) { // 连接西门子PLC bool siemensConn = siemensS7.Connect("192.168.1.200", CPU_Type.S71200, 0, 0); if (siemensConn) { Console.WriteLine("西门子PLC连接成功"); } else { Console.WriteLine("西门子PLC连接失败"); } // 创建ModbusTCP服务器 bool slaveConn = false; try { TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 502); ModbusTcpSlave modbusTcpSlave = ModbusTcpSlave.CreateTcp(1, tcpListener); modbusTcpSlave.Listen(); slaveConn = true; Console.WriteLine("ModbusTCP服务开启成功"); } catch (Exception ex) { slaveConn = false; Console.WriteLine("ModbusTCP服务开启失败:" + ex.Message); } // 西门子PLC连接成功且ModbusTCP服务器创建成功 if (siemensConn && slaveConn) { while (true) { // 读取PLC的数据,写入到ModbusTCP里 float value = Convert.ToSingle(siemensS7.Read("DB1.DBD0", VarType.Real)); // 显示出来 Console.WriteLine("读取数据:" + value); // 写入Modbus服务器 SetFloatValue(1, value); Thread.Sleep(500); } } Console.ReadLine(); } } ``` 你可以从以下链接下载ModbusTCP服务器的软件代码:[https://github.com/dathlin/HslCommunication/raw/master/Download/ModbusTcpServer.zip](https://github.com/dathlin/HslCommunication/raw/master/Download/ModbusTcpServer.zip)。该地址的服务器软件是最新的,并且会不断更新。 如果你想读取或写入离散量,可以使用以下代码示例: ```csharp // 读取地址100的离散量 bool value_100 = busTcpServer.ReadDiscrete("100"); // 读取地址100-109的离散量 bool[] value_100_109 = busTcpServer.ReadDiscrete("100", 10); // 写入地址100的离散量为true busTcpServer.WriteDiscrete("100", true); // 写入地址100-101的离散量为true busTcpServer.WriteDiscrete("100", new bool[] { true, true }); ``` 希望这些代码能够帮助到你。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于C#开发ModbusTCP服务器实现数据接口](https://blog.csdn.net/xiketangAndy/article/details/120866573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C# 开发ModBus的服务器程序 实现ModBus数据总站 搭建自定义的Modbus服务器 同时支持tcp和rtu...](https://blog.csdn.net/weixin_30764771/article/details/95071856)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl640

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值