吴忠躺衫网络科技有限公司

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游戏平台 送1666元礼金领取lrm | 百家乐官网赌博技巧论坛| 金都娱乐城| 互联网百家乐的玩法技巧和规则 | 美姑县| 威尼斯人娱乐城易博lm0| 百家乐官网三遍| 海王星国际| 大发888娱乐场奖金| 真人百家乐代理分成| 百家乐官网高科技出千工具| 太阳城地址| 百家乐筹码方形| 百家乐官网里靴是什么意识| 乾安县| 好望角百家乐的玩法技巧和规则| 榆次百家乐官网的玩法技巧和规则| 百家乐官网路单网下载| 四房播播| bet365体育在线投注| 二八杠网站| 百家乐大赌城| 百家乐翻天粤语下载| 百家乐官网秘诀| 赌百家乐官网赢的奥妙| 陆丰市| 威尼斯人娱乐城是骗子| 玩百家乐新澳门娱乐城| 实战百家乐官网十大取胜原因百分百战胜百家乐官网不买币不吹牛只你能做到按我说的.百家乐官网基本规则 | 赌博百家乐官网玩法| 百家乐官网玩法简介| 大发888娱乐下载网址| 成人百家乐的玩法技巧和规则| 百家乐连跳规律| 加多宝百家乐官网的玩法技巧和规则 | 百家乐官网游戏厅|