一、Modbus協議簡介
Modbus是一種通訊協議,用於工業自動化領域中的數據通信,早在1979年就已經出現,現在已成為廣泛應用的通信協議之一。Modbus通常是在串行通信中使用,但也可以在以太網上運行。
Modbus包括ASCII、RTU和TCP/IP協議,每種協議都有自己的特點和優點,根據應用的需求選擇相應的協議。
二、C# Modbus庫介紹
C# Modbus庫是一種用於C#編程語言的Modbus通信工具,它可以快速的連接Modbus設備,並且以更快的速度讀寫Modbus寄存器。
以下是C# Modbus庫的代碼示例:
using System; using System.IO.Ports; using Modbus.Device; // 定義串口 using SerialPort _serialPort = new SerialPort("COM1"); // 創建Modbus工廠 var factory = new ModbusFactory(); // 連接設備 using (var modbus = factory.CreateRtuMaster(_serialPort)) { modbus.Transport.ReadTimeout = 1000; modbus.Transport.WriteTimeout = 1000; modbus.Transport.Retries = 3; // 讀取寄存器 ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); foreach (ushort register in registers) { Console.WriteLine($"register:{register} "); } // 寫入寄存器 modbus.WriteSingleRegister(1, 1, 100); }
三、C# Modbus常用操作
1、讀取寄存器
讀取寄存器通常是獲取Modbus設備中數據的常用方法。可以使用C# Modbus庫中的ReadHoldingRegisters()方法來讀取寄存器。
以下是C# Modbus庫中讀取寄存器的代碼示例:
// 連接Modbus設備 using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 讀取寄存器 ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); foreach (ushort register in registers) { Console.WriteLine($"register:{register} "); } }
2、寫入寄存器
寫入寄存器通常用於向Modbus設備中寫入數據,可以使用C# Modbus庫中的WriteSingleRegister()方法來寫入寄存器。
以下是C# Modbus庫中寫入寄存器的代碼示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 寫入寄存器 modbus.WriteSingleRegister(1, 1, 100); }
3、讀取線圈狀態
讀取線圈狀態通常用於獲取Modbus設備中的開關量狀態。可以使用C# Modbus庫中的ReadCoils()方法來讀取線圈狀態。
以下是C# Modbus庫中讀取線圈狀態的代碼示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 讀取線圈狀態 bool[] coilStatus = modbus.ReadCoils(1, 0, 10); foreach (bool status in coilStatus) { Console.WriteLine($"status:{status} "); } }
4、寫入線圈狀態
寫入線圈狀態通常用於設定Modbus設備中的開關量狀態。可以使用C# Modbus庫中的WriteSingleCoil()方法來寫入線圈狀態。
以下是C# Modbus庫中寫入線圈狀態的代碼示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { // 寫入線圈狀態 modbus.WriteSingleCoil(1, 1, true); }
5、異常處理
在使用Modbus時,可能會遇到連接中斷或數據讀寫錯誤等異常情況。為了保證程序的可靠性,需做好異常處理。
以下是C# Modbus庫中異常處理的代碼示例:
using (var modbus = factory.CreateRtuMaster(_serialPort)) { try { ushort[] registers = modbus.ReadHoldingRegisters(1, 0, 10); } catch (Exception ex) { Console.WriteLine($"Exception:{ex.Message} "); } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/283404.html