Modbus RTU Slave模拟工具

发一个简单的Modbus RTU Slave模拟工具,用EasyModbus制作,有需要的直接拿走。

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using EasyModbus;
using System.IO.Ports;
using System.Management;
using System.Text.RegularExpressions;

namespace ModbusRTU_Slave
{
    public partial class Form1 : Form
    {
        EasyModbus.ModbusServer modbusServer = new EasyModbus.ModbusServer();
        public Form1()
        {
            InitializeComponent();
            InitCom();
        }

        public static List<string> MulGetHardwareInfo()
        {
            var comlist = new List<string>();
            try
            {
                using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity"))
                {
                    var hardInfos = searcher.Get();
                    foreach (var hardInfo in hardInfos)
                    {
                        if (hardInfo.Properties["Name"].Value != null && hardInfo.Properties["Name"].Value.ToString().Contains("(COM"))
                        {
                            String strComName = hardInfo.Properties["Name"].Value.ToString();
                            comlist.Add(strComName);
                        }
                    }
                }
                Console.ReadKey();
            }
            catch
            {
            }
            return comlist;
        }

        public void InitCom()
        {
            //初始化串口
            string[] portNames = SerialPort.GetPortNames(); // 获取所有可用的串口号数组
            List<string> lt = MulGetHardwareInfo();

            for (var m = 0; m < portNames.Length; m++)
            {
                for (var n = 0; n < lt.Count; n++)
                {
                    Regex regex = new Regex("\\(" + portNames[m] + "\\)" + "|" + "\\(" + portNames[m] + "-");
                    bool sucess = regex.IsMatch(lt[n]);
                    if (sucess)
                    {
                        comboBox1.Items.Add(portNames[m]);
                        comboBox2.Items.Add(lt[n]);
                        break;
                    }
                }
            }
        }

        public void startServer()
        {
            modbusServer.Baudrate = int.Parse(comboBox3.Text);
            modbusServer.Parity = Parity.None;
            modbusServer.StopBits = StopBits.One;
            modbusServer.SerialPort = comboBox1.Text;
            modbusServer.UnitIdentifier = 3;
            modbusServer.Listen();
            modbusServer.HoldingRegistersChanged += new ModbusServer.HoldingRegistersChangedHandler(holdingRegistersChanged);
        }

        public void holdingRegistersChanged(int startingAddress, int quantity)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.DataColumn dc1 = new System.Data.DataColumn("序号");
            System.Data.DataColumn dc2 = new System.Data.DataColumn("值");
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);
            for (var m = 0; m < 10; m++)
            {
                System.Data.DataRow dr = dt.NewRow();
                dr[0] = m.ToString();
                dr[1] = modbusServer.holdingRegisters[m+1].ToString();
                dt.Rows.Add(dr);
            }
            //写入
            for (var m = 10; m < 20; m++)
            {
                System.Data.DataRow dr = dt.NewRow();
                dr[0] = m.ToString();
                dr[1] = (modbusServer.holdingRegisters[m -9]+1).ToString();
                modbusServer.holdingRegisters[m] =(short)(modbusServer.holdingRegisters[m - 10]+1);
                dt.Rows.Add(dr);
            }
            ShowStatus(dt);
            
        }
        

        delegate void ShowStatusCallback(System.Data.DataTable dt);      //显示接收的消息委托
                                                               //显示接收的消息
        void ShowStatus(System.Data.DataTable dt)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new ShowStatusCallback(ShowStatus), new object[] { dt });
            }
            else
            {
                dataGridView1.DataSource = dt;
            }
        }

        

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = comboBox2.SelectedIndex;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            startServer();
            button1.BackColor = System.Drawing.Color.Green;
            toolStripStatusLabel1.Visible = true;
            toolStripStatusLabel1.Text = "Modbus服务已启动!";
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水滴与鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值