C#實現(xiàn)modbus通訊的實現(xiàn)示例
前言
這篇文章是modbus通訊的串口(RTU)、網(wǎng)口(TCP)通訊的記錄,以下都是使用NModbus4第三方庫實現(xiàn),能進(jìn)行讀寫數(shù)據(jù)。
一、Modbus RTU通訊
Modbus RTU通訊是一種基于串口通訊的協(xié)議。它使用串行通信接口(如RS232、RS485等)來傳輸數(shù)據(jù),并且是Modbus協(xié)議的一種物理層實現(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; // 校驗位
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 地址讀值
//讀取單個線圈狀態(tài)(功能碼 0x01)
public bool ReadCoil(ushort coilAddress)
{
bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1);
return coils[0];
}
//讀取多個線圈狀態(tài)(功能碼 0x01)
public bool[] ReadCoils(ushort startAddress, ushort quantity)
{
return master.ReadCoils(slaveAddress, startAddress, quantity);
}
//讀取單個保持寄存器(功能碼 0x03)
public ushort ReadRegister(ushort registerAddress)
{
ushort[] registers = master.ReadHoldingRegisters(slaveAddress, registerAddress, 1);
return registers[0];
}
//讀取多個保持寄存器(功能碼 0x03)
public ushort[] ReadResgisters(ushort startAddress, ushort quantity)
{
return master.ReadHoldingRegisters(slaveAddress, startAddress, quantity);
}
#endregion
#region 地址寫值
//寫單個線圈(功能碼 0x05)
//如果需要控制單個 IO 點(diǎn)(例如一個繼電器),可以使用 WriteSingleCoil 方法
public void WriteCoil(ushort coilAddress, bool value)
{
master.WriteSingleCoil(slaveAddress, coilAddress, value);
}
//寫多個線圈(功能碼 0x0F)
//如果需要同時控制多個 IO 點(diǎn),可以使用 WriteMultipleCoils 方法
public void WriteMultCoils(ushort startAddress, bool[] values)
{
master.WriteMultipleCoils(slaveAddress, startAddress, values);
}
//寫單個保持寄存器(功能碼 0x06)
//如果需要寫入單個寄存器(例如一個數(shù)字量輸出),可以使用 WriteSingleRegister 方法
public void WriteRegister(ushort registerAddress, ushort value)
{
master.WriteSingleRegister(slaveAddress, registerAddress, value);
}
//寫多個保持寄存器(功能碼 0x10)
//如果需要寫入多個寄存器,可以使用 WriteMultipleRegisters 方法
public void WriteMultRegisters(ushort startAddress, ushort[] values)
{
master.WriteMultipleRegisters(slaveAddress, startAddress, values);
}
#endregion
}
}
二、Modbus TCP通訊
Modbus TCP是一種基于以太網(wǎng)的Modbus協(xié)議實現(xiàn)方式。它通過TCP/IP網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,適用于工業(yè)自動化和設(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#實現(xiàn)modbus通訊的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# modbus通訊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望
相關(guān)文章
C#中的SQLCommand命令與DbTransaction事務(wù)處理
這篇文章介紹了C#中的SQLCommand命令與DbTransaction事務(wù)處理,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05

