C#使用EasyModbus進(jìn)行通訊的實(shí)現(xiàn)示例
EasyModbus是一個流行的.NET庫,用于實(shí)現(xiàn)Modbus TCP、RTU和UDP協(xié)議通信。
一 安裝EasyModbus

二 ModbusRTU-串口連接
// 創(chuàng)建Modbus RTU客戶端
ModbusClient modbusClient = new ModbusClient("COM10"); // 串口號
modbusClient.Baudrate = 9600; // 波特率
modbusClient.Parity = System.IO.Ports.Parity.None; // 校驗(yàn)位
modbusClient.StopBits = System.IO.Ports.StopBits.One; // 停止位
modbusClient.Connect();
三 ModbusTCP-網(wǎng)口連接
// 創(chuàng)建Modbus客戶端實(shí)例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口
// 連接到Modbus服務(wù)器
modbusClient.Connect();
四 讀取多個輸出線圈
// 讀取線圈狀態(tài) (功能碼01)
bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 從地址0開始讀取5個線圈
五 寫入單個線圈
// 寫入單個線圈 (功能碼05)
modbusClient.WriteSingleCoil(0, true); // 向地址0寫入true
六 讀取保持寄存器
// 讀取保持寄存器 (功能碼03)
int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 從地址0開始讀取10個寄存器
七 讀取輸入寄存器
int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
八 寫入單個輸出寄存器
modbusClient.WriteSingleRegister(0, 1234);
九 寫入多個輸出寄存器
// 寫入多個寄存器 (功能碼16)
int[] valuesToWrite = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(0, valuesToWrite); // 從地址0開始寫入
基本用法
1. Modbus TCP客戶端
using EasyModbus;
// 創(chuàng)建Modbus客戶端實(shí)例
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 502); // IP地址和端口
try
{
// 連接到Modbus服務(wù)器
modbusClient.Connect();
// 讀取保持寄存器 (功能碼03)
int[] holdingRegisters = modbusClient.ReadHoldingRegisters(0, 10); // 從地址0開始讀取10個寄存器
// 寫入單個寄存器 (功能碼06)
modbusClient.WriteSingleRegister(0, 1234); // 向地址0寫入值1234
// 寫入多個寄存器 (功能碼16)
int[] valuesToWrite = { 100, 200, 300 };
modbusClient.WriteMultipleRegisters(10, valuesToWrite); // 從地址10開始寫入
// 讀取線圈狀態(tài) (功能碼01)
bool[] coilStatus = modbusClient.ReadCoils(0, 5); // 從地址0開始讀取5個線圈
// 寫入單個線圈 (功能碼05)
modbusClient.WriteSingleCoil(0, true); // 向地址0寫入true
}
catch (Exception ex)
{
Console.WriteLine($"發(fā)生錯誤: {ex.Message}");
}
finally
{
// 斷開連接
modbusClient.Disconnect();
}
2. Modbus RTU客戶端 (串口通信)
using EasyModbus;
// 創(chuàng)建Modbus RTU客戶端
ModbusClient modbusClient = new ModbusClient("COM1"); // 串口號
modbusClient.Baudrate = 9600; // 波特率
modbusClient.Parity = System.IO.Ports.Parity.None; // 校驗(yàn)位
modbusClient.StopBits = System.IO.Ports.StopBits.One; // 停止位
try
{
modbusClient.Connect();
// 與TCP類似的操作
int[] inputRegisters = modbusClient.ReadInputRegisters(0, 5);
// ...其他操作
}
catch (Exception ex)
{
Console.WriteLine($"發(fā)生錯誤: {ex.Message}");
}
finally
{
modbusClient.Disconnect();
}
3. Modbus服務(wù)器
EasyModbus也支持創(chuàng)建Modbus服務(wù)器:
using EasyModbus;
// 創(chuàng)建Modbus TCP服務(wù)器
ModbusServer modbusServer = new ModbusServer();
modbusServer.Port = 502; // 設(shè)置端口
// 設(shè)置寄存器值(服務(wù)器模擬)
modbusServer.HoldingRegisters[0] = 100;
modbusServer.HoldingRegisters[1] = 200;
// 啟動服務(wù)器
modbusServer.Listen();
Console.WriteLine("Modbus服務(wù)器已啟動,按任意鍵停止...");
Console.ReadKey();
// 停止服務(wù)器
modbusServer.StopListening();
高級功能
異步操作
// 異步讀取保持寄存器 int[] registers = await Task.Run(() => modbusClient.ReadHoldingRegisters(0, 10));
事件處理
modbusClient.DataReceived += (sender, e) =>
{
Console.WriteLine($"接收到數(shù)據(jù): {BitConverter.ToString(e.Data)}");
};
超時設(shè)置
modbusClient.ConnectionTimeout = 5000; // 5秒連接超時
注意事項(xiàng)
- 確保防火墻允許Modbus通信(默認(rèn)端口502)
- 對于RTU模式,確保串口配置與設(shè)備匹配
- 處理異常情況,如連接失敗、超時等
- 寄存器地址從0開始,但某些設(shè)備文檔可能從1開始計(jì)數(shù),需要注意偏移
完整示例
using System;
using EasyModbus;
class Program
{
static void Main(string[] args)
{
ModbusClient modbusClient = new ModbusClient("192.168.1.100", 502);
try
{
Console.WriteLine("正在連接Modbus服務(wù)器...");
modbusClient.Connect();
// 讀取保持寄存器
Console.WriteLine("讀取保持寄存器...");
int[] registers = modbusClient.ReadHoldingRegisters(0, 5);
for (int i = 0; i < registers.Length; i++)
{
Console.WriteLine($"寄存器 {i}: {registers[i]}");
}
// 寫入寄存器
Console.WriteLine("寫入寄存器...");
modbusClient.WriteSingleRegister(10, 1234);
// 驗(yàn)證寫入
int value = modbusClient.ReadHoldingRegisters(10, 1)[0];
Console.WriteLine($"寄存器10的新值: {value}");
}
catch (Exception ex)
{
Console.WriteLine($"錯誤: {ex.Message}");
}
finally
{
modbusClient.Disconnect();
Console.WriteLine("連接已關(guān)閉");
}
}
}
通過以上示例,你應(yīng)該能夠開始在C#項(xiàng)目中使用EasyModbus庫進(jìn)行Modbus通信了。
到此這篇關(guān)于C#使用EasyModbus進(jìn)行通訊的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# EasyModbus通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?EF?Core可視化工具的使用及EF?Core入門語句操作代碼
EF?Core?可用作對象關(guān)系映射程序?(O/RM),以便于?.NET?開發(fā)人員能夠使用?.NET?對象來處理數(shù)據(jù)庫,這樣就不必經(jīng)常編寫大部分?jǐn)?shù)據(jù)訪問代碼了,接下來通過本文給大家介紹C#?EF?Core可視化工具的使用及EF?Core入門語句,感興趣的朋友一起看看吧2022-02-02
C#設(shè)置軟件開機(jī)自動運(yùn)行的方法(修改注冊表)
這篇文章主要介紹了C#設(shè)置軟件開機(jī)自動運(yùn)行的方法,通過簡單修改注冊表開機(jī)啟動項(xiàng)實(shí)現(xiàn)軟件的開機(jī)啟動功能,非常簡單實(shí)用,需要的朋友可以參考下2016-06-06
詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內(nèi)存應(yīng)用
這篇文章主要介紹了詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內(nèi)存應(yīng)用,需要的朋友可以參考下2017-06-06
基于C#技術(shù)實(shí)現(xiàn)身份證識別功能
這篇文章主要介紹了基于C#技術(shù)實(shí)現(xiàn)身份證識別功能的相關(guān)資料,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
C# 如何使用OpcUaHelper讀寫OPC服務(wù)器
這篇文章給大家介紹C# 如何使用OpcUaHelper讀寫OPC服務(wù)器,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12

