首页 > 其他分享 >modubs协议

modubs协议

时间:2024-07-30 18:08:41浏览次数:10  
标签:协议 MB List AddRange modubs byte public SendCommand

代码

 public class ModbusHelp
    {
        #region 功能码
        /// <summary>
        /// 读线圈寄存器
        /// </summary>
        public const byte MB_READ_COILS = 0x01;
        /// <summary>
        /// 读离散输入寄存器
        /// </summary>
        public const byte MB_READ_DISCRETE = 0x02;
        /// <summary>
        /// 读保持寄存器
        /// </summary>
        public const byte MB_READ_HOLD_REG = 0x03;
        /// <summary>
        /// 读输入寄存器
        /// </summary>
        public const byte MB_READ_INPUT_REG = 0x04;
        /// <summary>
        /// 写单个线圈
        /// </summary>
        public const byte MB_WRITE_SINGLE_COIL = 0x05;
        /// <summary>
        /// 写单寄存器
        /// </summary>
        public const byte MB_WRITE_SINGLE_REG = 0x06;
        /// <summary>
        /// 写多线圈
        /// </summary>
        public const byte MB_WRITE_MULTIPLE_COILS = 0x0f;
        /// <summary>
        /// 写多寄存器
        /// </summary>
        public const byte MB_WRITE_MULTIPLE_REGS = 0x10;
        #endregion


        #region 协议
        /// <summary>
        /// 事物处理标识符
        /// </summary>
        public byte[] MB_Thing = new byte[] { 0x00, 0x0B };
        /// <summary>
        /// 协议标识符
        /// </summary>
        public byte[] MB_Agreement = new byte[] { 0x00, 0x00 };
        /// <summary>
        /// 单元标识符
        /// </summary>
        public byte MB_Cell = 0x04;
        #endregion

        /// <summary>
        /// 计算数据长度
        /// </summary>
        /// <param name="byteData"></param>
        /// <returns></returns>
        public byte[] GetDataLength(byte[] byteData)
        {
            int leng = byteData.Length;
            return IntToByte(leng);
        }

        /// <summary>
        /// int类型转字节
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public byte[] IntToByte(int data)
        {
            byte[] bytes = BitConverter.GetBytes(Convert.ToInt16(data));
            return ReplenishByte(bytes);
        }

        /// <summary>
        /// 补充字节
        /// </summary>
        /// <returns></returns>
        public byte[] ReplenishByte(byte[] byteData)
        {
            if (byteData.Length == 2 && byteData[1] == 0)
            {
                byteData = new byte[] { 0x00, byteData.FirstOrDefault() };
            }
            else
            {
                byteData = new byte[] { byteData[1], byteData[0] };
            }
            return byteData;
        }


        //public byte[] IntToByte(int data)
        //{
        //    var hexValue = data.ToString("x");
        //    if (hexValue.Length <= 2)
        //    {
        //        return new byte[] { 0x00, Convert.ToByte(hexValue, 16) };
        //    }
        //    else
        //    {
        //        if (hexValue.Length % 2 != 0)//不是两位的补0
        //        {
        //            hexValue = "0" + hexValue;
        //        }
        //        char[] hexCharacters = hexValue.ToCharArray();
        //        byte[] byteArray = new byte[Convert.ToInt32(Math.Ceiling((double)hexCharacters.Length / 2))];
        //        for (int i = 0; i < byteArray.Length; i++)
        //        {
        //            string hexVal = hexValue.Substring(i * 2, 2);
        //            byteArray[i] = Convert.ToByte(hexVal, 16);
        //        }
        //        if (byteArray.Length <= 1)
        //        {
        //            return new byte[] { 0x00, byteArray.FirstOrDefault() };
        //        }
        //        return byteArray;
        //    }
        //}

        /// <summary>
        /// 读线圈寄存器
        /// </summary>
        /// <param name="state">读取位置</param>
        /// <param name="places">读取多少位</param>
        /// <returns></returns>
        public List<byte> ReadModbusSingle(int state, int places)
        {
            List<byte> SendCommand = new List<byte>();
            //事物处理标识符
            SendCommand.AddRange(MB_Thing);
            //协议标识符
            SendCommand.AddRange(MB_Agreement);
            //长度
            SendCommand.AddRange(new byte[] { 0x00, 0x06 });
            //单元标识符
            SendCommand.Add(MB_Cell);
            //功能码
            SendCommand.Add(MB_READ_HOLD_REG);
            //起始地址
            SendCommand.AddRange(IntToByte(state));
            //结束地址-长度
            SendCommand.AddRange(IntToByte(places));
            return SendCommand;
        }

        /// <summary>
        /// 写单寄存器
        /// </summary>
        /// <param name="state">读取位置</param>
        /// <param name="places">读取多少位</param>
        /// <returns></returns>
        public List<byte> WriteModbusSingle(int index, int value)
        {
            List<byte> SendCommand = new List<byte>();
            //事物处理标识符
            SendCommand.AddRange(MB_Thing);
            //协议标识符
            SendCommand.AddRange(MB_Agreement);
            //长度
            SendCommand.AddRange(new byte[] { 0x00, 0x06 });
            //单元标识符
            SendCommand.Add(MB_Cell);
            //功能码
            SendCommand.Add(MB_WRITE_SINGLE_REG);
            //起始地址
            SendCommand.AddRange(IntToByte(index));
            //结束地址-长度
            SendCommand.AddRange(IntToByte(value));
            return SendCommand;
        }

        /// <summary>
        /// 写入多个寄存器
        /// </summary>
        /// <param name="index">位置</param>
        /// <param name="values">值</param>
        /// <returns></returns>
        public List<byte> WriteModbusList(int index, List<int> values)
        {
            //写入的值
            List<byte> valueByte = new List<byte>();
            foreach (var it in values)
            {
                valueByte.AddRange(IntToByte(it));
            }
            byte[] valueLeng = BitConverter.GetBytes(Convert.ToInt16(valueByte.Count()));
            valueByte.Insert(0, valueLeng.FirstOrDefault());

            List<byte> SendCommand = new List<byte>();
            //事物处理标识符
            SendCommand.AddRange(MB_Thing);
            //协议标识符
            SendCommand.AddRange(MB_Agreement);

            //长度
            SendCommand.AddRange(IntToByte(valueByte.Count() + 6));

            //单元标识符  1
            SendCommand.Add(MB_Cell);
            //功能码  1
            SendCommand.Add(MB_WRITE_MULTIPLE_REGS);
            //写入位置 2
            SendCommand.AddRange(IntToByte(index));
            //写入寄存器数量
            SendCommand.AddRange(IntToByte(values.Count()));
            //写入的值
            SendCommand.AddRange(valueByte);
            return SendCommand;
        }



    }

 

标签:协议,MB,List,AddRange,modubs,byte,public,SendCommand
From: https://www.cnblogs.com/shuaimeng/p/18333068

相关文章

  • GIS视效升级!零代码添加环境效果,支持多种GIS影像协议
    在当今的数字化时代,GIS(地理信息系统)不再仅仅只能通过一些二维示意图或简陋的三维地形图表示,它可以通过专业的软件简单升级视效。想象一下,在你的GIS场景中,阳光明媚的天气、突如其来的暴风雨、缭绕的晨雾,统统都可以通过零代码的操作轻松实现,而这个效果我是使用一款叫做山海鲸可视化......
  • 使用C99 变长数组和和零长数组特性封装协议回复消息
    背景:主从机交互协议中,需要针对不同控制字封装回复消息接口。本文使用变长数组特性和零长数组特性对这类接口进行统一封装。 1#pragmapack(1)2typedefstruct{3uint8_tmagic;4uint8_tlen_H;5uint8_tlen_L;6uint8_tcmd;7uint8_t......
  • 如何测试 python 类型协议是另一个协议的子类?
    该问题的明显解决方案是使用issubclass,但这会引发TypeError(使用Python3.6.7),例如>>>fromtyping_extensionsimportProtocol>>>classProtoSubclass(Protocol):...pass...>>>issubclass(ProtoSubclass,Protocol)Traceback(mos......
  • 区块链共识协议算法
    一、常见共识协议算法1.ByzantineFaultTolerance(BFT)BFT是一种容错算法,旨在在系统中存在一部分恶意或故障节点的情况下,仍然能够达到一致性。特点:容忍拜占庭故障,即能够处理部分节点不可靠或恶意的情况。通常适用于许可链(私有链或联盟链)。应用:HyperledgerFabri......
  • 如何使用支持简单类型和属性的字段声明协议?
    (相关但不重复:如何注释可以实现为属性的属性?)我想创建一个Protocol,其中字段可以通过简单类型和财产。例如:classP(Protocol):v:int@dataclassclassFoo(P):v:intclassBar(P):@propertydefv(self)->int:#ERROR......
  • 协议-TLS协议-客户端TLS解密的实现原理
    参考来源:练习实践-TLS协议01-Wireshark对https数据的解密练习实践-TLS协议01-客户端curl配合sslkey文件实现解密极客时间:网络排查案例课-实战二:应用层真实案例揭秘篇-20丨TLS加解密:如何解密HTTPS流量?客户端如何做TLS解密?这里说的客户端,包括了Chrome、Firefox等浏览......
  • [HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-E
    0引言在近期项目一场景中,一WebAPI(响应内容:7MB-40MB、数据项:5W-20W条)的网络传输耗时较大,短则5s,长则高达25s,前端渲染又需要耗时9s-60s。在这个场景中,前端的问题暂且不表。那么针对后端的问题,个人认为还是有较大的优化空间:1)启用HTTP内容压缩策略【最重要】2)调整数据......
  • Winform程序控制网络继电器(康耐德,泥人..)运用Socket,TCP协议
    //继电器官网查看命令https://www.konnad.com/service/download/product-model/sdd4040-ad3staticbyte[]DOON=newbyte[]{0x00,0x01,0x00,0x00,0x00,0x06,0xFF,0x05,0x00,0x64,0xFF,0x00};//控制继电器打开(DO-1灯亮)staticbyte[]DOOFF=new......
  • OSPF动态路由协议实验
    首先地址划分一个骨干网段分成三个,r1,r2,r5三个环回网段 ,总共要四个网段192.168.1.0/24192.168.1.0/26---骨干网段192.168.1.0/28192.168.1.16/28192.168.1.32/28备用192.168.1.64/28192.168.1.64/26---r1环回192.168.1.128/26---r2环回192.168.1.192/26---r3环回......
  • web基础以及http协议
    ⼀、web基本概念和常识Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。Web服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。Web应⽤开发也经过了⼏代技术的不断......