C#實(shí)現(xiàn)modbus通訊的實(shí)現(xiàn)示例
前言
這篇文章是modbus通訊的串口(RTU)、網(wǎng)口(TCP)通訊的記錄,以下都是使用NModbus4第三方庫(kù)實(shí)現(xiàn),能進(jìn)行讀寫(xiě)數(shù)據(jù)。
一、Modbus RTU通訊
Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來(lái)傳輸數(shù)據(jù),并且是Modbus協(xié)議的一種物理層實(shí)現(xiàn)方式。
1.C#程序編寫(xiě)
代碼如下:
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類(lèi)型,不是IModbusSerialMaster類(lèi)型
public IModbusMaster master;
public SerialPort serialPort = null;
public RS485Service()
{
}
public void Connect()
{
if (serialPort == null)
{
try
{
// 配置串口連接
string portName = "COM1"; // 串口名稱(chēng)
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 地址寫(xiě)值
//寫(xiě)單個(gè)線圈(功能碼 0x05)
//如果需要控制單個(gè) IO 點(diǎn)(例如一個(gè)繼電器),可以使用 WriteSingleCoil 方法
public void WriteCoil(ushort coilAddress, bool value)
{
master.WriteSingleCoil(slaveAddress, coilAddress, value);
}
//寫(xiě)多個(gè)線圈(功能碼 0x0F)
//如果需要同時(shí)控制多個(gè) IO 點(diǎn),可以使用 WriteMultipleCoils 方法
public void WriteMultCoils(ushort startAddress, bool[] values)
{
master.WriteMultipleCoils(slaveAddress, startAddress, values);
}
//寫(xiě)單個(gè)保持寄存器(功能碼 0x06)
//如果需要寫(xiě)入單個(gè)寄存器(例如一個(gè)數(shù)字量輸出),可以使用 WriteSingleRegister 方法
public void WriteRegister(ushort registerAddress, ushort value)
{
master.WriteSingleRegister(slaveAddress, registerAddress, value);
}
//寫(xiě)多個(gè)保持寄存器(功能碼 0x10)
//如果需要寫(xiě)入多個(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)方式。它通過(guò)TCP/IP網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,適用于工業(yè)自動(dòng)化和設(shè)備監(jiān)控中的高速通信。
1.C#程序編寫(xiě)
代碼如下:
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主站對(duì)象
_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>
/// 寫(xiě)入線圈值
/// </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>
/// 寫(xiě)入寄存器值
/// </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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望
相關(guān)文章
c# 使用handle.exe解決程序更新文件被占用的問(wèn)題
這篇文章主要介紹了c# 使用handle.exe解決程序更新文件被占用的問(wèn)題,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#中的SQLCommand命令與DbTransaction事務(wù)處理
這篇文章介紹了C#中的SQLCommand命令與DbTransaction事務(wù)處理,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C#實(shí)現(xiàn)的AES加密解密完整實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的AES加密解密,結(jié)合完整實(shí)例形式分析了C#實(shí)現(xiàn)的AES算法進(jìn)行加密與解密的相關(guān)技巧,需要的朋友可以參考下2016-07-07
基于C#實(shí)現(xiàn)語(yǔ)音識(shí)別功能詳解
在.NET4.0中,可以借助System.Speech組件讓電腦來(lái)識(shí)別我們的聲音。本文將利用該組件實(shí)現(xiàn)語(yǔ)音識(shí)別功能,文中實(shí)現(xiàn)過(guò)程講解詳細(xì),需要的可以參考一下2022-04-04

