天天看點

modbus ascii java_簡說Modbus-RTU與Modbus-ASCII

Modbus在串行總線通信中的協定有RTU和ASCII兩種。RTU是Remote Terminal Unit的縮寫,意思是遠端終端單元。ASCII是American Standard Code for Information Interchange,意思是美國資訊交換标準代碼,是将文字編輯符号、大小寫字母、數字和一些不可見的控制字元進行編碼的一種字元表示形式,除了空字元外,共127個字元編碼。

兩種協定的不同之處,孔丙火(微信公衆号:孔丙火)認為,最簡單的講,就是:RTU是直接發送資料,二進制代碼,其表示的實體意義,需要發送端和接收端進行約定;ASCII發送的資料是用于表示字元的二進制代碼;舉例如下:

modbus ascii java_簡說Modbus-RTU與Modbus-ASCII

圖1

在資料發送格式上,兩者也有以下不同之處。

(1)ASCII有開始字元和結束字元,可以作為一幀資料開始和結束的标志,用于接收端判斷,一個封包必須以一個‘冒号’ ( : )(ASCII 十六進制3A )起始,以‘回車-換行’ (CR LF) (ASCII 十六進制0D 和0A) 結束,如圖2所示。而RTU則沒有這樣的标志,需要用時間間隔來判斷一幀資料的開始和結束,協定中規定的是3.5個字元周期,就是在一幀開始前,必須有大于3.5個字元周期的空閑時間,一幀結束後,也必須有大于3.5個字元周期的空閑時間,否則會出錯,如圖3所示。

modbus ascii java_簡說Modbus-RTU與Modbus-ASCII

圖2

modbus ascii java_簡說Modbus-RTU與Modbus-ASCII

圖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、嵌入式軟硬體的設計經驗分享,秉承“點點滴滴皆智慧”的理念,一起分享,共同交流。