C#實(shí)現(xiàn)modbus通訊的實(shí)現(xiàn)示例
前言
這篇文章是modbus通訊的串口(RTU)、網(wǎng)口(TCP)通訊的記錄,以下都是使用NModbus4第三方庫實(shí)現(xiàn),能進(jìn)行讀寫數(shù)據(jù)。
一、Modbus RTU通訊
Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來傳輸數(shù)據(jù),并且是Modbus協(xié)議的一種物理層實(shí)現(xiàn)方式。
1.C#程序編寫
代碼如下:
using Modbus.Device; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1.Service { //modbus串口通訊 class RS485Service { //配置文件 public IniFile m_ConfigFile; //從站地址 byte slaveAddress = 1; //注:是IModbusMaster類型,不是IModbusSerialMaster類型 public IModbusMaster master; public SerialPort serialPort = null; public RS485Service() { } public void Connect() { if (serialPort == null) { try { // 配置串口連接 string portName = "COM1"; // 串口名稱 int baudRate = 9600; // 波特率 Parity parity = Parity.None; // 校驗(yàn)位 int dataBits = 8; // 數(shù)據(jù)位 StopBits stopBits = StopBits.One; // 停止位 serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits); //serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); if (serialPort.IsOpen) { master = ModbusSerialMaster.CreateRtu(serialPort); Console.WriteLine("串口通訊連接成功!"); } } catch (Exception ex) { Console.WriteLine("串口通訊未連接!" + ex.Message); } } } #region 地址讀值 //讀取單個(gè)線圈狀態(tài)(功能碼 0x01) public bool ReadCoil(ushort coilAddress) { bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1); return coils[0]; } //讀取多個(gè)線圈狀態(tài)(功能碼 0x01) public bool[] ReadCoils(ushort startAddress, ushort quantity) { return master.ReadCoils(slaveAddress, startAddress, quantity); } //讀取單個(gè)保持寄存器(功能碼 0x03) public ushort ReadRegister(ushort registerAddress) { ushort[] registers = master.ReadHoldingRegisters(slaveAddress, registerAddress, 1); return registers[0]; } //讀取多個(gè)保持寄存器(功能碼 0x03) public ushort[] ReadResgisters(ushort startAddress, ushort quantity) { return master.ReadHoldingRegisters(slaveAddress, startAddress, quantity); } #endregion #region 地址寫值 //寫單個(gè)線圈(功能碼 0x05) //如果需要控制單個(gè) IO 點(diǎn)(例如一個(gè)繼電器),可以使用 WriteSingleCoil 方法 public void WriteCoil(ushort coilAddress, bool value) { master.WriteSingleCoil(slaveAddress, coilAddress, value); } //寫多個(gè)線圈(功能碼 0x0F) //如果需要同時(shí)控制多個(gè) IO 點(diǎn),可以使用 WriteMultipleCoils 方法 public void WriteMultCoils(ushort startAddress, bool[] values) { master.WriteMultipleCoils(slaveAddress, startAddress, values); } //寫單個(gè)保持寄存器(功能碼 0x06) //如果需要寫入單個(gè)寄存器(例如一個(gè)數(shù)字量輸出),可以使用 WriteSingleRegister 方法 public void WriteRegister(ushort registerAddress, ushort value) { master.WriteSingleRegister(slaveAddress, registerAddress, value); } //寫多個(gè)保持寄存器(功能碼 0x10) //如果需要寫入多個(gè)寄存器,可以使用 WriteMultipleRegisters 方法 public void WriteMultRegisters(ushort startAddress, ushort[] values) { master.WriteMultipleRegisters(slaveAddress, startAddress, values); } #endregion } }
二、Modbus TCP通訊
Modbus TCP是一種基于以太網(wǎng)的Modbus協(xié)議實(shí)現(xiàn)方式。它通過TCP/IP網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,適用于工業(yè)自動(dòng)化和設(shè)備監(jiān)控中的高速通信。
1.C#程序編寫
代碼如下:
using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace XiSi.Communications { class ModbusTCPProtocol { #region 屬性 private string _ip = "127.0.0.1"; private int _port = 502; public byte slaveAddress = 1; public IModbusMaster _master; TcpClient client; #endregion public void Config(string ip, int port) { _ip = ip; _port = port; } /// <summary> /// modbus的tcp連接(網(wǎng)口連接) /// </summary> public void Connect() { //連接到Modbus TCP服務(wù)器(IP地址和端口) client = new TcpClient(); client.Connect(IPAddress.Parse(_ip), _port); //創(chuàng)建Modbus TCP主站對象 _master = ModbusIpMaster.CreateIp(client); } public void Disconnect() { _master.Dispose(); } public bool IsConnected() { return _master != null && client.Connected; } /// <summary> /// 讀取線圈 /// </summary> public bool[] ReadCoils(ushort startAddress, ushort count) { return _master.ReadCoils(slaveAddress, startAddress, count); } /// <summary> /// 寫入線圈值 /// </summary> public void WriteCoil(ushort startAddress, bool value) { _master.WriteSingleCoil(slaveAddress, startAddress, value); } /// <summary> /// 讀取寄存器 /// </summary> public ushort[] ReadRegisters(ushort startAdress, ushort count) { return _master.ReadHoldingRegisters(slaveAddress, startAdress, count); } /// <summary> /// 寫入寄存器值 /// </summary> public void WriteRegisters(ushort startAddress, ushort[] data) { _master.WriteMultipleRegisters(slaveAddress, startAddress, data); } } }
到此這篇關(guān)于C#實(shí)現(xiàn)modbus通訊的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# modbus通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望
相關(guān)文章
WPF中不規(guī)則窗體與WindowsFormsHost控件兼容問題的解決方法
這篇文章主要介紹了WPF中不規(guī)則窗體與WindowsFormsHost控件兼容問題的解決方法,對比以往的解決方案,給出了一個(gè)具有普遍性的技巧,具有一定的借鑒價(jià)值,需要的朋友可以參考下2014-11-11詳解C#中 Thread,Task,Async/Await,IAsyncResult的那些事兒
本文主要介紹了C#中 Thread,Task,Async/Await,IAsyncResult的相關(guān)知識。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01C# StreamReader類實(shí)現(xiàn)讀取文件的方法
這篇文章主要介紹了C# StreamReader類實(shí)現(xiàn)讀取文件的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C#常用數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array
這篇文章介紹了C#常用數(shù)據(jù)結(jié)構(gòu)之?dāng)?shù)組Array,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證
這篇文章介紹了C#使用Data?Annotations進(jìn)行手動(dòng)數(shù)據(jù)驗(yàn)證的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法
這篇文章主要介紹了C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-08-08Entity?Framework使用ObjectContext類
這篇文章介紹了Entity?Framework使用ObjectContext類的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06