logo

C# Modbus通信从入门到精通(10)——Modbus RTU(0x10功能码与C#代码实现)

作者:暴富20212024.01.18 11:33浏览量:7

简介:本文将详细介绍Modbus RTU协议中的0x10功能码,并通过C#代码示例演示如何实现Modbus RTU通信。

在Modbus通信中,RTU(Remote Terminal Unit)是一种常见的通信协议。与ASCII模式相比,RTU协议具有更高的数据传输速率和更好的抗干扰能力。0x10功能码在RTU协议中表示读取保持寄存器的功能。
在Modbus RTU协议中,0x10功能码用于从设备读取保持寄存器的值。保持寄存器用于存储设备的状态和数据,可以用来监视设备的运行状态、读取输入状态等。
下面是一个使用C#实现Modbus RTU 0x10功能码的示例代码:

  1. using System;
  2. using System.IO.Ports;
  3. using System.Threading;\n
  4. public class ModbusRTUExample
  5. {
  6. private SerialPort port;
  7. public ModbusRTUExample(string portName, int baudRate)
  8. {
  9. port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
  10. port.Open();
  11. }
  12. public void ReadHoldingRegisters(int startAddress, int numRegisters)
  13. {
  14. byte[] request = new byte[6];
  15. byte[] response = new byte[2 * numRegisters + 2];
  16. // 构建请求报文
  17. request[0] = 0x00; // 从机地址
  18. request[1] = 0x10; // 功能码 0x10 (读取保持寄存器)
  19. request[2] = (byte)(startAddress >> 8); // 开始地址高8位
  20. request[3] = (byte)startAddress; // 开始地址低8位
  21. request[4] = (byte)(numRegisters >> 8); // 寄存器数量高8位
  22. request[5] = (byte)numRegisters; // 寄存器数量低8位
  23. // 发送请求报文并接收响应报文
  24. port.Write(request, 0, request.Length);
  25. port.Read(response, 0, response.Length);
  26. // 处理响应报文
  27. if (response[1] == 0x10 && response[2] == (byte)(startAddress >> 8) && response[3] == (byte)startAddress)
  28. {
  29. for (int i = 4; i < response.Length - 2; i += 2)
  30. {
  31. ushort registerValue = (ushort)((response[i] << 8) | response[i + 1]);
  32. Console.WriteLine($"Register {startAddress + (i / 2)} = {registerValue}");
  33. }
  34. }
  35. else

相关文章推荐

发表评论