ModBus通信協議

ModBus通信協議
1 1. 主從模式

RS-485上的軟件層協議ModBus主要依賴於主從模式。主從模式是指在半雙工通訊方式上,2個或者2個以上的設備組成的通訊系統中:
這裏寫圖片描述
(1) 至少且只有一個主機,其他的都是從機
(2) 不管任何時候,從機都不能主動向主機發送數據
(3) 主機具有訪問從機的權限,從機不可以主動訪問從機,任何一次數據交換,都要由主機發起
(4)不管是主機還是從機,系統一旦上電,都要把自己置於接收狀態(或者稱爲監聽狀態)
主從機的數據交互,需要:
a. 主機將自己轉爲發送狀態
b. 主機按照預先約定的格式發出尋址數據幀。
所謂的約定,可是主機開發者和從機開發者約定好的規約,好,例如主機要通過從機控制接在從機的電機,主機要啓動電機就往從機發0x1,停止電機就往從機發0x2。這就是一種預
先約定好的格式,但是這樣做,互換性、兼容性、通用性差,例如其他公司是約定發送0x03讓電機轉動,發0x04讓電機停止。導致不同廠家的主機、從機不能相互通訊。用戶需要的,就像網絡操作,只要接入有網的網線那麼計算機都能上網。
所以說,我們需要一種大家都共同遵循的規則(可以是ModBus,也可以是TCP/IP等上層協議),這種大家認可,共同遵循的軟件層協議。軟件層協議主要是解決如何解析傳輸的數據,即傳輸的目的或者更加可靠的傳輸數據。
半雙工通訊中,都是主機尋找從機,主機的目的無非有: 主機要發數據給從機,或者主機要從從機中獲取數據。
c. 主機恢復自身的接收狀態
主機等待自身所尋址的從機作迴應,也就是說從機接收到主機的尋址命令、數據後一定要回應主機,不然主機會認爲從機通訊異常。迴應數據包也是要按照ModBus協議規約(其實不侷限ModBus,像TCP/IP也需要回應是吧!~)
2. ModBus通訊協議

通俗點來講,ModBus規約了起停電機,主機要分別發送什麼命令給從機。ModBus規定主從機之間數據的交互,需要遵循什麼樣的格式,如何保證數據在傳輸過程中不發生衝突。只要都遵循這個協議,那麼不同廠家的主從機就可以共用了。
ModBus一般是工作在一主多從的場景,還是這個圖:
這裏寫圖片描述
主機和從機之間的連線不一定是非要485來作爲載體,也可以是IIC,SPI。因爲ModBus是軟件層的協議,它既可以規約485硬件接線方式,也可以規約其他硬件接線方式。很多資料會寫”基於RS-485的ModBus通訊協議”,意思是底層的0、1數據是通過RS-485方式去傳輸的,0、1的意義則是通過ModBus去解析的。強調,硬件協議可以確保數據得以傳輸出去,軟件協議保障數據的有序傳輸,數據不會發生衝突。
ModBus規定:
(1) 主從模式
有的協議規定是多主模式,意思是系統中的設備都是主機,它們並沒有主從之分,任何時刻,誰想發送數據都可以往總線上發送,例如網絡通信、CAN總線通訊,自然它們自有一套防止數據衝突機制,485由於不具備衝突檢測的硬件機制,所以它必須遵循主從模式。主從模式的原則是,整個系統只能有一個主機,每一個從機都必須有一個唯一的地址
(2) 從機的地址是作爲每個從機的唯一標識。地址取值是0-247,0號地址表示廣播地址,廣播地址由主機保留,當主機向0號地址發數據包的時候,每一個從機設備都會收到數據包。也就是說,當主機發出的尋址幀的地址是0的時候,所有從機都要執行主機要求的動作。按理說,從機收到主機的尋址幀之後,是要做出應答包的,但是現在是0號地址,也就是要回的話每臺從機都要回,那麼肯定會造成RS-485通訊線上的數據混亂,因此所有從機在主機發0號地址時候不予返回數據包應答。
從機的地址有兩個作用
a. 主機向目標從機發尋址幀時其地址部分爲從機地址,這樣主機纔可以檢索到目標從機
b. 對於主機的目標從機,當收到主機發來的非0地址時,要做出數據包應答,假設從機要返回數據包給主機,自然是要把數據包放到RS-485總線上,因爲每臺從機,其物理連線是在一起的,所以這就會造成其他從機認爲數據是要發送給它的現象,所以在從機回覆主機的數據包中,加上從機自身的地址,那麼其他從機讀取到這個地址值跟自己的地址不相同,就不會去響應了。
(3) ModBus數據包的格式
主機要尋找某臺從機,需要發出相應格式的信息,這就需要談到ModBus的兩種傳輸方式:
a. RTU傳輸方式
RTU實際上也成爲二進制方式。假設主機要發送0x23,那就是發送0010 0011,按照485通訊協議,先發高位,即1100 0100。前後分別加上起始、停止位: “起始位 1100 0100 停止位”共10位數據
b. ASC傳輸方式
同樣要發送0x23,它是十六進制數,會將其拆成十位的’2’和個位的’3’,將它們的asc碼依次發出去,’0’的asc碼是0x32,’3’的asc是0x33,轉爲二進制爲0011 0010和0011 0011,同樣要加上停止、起始位,共20位數據
很明顯,asc傳輸方式比較低,但是由於它傳輸的是asc碼,所以可以利用一些串口終端將其數值打印出來。

特別提醒,RS-485硬件協議決定,對於每一個字節數據的傳輸是先發高位,再發地位,所以假設數組u8型數組revArr[2]存放着接收到的數據,那麼接收端解析數據應該是u16型data = revArr[0] * 256 + revArr[1]。
本文章摘抄於https://blog.csdn.net/qq_29344757/article/details/71522291?locationNum=14&fps=1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章