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

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

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

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

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

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

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

Modbus

以下是要分解的Modbus熱圖

圖片

Modbus消息幀

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

圖片

通用消息幀

圖片

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

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

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

每個字節(jié)的位

1個起始位

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

1個奇偶校驗位,無校驗則無

1個停止位(有校驗時),2個Bit(無校驗時)

錯誤檢測

LRC(縱向冗長檢測)

RTU消息幀

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

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

每個字節(jié)的位

1個起始位

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

1個奇偶校驗位,無校驗則無

1個停止位(有校驗時),2個Bit(無校驗時)

錯誤檢測域

CRC(循環(huán)冗長檢測)

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));
        }        /// 
        /// 例如把如下字符串轉(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校驗(累加和)

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" 無論何時,都是兩位數(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校驗(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數(shù)據(jù)表

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

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

圖片

命令報文信息解析:

圖片

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

串口調(diào)試工具

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

圖片

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

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

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

    關(guān)注

    40

    文章

    5288

    瀏覽量

    169672
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    1718

    瀏覽量

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

    關(guān)注

    2

    文章

    4349

    瀏覽量

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

    關(guān)注

    0

    文章

    35

    瀏覽量

    7301
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    ModBus通訊協(xié)議簡介

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

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

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

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

      1. Modbus簡介   Modbus是Modicon公司(現(xiàn)在已經(jīng)被施耐德收購成為了施耐德旗下品牌)為其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 ?64次下載

    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é)議模型實現(xiàn)

    基于C++的modbus通訊協(xié)議模型實現(xiàn),很好的資料,快來下載學(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é)議可以說是工業(yè)自動化領(lǐng)域應(yīng)用
    的頭像 發(fā)表于 11-09 16:39 ?1287次閱讀

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

    作為工控人,Modbus 通訊協(xié)議想必都不陌生,Modbus 通訊協(xié)議可以說是工業(yè)自動化領(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ì)資料講解