c# modbus 客户端 读modbus 输入寄存器的值

using System;
using System.Net.Sockets;
using System.Threading.Tasks;
using Modbus.Data;
using Modbus.Device;

class Program
{
static async Task Main(string[] args)
{
string ipAddress = “192.168.80.22”;
int port = 10051; // Modbus TCP默认端口号

    // 创建Modbus TCP客户端
    using (TcpClient client = new TcpClient(ipAddress, port))
    using (ModbusIpMaster master = ModbusIpMaster.CreateIp(client))
    {
        // 设置读取的起始地址和数量
        ushort startAddress = 300;
        ushort numberOfPoints = 20; // 读取300-320共计21个寄存器的值

        try
        {
            // 读取输入寄存器的值
            ushort[] inputRegisters =  master.ReadInputRegisters(1,startAddress, numberOfPoints);

            // 输出读取到的输入寄存器的值
            Console.WriteLine("Read Input Registers:");
            for (int i = 0; i < inputRegisters.Length; i++)
            {
                Console.WriteLine($"Register {startAddress + i}: {inputRegisters[i]}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error reading input registers: {ex.Message}");
        }
    }
}

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用 C# 编写的 Modbus RTU 协议写多个寄存器的示例代码: ```csharp using System; using System.IO.Ports; namespace ModbusRTU_Write_Multiple_Registers { class Program { static void Main(string[] args) { SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); port.Open(); // Modbus RTU 请求帧 byte slaveAddress = 1; // 从站地址 byte functionCode = 16; // 功能码,16 表示写多个寄存器 ushort startingAddress = 0; // 起始地址,从 0 开始 ushort numberOfRegisters = 3; // 写入的寄存器数量 byte byteCount = (byte)(numberOfRegisters * 2); // 字节数,每个寄存器占用 2 字节 byte[] data = new byte[byteCount]; // 写入的数据 ushort[] values = new ushort[] { 100, 200, 300 }; // 写入的 for (int i = 0; i < numberOfRegisters; i++) { byte[] bytes = BitConverter.GetBytes(values[i]); data[i * 2] = bytes[1]; data[i * 2 + 1] = bytes[0]; } byte[] requestFrame = new byte[7 + byteCount]; requestFrame[0] = slaveAddress; requestFrame[1] = functionCode; requestFrame[2] = (byte)(startingAddress >> 8); requestFrame[3] = (byte)startingAddress; requestFrame[4] = (byte)(numberOfRegisters >> 8); requestFrame[5] = (byte)numberOfRegisters; requestFrame[6] = byteCount; Array.Copy(data, 0, requestFrame, 7, byteCount); // 计算 CRC 校验码 ushort crc = ModbusRTU.CalculateCRC(requestFrame, 0, requestFrame.Length - 2); requestFrame[requestFrame.Length - 2] = (byte)(crc & 0xFF); requestFrame[requestFrame.Length - 1] = (byte)(crc >> 8); // 发送请求帧 port.Write(requestFrame, 0, requestFrame.Length); // 接收响应帧 byte[] responseFrame = new byte[8]; int bytesRead = port.Read(responseFrame, 0, responseFrame.Length); if (bytesRead == responseFrame.Length) { // 校验响应帧的地址、功能码和字节数是否与请求帧相同 if (responseFrame[0] == slaveAddress && responseFrame[1] == functionCode && responseFrame[2] == byteCount) { // 解析响应帧的 CRC 校验码 ushort actualCRC = (ushort)(responseFrame[responseFrame.Length - 1] << 8 | responseFrame[responseFrame.Length - 2]); ushort expectedCRC = ModbusRTU.CalculateCRC(responseFrame, 0, responseFrame.Length - 2); if (actualCRC == expectedCRC) { Console.WriteLine("写入多个寄存器成功!"); } else { Console.WriteLine("CRC 校验错误!"); } } else { Console.WriteLine("响应帧错误!"); } } else { Console.WriteLine("接收响应帧失败!"); } port.Close(); } } public static class ModbusRTU { // 计算 CRC 校验码 public static ushort CalculateCRC(byte[] bytes, int offset, int count) { ushort crc = 0xFFFF; for (int i = offset; i < offset + count; i++) { crc ^= bytes[i]; for (int j = 0; j < 8; j++) { if ((crc & 0x0001) == 0x0001) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } return crc; } } } ``` 该示例代码使用了 .NET Framework 自带的 `SerialPort` 类来打开串口,然后构造 Modbus RTU 请求帧,发送给从站设备,接收从站设备返回的 Modbus RTU 响应帧,并校验 CRC 校验码。如果 CRC 校验码正确,则表示写入多个寄存器成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

公孙无语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值