Modbus-RTU协议C#实现

这篇具有很好参考价值的文章主要介绍了Modbus-RTU协议C#实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、安装依赖包
System.IO.Ports
2、读协议

/// <summary>
        /// Modbus-RTU协议读实例
        /// </summary>
        private static void Read()
        {
            //组装一个请求报文
            // 01 03 00 00 00 0A C5 CD
            byte slave = 0x01;
            //byte function = 0x03;   //读单个寄存器
            byte function = 0x01;   //读单个线圈状态
            int startAddress = 0;
            int length = 10;

            List<byte> bytes = new List<byte>();
            bytes.Add(slave);
            bytes.Add(function);
            bytes.Add(BitConverter.GetBytes(startAddress)[1]);
            bytes.Add(BitConverter.GetBytes(startAddress)[0]);
            bytes.Add(BitConverter.GetBytes(length)[1]);
            bytes.Add(BitConverter.GetBytes(length)[0]);
            //CRC校验
            bytes = CRC16(bytes);
            //组装好了进行串口通信
            SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            serialPort.Open();
            //向从站发送请求
            serialPort.Write(bytes.ToArray(), 0, bytes.Count);
            Task.Run(async () =>
            {
                await Task.Delay(100);
                byte[] buffer = new byte[serialPort.BytesToRead];
                serialPort.DiscardInBuffer();

                List<byte> bufferList = new List<byte>(buffer);
                bufferList.RemoveAt(0);
                bufferList.RemoveAt(0);
                bufferList.RemoveAt(0);
                bufferList.RemoveAt(bufferList.Count - 1);
                bufferList.RemoveAt(bufferList.Count - 1);
                //读寄存器
                //for(int i = 0; i < bufferList.Count; i++)
                //{
                //    List<byte> valueList = new List<byte>();
                //    valueList.Add(bufferList[i]);
                //    valueList.Add(bufferList[++i]);
                //    valueList.Reverse();
                //    ushort value=BitConverter.ToUInt16(valueList.ToArray(), 0);
                //    Console.WriteLine(value);
                //}
                //读线圈 09 00
                bufferList.Reverse();
                var values = string.Join("", bufferList.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')).ToList()).ToList();
                values.Reverse();
                for (int i = 0; i < values.Count; i++)
                {
                    Console.WriteLine(Convert.ToBoolean(int.Parse(values[i].ToString())));
                }
            });
        }

3、写协议

/// <summary>
        /// Modbus-RTU协议写实例
        /// </summary>
        private static void Write()
        {
            //组装报文
            byte slave = 0x01;
            //byte function = 0x05;   //写单个线圈状态
            byte function = 0x06;   //写单个寄存器
            int startAddress = 0;
            bool value = false;
            int iv = 123;

            List<byte> bytes = new List<byte>();
            bytes.Add(slave);
            bytes.Add(function);
            bytes.Add(BitConverter.GetBytes(startAddress)[1]);
            bytes.Add(BitConverter.GetBytes(startAddress)[0]);
            //单线圈的写入
            //bytes.Add(value ? (byte)0xFF : (byte)0x00);
            //bytes.Add(0x00);
            //单寄存器写入
            bytes.Add(BitConverter.GetBytes(iv)[1]);
            bytes.Add(BitConverter.GetBytes(iv)[0]);
            //CRC校验
            bytes = CRC16(bytes);
            SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            serialPort.Open();
            //向从站发送请求
            serialPort.Write(bytes.ToArray(), 0, bytes.Count);
            //接收后如果报文一致,说明发送请求成功
        }

4、CRC16校验文章来源地址https://www.toymoban.com/news/detail-615777.html

/// <summary>
        /// CRC-16校验
        /// </summary>
        /// <param name="value"></param>
        /// <param name="poly"></param>
        /// <param name="crcInit"></param>
        /// <returns></returns>
        /// <exception cref="ArgumentException"></exception>
        private static List<byte> CRC16(List<byte> value,ushort poly=0xA001,ushort crcInit=0xFFFF)
        {
            if (value == null || !value.Any())
                throw new ArgumentException("");
            //运算
            ushort crc = crcInit;
            for(int i=0; i<value.Count; i++)
            {
                crc = (ushort)(crc ^ value[i]);
                for(int j=0; j<8; j++)
                {
                    crc=(crc&1)!=0?(ushort)((crc>>1)^poly):(ushort)(crc>>1);
                }
            }
            byte hi = (byte)((crc & 0xFF00) >> 8);
            byte lo=(byte)(crc & 0xFF);
            List<byte> buffer = new List<byte>();
            buffer.AddRange(value);
            buffer.Add(lo);
            buffer.Add(hi);
            return buffer;
        }

到了这里,关于Modbus-RTU协议C#实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32开发之Modbus协议(RTU从站)

    说明 1、本文不做协议格式的讲解,只做实现,如需了解协议格式,自行搜索 2、本文不依赖于硬件相关的资源,建立在硬件通讯之上,通过回调的形式和对应的硬件进行关联 3、相关协议内容参照,上一篇RTU主站 宏定义(modbus_core_define) crc校验(modbus_core_crc) 头文件 源文件

    2024年02月11日
    浏览(46)
  • STM32开发之Modbus协议(主站RTU)

    在单片机方面,针对于通讯常用的协议之一modbus,这里将modbus协议和硬件之间的关系完全独立出来,硬件和协议之间的联系采用的是回调的方式进行一个关联。 1、此协议可直接移植,并不需要关心硬件相关的。 2、modbus相关协议概念自行查找,本文只做代码的实现。 宏定义(

    2024年02月12日
    浏览(42)
  • Profibus-DP转modbus RTU网关modbus rtu协议

    捷米JM-DPM-RTU网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:E+H流量计、倍福编码器等)接入到Modbus网络中;通过增加DP/PA耦合器,也可将Profibus PA从站接入Modbus网络。在Modbus串口侧提供RS485和RS232两种电平接口。 捷米JM-DPM-RTU网关

    2024年02月10日
    浏览(43)
  • STM32硬件库(非HAL库)实现MODBUS RTU协议的03,06功能码(读以及与单个发送)

    本人软件工程专业,关于硬件只有408的基础,后续学习发现一些博主所讲以及b站上所给的教程并不是很清晰,故编写此文档供大家查看。 如果我说的地方哪里有问题,希望大家可以给出意见!(●ˇ∀ˇ●) 参考文档: Modbus通讯协议常用功能码解释_modbus功能码_Lee139499的博客

    2024年02月03日
    浏览(32)
  • modbus-tcp-rtu协议图表

    MODBUS TCP 读寄存器 请求 序号 意义 所占字节 字节存放格式 1 事务处理标识 2个字节 高字节在前 2 协议标识 2个字节 高字节在前 3 长度 2个字节 高字节在前 4 单元标识 1个字节 0x00-0xff 5 功能码 1个字节 0x03 6 起始寄存器地址 2个字节 高字节在前 7 寄存器个数 2个字节 高字节在前

    2024年01月23日
    浏览(37)
  • MODBUS RTU协议原理及功能码解析

    目录                         第一部分 MODBUS RTU协议原理 1.1 简介 1.2 RTU传输模式 1.3 MODBUS报文帧 1.4 CRC校验                 第二部分 MODBUS RTU模式下功能码解析 2.1 Modbus-RTU协议简介 2.2 部分功能码名词解释 2.3 部分功能码解析 01功能码 –读线圈状态 0

    2024年02月02日
    浏览(46)
  • MODBUS RTU 通信协议 CRC16校验算法

    CRC校验码是一个2个字节(16位二进制)的数。 发送端:发送的数据计算CRC校验码----发送:数据+CRC校验码 接收端:收到数据后重新计算CRC校验码,然后和接收到数据中的CRC校验码进行比较,判断是否相等。 如果不相等:数据传输过程中出错,给出错误应答。 CRC16 校验源码

    2024年02月16日
    浏览(49)
  • 树莓派4B与智能插排通过RS485(modbus RTU协议)通信

    目标:使用树莓派4B与CANHAT扩展板读取智能插排测量的各项数据(RS485+modbus RTU),获取的数据上传到Hyperledger Fabric框架。 之前学习过了modbus RTU协议,在智能涡轮流量计的实验中应用过一次,这次用这个带485模块的智能插座再复习一次~ 实验材料: 树莓派4B/8G:  CANHAT扩展板:

    2024年02月01日
    浏览(75)
  • EthernetIP 转MODBUS RTU协议网关连接FANUC机器人作为EthernetIP通信从站

    远创智控YC-EIPM-RTU网关产品是一款高效的数据采集工具,它可以通过各种数据接口与工业领域的仪表、PLC、计量设备等产品连接,实时采集这些设备中的运行数据、状态数据等信息。采集到的数据经过整合和运算等操作后,可以被传输到其他设备或者云平台。网关可采集设备

    2024年02月08日
    浏览(55)
  • Modbus RTU(Remote Terminal Unit)与RS-485协议(rs485)介绍(主站设备(Master)、从站设备(Slave))Modbus TCP、Modbus ASCII

    参考文章:ModBus协议 参考文章:一篇文章了解 RS485 和 MODBUS 的区别,它们有什么不同? Modbus RTU和RS-485是工业通信中常用的两种协议。Modbus RTU 是一种数据表示协议,而 RS-485 则是物理传输标准。尽管这两者有时被并列讨论,但它们在通信系统中的角色却大不相同。以下内容将

    2024年02月05日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包