发一个简单的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服务已启动!";
}
}
}