色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    5427

    瀏覽量

    171776
  • MODBUS
    +關注

    關注

    28

    文章

    1808

    瀏覽量

    77028
  • 設備
    +關注

    關注

    2

    文章

    4515

    瀏覽量

    70660
  • 電子控制器
    +關注

    關注

    0

    文章

    40

    瀏覽量

    7354
收藏 人收藏

    評論

    相關推薦

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

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

    作為工控人,Modbus 通訊協議想必都不陌生,Modbus 通訊協議可以說是工業自動化領域應用
    發表于 11-27 02:01 ?54次下載
    <b class='flag-5'>Modbus</b><b class='flag-5'>通訊</b><b class='flag-5'>協議</b>的詳細資料講解
    主站蜘蛛池模板: 免费毛片在线播放| 99精品久久精品一区二区| 久99视频精品免费观看福利| 2019午夜福合集不打码| 忘忧草在线影院WWW日本动漫| 日韩一级精品久久久久| 精品国产三级a| 中文无码第3页不卡av| 色即是空之甜性涩爱| 久久中文字幕免费视频| 国产精品久久久久久免费播放| 97久久国产露脸精品国产| 亚洲精品国产AV成人毛片| 人禽l交视频在线播放 视频| 久久亚洲免费视频| 韩国无遮羞禁动漫在线观看| 动漫美女搞鸡| beeg xxx日本老师| 真实国产熟睡乱子伦对白无套 | 国内精品久久久久影院亚洲| 超碰人人草在线视频| 3d无遮挡h肉动漫在线播放| 亚洲熟妇色自偷自拍另类| 午夜精品国产自在现线拍| 日本xxxxxxxxx老师59| 末班车动漫无删减免费| 久久综合中文字幕佐佐木希| 精品午夜国产福利观看| 国产综合视频在线观看一区| 国产精品久久欧美一区| 国产成人免费在线| 给个男人都懂的网址2019| yin乱教师系列合集| AV多人爱爱XXx| 99精品视频在线观看re| 97国产成人精品视频| 4388成人| 91麻豆久久| 777EY_卡通动漫_1页| 18黄女脱内衣| 97在线视频免费|