在工業控制、電力通訊、智能儀表等領域,通常情況下是采用串口通信的方式進行數據交換。采用的方式是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規定了部分功能代碼,此外也保留了一部分功能代碼作為備用或者用戶自定義,這些功能碼大家不需要去記憶,甚至都不用去看,直到你有用到的那天再過來查這個表格即可