0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Modbus通訊協(xié)議入門學(xué)習(xí)

jf_78858299 ? 來(lái)源: 嵌入式系統(tǒng)開發(fā) ? 作者: 嵌入式系統(tǒng)開發(fā) ? 2023-03-23 09:46 ? 次閱讀

Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。Modbus 協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如果回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。

Modbus 是一個(gè)請(qǐng)求/應(yīng)答協(xié)議

Modbus

以下是要分解的Modbus熱圖

圖片

Modbus消息幀

了解了它,會(huì)使你對(duì)串口通信有一個(gè)清晰的認(rèn)識(shí)!

圖片

通用消息幀

圖片

ASCII消息幀 (在消息中的每個(gè)8Bit 字節(jié)都作為兩個(gè)ASCII字符發(fā)送)

十六進(jìn)制,ASCII字符0...9,A...F

消息中的每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成

每個(gè)字節(jié)的位

1個(gè)起始位

n個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送

1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)

1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無(wú)校驗(yàn)時(shí))

錯(cuò)誤檢測(cè)

LRC(縱向冗長(zhǎng)檢測(cè))

RTU消息幀

8位二進(jìn)制,十六進(jìn)制數(shù)0...9,A...F

消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成

每個(gè)字節(jié)的位

1個(gè)起始位

8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送

1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)

1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無(wú)校驗(yàn)時(shí))

錯(cuò)誤檢測(cè)域

CRC(循環(huán)冗長(zhǎng)檢測(cè))

CRC校驗(yàn)

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));
        }        /// 
        /// 例如把如下字符串轉(zhuǎn)換成字節(jié)數(shù)組        /// AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB   轉(zhuǎn)換為字節(jié)數(shù)組        /// 
        /// 十六進(jìn)制字符串
        /// 
        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;
        }        /// 
        /// 將字節(jié)數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制字符串,中間用 “ ”分割 如:AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB        /// 
        /// 要轉(zhuǎn)換的字節(jié)數(shù)組
        /// 
        public static String ToHex(byte[] vars)
        {            return BitConverter.ToString(vars).Replace('-', ' ').Trim();
        }

CS校驗(yàn)(累加和)

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     轉(zhuǎn)換為字節(jié)數(shù)組        /// 
        /// 十六進(jìn)制字符串
        /// 
        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;
        }        /// 
        /// 轉(zhuǎn)換為符合本程序的十六進(jìn)制格式        /// 
        /// 1 2 3 等。
        /// 返回十六進(jìn)制字符串,如果是1-9的話,前面帶零
        /// 例如: 5  ="05"  12 ="0C" 無(wú)論何時(shí),都是兩位數(shù)。  
        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校驗(yàn)(LRC錯(cuò)誤校驗(yàn)用于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數(shù)據(jù)表

自定義Modbus數(shù)據(jù)表例子:

設(shè)備相關(guān)讀取信息:

圖片

命令報(bào)文信息解析:

圖片

自定義Modbus數(shù)據(jù)表定義注意

串口調(diào)試工具

串口調(diào)試工具的使用.

圖片

串口調(diào)試工具 + RS485 就可以讀取硬件上的數(shù)據(jù),和向硬件請(qǐng)求了,如何使用請(qǐng)看“調(diào)試篇”會(huì)有詳細(xì)的說(shuō)明。

網(wǎng)絡(luò)調(diào)試助手:

調(diào)試助手主要還是TCP協(xié)議通訊的一個(gè)調(diào)試工具
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5426

    瀏覽量

    171740
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1805

    瀏覽量

    77011
  • 設(shè)備
    +關(guān)注

    關(guān)注

    2

    文章

    4509

    瀏覽量

    70645
  • 電子控制器
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    7349
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是Modbus通訊協(xié)議?Modbus通訊協(xié)議有什么特點(diǎn)?

    什么是Modbus通訊協(xié)議:  Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個(gè)品牌)在1979年發(fā)明的,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線
    發(fā)表于 11-11 10:35

    LABVIEW的MODBUS庫(kù),MODBUS學(xué)習(xí)入門必備

    LABVIEW的MODBUS庫(kù),MODBUS學(xué)習(xí)入門必備
    發(fā)表于 02-23 19:02

    基于LabVIEW的Modbus串口通訊協(xié)議的實(shí)現(xiàn)

    基于LabVIEW 的Modbus 串口通訊協(xié)議的實(shí)現(xiàn)附件基于LabVIEW 的Modbus 串口通訊協(xié)
    發(fā)表于 10-16 10:50

    ModBus通訊協(xié)議簡(jiǎn)介

    ModBus通訊協(xié)議通訊協(xié)議又稱通信規(guī)程,是指通信雙方對(duì)數(shù)據(jù)傳送控制的一種約定。約定中包括對(duì)數(shù)據(jù)格式,同步方式,傳送速度,傳送步驟,檢糾錯(cuò)方
    發(fā)表于 08-23 09:19

    如何通過(guò)VISA編寫Modbus通訊協(xié)議

    什么是Modbus通訊協(xié)議?如何通過(guò)VISA編寫Modbus通訊協(xié)議呢?
    發(fā)表于 09-29 07:44

    Modbus通訊協(xié)議的幾種實(shí)現(xiàn)方式

      1. Modbus簡(jiǎn)介   Modbus是Modicon公司(現(xiàn)在已經(jīng)被施耐德收購(gòu)成為了施耐德旗下品牌)為其PLC通訊而開發(fā)的一種通訊協(xié)議
    發(fā)表于 05-05 16:19

    MODBUS通訊協(xié)議及編程

    ModBus通訊協(xié)議分為RTU協(xié)議和ASCII協(xié)議,下面就ModBus?RTU
    發(fā)表于 07-17 11:58 ?1.5w次閱讀

    Modbus_通訊協(xié)議詳解

    Modbus_通訊協(xié)議詳解,Modbus_通訊協(xié)議詳解
    發(fā)表于 12-08 14:13 ?0次下載

    MODBUS通訊協(xié)議及編程

    MODBUS通訊協(xié)議及編程標(biāo)準(zhǔn)通訊協(xié)議格式,工業(yè)通信的標(biāo)準(zhǔn)格式。
    發(fā)表于 03-10 11:45 ?67次下載

    MODBUS通訊協(xié)議詳細(xì)介紹

    MODBUS通訊協(xié)議詳細(xì)介紹標(biāo)準(zhǔn)通訊協(xié)議格式,工業(yè)通信的標(biāo)準(zhǔn)格式。
    發(fā)表于 03-10 11:42 ?38次下載

    基于C++的modbus通訊協(xié)議模型實(shí)現(xiàn)

    基于C++的modbus通訊協(xié)議模型實(shí)現(xiàn),很好的資料,快來(lái)下載學(xué)習(xí)吧。
    發(fā)表于 03-21 17:27 ?55次下載

    MODBUS通訊協(xié)議中文版

    介紹了MODBUS通訊協(xié)議的架構(gòu),和應(yīng)用,分享給大家,歡迎下載。
    發(fā)表于 08-09 17:33 ?0次下載

    Modbus通訊協(xié)議的原理和標(biāo)準(zhǔn)

    Modbus通訊協(xié)議分為RTU和ASCLL兩種傳輸模式,已經(jīng)成為一種標(biāo)準(zhǔn)工業(yè)控制協(xié)議。
    發(fā)表于 11-02 18:31 ?12次下載

    解讀Modbus通訊協(xié)議

    作為工控人,Modbus 通訊協(xié)議想必都不陌生,Modbus 通訊協(xié)議可以說(shuō)是工業(yè)自動(dòng)化領(lǐng)域應(yīng)用
    的頭像 發(fā)表于 11-09 16:39 ?1640次閱讀

    Modbus通訊協(xié)議的詳細(xì)資料講解

    作為工控人,Modbus 通訊協(xié)議想必都不陌生,Modbus 通訊協(xié)議可以說(shuō)是工業(yè)自動(dòng)化領(lǐng)域應(yīng)用
    發(fā)表于 11-27 02:01 ?54次下載
    <b class='flag-5'>Modbus</b><b class='flag-5'>通訊</b><b class='flag-5'>協(xié)議</b>的詳細(xì)資料講解