1. 程式人生 > >modbus協議之串行鏈路

modbus協議之串行鏈路

產生 顯示器 led The 流轉 自己 cnblogs 擴展 地址

目錄

  • modbus協議之串行鏈路
    • 一、modbus簡介
    • 二、modbus消息楨
    • 三、modus設備地址與功能碼
    • 附錄一、CRC校驗與LRC校驗
    • 附錄二、功能碼
    • 其它參考文檔

modbus協議之串行鏈路

一、modbus簡介

技術分享圖片

Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)於1979年為使用可編程邏輯控制(PLC)通信而發表。Modbus已經成為工業領域通信協議的業界標準(De facto),並且現在是工業電子設備之間常用的連接方式。


Modbus有下列三種通信方式

1、以太網,對應的通信模式是MODBUS TCP。

2、異步串行傳輸(各種介質如有線RS-232-/422/485/;光纖、無線等),對應的通信模式是MODBUS RTU或MODBUS ASCII。

3、高速令牌傳遞網絡,對應的通信模式是Modbus PLUS。

二、modbus消息楨

Modbus消息楨包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,RTU、ASCII消息楨用於異步串行傳輸通信,TCP通信方式的消息楨與RTU、ASCII消息楨也有關聯,具體見《MODBUS-TCP》。 其中異步串行傳輸通信中RTU類型的消息楨最為常用。

2.1、通用消息楨

技術分享圖片

技術分享圖片

ADU: 應用數據單元 PDU: 協議數據單元

2.2、ASCII消息楨

1、消息以冒號(:)字符(ASCII碼 3AH)開始,以回車換行符結束(ASCII碼 0DH,0AH)。

2、其它域可以使用的傳輸字符是十六進制的0...9,A...F。網絡上的設備不斷偵測“:”字符,當有一個冒號接收到時,每個設備都解碼下個域(地址域)來判斷是否發給自己的。

3、消息中字符間發送的時間間隔最長不能超過1秒,否則接收的設備將認為傳輸錯誤。
 
技術分享圖片

技術分享圖片

//串行鏈路bit格式
十六進制,ASCII字符0...9,A...F 
----消息中的每個ASCII字符都是一個十六進制字符組成 每個字節的位
1個起始位 
7個數據位,最小的有效位先發送 
1個奇偶校驗位,無校驗則無 
1個停止位(有校驗時),2個Bit(無校驗時) 
LRC(縱向冗長檢測) 

問:ASCII消息楨模式通信,在消息中的每個8Bit字節都作為兩個ASCII字符發送,怎麽理解?

答:實際上在ASCII模式下,所有的通訊數據都是ASCII碼,包括幀結束用的也是ASCII碼裏的回車、換行。每個字節都作為一個ASCII碼,這裏說的有點歧義。應該說是兩個ASCII碼。比如要傳送一個字節,字節內容是0x23,則實際傳送的是兩個ASCII碼,即字符2(0x32)和字符3(0x33)。這種編碼的好處是所有的字符都是可讀的,不會出現0x00、0xFF這種不可讀的,方便調試。缺點是效率低,把一個字節拆成兩個ASCII碼,數據量變大了。


追問:字節內容是0x23,這是幾個字節,是幾進制?

追答:0x23 這個是十六進制表示方法。這是一節字節的數據,是指MODBUS裏面的數據,與傳送無關。傳送的時候,把一個字節拆成2個ASCII表示,0x32,0x33,這個是傳送的過程中的一種變換,接收方在接收到後,需要重新拼接,還原成數據,即0x23。

2.3、RTU消息楨

1、消息發送至少要以3.5個字符時間的停頓間隔開始。在網絡波特率下多樣的字符時間,這是最容易實現的(如下圖的T1-T2-T3-T4所示)。傳輸的第一個域是設備地址。可以使用的傳輸字符是十六進制的0...9,A...F。

2、網絡設備不斷偵測網絡總線,包括停頓間隔時間內。當第一個域(地址域)接收到,每個設備都進行解碼以判斷是否發往自己的。在最後一個傳輸字符之後,一個至少3.5個字符時間的停頓標定了消息的結束。一個新的消息可在此停頓後開始。

3、整個消息幀必須作為一連續的流轉輸。如果在幀完成之前有超過1.5個字符時間的停頓時間,接收設備將刷新不完整的消息並假定下一字節是一個新消息的地址域。

4、如果一個新消息在小於3.5個字符時間內接著前個消息開始,接收的設備將認為它是前一消息的延續。這將導致一個錯誤,因為在最後的CRC域的值不可能是正確的。


技術分享圖片

技術分享圖片

//串行鏈路bit格式
8位二進制,十六進制數0...9,A...F 
消息中的每個8位域都是一個兩個十六進制字符組成 
每個字節的位 
1個起始位 
8個數據位,最小的有效位先發送 
1個奇偶校驗位,無校驗則無 
1個停止位(有校驗時),2個Bit(無校驗時) 
CRC(循環冗長檢測) 

三、modus設備地址與功能碼

技術分享圖片

3.1、設備地址域

消息幀的地址域包含兩個字符(ASCII)或8Bit(RTU)。可能的從設備地址是0...247 (十進制)。單個設備的地址範圍是1...247。主設備通過將要聯絡的從設備的地址放入消息中的地址域來選通從設備。當從設備發送回應消息時,它把自己的地址放入回應的地址域中,以便主設備知道是哪一個設備作出回應。地址0是用作廣播地址,以使所有的從設備都能認識。當Modbus協議用於更高水準的網絡,廣播可能不允許或以其它方式代替。

技術分享圖片

3.2、數據域起始地址

1、PLC地址和協議地址區別

PLC地址可以理解為協議地址的變種,在觸摸屏和PLC編程中應用較為廣泛。

2、寄存器PLC地址
寄存器PLC地址指存放於控制器中的地址,這些控制器可以是PLC,也可以使觸摸屏,或是文本顯示器。PLC地址一般采用10進制描述,共有5位,其中第一位代碼寄存器類型。PLC地址例如40001、30002等。

3、寄存器協議地址
寄存器協議地址指指通信時使用的寄存器地址,例如PLC地址40001對應尋址地址0x0000,40002對應尋址地址0x0001,寄存器尋址地址一般使用16進制描述。再如,PLC寄存器地址40003對應協議地址0002,PLC寄存器地址30003對應協議地址0002,雖然兩個PLC寄存器寄存器通信時使用相同的地址,但是需要使用不同的命令訪問,所以訪問時不存在沖突。

PLC每個塊其實寄存器起始地址從1開始,一般看手冊上說讀某一地址的數據,給某一地址寫數據,該地址指的都是寄存器的地址,並不是modbus報文中的數據的起始地址。modbus應用協議的中數據的起始地址從0開始。

技術分享圖片

技術分享圖片

3.3、功能碼

參考文檔:https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1

功能碼:通訊傳送的第二個字節。ModBus通訊規約定義功能號為1到127。本儀表只利用其中的一部分功能碼。作為主機請求發送,通過功能碼告訴從機執行什麽動作。作為從機響應,從機發送的功能碼與從主機發送來的功能碼一樣,並表明從機已響應主機進行操作。如果從機發送的功能碼的最高位為1(比如功能碼大與此同時127),則表明從機沒有響應操作或發送出錯。

3.3.1、Modbus寄存器

技術分享圖片


3.3.2、Modbus寄存器數據類型
數據名稱 數據說明 數據類型 讀寫狀態 應用舉例
線圈狀態 DI數字量輸出 位變量 只讀 電磁閥輸出,MOSFET輸出,LED顯示等
離散輸入狀態 DI數字量輸出 位變量 讀寫 撥碼開關,接近開關等
保持寄存器 AO模擬量輸出 16-bit類型 只讀 模擬量輸出設定值,PID運行參數,變量閥輸出大小,傳感器報警上限下限
輸入寄存器 AO模擬量輸入 16-bit類型 讀寫 模擬量輸入

3.3.3、Modbus寄存器數據類型

Modbus中常用的功能碼有8個,可以分為位操作和字操作兩類,如表2.1所示:

技術分享圖片

附錄一、CRC校驗與LRC校驗

附錄二、功能碼

功能碼     名稱               作用

1    讀取線圈狀態      取得一組邏輯線圈的當前狀態(ON/OFF)

2    讀取輸入狀態      取得一組開關輸入的當前狀態(ON/OFF)

3    讀取保持寄存器    在一個或多個保持寄存器中取得當前的二進制值

4    讀取輸入寄存器    在一個或多個輸入寄存器中取得當前的二進制值

5    強置單線圈        強置一個邏輯線圈的通斷狀態

6    預置單寄存器      把具體二進值裝入一個保持寄存器

7    讀取異常狀態      取得8個內部線圈的通斷狀態,這8個線圈的地址由控制器決定

8   回送診斷校驗       把診斷校驗報文送從機,以對通信處理進行評鑒

9   編程(只用於484)   使主機模擬編程器作用,修改PC從機邏輯

10  控詢(只用於484)   可使主機與一臺正在執行長程序任務從機通信,探詢該從機是否已完成其操作任務,僅在含有功能碼9的報文發送後,本功能碼才發送

11  讀取事件計數        可使主機發出單詢問,並隨即判定操作是否成功,尤其是該命令或其他應答產生通信錯誤時

12  讀取通信事件記錄     可是主機檢索每臺從機的ModBus事務處理通信事件記錄。如果某項事務處理完成,記錄會給出有關錯誤

13  編程(184/384 484 584) 可使主機模擬編程器功能修改PC從機邏輯

14  探詢(184/384 484 584)可使主機與正在執行任務的從機通信,定期控詢該從機是否已完成其程序操作,僅在含有功能13的報文發送後,本功能碼才得發送

15  強置多線圈  強置一串連續邏輯線圈的通斷

16  預置多寄存器  把具體的二進制值裝入一串連續的保持寄存器

17  報告從機標識 可使主機判斷編址從機的類型及該從機運行指示燈的狀態

18 (884和MICRO 84) 可使主機模擬編程功能,修改PC狀態邏輯

19  重置通信鏈路   發生非可修改錯誤後,是從機復位於已知狀態,可重置順序字節

20  讀取通用參數(584L)  顯示擴展存儲器文件中的數據信息

21  寫入通用參數(584L) 把通用參數寫入擴展存儲文件,或修改之

22~64  保留作擴展功能備用

65~72 保留以備用戶功能所用

73~119 非法功能

120~127 保留 留作內部作用

128~255 保留  用於異常應答

其它參考文檔

《MODBUS軟件開發指南---楊更更》

https://blog.csdn.net/lakerszhy/article/details/68927178?locationNum=4&fps=1

https://blog.csdn.net/byxdaz/article/details/77892778

https://www.cnblogs.com/luomingui/archive/2013/06/14/Modbus.html

https://blog.csdn.net/ouyangxin95/article/details/78169380

http://www.doc88.com/p-3106325452452.html

modbus協議之串行鏈路