C# Modbus通信从入门到精通(10)——Modbus RTU(0x10功能码)
发布人:shili8
发布时间:2024-12-30 15:35
阅读次数:0
**C# Modbus通信从入门到精通(10)——Modbus RTU(0x10功能码)**
在前面的文章中,我们已经学习了如何使用C#进行Modbus TCP通信。今天我们将重点讨论Modbus RTU(0x10功能码)的通信。
**什么是Modbus RTU?**
Modbus RTU是一种基于RS-485的串行通信协议,用于工业控制和监测系统中设备之间的数据交换。它是Modbus TCP的一种替代方案,主要用于低速率、长距离传输的应用场景。
**Modbus RTU(0x10功能码)的特点**
Modbus RTU(0x10功能码)支持以下特性:
* **串行通信**: Modbus RTU使用RS-485接口进行通信。
* **多设备支持**: Modbus RTU可以连接多个设备,实现数据交换和控制。
* **读写操作**: Modbus RTU支持读取和写入设备的寄存器和 Coil。
* **错误校验**: Modbus RTU使用CRC-16进行错误校验。
**C#中Modbus RTU(0x10功能码)的实现**
下面是C#中Modbus RTU(0x10功能码)的基本实现:
csharpusing System;
using System.IO.Ports;
public class ModbusRTU{
private SerialPort _serialPort;
public ModbusRTU(string portName, int baudRate)
{
_serialPort = new SerialPort(portName, baudRate);
}
public void Open()
{
if (!_serialPort.IsOpen)
{
_serialPort.Open();
}
}
public void Close()
{
if (_serialPort.IsOpen)
{
_serialPort.Close();
}
}
public byte[] ReadCoil(int address, int quantity)
{
// 构造读取 Coil 的 Modbus RTU 消息 byte[] message = new byte[5];
message[0] =0x10; // 功能码 message[1] = (byte)(address >>8); // 起始地址(高字节)
message[2] = (byte)(address &0xFF); // 起始地址(低字节)
message[3] = (byte)((quantity +15) /16); // 数据长度 message[4] =0x00; // CRC-16 // 发送读取 Coil 的 Modbus RTU 消息 _serialPort.Write(message,0, message.Length);
// 等待设备响应 byte[] response = new byte[5];
int bytesRead = _serialPort.Read(response,0, response.Length);
// 校验 CRC-16 if (bytesRead ==2 && response[1] ==0x00)
{
return response;
}
else {
throw new Exception("CRC-16 校验失败");
}
}
public void WriteCoil(int address, int quantity, byte[] data)
{
// 构造写入 Coil 的 Modbus RTU 消息 byte[] message = new byte[5 + data.Length];
message[0] =0x10; // 功能码 message[1] = (byte)(address >>8); // 起始地址(高字节)
message[2] = (byte)(address &0xFF); // 起始地址(低字节)
message[3] = (byte)((quantity +15) /16); // 数据长度 Array.Copy(data,0, message,4, data.Length);
for (int i =0; i < 2; i++)
{
message[data.Length + i] = (byte)(data[i] ^0xFF); // CRC-16 }
// 发送写入 Coil 的 Modbus RTU 消息 _serialPort.Write(message,0, message.Length);
}
}
**示例代码**
csharppublic class Program{
public static void Main()
{
string portName = "COM1";
int baudRate =9600;
ModbusRTU modbusRtu = new ModbusRTU(portName, baudRate);
modbusRtu.Open();
try {
byte[] data = modbusRtu.ReadCoil(0x0000,10);
Console.WriteLine(BitConverter.ToString(data));
byte[] newData = new byte[2];
newData[0] =0xFF;
newData[1] =0x00;
modbusRtu.WriteCoil(0x0000,2, newData);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
modbusRtu.Close();
}
}
**总结**
本文介绍了Modbus RTU(0x10功能码)的基本特性和C#中实现的方法。通过示例代码,我们可以看到如何使用Modbus RTU进行读取和写入 Coil 的操作。

