0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Modbus通讯协议入门学习

jf_78858299 来源: 嵌入式系统开发 作者: 嵌入式系统开发 2023-03-23 09:46 次阅读

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

Modbus 是一个请求/应答协议

Modbus

以下是要分解的Modbus热图

图片

Modbus消息帧

了解了它,会使你对串口通信有一个清晰的认识!

图片

通用消息帧

图片

ASCII消息帧 (在消息中的每个8Bit 字节都作为两个ASCII字符发送)

十六进制,ASCII字符0...9,A...F

消息中的每个ASCII字符都是一个十六进制字符组成

每个字节的位

1个起始位

n个数据位,最小的有效位先发送

1个奇偶校验位,无校验则无

1个停止位(有校验时),2个Bit(无校验时)

错误检测

LRC(纵向冗长检测)

RTU消息帧

8位二进制,十六进制数0...9,A...F

消息中的每个8位域都是一个两个十六进制字符组成

每个字节的位

1个起始位

8个数据位,最小的有效位先发送

1个奇偶校验位,无校验则无

1个停止位(有校验时),2个Bit(无校验时)

错误检测域

CRC(循环冗长检测)

CRC校验

public static string CRCCheck(string val)
        {
            val = val.TrimEnd(' ');            string[] spva = val.Split(' ');            byte[] bufData = new byte[spva.Length + 2];
            bufData = ToBytesCRC(val);            ushort CRC = 0xffff;            ushort POLYNOMIAL = 0xa001;            for (int i = 0; i < bufData.Length - 2; i++)
            {
                CRC ^= bufData[i];                for (int j = 0; j < 8; j++)
                {                    if ((CRC & 0x0001) != 0)
                    {
                        CRC >>= 1;
                        CRC ^= POLYNOMIAL;
                    }                    else
                    {
                        CRC >>= 1;
                    }
                }
            }            return Maticsoft.DBUtility.HLConvert.ToHex(System.BitConverter.GetBytes(CRC));
        }        /// 
        /// 例如把如下字符串转换成字节数组        /// AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB   转换为字节数组        /// 
        /// 十六进制字符串
        /// 
        public static byte[] ToBytesCRC(string hex)
        {            string[] temp = hex.Split(' ');            byte[] b = new byte[temp.Length + 2];            for (int i = 0; i < temp.Length; i++)
            {
                b[i] = Convert.ToByte(temp[i], 16);
            }            return b;
        }        /// 
        /// 将字节数据转换为十六进制字符串,中间用 “ ”分割 如:AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB        /// 
        /// 要转换的字节数组
        /// 
        public static String ToHex(byte[] vars)
        {            return BitConverter.ToString(vars).Replace('-', ' ').Trim();
        }

CS校验(累加和)

public static string CSCheck(string str)
        {            if (str.Length == 0) return "";            else str = str.Trim();            byte[] sss = ToBytes(str);            int n = 0;            for (int i = 0; i < sss.Length; i++)
            {
                n += sss[i];
            }            return ToHex(n);
        }        /// 
        /// AB CD 12 3B     转换为字节数组        /// 
        /// 十六进制字符串
        /// 
        public static byte[] ToBytes(string hex)
        {            string[] temp = hex.Split(' ');            byte[] b = new byte[temp.Length];            for (int i = 0; i < temp.Length; i++)
            {                if (temp[i].Length > 0)
                    b[i] = Convert.ToByte(temp[i], 16);
            }            return b;
        }        /// 
        /// 转换为符合本程序的十六进制格式        /// 
        /// 1 2 3 等。
        /// 返回十六进制字符串,如果是1-9的话,前面带零
        /// 例如: 5  ="05"  12 ="0C" 无论何时,都是两位数。  
        public static string ToHex(int var)
        {            int cs = var;            string tmp = "";            if (cs == 0) { tmp = "00"; }            while (cs > 0)
            {                int ys;
                cs = Math.DivRem(cs, 256, out ys);
                tmp = tmp.Insert(0, string.Format(" {0}", Right("00" + Convert.ToString(ys, 16), 2).ToUpper()));
            }            return tmp.Trim();
        }        public static string Right(string str, int Length)
        {            if ((Length <= 0) || (str == null))
            {                return "";
            }            int length = str.Length;            if (Length >= length)
            {                return str;
            }            return str.Substring(length - Length, Length);
        }

)

LRC校验(LRC错误校验用于ASCII模式)

/// 
        /// 取模FF(255)        /// 取反+1        /// 
        /// 
        /// 
        public static string LRCheck(string writeUncheck)
        {            char[] hexArray = new char[writeUncheck.Length];
            hexArray = writeUncheck.ToCharArray();            int decNum = 0, decNumMSB = 0, decNumLSB = 0;            int decByte, decByteTotal = 0;            bool msb = true;            for (int t = 0; t <= hexArray.GetUpperBound(0); t++)
            {                if ((hexArray[t] >= 48) && (hexArray[t] <= 57))

                    decNum = (hexArray[t] - 48);                else if ((hexArray[t] >= 65) & (hexArray[t] <= 70))
                    decNum = 10 + (hexArray[t] - 65);                if (msb)
                {
                    decNumMSB = decNum * 16;
                    msb = false;
                }                else
                {
                    decNumLSB = decNum;
                    msb = true;
                }                if (msb)
                {
                    decByte = decNumMSB + decNumLSB;
                    decByteTotal += decByte;
                }
            }

            decByteTotal = (255 - decByteTotal) + 1;
            decByteTotal = decByteTotal & 255;            int a, b = 0;            string hexByte = "", hexTotal = "";            double i;            for (i = 0; decByteTotal > 0; i++)
            {
                b = Convert.ToInt32(System.Math.Pow(16.0, i));
                a = decByteTotal % 16;
                decByteTotal /= 16;                if (a <= 9)
                    hexByte = a.ToString();                else
                {                    switch (a)
                    {                        case 10:
                            hexByte = "A";                            break;                        case 11:
                            hexByte = "B";                            break;                        case 12:
                            hexByte = "C";                            break;                        case 13:
                            hexByte = "D";                            break;                        case 14:
                            hexByte = "E";                            break;                        case 15:
                            hexByte = "F";                            break;
                    }
                }
                hexTotal = String.Concat(hexByte, hexTotal);
            }            return hexTotal;
        }        public void LRCheck(byte[] code)
        {            int sum = 0;            foreach (byte b in code)
            {
                sum += b;
            }
            sum = sum % 255;//取模FF(255)
            sum = ~sum + 1;//取反+1
            string lrc = Convert.ToString(sum, 16);            return lrc;
        }

自定义Modbus数据表

自定义Modbus数据表例子:

设备相关读取信息:

图片

命令报文信息解析:

图片

自定义Modbus数据表定义注意

串口调试工具

串口调试工具的使用.

图片

串口调试工具 + RS485 就可以读取硬件上的数据,和向硬件请求了,如何使用请看“调试篇”会有详细的说明。

网络调试助手:

调试助手主要还是TCP协议通讯的一个调试工具
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    40

    文章

    5483

    浏览量

    173246
  • MODBUS
    +关注

    关注

    28

    文章

    1857

    浏览量

    77758
  • 设备
    +关注

    关注

    2

    文章

    4584

    浏览量

    71051
  • 电子控制器
    +关注

    关注

    0

    文章

    40

    浏览量

    7405
收藏 人收藏

    评论

    相关推荐

    什么是Modbus通讯协议?Modbus通讯协议有什么特点?

    什么是Modbus通讯协议:  Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线
    发表于 11-11 10:35

    LABVIEW的MODBUS库,MODBUS学习入门必备

    LABVIEW的MODBUS库,MODBUS学习入门必备
    发表于 02-23 19:02

    基于LabVIEW的Modbus串口通讯协议的实现

    基于LabVIEW 的Modbus 串口通讯协议的实现附件基于LabVIEW 的Modbus 串口通讯
    发表于 10-16 10:50

    ModBus通讯协议简介

    ModBus通讯协议通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方
    发表于 08-23 09:19

    如何通过VISA编写Modbus通讯协议

    什么是Modbus通讯协议?如何通过VISA编写Modbus通讯协议呢?
    发表于 09-29 07:44

    Modbus通讯协议的几种实现方式

      1. Modbus简介   Modbus是Modicon公司(现在已经被施耐德收购成为了施耐德旗下品牌)为其PLC通讯而开发的一种通讯协议
    发表于 05-05 16:19

    MODBUS通讯协议及编程

    ModBus通讯协议分为RTU协议和ASCII协议,下面就ModBus RTU
    发表于 07-17 11:58 1.5w次阅读

    Modbus_通讯协议详解

    Modbus_通讯协议详解,Modbus_通讯协议详解
    发表于 12-08 14:13 0次下载

    MODBUS通讯协议及编程

    MODBUS通讯协议及编程标准通讯协议格式,工业通信的标准格式。
    发表于 03-10 11:45 67次下载

    MODBUS通讯协议详细介绍

    MODBUS通讯协议详细介绍标准通讯协议格式,工业通信的标准格式。
    发表于 03-10 11:42 38次下载

    基于C++的modbus通讯协议模型实现

    基于C++的modbus通讯协议模型实现,很好的资料,快来下载学习吧。
    发表于 03-21 17:27 55次下载

    MODBUS通讯协议中文版

    介绍了MODBUS通讯协议的架构,和应用,分享给大家,欢迎下载。
    发表于 08-09 17:33 0次下载

    Modbus通讯协议的原理和标准

    Modbus通讯协议分为RTU和ASCLL两种传输模式,已经成为一种标准工业控制协议
    发表于 11-02 18:31 12次下载

    解读Modbus通讯协议

    作为工控人,Modbus 通讯协议想必都不陌生,Modbus 通讯协议可以说是工业自动化领域应用
    的头像 发表于 11-09 16:39 1867次阅读

    Modbus通讯协议的详细资料讲解

    作为工控人,Modbus 通讯协议想必都不陌生,Modbus 通讯协议可以说是工业自动化领域应用
    发表于 11-27 02:01 54次下载
    <b class='flag-5'>Modbus</b><b class='flag-5'>通讯</b><b class='flag-5'>协议</b>的详细资料讲解