衡阳派盒市场营销有限公司

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

    文章

    5460

    瀏覽量

    172751
  • MODBUS
    +關注

    關注

    28

    文章

    1821

    瀏覽量

    77318
  • 設備
    +關注

    關注

    2

    文章

    4546

    瀏覽量

    70862
  • 電子控制器
    +關注

    關注

    0

    文章

    40

    瀏覽量

    7389
收藏 人收藏

    評論

    相關推薦

    什么是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 ?1765次閱讀

    Modbus通訊協議的詳細資料講解

    作為工控人,Modbus 通訊協議想必都不陌生,Modbus 通訊協議可以說是工業自動化領域應用
    發表于 11-27 02:01 ?54次下載
    <b class='flag-5'>Modbus</b><b class='flag-5'>通訊</b><b class='flag-5'>協議</b>的詳細資料講解
    网上玩百家乐官网游戏有人挣到钱了吗 | 百家乐官网注册就送| 百家乐官网特殊计| 大发888娱乐备用网址| 豪华百家乐官网桌子| 威尼斯人娱乐城真人百家乐| 百人百家乐官网软件供应| 百家乐官网娱乐城博彩通博彩网| 百家乐发牌靴发牌盒| 百家乐官网注册开户| 百家乐鞋业| 百家乐官网视频游戏双扣| 缅甸百家乐网站是多少| 百家乐官网视频软件下载| 百家乐77scs| 筹码百家乐官网500| 实战百家乐十大取胜原因百分百战胜百家乐不买币不吹牛只你能做到按我说的.百家乐基本规则 | 龙泉市| 百家乐足球投注网哪个平台网址测速最好 | 奇迹百家乐的玩法技巧和规则| 百家乐官网的方法和公式| 游戏机百家乐的玩法技巧和规则| 湾仔区| 百家乐园百利宫娱乐城怎么样百家乐园百利宫娱乐城如何 | 总统百家乐官网的玩法技巧和规则 | 澳门百家乐官网会出千吗| 威尼斯人娱乐城免费注册| 诸子百家乐官网的玩法技巧和规则 | 百家乐是否有路子| 御金娱乐| 百家乐揽子打法| 漾濞| 百家乐庄家怎样赚钱| 百家乐官网视频造假| 澳门线上赌场| 百家乐网站平台| 破解百家乐官网公式| 大发888代理佣金| 百家乐冯氏坐庄法| 百家乐官网分析软件骗人| 大发888 大发888官网|