C#实现modbus通讯的实现示例
作者:老农民编程
本文主要介绍了modbus通讯的串口(RTU)、网口(TCP)通讯的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
这篇文章是modbus通讯的串口(RTU)、网口(TCP)通讯的记录,以下都是使用NModbus4第三方库实现,能进行读写数据。
一、Modbus RTU通讯
Modbus RTU通讯是一种基于串口通讯的协议。它使用串行通信接口(如RS232、RS485等)来传输数据,并且是Modbus协议的一种物理层实现方式。
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; // 数据位
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 地址读值
//读取单个线圈状态(功能码 0x01)
public bool ReadCoil(ushort coilAddress)
{
bool[] coils = master.ReadCoils(slaveAddress, coilAddress, 1);
return coils[0];
}
//读取多个线圈状态(功能码 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 点(例如一个继电器),可以使用 WriteSingleCoil 方法
public void WriteCoil(ushort coilAddress, bool value)
{
master.WriteSingleCoil(slaveAddress, coilAddress, value);
}
//写多个线圈(功能码 0x0F)
//如果需要同时控制多个 IO 点,可以使用 WriteMultipleCoils 方法
public void WriteMultCoils(ushort startAddress, bool[] values)
{
master.WriteMultipleCoils(slaveAddress, startAddress, values);
}
//写单个保持寄存器(功能码 0x06)
//如果需要写入单个寄存器(例如一个数字量输出),可以使用 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是一种基于以太网的Modbus协议实现方式。它通过TCP/IP网络进行数据传输,适用于工业自动化和设备监控中的高速通信。
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连接(网口连接)
/// </summary>
public void Connect()
{
//连接到Modbus TCP服务器(IP地址和端口)
client = new TcpClient();
client.Connect(IPAddress.Parse(_ip), _port);
//创建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);
}
}
}
到此这篇关于C#实现modbus通讯的实现示例的文章就介绍到这了,更多相关C# modbus通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望
