1. 程式人生 > >RS485通訊和Modbus通訊協議彙總

RS485通訊和Modbus通訊協議彙總

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]。

在工業控制、電力通訊、智慧儀表等領域,通常情況下是採用串列埠通訊的方式進行資料交換。最初採用的方式是RS232介面,由於工業現場比較複雜,各種電氣裝置會在環境中產生比較多的電磁干擾,會導致訊號傳輸錯誤。除此之外,RS232介面只能實現點對點通訊,不具備聯網功能,最大傳輸距離也只能達到幾十米,不能滿足遠距離通訊要求。

而RS485則解決了這些問題,資料訊號採用差分傳輸方式,可以有效的解決共模干擾問題,最大距離可以到1200米,並且允許多個收發裝置接到同一條總線上。隨著工業應用通訊越來越多,1979年施耐德電氣制定了一個用於工業現場的匯流排協議Modbus協議,現在工業中使用RS485通訊場合很多都採用Modbus協議,所以今天我們來了解下RS485通訊和Modbus通訊協議。

【RS485通訊】

實際上在RS485之前RS232就已經誕生,但是RS232有幾處不足的地方:

1、介面的訊號電平值較高,達到十幾V,容易損壞介面電路的晶片,而且和TTL電平不相容,因此和微控制器電路接起來的話必須加轉換電路。

2、傳輸速率有侷限,不可以過高,一般到幾十Kb/s就到極限了。

3、介面使用訊號線和GND與其他裝置形成共地模式的通訊,這種共地模式傳輸容易產生干擾,並且抗干擾性能也比較弱。

4、傳輸距離有限,最多隻能通訊幾十米。

5、通訊的時候只能兩點之間進行通訊,不能夠實現多機聯網通訊。

針對RS232介面的不足,就不斷出現了一些新的介面標準,RS485就是其中之一,他具備以下的特點:

1.邏輯“1”以兩線間的電壓差為+(2—6)V表示;邏輯“0”以兩線間的電壓差為-(2—6)V表示。介面訊號電平比RS232C降低了,就不易損壞電路的晶片,且該電平與TTL電平相容,可方便與TTL電路連線。

2.RS485通訊速度快,資料最高傳輸速率為10Mbps以上

3.RS485內部的物理結構,採用的是平衡驅動器和查分接收器的組合,抗干擾能力大大增加。

4.傳輸速率最遠可達到1200米左右,但是他的傳輸速率和傳輸距離是成反比的,只有在100KB/s以下的傳輸速率,才能達到最大的通訊距離,如果需要傳輸更遠距離可以使用中繼。

5.可以在總線上進行聯網實現多機通訊,總線上允許掛多個收發器,從現有的RS485晶片來看,有可以掛32、64、128、256等不同個裝置的驅動器。

RS-485採用平衡傳送和差分接收,因此具有抑制共模干擾的能力。RS-485採用半雙工工作方式,任何時候只能有一點處於傳送狀態,因此,傳送電路須由使能訊號加以控制。RS-485用於多點互連時非常方便,可以省掉許多訊號線。應用RS-485可以聯網構成分散式系統,其允許最多並聯32臺驅動器和32臺接收器。在RS232或RS485裝置聯成的裝置網中,如果裝置數量超過2臺,就必須使用RS485做通訊介質,RS485網的裝置間要想互通訊息只有通過“主(Master)”裝置中轉才能實現,這個主裝置通常是PC,而這種裝置網中只允許存在一個主裝置,其餘全部是從(Slave)裝置。

RS485有兩線制和四線制兩種接線,四線制只能實現點對點的通訊方式,現很少採用,現在多采用的是兩線制接線方式,這種接線方式為匯流排式拓樸結構在同一總線上最多可以掛接32個結點。在RS485通訊網路中一般採用的是主從通訊方式,即一個主機帶多個從機。很多情況下,連線RS-485通訊鏈路時只是簡單地用一對雙絞線將各個介面的“A”、“B”端連線起來。而忽略了訊號地的連線,這種連線方法在許多場合是能正常工作的,但卻埋下了很大的隱患,這有二個原因:

(1)共模干擾問題:RS-485介面採用差分方式傳輸訊號方式,並不需要相對於某個參照點來檢測訊號,系統只需檢測兩線之間的電位差就可以了。但人們往往忽視了收發器有一定的共模電壓範圍,RS-485收發器共模電壓範圍為-7~+12V,只有滿足上述條件,整個網路才能正常工作。當網路線路中共模電壓超出此範圍時就會影響通訊的穩定可靠,甚至損壞介面。

(2)EMI問題:傳送驅動器輸出訊號中的共模部分需要一個返回通路,如沒有一個低阻的返回通道(訊號地),就會以輻射的形式返回源端,整個匯流排就會像一個巨大的天線向外輻射電磁波。由於PC機預設的只帶有RS232介面,有兩種方法可以得到PC上位機的RS485電路:(1)通過RS232/RS485轉換電路將PC機串列埠RS232訊號轉換成RS485訊號,對於情況比較複雜的工業環境最好是選用防浪湧帶隔離珊的產品。(2)通過PCI多串列埠卡,可以直接選用輸出訊號為RS485型別的擴充套件卡。

【Modbus通訊協議】

Modbus協議是應用於電子控制器上的一種通用語言。通過此協議,控制器相互之間、控制器經由網路(例如乙太網)和其它裝置之間可以通訊。它已經成為一通用工業標準。有了它,不同廠商生產的控制裝置可以連成工業網路,進行集中監控。此協議定義了一個控制器能認識使用的訊息結構,而不管它們是經過何種網路進行通訊的。它描述了一控制器請求訪問其它裝置的過程,如何迴應來自其它裝置的請求,以及怎樣偵測錯誤並記錄。它制定了訊息域格局和內容的公共格式。

Modbus具有以下幾個特點:

(1)標準、開放,使用者可以免費、放心地使用Modbus協議,不需要交納許可證費,也不會侵犯智慧財產權。目前,支援Modbus的廠家超過400家,支援Modbus的產品超過600種。

(2)Modbus可以支援多種電氣介面,如RS-232、RS-485等,還可以在各種介質上傳送,如雙絞線、光纖、無線等。

(3)Modbus的幀格式簡單、緊湊,通俗易懂。使用者使用容易,廠商開發簡單。

R【TU協議幀資料】

Modbus有兩種通訊傳輸方式,一種是ASCII模式,一種是RTU模式。由於ASCII模式的資料位元組是7bit資料位,51微控制器無法實現,而且應用也相對較少,所以這裡我們只用RTU模式。兩種模式相似,會用一種另外一種也就會了。一條典型的RTU資料幀如圖所示。

和我們實用串列埠通訊程式類似,我們一次傳送的資料幀必須是作為一個連續的資料流進行傳輸。我們在實用串列埠通訊程式中採用的方法是定義30ms,如果接收到的資料超過了30ms還沒有接收到下一個位元組,我們就認為這次的資料結束。而Modbus的RTU模式規定不同資料幀之間的間隔是3.5個位元組通訊時間以上。如果在一幀資料完成之前有超過3.5個位元組時間的停頓,接收裝置將重新整理當前的訊息並假定下一個位元組是一個新的資料幀的開始。同樣的,如果一個新訊息在小於3.5個位元組時間內接著前邊一個數據開始的,接收的裝置將會認為它是前一幀資料的延續。這將會導致一個錯誤,因此大家看RTU資料幀最後還有16bit的CRC校驗。

起始位和結束符:前後都至少有3.5個位元組的時間間隔,起始位和結束符實際上沒有任何資料,T1-T2-T3-T4代表的是時間間隔3.5個位元組以上的時間,而真正有意義的第一個位元組是裝置地址。

裝置地址:在多機通訊的時候,資料那麼多,我們依靠什麼判斷這個資料幀是哪個裝置的呢?沒錯,就是依靠這個裝置地址位元組。每個裝置都有一個自己的地址,當裝置接收到一幀資料後,程式首先對裝置地址位元組進行判斷比較,如果與自己的地址不同,則對這幀資料直接不予理會,如果如果與自己的地址相同,就要對這幀資料進行解析,按照之後的功能碼執行相應的功能。如果地址是0x00,則認為是一個廣播命令,就是所有的從機裝置都要執行的指令。

功能程式碼:在第二個位元組功能程式碼位元組中,Modbus規定了部分功能程式碼,此外也保留了一部分功能程式碼作為備用或者使用者自定義,這些功能碼大家不需要去記憶,甚至都不用去看,直到你有用到的那天再過來查這個表格即可。

CRC校驗:CRC校驗是一種資料演算法,是用來校驗資料對錯的。CRC校驗函式把一幀資料除最後兩個位元組外,前邊所有的位元組進行特定的演算法計算,計算完後生成了一個16bit的資料,作為CRC校驗碼,新增在一幀資料的最後。接收方接收到資料後,同樣會把前邊的位元組進行CRC計算,計算完了再和發過來的CRC的16bit的資料進行比較,如果相同則認為資料正常,沒有出錯,如果比較不相同,則說明資料在傳輸中發生了錯誤,這幀資料將被丟棄,就像沒收到一樣,而傳送方會在得不到迴應後做相應的處理錯誤處理。

鼎酷IOT部落(dkiot888)是由鼎易鴻基&萬酷電子聯合出品,專注於為大家提供物聯網精髓的新媒體平臺。我們關注物聯網行業最新動態,專注做您的物聯網口袋知識庫,旨在搭建共同學習的知識平臺,讓您學得方便,聊得暢快;鼎酷IOT部落用心做大家的“良僕”。各項內容鼎酷IOT部落微信公眾號同步。物聯網行業頂尖產品諮詢也歡迎留言。