簡說Modbus-RTU與Modbus-ASCII


Modbus在串行總線通信中的協議有RTU和ASCII兩種。RTU是Remote Terminal Unit的縮寫,意思是遠程終端單元。ASCII是American Standard Code for Information Interchange,意思是美國信息交換標准代碼,是將文字編輯符號、大小寫字母、數字和一些不可見的控制字符進行編碼的一種字符表示形式,除了空字符外,共127個字符編碼。
兩種協議的不同之處,孔丙火(微信公眾號:孔丙火)認為,最簡單的講,就是:RTU是直接發送數據,二進制代碼,其表示的物理意義,需要發送端和接收端進行約定;ASCII發送的數據是用於表示字符的二進制代碼;舉例如下:

圖1 
在數據發送格式上,兩者也有以下不同之處。
(1)ASCII有開始字符和結束字符,可以作為一幀數據開始和結束的標志,用於接收端判斷,一個報文必須以一個‘冒號’ ( : )(ASCII 十六進制3A )起始,以‘回車-換行’ (CR LF) (ASCII 十六進制0D 和0A) 結束,如圖2所示。而RTU則沒有這樣的標志,需要用時間間隔來判斷一幀數據的開始和結束,協議中規定的是3.5個字符周期,就是在一幀開始前,必須有大於3.5個字符周期的空閑時間,一幀結束后,也必須有大於3.5個字符周期的空閑時間,否則會出錯,如圖3所示。

圖2

圖3
特別說明:大家都知道,串口發送數據是以字節為單位的,兩個字節的發送時間間隔在RTU中也是有規定的,必須小於1.5個字符周期,不然也會出錯。字符周期是一個時間單位,在孔丙火(微信公眾號:孔丙火)看來,很多人在做的時候會弄錯這個概念,有的人以為是bit,這是不對的,應該是字節,但不是8個bit的字節,而是RTU發送1個字節的實際bit數,這里面包含一些附加位,如起始位、停止位、校驗位等,加起來是11個bit,即1個字符周期是11bit的時間。那么問題來了,細心的朋友就會問孔丙火(微信公眾號:孔丙火),如果串口參數是無校驗的時候,不就是10個bit了嗎?的確是這樣,所以RTU協議中有明確規定,偶校驗是推薦的,但無校驗也是允許的,但也推薦,無校驗的時候,停止位最好設置為2位,就是為了確保1個字符周期是11bit。
(2)兩者的數據域的長度不同,RTU數據域的長度為252字符,而ASCII的是其兩倍,這是由於本文第2段所述的原因,同時為了兩種協議的應用層數據保持一致,才做出這樣的規定。孔丙火(微信公眾號:孔丙火)還注意到一個問題,在標准中,描述數據域長度使用的單位是字符,而不是字節,我想這跟我在上段中描述的11bit的問題有關,用字符更加准確。
(3)兩者的數據幀校驗方式不同。RTU使用CRC校驗,即循環冗余檢驗,ASCII使用的是LRC,即縱向冗余校驗。
(4)在Modbus標准中,RTU是必須要求的,而ASCII是可選項,即作為一個Modbus通信設備可以只支持RTU,也可以同時支持RTU和ASCII,但不能只支持ASCII。
參考文獻:GB/T 19582-2008。
文章在微信公眾號同步推出,微信公眾號:孔丙火,關注欣賞更多文章。

本訂閱號致力於單片機、PLC、嵌入式軟硬件的設計經驗分享,秉承“點點滴滴皆智慧”的理念,一起分享,共同交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM