在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    172757
  • MODBUS
    +關注

    關注

    28

    文章

    1821

    瀏覽量

    77323
  • 設備
    +關注

    關注

    2

    文章

    4547

    瀏覽量

    70863
  • 電子控制器
    +關注

    關注

    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>的詳細資料講解
    主站蜘蛛池模板: 国产三级日产三级日本三级 | 美女扒开尿囗给男生桶爽 | 天天综合天天添夜夜添狠狠添 | 窝窝午夜视频 | 国模张文静啪啪私拍337p | 啪啪网站免费 | 亚洲综合久久久 | 日本一区二区高清免费不卡 | 岬奈奈美在线 国产一区 | 韩国理论三级在线观看视频 | 欧美一级日韩一级亚洲一级 | 一级黄视频 | 1000部啪啪未满十八勿入 | 国产理论最新国产精品视频 | avtt亚洲一区中文字幕 | 性欧美1819hd| 日本免费xxxx色视频 | 久久综合久色欧美婷婷 | 天天色综 | 亚洲a网| 激情五月婷婷色 | 国产黄页| 一区不卡在线观看 | 国产黄色在线视频 | 欧美精品一区二区三区在线播放 | 久久semm亚洲国产 | 操日韩| 日本网络视频www色高清免费 | 亚洲系列中文字幕一区二区 | 手机在线电影你懂的 | 欧美zooz人禽交免费 | 一区二区三区亚洲 | 亚洲欧美一区二区三区四区 | 最近观看免费高清视频 | 很黄很色网站 | 国产精品三级在线观看 | 天堂电影在线观看免费入口 | 亚洲欧美天堂网 | 久久国产香蕉一区精品 | 99青草青草久热精品视频 | 国内外精品免费视频 |