C#實現Modbus通信的詳細教程(支持TCP和RTU)
引言
Modbus 協(xié)議是一種廣泛應用于工業(yè)自動化中的通信協(xié)議,用于在設備之間進行數據交換。它基于主/從架構,并支持多種傳輸方式,如 Modbus TCP 和 Modbus RTU。由于其簡潔、可靠和開放性,Modbus 被廣泛應用于 SCADA 系統(tǒng)、PLC(可編程邏輯控制器)、傳感器以及其他嵌入式系統(tǒng)。
在本文中,我們將使用 C# 編程語言和開源庫 NModbus,展示如何輕松實現 Modbus 通信,支持 Modbus TCP 和 Modbus RTU 兩種通信方式。
1. 準備工作
在開始編寫代碼之前,你需要做一些準備工作:
- NModbus 庫:NModbus 是一個用 C# 實現的開源 Modbus 協(xié)議庫,支持 Modbus RTU 和 Modbus TCP。我們將利用這個庫來簡化 Modbus 協(xié)議的實現。
- 安裝 NModbus 庫:你可以通過 NuGet 包管理器或者 .NET CLI 安裝 NModbus。
打開 Visual Studio 中的 NuGet 包管理器控制臺,運行以下命令來安裝 NModbus:
Install-Package NModbus
或者,使用 .NET CLI:
dotnet add package NModbus
2. Modbus TCP 客戶端實現
Modbus TCP 是基于以太網的協(xié)議,通信速度較快,適用于大多數現代設備。如果你有一個支持 Modbus TCP 協(xié)議的設備或服務器,以下是如何在 C# 中實現一個簡單的 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 設備的協(xié)議客戶端
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();
}
}代碼解析:
- 連接到 Modbus 服務器:使用
TcpClient與 Modbus 設備建立 TCP 連接。指定設備的 IP 地址和端口(默認為 502)。 - 創(chuàng)建 Modbus 客戶端:通過
ModbusTcpMaster.CreateIp(client)創(chuàng)建一個 Modbus 客戶端,支持讀寫數據。 - 讀取保持寄存器:通過
ReadHoldingRegisters方法從設備讀取指定地址的多個寄存器的值。 - 關閉連接:通信完成后,關閉與設備的連接。
常用 Modbus 操作:
- 讀取寄存器:
ReadHoldingRegisters()、ReadInputRegisters()。 - 寫入寄存器:
WriteSingleRegister()、WriteMultipleRegisters()。
3. Modbus RTU 客戶端實現
Modbus RTU(Remote Terminal Unit)是基于串口通信的協(xié)議,常用于嵌入式設備和遠程設備的通信。Modbus RTU 適用于較為簡單的設備,尤其是需要通過串口(如 RS232 或 RS485)通信的情況。
代碼示例: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. 創(chuàng)建 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();
}
}代碼解析:
- 配置串口連接:使用
SerialPort類設置串口連接,包括端口號、波特率、校驗位等。 - 創(chuàng)建 Modbus RTU 客戶端:通過
ModbusSerialMaster.CreateRtu()創(chuàng)建 Modbus RTU 客戶端。 - 讀取寄存器:通過
ReadHoldingRegisters方法讀取指定從站地址和寄存器范圍的數據。 - 關閉串口連接:通信完成后,關閉串口。
常見 Modbus RTU 操作:
- 讀取數據:
ReadCoils()、ReadDiscreteInputs()、ReadHoldingRegisters()、ReadInputRegisters()。 - 寫入數據:
WriteSingleCoil()、WriteSingleRegister()、WriteMultipleCoils()、WriteMultipleRegisters()。
4. 錯誤處理和調試
在實際使用 Modbus 協(xié)議進行通信時,錯誤處理和調試至關重要。常見的錯誤包括連接超時、通信中斷、數據格式錯誤等。
錯誤處理示例:
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}");
}通過捕獲不同類型的異常,你可以更精確地定位問題所在,便于調試和修復。
5. 小結
在 C# 中實現 Modbus 通信非常簡單,通過使用 NModbus 庫,我們能夠輕松地構建 Modbus TCP 和 Modbus RTU 客戶端。無論是與工業(yè)設備、傳感器,還是 PLC 通信,Modbus 都是一個可靠且高效的選擇。
本教程展示了如何在 C# 中使用 NModbus 庫實現 Modbus TCP 和 Modbus RTU 通信。通過這些示例,你可以快速入門并根據自己的需求進一步擴展和優(yōu)化代碼。希望本教程能幫助你實現與各種 Modbus 設備的高效通信。
以上就是C#實現Modbus通信的詳細教程(支持TCP和RTU)的詳細內容,更多關于C# Modbus通信的資料請關注腳本之家其它相關文章!

