<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> PLC基礎入門教程 >> 正文

      手把手帶你搞懂Modbus通信協議 報文格式詳解

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2022-09-01

      摘要:昨天有小伙伴在群里問關于Modbus通信協議的,大家都比較積極地解答,所以今天果子哥總結一下關于Modbus相關的知識,適合正在入門的小伙伴“食用”。同樣還是理論+實戰的方式解答,大佬勿噴。

      1.什么是Modbus?

      顧名思義,它是一個bus,即總線協議。比如串口協議、IIC協議、SPI都是通信協議。你接觸到這種協議,相信你所處的行業是工業方面或者你的產品用于工業。

      好了,現在知道了大概知道了,這是一個總線協議,是一個mod什么的公司發表的一個通信協議。那為什么要用這個呢? 答案就是他們都在用,你就得學,啊哈哈!

      正經的說,它被工業領域所接受的原因是它具備一下三個優點

      • 公開發表并且無版權要求
      • 易于部署和維護
      • 對供應商來說,修改移動本地的比特或字節沒有很多限制

      簡單的概括,就是免費+簡單+方便修改!

      歸納:Modbus就是一種用在工業上的簡單協議!

      2.Modbus用來干什么?

      用兩個字概括:通信

      是的,所有協議都是用來通信的,協議的制定就是讓兩個人根據這個協議看懂傳來的一組數據。比如我給你一個6666,你要是沒有協議,就只知道這是6666,而有了協議,你就知道了這是在問我是不是大佬?當然,也可以表示其他意思,具體什么意思就看你協議怎么制定!

      歸納:Modbus用來通信嘍,是個人都知道!

      3.Modbus的內容是什么?

      大致分為以下幾種:

      • Modbus-RTU
      • Modbus-ASCII
      • Modbus-TCP

      以上三種協議,一個設備只會有一種協議,如果你的設備使用的是Modbus-RTU,只需查看以下對應部分,一般來說大部分的設備都是Modbus-RTU協議的。

      4.通訊過程

      Modbus是主從方式通信,也就是說,不能同步進行通信,總線上每次只有一個數據進行傳輸,即主機發送,從機應答,主機不發送,總線上就沒有數據通信。(所以說,這也算是一個缺點了)

      舉例1: 一個總線上有一個主機,多個從機,主機查詢其中一個從機,首先你必須得這些從機分配地址(這樣才能知道哪個從機,而且每個地址必須唯一),分配好地址后,主機要查詢,然后數據下發(數據內容下面會介紹),從機得到主機發送的數據,然后對應地址的從機回復,主機得到從機數據,這樣就是一個主機到從機的通信過程,是不是很簡單呢?

      舉例2: 就像打電話,你得知道對方的電話(這就是唯一地址),然后你打電話過去,相當于主機查找從機,然后對方接通電話,給你回復(返回數據);正常是這樣的。

      如果這時候,對方正在打電話,你應該聽到的是"sorry,you…"這一串英文,說明對方忙,但是Modbus總線不能判斷對方是否忙,也沒有對應的仲裁機制,好了你又知道了一個缺點了!但是,你可以在用軟件的辦法進行適當的處理數據!

      5 Modbus-RTU協議

      設備必須要有RTU協議!這是Modbus協議上規定的,且默認模式必須是RTU,ASCII作為選項。(也就是說,一般的設備只有RTU這個協議,ASCII一般很少)所以說,一般學習Modbus協議,只需要了解RTU的協議,ASCII作為學習的了解就足夠了。

      1、幀結構

      幀結構 = 地址 + 功能嗎 + 數據 + 校驗

      • 地址: 占用一個字節,范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應答所有地址,正常的需要兩個設備的地址一樣才能進行查詢和回復)。

      • 功能碼:占用一個字節,功能碼的意義就是,知道這個指令是干啥的,比如你可以查詢從機的數據,也可以修改數據,所以不同功能碼對應不同功能。

      • 數據:根據功能碼不同,有不同結構,在后續的實例中有說明。

      • 校驗:為了保證數據不錯誤,增加這個,然后再把前面的數據進行計算看數據是否一致,如果一致,就說明這幀數據是正確的,我再回復;如果不一樣,說明你這個數據在傳輸的時候出了問題,數據不對的,所以就拋棄了。

      2、實戰

      只談理論大家可能不太明白,下面舉一個例子。記住Modbus-RTU協議一般我們用的最多功能碼就是0306,大部分都是用modbus來查詢傳感器上的信息用03查詢功能碼,如果需要修改傳感器寄存器的值就用06修改功能碼,其他的不需要過多關注,學多了你也記不住,哈哈哈!

      2.1 查詢功能碼0x03

      功能描述:現在我是主機,我要查詢從機地址為1的數據。我現在用電腦的modbus調試助手來代替注意,stm32來代替從機。

       

      我需要發送以下數據:

      主機發送: 01 03 00 00 00 01 84 0A
      從機回復: 01 03 02 19 98 B2 7E
      

      那么這一組數據是什么意思呢?

      從上面的結構圖中,可以看出,主機發送的數據大致是 地址+功能碼+數據+校驗;

      所以解析如下:

      發送數據解析

      modbus發送數據解析 

      01-地址,也就是你傳感器的地址
      03-功功能碼,03代表查詢功能,查詢傳感器的數據
      00 00-代表查詢的起始寄存器地址.說明從0x0000開始查詢。這里需要說明以下,Modbus把數據存放在寄存器中,通過查詢寄存器來得到不同變量的值,一個寄存器地址對應2字節數據
      00 01-代表查詢了一個寄存器.結合前面的00 00,意思就是查詢從0開始的1個寄存器值
      84 0A-循環冗余校驗,是modbus的校驗公式,從首個字節開始到84前面為止;
      

      回復數據解析

      modbus回復數據解析 

      01-地址,也就是你傳感器的地址
      03-功功能碼,03代表查詢功能,查詢傳感器的數據。這里要注意的是注意發給從機的功能碼是啥,從機就要回復同樣的功能碼,如果不一樣說明這一幀數據有錯誤
      02-代表后面數據的字節數,因為上面說到,一個寄存器有2個字節,所以后面的字節數肯定是2*查詢的寄存器個數;
      19 98-寄存器的值是19 98,結合發送的數據看出,01這個寄存器的值為19 98
      B2 7E-循環冗余校驗
      

      好了,是不是很簡單呢?基本流程就是:

      • 發送:從機的地址+我要干嘛的功能碼+我要查的寄存器的地址+我要查的寄存器地址的個數+校驗碼

      • 回復:從機的地址+主機發我的功能碼+要發送給主機數據的字節數+數據+校驗碼

      就是這么簡單!

      2.2 修改功能碼0x06

      如果我要修改從機的數據呢?那么這個協議有嗎,答案是Yes!

      1、修改-0x06功能碼

      主機發送: 01 06 00 00 00 01 48 0A
      從機回復: 01 06 00 00 00 01 48 0A
      

      誒,看上去怎么一樣的啊?是不是錯了?答案是這是正確的;

      發送數據解析

      modbus發送數據解析 

      01-主機要查詢的從機地址
      06-功能碼,06代表修改單個寄存器功能,修改有些不同,有修改一個寄存器和修改多個寄存器;
      00 00-代表修改的起始寄存器地址.說明從0x0000開始.
      00 01-代表修改的值為00 01.結合前面的00 00,意思就是修改0號寄存器值為00 01;
      48 0A-循環冗余校驗,是modbus的校驗公式,從首個字節開始到48前面為止;
      

      回復數據解析

      modbus回復數據解析 

      01-從機返回給主機自己的地址,說明這就是主機查的從機
      06-功能碼,代表修改單個寄存器功能,主機發啥功能碼,從機就必須回什么功能碼;
      00 00-代表修改的起始寄存器地址.說明是0x0000.
      00 01-代表修改的值為00 01.結合前面的00 00,意思就是修改0號寄存器值為00 01;
      48 0A-循環冗余校驗,是modbus的校驗公式,從首個字節開始到48前面為止;
      

      如果回復的一樣,說明這個數據是修改成功的;如果功能碼不是06,而是別的,說明從機回復的數據有誤,主機可以做相應的處理。

      2、修改-0x10功能碼

      如果我要修改多個寄存器,難道用06發好幾次,這樣不會太傻了嗎?所以modbus RTU協議包含了修改連續多個寄存器的方法,就是功能碼為0x10;這個大家自己去查詢,基本和上面的數據格式差不多。

      歸納

      Modbus-RTU協議只需要看懂功能碼0x030x060x10這三個基本的就已經足夠了;分別回想下其數據域部分:

      0x03–主機需要發送起始地址+寄存器數量,從機回復總字節數+數據

      0x06–主機發送起始地址+數據內容(因為你只需要修改一個,所以起始地址就是所要修改的地址),從機返回起始地址+數據內容(發現居然一樣!)

      0x10–主機發送起始地址+寄存器個數+總字節數+數據,從機返回起始地址+寄存器數量

      6 Modbus-ACSII協議

      一般只需要了解RTU協議,因為前面有說過,必須要有RTU協議的,所以只需要了解了RTU協議,就可以讀出設備信息了,至于ACSII協議,做個大概了解

      1.幀形式

      對于RTU協議,比如RTU發送一個字節:0x12;ASCII協議則需要發送2個字節:一個字節代表ASCII碼1,一個代表ASCII碼2,即0x310x32,才能代表0x12。所以,ASCII協議的效率比較低。但是ASCII更符合串口打印查看,因為串口發送的數據一般都是文本模式(ASCII),比如用RTU協議,你發送06串口可以把06正常顯示出來,但是用ACSII協議,你發送06串口是不能正常顯示的,因為06是不可顯示字符。

      modbus幀形式 

      從上面的圖中,看出:

      1)比RTU多了起始段:,多個結束符CRLF

      2)地址和功能都變成了2個字節

      3)數據部分更加繁瑣,但是更符合人們的查看;

      2.歸納

      由于Modbus-RTU和Modbus-ACSII都是基于232和485鏈路的,所以其通訊模式半雙工,一般是主機和從機的模式。其差別就是其字節的格式不同,一個是16進制的數據,一個是ASCII數據。ASCII多了幀頭和幀尾,也就是說可以有用這個頭尾判斷一幀字節來判斷是否結束;而RTU沒有幀頭和幀尾,所以協議里明確兩幀之間要大于3.5個字節時間間隔,作為一幀結束的判斷依據。對于RS485來說,總線上一般允許最大32個設備。

      備注

      最后再補充點:Modbus從設備的回應數據格式是:1、回應的數據包與主機查詢的數據包格式一致。從機正常回應時:功能碼與主機發送的功能碼一致(1-127)
      如果異常回應時:功能碼要在收的主機的功能碼的基礎上加128。不要問為啥加128,你去問造協議的那一幫人吧!

      因為電腦只支持USB,所以我們需要把USB轉TTL串口,再轉成485接口之后與單片機相連,這是硬件最基本的,但是也需要注意。

      最后修改了一下串口調試助手,加了一個CRC校驗的功能,后臺回復:Modbus-ly,就可以獲取。

      Tags:Modbus,通信協議  
      責任編輯:admin
      相關文章列表
      梯形圖實例 儀表與西門子PLC Modbus通訊實例稱重儀表 指令MBUS_M
      西門子plc與modbus設備進485通信詳解(modbus多機輪詢)讀取儀表
      寄存器PLC地址與寄存器modbus協議地址 三菱FX系列西門子s7系列pl
      Modbus協議基本知識 Modbus地址范圍對應表
      Modbus-RTU協議解析
      MODBUS常用功能碼學習及實例 modbus報文格式
      Modbus如何遠距離傳輸? Modbus物聯網
      Modbus和RS485的關系是什么?
      Modbus RS485接線方法  modbus接線方法 終端電阻
      MODBUS調試工具(modscan32)使用說明-MODBUS調試工具(modscan32)如
      RS-485終端電阻怎么接?485終端電阻接法解析
      modbus通訊 RS-485終端電阻的重要性
      Modbus功能碼詳解 讀取線圈、保持寄存器
      modbus協議地址和常用功能碼,modbus詳解
      Modbus功能碼介紹
      Modbus網關的概念/功能/作用/特點
      Modbus-RTU通訊協議03功能碼詳解——小白一看就會的協議解析
      西門子plc SMART200 通過Modbus讀取溫濕度傳感器數據梯形圖實例
      實現PLC與多臺變頻器的MODBUS/RTU通信   MODBUS協議報文格式
      西門子plc modbus地址詳解
      s7-200與計算機modbus通訊案例,西門子S7-200 Smart Modbus通信介
      Modbus通訊協議簡介
      電力儀表怎么設置modbus ,電力-MODBUS_RTU通訊規約
      MODBUS規約報文解析
      modbus rtu六種功能碼詳細解析
      ModBus通信協議
      modbus通訊協議功能碼一覽_ModBus功能碼定義
      西門子200SMART主站輪詢MODBUS通信指令案例_梯形圖實例
      在通信程序中,如何實現PLC與多臺變頻器的MODBUS/RTU通信?
      MODBUS-RTU數據幀格式、報文實例
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      推薦文章
      最新推薦
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 色婷婷狠狠久久综合五月| 伊人久久久大香线蕉综合直播| 一本久久a久久精品vr综合| 久久精品国产9久久综合| 亚洲人成综合在线播放| 色综合合久久天天给综看| 一本一道久久综合狠狠老 | 天天爽天天狠久久久综合麻豆| 国产成人综合日韩精品无码不卡 | 伊人久久久大香线蕉综合直播| 青草久久精品亚洲综合专区| 伊人性伊人情综合网| 狠狠色丁香久久婷婷综合图片| 色综合婷婷在线观看66| 亚洲综合久久精品无码色欲| 久久精品亚洲综合专区| 亚洲国产综合精品中文字幕| 久久综合鬼色88久久精品综合自在自线噜噜 | 亚洲综合一区二区三区四区五区| 色综久久天天综合绕视看| 亚洲av综合avav中文| 亚洲综合国产一区二区三区| 一本大道无香蕉综合在线| 狠狠色丁香婷婷久久综合| 亚洲五月综合网色九月色| 色综合天天综合狠狠| 亚洲综合久久久久久中文字幕| 色欲综合久久躁天天躁蜜桃| 久久婷婷综合色丁香五月| 少妇人妻综合久久中文字幕| HEYZO无码综合国产精品227| 狠狠人妻久久久久久综合蜜桃| 色婷婷综合缴情综免费观看| 婷婷五月六月激情综合色中文字幕| 色婷婷综合久久久中文字幕| 青青草原综合久久大伊人| 亚洲AV综合色区无码一区爱AV| 色综合天天综合婷婷伊人| 国产激情电影综合在线看| 成人综合伊人五月婷久久| 久久丁香五月天综合网|