知識點1【 Modbus通信】
1、Modbus的概述
Modbus是OSI模型第七層的應用層報文傳輸協議
協議:說明有組包和解包的過程
2、通信機制
Modelbus是一個請求/應答協議
通信機制:主機輪詢,從機應答的機制。每個從設備有唯一的地址,主設備通過地址指定通信對象。
輪詢:在通信或控制系統中,由主設備主動發送,周期性地向從設備發起請求并獲取數據的機制。
特點
(1)系統中只有一個主機:主機通信
(2)系統中的從機不可以主動向主機發送數據
(3)系統上電后,所有的主從設備都應該處于監聽總線的狀態,也就是接收狀態
(4)如果要發起一次通信,必須從主機的主動發起
通信流程
(1)主機首先切換成發送模式,發送數據包
(2)馬上轉成接收模式
3、Modbus報文格式
縮略語
報文介紹(重點)
地址域:從設備的ID號 1Byte
功能碼:執行的具體操作 1Byte
數據域:發送或者接收的有效數據 252Byte
差錯校驗:判斷數據傳輸是否正確 2Byte
異常響應
這段話,中我們可以看到異常響應,那什么是異常響應,如何區分異常響應和正確響應呢?
異常響應概述
服務器(從設備) 向 客戶端(主設備) 返回的錯誤通知,用于指示請求無法撐場處理
異常響應的辨別
功能碼為原功能碼 + 0x80(即最高位置1),范圍為128-255(十進制)
通信的架構圖
(1)正確的響應
(2)錯誤的相應
知識點2【功能碼】
功能碼分為三類
1、公共功能碼
2、用戶定義功能碼:
3、保留功能嗎:
其中最常用的也就是公共功能碼
常用功能碼介紹
1、0x01:可讀可寫 按照bit操作
-
請求格式:
從站地址 | 0x01 | 起始地址高位 | 起始地址低位 | 寄存器數量高位 | 寄存器數量低位 | CRC
-
響應格式:
從站地址 | 0x01 | 數據字節數 | 線圈狀態(按位打包) | CRC
-
示例:
讀取地址0x0000開始的5個線圈狀態,返回值為
0x15
(二進制00010101
,表示線圈0-4的狀態為ON、OFF、ON、OFF、ON)。
2、0x02:只讀 按照bit操作
-
請求格式:
從站地址 | 0x02 | 起始地址高位 | 起始地址低位 | 輸入數量高位 | 輸入數量低位 | CRC
-
響應格式:
從站地址 | 0x02 | 數據字節數 | 離散輸入狀態(按位打包) | CRC
-
示例:
讀取地址0x0002開始的3個離散輸入,返回
0x05
(二進制00000101
,表示輸入2-4的狀態為ON、OFF、ON)。
3、0x03:讀保持寄存器,按照寄存器讀取
-
請求格式:
從站地址 | 0x03 | 起始地址高位 | 起始地址低位 | 寄存器數量高位 | 寄存器數量低位 | CRC
-
響應格式:
從站地址 | 0x03 | 數據字節數 | 寄存器值(每寄存器2字節) | CRC
-
示例:
讀取地址0x000A開始的2個保持寄存器,返回值為
0x00FF
和0x1234
。
4、0x06:寫 按照寄存器操作
-
請求格式:
從站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 寫入值高位 | 寫入值低位 | CRC
-
響應格式:
從站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 寫入值高位 | 寫入值低位 | CRC
(與請求相同,表示操作成功) -
示例:
向地址0x0001寫入值
0xABCD
,請求與響應報文一致。
5、0x16:寫入多個寄存器
-
請求格式:
從站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器數量高位 | 寄存器數量低位 | 字節數 | 寄存器值列表(每值2字節) | CRC
-
響應格式:
從站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器數量高位 | 寄存器數量低位 | CRC
-
示例:
向地址0x0000寫入兩個寄存器值
0x1234
和0x5678
,請求中包含字節數0x04
和值列表。
注意
請求和響應部分 手冊中的圖如下,我這里來說一下分析時候的注意事項
無論是請求還是響應都是 PDU部分,即 功能碼和數據 部分
并且Modbus是大端存儲,我們存數據的時候先存入 高地址
知識點3【Modbus在數據鏈路層的實現】
1、請求方式
(1)單播模式
(2)廣播模式
2、地址的規則
尋址地址共256個
主節點沒有地址,每個子節點必須有一個地址
3、傳輸過程中的注意事項
(1)間隔時間
由于沒有起始位和停止位,Modbus使用的是以3.5個字符作為 兩個報文 之間的最短間隔時間。
(2)相鄰字符最大間隔
同一幀數據中相鄰字符間隔時間大于1.5個字符
上面的時間單位都是字符,哪一個字符是多久呢?請看下面介紹
(3)RTU模式每個字節(11位)格式
奇偶校驗位 是可以沒有的,收發端保持一致即可
是不是很熟悉,和串口一摸一樣。
因為Modbus是應用層協議,而串口 是物理層和數據鏈路層 的標準,因此到達數據鏈路層,他們的格式都是一樣的。
串口是一個廣義概念,泛指異步串行通信接口。并不只局限于USART。RS485,RS232也都是串口。
因此這里的一個字符時間就是:
字符時間
以波特率9600為例
總結
- 幀間空閑時間(Inter-Frame Delay)必須 ≥?3.5個字符時間,以區分連續的數據幀。
- 幀內字符間隔(Inter-Character Timeout)必須 ≤?1.5個字符時間,否則視為幀結束。
4、RS485和Modbus 的關系
通信:硬件層,軟件層組成
硬件層:
RS485——解決的是數據的傳輸問題,也就是如何將一個“0“或”1”傳輸到另外一端。
軟件層:
Modbus——在硬件的基礎上,解決數據傳輸的含義,傳的數據代表什么。