1、在项目中通过NuGet添加NModbus,在界面中添加一个Button。
using NModbus.Device;
using NModbus;
using System.Net.Sockets;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Diagnostics;
namespace WpfAppModbus
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnRead_Click(object sender, RoutedEventArgs e)
{
// 1. 连接到 Modbus 服务器(Modbus TCP)
string ipAddress = "127.0.0.1"; // 设备的 IP 地址
int port = 502; // Modbus TCP 默认端口
TcpClient client = new TcpClient(ipAddress, port);
// 2. 获取 Modbus TCP 设备的协议客户端
var factory = new ModbusFactory();
IModbusMaster master = factory.CreateMaster(client);
// 3. 读取从站设备的寄存器
ushort startAddress = 0; // 寄存器起始地址
ushort numRegisters = 10; // 读取 10 个寄存器
// 4.从站地址(Slave ID)
byte slaveId = 2;
try
{
// 读取保持寄存器
// ReadHoldingRegisters: 读取保持寄存器的值。参数包括从站地址(Slave ID)、起始地址和要读取的寄存器数量。
// NModbus 还支持其他 Modbus 操作,例如:
// 读取输入寄存器: ReadInputRegisters
// 读取线圈状态: ReadCoils
// 写入单个寄存器: WriteSingleRegister
// 写入多个寄存器: WriteMultipleRegisters
// 写入单个线圈: WriteSingleCoil
// 写入多个线圈: WriteMultipleCoils
ushort[] registers = master.ReadHoldingRegisters(slaveId,startAddress, numRegisters);
// 输出结果
Debug.WriteLine("读取到的寄存器值:");
foreach (var register in registers)
{
Debug.WriteLine(register);
}
}
catch (Exception ex)
{
Debug.WriteLine($"读取错误: {ex.Message}");
}
// 5. 关闭连接
client.Close();
}
}
}
2、使用Modscan32软件模拟一个Modbus服务器,选择文件->新建,设置Device Id、Address、Lenght,在下拉框中选择03:HOLDING REGISTER。在下方灰色框中双击要修改的数据。
https://download.csdn.net/download/xingchengaiwei/90341117
3、运行程序后,读取到的数据如下。