C# ModbusRTU通信寄存器数据读写

2 篇文章 0 订阅

先了解ModbusRTU的通信协议。

功能码:

代码

名称

作用

01

读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF)

02

读取输入状态

取得一组开关输入的当前状态(ON/OFF)

03

读取保持寄存器

在一个或多个保持寄存器中取得当前的二进制值

04

读取输入寄存器

在一个或多个输入寄存器中取得当前的二进制值

05

强置单线圈

强置一个逻辑线圈的通断状态

06

预置单寄存器

放置一个特定的二进制值到一个单寄存器中

07

读取异常状态

取得8个内部线圈的通断状态

15

强置多线圈

强置一串连续逻辑线圈的通断

16

预置多寄存器

放置一系列特定的二进制值到一系列多寄存器中

17

报告从机标识

可使主机判断编址从机的类型及该从机运行指示灯的状态

写单个寄存器:

        /// <summary>
        /// 发送单寄存器控制数据
        /// </summary>
        /// <param name="DeviceAddr">设备地址</param>
        /// <param name="Register">寄存器地址</param>
        /// <param name="Data">数据</param>
        /// <returns></returns>
        private byte[] CreateControlCMD(byte DeviceAddr, ushort Register, ushort Data)
        {
            byte[] CMD = new byte[8];
            try
            {
                //组织请求数据             
                CMD[0] = DeviceAddr;
                CMD[1] = 0x06;//06码:预置单寄存器,把具体二进制装入一个保持寄存器
                CMD[2] = BitConverter.GetBytes(Register)[1];
                CMD[3] = BitConverter.GetBytes(Register)[0];
                CMD[4] = BitConverter.GetBytes(Data)[1];
                CMD[5] = BitConverter.GetBytes(Data)[0];
                byte[] crcByte = CRC.CRC16(CMD.Take(6).ToArray());
                CMD[6] = crcByte[1];
                CMD[7] = crcByte[0];
                return CMD;
            }
            catch (Exception ex)
            {
                Logger.Error(string.Format("构造指令出错:{0}", ex.ToString()));
            }
            return CMD;
        }

读取寄存器(0x03):

        public static byte[] RTUReadRegisterRequestCmd(byte address, byte function, ushort startRegister, ushort numOfRegister)
        {
            byte[] cmds = new byte[8];
            cmds[0] = address;
            cmds[1] = function;  //read cmd
            cmds[2] = (byte)(startRegister >> 8);  //high byte of register address
            cmds[3] = (byte)startRegister; //low byte of register address
            cmds[4] = (byte)(numOfRegister >> 8);  //high byte of register number
            cmds[5] = (byte)numOfRegister;  //low byte of register number
            byte[] crcByteT = CRC.CRC16(cmds.Take(6).ToArray());
            cmds[6] = crcByteT[1];
            cmds[7] = crcByteT[0];
            return cmds;
        }

CRC16方法:

        public static byte[] CRC16(byte[] data)
        {
            int len = data.Length;
            if (len > 0)
            {
                ushort crc = 0xFFFF;

                for (int i = 0; i < len; i++)
                {
                    crc = (ushort)(crc ^ (data[i]));
                    for (int j = 0; j < 8; j++)
                    {
                        crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ 0xA001) : (ushort)(crc >> 1);
                    }
                }
                byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
                byte lo = (byte)(crc & 0x00FF);         //低位置

                return new byte[] { hi, lo };
            }
            return new byte[] { 0, 0 };
        }

读取数据的总长:

总长 = 地址(1)+功能码(1)+数据长度(2)+数据(n)+crc校验(2)

 

 

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c是一种编程语言,被广泛用于开发软件和应用程序。它是由丹尼斯·里奇在20世纪70年代初开发的。c语言具有简洁、高效、灵活的特点,因此深受程序员的喜爱。 C语言是一种高级语言,但它的语法和结构相对简单,易于理解和学习。它提供了许多基本的编程概念,如变量、数据类型、运算符和控制语句,使程序员能够编写出功能丰富、高效率的程序。 C语言可以用于开发各种软件和应用,例如操作系统、编译器、数据库系统、游戏等。C语言还具有良好的可移植性,因为它可以在不同的操作系统和硬件平台上运行。 C语言的另一个重要特点是它可以直接与计算机硬件进行交互。程序员可以通过C语言编写底层的系统功能和设备驱动程序,提高程序的性能和效率。 尽管C语言非常强大和灵活,但它也有一些缺点。例如,C语言对于错误处理机制较为简单,程序员需要自行处理错误和异常。此外,C语言的指针概念对于初学者来说可能较为困难。 总而言之,C语言是一种非常重要的编程语言,具有广泛的应用领域和丰富的功能。它的简洁性、高效性和灵活性使得它成为众多程序员选择的首选语言。无论是初学者还是经验丰富的开发者,都可以通过学习和使用C语言来构建出功能强大的软件和应用程序。 ### 回答2: C是一种编程语言,诞生于20世纪70年代,由丹尼斯·里奇开发。它是一种通用的高级编程语言,被广泛应用于各个领域。 C语言具有简洁、高效的特点,可以快速开发出高效率的应用程序。它被用于开发操作系统、嵌入式系统以及各种应用软件。C语言还是许多其他编程语言的基础,包括C++、Java和Python等。 C语言的语法简单明了,易于理解和学习。它提供了丰富的控制结构和操作符,使得程序员可以实现各种复杂的操作。同时,C语言还提供了丰富的库函数,供程序员调用,使得开发过程更加高效。 C语言使用面向过程的编程范式,注重过程的执行和功能的实现。它强调在程序中定义函数,使用函数来组织和管理代码。这种编程范式具有良好的结构化特性,可以提高程序的可性和可维护性。 C语言也具有较高的性能,可以直接访问内存和硬件设备。这使得它非常适合于开发底层系统软件,如驱动程序和嵌入式系统。 总的来说,C语言是一种功能强大、灵活性高的编程语言。它在计算机科学和软件工程领域起着重要的作用,并且被广泛应用于各个领域。无论是初学者还是专业的软件开发人员,掌握C语言都是非常重要的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值