前言
Modbus 协议是一种广泛应用于工业自动化中的通信协议,用于在设备之间进行数据交换。
它基于主/从架构,并支持多种传输方式,如 Modbus TCP 和 Modbus RTU。由于其简洁、可靠和开放性,Modbus 被广泛应用于 SCADA 系统、PLC(可编程逻辑控制器)、传感器以及其他嵌入式系统。
在本文中,我们将使用 C# 编程语言和开源库 NModbus,展示如何轻松实现 Modbus 通信,支持 Modbus TCP 和 Modbus RTU 两种通信方式。
正文
1、准备工作
-
NModbus 库:NModbus 是一个用 C# 实现的开源 Modbus 协议库,支持 Modbus RTU 和 Modbus TCP。我们将利用这个库来简化 Modbus 协议的实现。
-
安装 NModbus 库:你可以通过 NuGet 包管理器或者 .NET CLI 安装 NModbus。
打开 Visual Studio 中的 NuGet 包管理器控制台,运行以下命令来安装 NModbus:
Install-Package NModbus
或者,使用 .NET CLI:
dotnet add package NModbus
2、Modbus TCP 客户端实现
Modbus TCP 客户端
using System;
using System.Net.Sockets;
using Modbus.Device; // 引入 NModbus 库
class Program
{
static void Main(string[] args)
{
// 1. 连接到 Modbus 服务器(Modbus TCP)
string ipAddress = "192.168.0.100"; // 设备的 IP 地址
int port = 502; // Modbus TCP 默认端口
var client = new TcpClient(ipAddress, port);
// 2. 获取 Modbus TCP 设备的协议客户端
var modbusTcpMaster = ModbusTcpMaster.CreateIp(client);
// 3. 读取从站设备的寄存器
ushort startAddress = 0; // 寄存器起始地址
ushort numRegisters = 10; // 读取 10 个寄存器
try
{
// 读取保持寄存器
ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
// 输出结果
Console.WriteLine("读取到的寄存器值:");
foreach (var register in registers)
{
Console.WriteLine(register);
}
}
catch (Exception ex)
{
Console.WriteLine($"读取错误: {ex.Message}");
}
// 4. 关闭连接
client.Close();
}
}
3、Modbus RTU 客户端实现
Modbus RTU 客户端
using System;
using System.IO.Ports;
using Modbus.Device; // 引入 NModbus 库
class Program
{
static void Main(string[] args)
{
// 1. 通过串口连接到 Modbus 设备
string portName = "COM1"; // 串口名称
int baudRate = 9600; // 波特率
int parity = 0; // 校验位,0: 无校验,1: 偶校验,2: 奇校验
int dataBits = 8; // 数据位
int stopBits = 1; // 停止位
var serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
serialPort.Open();
// 2. 创建 Modbus RTU 主机对象
var modbusRtuMaster = ModbusSerialMaster.CreateRtu(serialPort);
// 3. 读取从站设备的寄存器
ushort startAddress = 0; // 寄存器起始地址
ushort numRegisters = 10; // 读取 10 个寄存器
try
{
// 读取保持寄存器(从站地址为 1)
ushort[] registers = modbusRtuMaster.ReadHoldingRegisters(1, startAddress, numRegisters);
// 输出结果
Console.WriteLine("读取到的寄存器值:");
foreach (var register in registers)
{
Console.WriteLine(register);
}
}
catch (Exception ex)
{
Console.WriteLine($"读取错误: {ex.Message}");
}
// 4. 关闭串口连接
serialPort.Close();
}
}
4、错误处理和调试
通过捕获不同类型的异常,你可以更精确地定位问题所在,便于调试和修复。例如:
try
{
// 读取寄存器
ushort[] registers = modbusTcpMaster.ReadHoldingRegisters(startAddress, numRegisters);
}
catch (SocketException ex)
{
Console.WriteLine($"网络错误:{ex.Message}");
}
catch (IOException ex)
{
Console.WriteLine($"I/O 错误:{ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"未知错误:{ex.Message}");
}
总结
在 C# 中实现 Modbus 通信非常简单,通过使用 NModbus 库,我们能够轻松地构建 Modbus TCP 和 Modbus RTU 客户端。不管是与工业设备、传感器,还是 PLC 通信,Modbus 都是一个可靠且高效的选择。
本文展示了如何在 C# 中使用 NModbus 库实现 Modbus TCP 和 Modbus RTU 通信。通过这些示例,大家可以快速入门并根据自己的需求进一步扩展和优化代码。希望本文能帮助大家实现与各种 Modbus 设备的高效通信。
关键词
Modbus、C#、NModbus、TCP、RTU、工业自动化、通信协议、SCADA、PLC、传感器
最后
如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。
也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!