RS485基本都是由RS232轉(zhuǎn)換而來,此時(shí)就需要將全雙工切換到半雙工,目前大部分的工程師基本都是使用軟件換向的方法,作者就遇到過軟件換向不及時(shí)丟包的方法,并提供一種解決思路工參考。
問題描述
最近公司在做一個(gè)采集器,具體的原理就是通過串口將客戶數(shù)據(jù)采集上來,由于客戶的接口是RS232的,而我們的采集器只有RS485接口,無法直接對(duì)接,因此我們引入了一個(gè)中間的RS232/RS485轉(zhuǎn)換器,對(duì)接我們的采集器,這種用法相信也是論壇工程師絕大多數(shù)的選擇,不料在進(jìn)行可靠性測(cè)試過程一個(gè)晚上,丟包率竟然高度10%,這種有線的連接,又是低速率串口,理論上的丟包率應(yīng)該是0。
圖1:信號(hào)采集原理圖
原因分析
首先我們排除以下幾個(gè)原因:
1、走線長(zhǎng)度:設(shè)備都擺放在一起,長(zhǎng)度只有2米不到;2、干擾問題:這是在辦公室測(cè)試的,沒有大的干擾;3、數(shù)據(jù)速率:波特率只用了115200,常規(guī)波特率;4、軟件問題:這個(gè)RS485采集軟件已經(jīng)用了好幾年,一直很穩(wěn)定;5、客戶的PLC程序:客戶在現(xiàn)場(chǎng)也用了好幾年,也很穩(wěn)定。
問題的定位基本可以大致確定方向,就是出在這個(gè)RS485和RS232的數(shù)據(jù)轉(zhuǎn)換上,我們的采集器的接口設(shè)計(jì)原理圖如下:
圖2:采集器端口設(shè)計(jì)原理圖
通過示波器的抓波我們發(fā)現(xiàn),問題原因就在這個(gè)端口上。如下圖;TX是我們采集器發(fā)出的信號(hào),RX是客戶PLC回復(fù)的信號(hào),DIR是我們的采集器的方向控制信號(hào)。簡(jiǎn)單說,就是在0uS的時(shí)候,我們發(fā)出去數(shù)據(jù),PLC在150uS左右就回復(fù)數(shù)據(jù),而我們的方向切換引腳在200~300uS不等。也就是說我們發(fā)送完數(shù)據(jù),來不及切換到接收狀態(tài),PLC就回復(fù)數(shù)據(jù)了,導(dǎo)致數(shù)據(jù)丟失。
通過和軟件工程師溝通,由于我們跑的是Linux系統(tǒng),方向引腳控制采取的是進(jìn)程控制的方法,這個(gè)進(jìn)程本來優(yōu)先級(jí)已經(jīng)很高,到時(shí)由于是多進(jìn)程運(yùn)行,還是會(huì)被其他系統(tǒng)進(jìn)程搶占,所以導(dǎo)致無法做到更高的切換速度,或者是切換速度無法明確,只能是一個(gè)區(qū)間。
圖3:示波器實(shí)測(cè)圖
解決方案
既然是采集器來不及換向,解決的思路很簡(jiǎn)單,有兩個(gè)方案;
1、將采集的換向速度提高,提高到100uS以內(nèi);2、將PLC的回復(fù)時(shí)間變慢,延長(zhǎng)到500uS以后。
由于客戶擔(dān)心改程序出問題,所以不愿意改,只好我們修改采集器的換向速度,我們的軟件工程師也不愿意改,理由是產(chǎn)品運(yùn)行多年,很穩(wěn)定,怕改出問題。按照自然法制,怕麻煩的事,用錢肯定能解決!
終于不負(fù)有心人,我們找到了兩個(gè)用錢解決的思路,就是更換RS485接口芯片,不讓軟件參與換向??蛇x的芯片有兩種:
1、美信公司的MAX13488:由芯片自動(dòng)切換方向,無需軟件干預(yù)切換方向,驅(qū)動(dòng)能力強(qiáng),通信速率高,MAX13488宣稱最高可以到16Mbps,與普通的RS485芯片性能一樣。
圖4;MAX13487 內(nèi)部框圖
2、周立功公司的RSM(3)485PHT,由芯片自動(dòng)切換方向,無需軟件干預(yù)切換方向,驅(qū)動(dòng)能力強(qiáng),通信速率高,DC電源、隔離、RS485芯片功能三合一,節(jié)省板卡空間。
圖5;RSM(3)485PHT原理圖
最終,我們選擇了周立功的RSM(3)485PHT,經(jīng)過7天的長(zhǎng)時(shí)間丟包測(cè)試,丟包率為0%,測(cè)試通過。
舉一反三
在接口轉(zhuǎn)換設(shè)計(jì)中,匹配性問題是我們經(jīng)常會(huì)遇到的,RS485由于定位是比較低速的串口,使用起來一般都不會(huì)有問題,我們的采集器也是99%的設(shè)備接入都沒問題,這個(gè)客戶的PLC也是我們遇到的唯一回復(fù)時(shí)間這么快的PLC,正常的PLC都會(huì)在500uS以后。這就給我們啟示:所有的雙工通信轉(zhuǎn)換為單工通信時(shí),都應(yīng)該考慮換向不及時(shí)導(dǎo)致的數(shù)據(jù)丟失。
02
匹配電阻使用不當(dāng)導(dǎo)致RS485通信失敗
很多工程師都知道RS485的匹配電阻120R電阻的重要性,因此設(shè)計(jì)時(shí)候都有預(yù)留該電阻。但多個(gè)RS485設(shè)備并聯(lián)時(shí),需要注意該電阻的影響。
問題描述
之前我們公司做過數(shù)據(jù)采集器,采集是通過RS485與其他客戶的設(shè)備連接的,產(chǎn)品設(shè)計(jì)之初是一對(duì)一連接,產(chǎn)品發(fā)布了2年基本沒有收到市場(chǎng)的問題反饋,最近一個(gè)月時(shí),客戶有反饋我們的RS485讀取不到數(shù)據(jù),更換好幾個(gè)全新的數(shù)據(jù)依舊,要求我們盡快解決。
原因分析
由于我們的產(chǎn)品已經(jīng)發(fā)布2年都沒問題,所以我們的主要懷疑方向就是客戶的現(xiàn)場(chǎng)應(yīng)用方案。我們先審視一下我們自己的RS485端口設(shè)計(jì),如下圖1。這個(gè)方案在點(diǎn)對(duì)點(diǎn)應(yīng)用場(chǎng)景多年都o(jì)k。
圖1:RS485端口設(shè)計(jì)原理圖
接著我們審視客戶的應(yīng)用方案,如圖2所示,客戶采用的是手拉手的模式,這種模式也是常用的拓?fù)浣Y(jié)構(gòu)。
圖2:客戶的現(xiàn)場(chǎng)應(yīng)用方案
由于暫時(shí)還沒有找到原因,我們?nèi)S485的標(biāo)準(zhǔn)這里找一些參考,終于,我們?cè)赗S485的標(biāo)準(zhǔn)里面找到以下關(guān)鍵信息;如下表:
總結(jié)下來,主要是以下的幾條;
(1)驅(qū)動(dòng)器輸出信號(hào)電平(負(fù)載最小時(shí)):±1.5V;(2)驅(qū)動(dòng)器負(fù)載最小阻抗:54Ω;
(3)接收器門檻電壓:±200mV;(4)接收器輸入阻抗最小值:≥12KΩ。
根據(jù)RS485差分阻抗的計(jì)算公式,當(dāng)有64個(gè)終端并接時(shí)(n=64時(shí)),當(dāng)RS485總線上只有首位兩端有終端匹配電阻Rt時(shí),總線上的差分阻抗為54.74Ω,剛剛符合RS485的標(biāo)準(zhǔn)。
圖3,多個(gè)RS485并聯(lián)的示意圖
但是,由于我們的終端匹配電阻Rt是使用一個(gè)固定120歐姆阻值的電阻焊接在主板上,客戶沒有辦法把中間的電阻刪除,導(dǎo)致整個(gè)RS485總線上并聯(lián)了多個(gè)120R的電阻,導(dǎo)致RS485總線上的差分阻抗遠(yuǎn)遠(yuǎn)小于54Ω,無法滿足標(biāo)準(zhǔn)要求的大于54歐姆的要求,總線上的阻抗太小,導(dǎo)致驅(qū)動(dòng)電流太大,RS485芯片無法提供足夠的電流。解決方案
已經(jīng)定位到原因,主要還是最初的設(shè)計(jì)定位是點(diǎn)對(duì)點(diǎn)通信,忽略了客戶的對(duì)點(diǎn)通信的需求,將RS485總線上的匹配電阻Rt全部都焊接了,客戶一旦使用多個(gè)設(shè)備并聯(lián)時(shí),導(dǎo)致了總線的差分阻抗太小。解決的辦法就是將除了收尾兩端的Rt全部刪除。如下圖4
圖4:刪除中間設(shè)備的Rt,只保留收尾兩端的Rt
整改之后,經(jīng)過我們測(cè)試部的測(cè)試和客戶的使用1個(gè)多月,再也沒有反饋問題,問題基本算解決。
總結(jié)
通過這次的事故,我們還總結(jié)了RS485以下的容易犯的錯(cuò)誤:
(1)上下拉電阻的主要作用:RS485增加上下拉電阻的主要目的是為了解決總線在空閑狀態(tài)、或者是開路狀態(tài)(485收發(fā)器與總線斷開)下,使得總線上的電壓大于RS485標(biāo)準(zhǔn)要求的200mV(實(shí)際應(yīng)用考慮余量設(shè)置為300mV);
(2)上下拉電阻的常規(guī)值:RS485的上下拉電阻阻值選擇主要滿足空閑狀態(tài)下Vab大于300mV,該電阻越小,功耗越大,功耗大到一定程度時(shí),甚至?xí)|發(fā)RS485 的電源輸出保護(hù),導(dǎo)致通信失敗,因此滿足空閑下300mV情況該電阻越大越好,一般的應(yīng)用,該電阻選擇1K/R0805即可;
(3)多節(jié)點(diǎn)時(shí)的上下拉電阻:當(dāng)RS485的總線上的節(jié)點(diǎn)增加時(shí),由于RS485芯片內(nèi)部也有內(nèi)部上下拉電阻(該阻值一般都是上百K),該阻值與輸入阻抗Rin并聯(lián)后,再與終端匹配電阻并聯(lián),最終的等效差分阻抗很容易會(huì)小于RS485標(biāo)準(zhǔn)要求的54Ω。因此,2個(gè)節(jié)點(diǎn)以上的應(yīng)用,則需要考慮外部上下拉電阻帶來的阻抗減小,
(4)終端匹配電阻:從上面公式可以看出,只增加2個(gè)匹配電阻,差分阻抗就降低到60Ω,如果再增加一個(gè)就降低到40Ω,因此,使用多個(gè)節(jié)點(diǎn)時(shí),最多只能在首尾兩端增加120Ω的匹配電阻。
RS485純硬件反相法自動(dòng)換向過早導(dǎo)致數(shù)據(jù)丟包
之前我們的產(chǎn)品的RS485設(shè)計(jì)借鑒了圖1中的轉(zhuǎn)換器的原理,該方案的原理主要是使用反相器法,具體的實(shí)現(xiàn)原理就是:反相法使用了一個(gè)反相器,依賴于發(fā)送信號(hào)TX的電平?jīng)Q定RS485芯片屬于發(fā)送還是接收狀態(tài),例如,TX為高電平時(shí),反相后為低電平,此時(shí)收發(fā)器處于接收狀態(tài),AB總線上的邏輯由上下拉決定,此時(shí)為邏輯1;當(dāng)TX為低電平時(shí),反相后為高電平,此時(shí)收發(fā)器處于發(fā)送狀態(tài),AB總線上的邏輯為0。簡(jiǎn)單說,就是反相法可以發(fā)送低電平,高電平其實(shí)是有AB線上的上下拉電阻決定的。
經(jīng)過我們的長(zhǎng)時(shí)間的驗(yàn)證,該種方案在100kbps波特率以內(nèi)都不會(huì)丟包,但是波特率大約100kbps以上,例如115200bps時(shí),丟包可以達(dá)到0.1%,這是我們不允許的。
圖1:Tps563200現(xiàn)貨價(jià)格
原因分析
反相器法的原理上是沒有問題的,但是我們忽略了一個(gè)串口的底層實(shí)現(xiàn)方式,串口通信是異步通信,雙方?jīng)]有時(shí)鐘同步,依賴于雙方的聲稱。
UART通信沒有時(shí)鐘同步,不是說不需要時(shí)鐘,而是兩個(gè)系統(tǒng)的時(shí)鐘來自兩個(gè)設(shè)備,各跑各的,沒有同步。這就要求兩個(gè)系統(tǒng)的時(shí)鐘誤差不能太大。UART接收的流程如下:
(1)接收端選定好與發(fā)送端一致的起始位數(shù)、數(shù)據(jù)位數(shù)、校驗(yàn)位數(shù)、停止位數(shù)、波特率,例如下圖起始位1、數(shù)據(jù)位8、校驗(yàn)無、停止位1、波特率9600bps。
(2)RX線上無傳輸時(shí),保持為高電平,RX端有采樣器,采樣器以波特率的16倍采樣周期對(duì)一位bit數(shù)據(jù)進(jìn)行采樣。確認(rèn)起始位后,再經(jīng)過16個(gè)采樣周期,采樣第一位數(shù)據(jù),再經(jīng)過16個(gè)采樣周期,采樣第二位,以此類推。
圖2:UART 采樣示意圖
圖3:UART 過采樣示意圖
圖4:UART 誤差允許范圍
這里就存在一個(gè)問題,發(fā)送和接收的底層啟動(dòng)都是由不同的廠家不同的工程師做的,大部分的工程師都是取數(shù)據(jù)bit的50%~80%位寬的數(shù)據(jù),如果雙方的波特率誤差過大,就有可能數(shù)據(jù)還沒有發(fā)送接收,但是RS485芯片已經(jīng)切換到接收狀態(tài)了,導(dǎo)致發(fā)送的數(shù)據(jù)錯(cuò)誤。
使用100k速率仿真現(xiàn)有的方案,TXD信號(hào)和方向引腳同時(shí)切換,幾乎沒有余量。極端情況下就有可能數(shù)據(jù)沒有傳輸結(jié)束,方向引腳就切換了,導(dǎo)致數(shù)據(jù)傳不出去。理想的方案應(yīng)該是方向引腳延后30%~50%的位寬再切換方向。
圖5:現(xiàn)有反向器的RS485方向切換方案仿真圖
解決方案
解決的方案需要在原有的基礎(chǔ)上,增加D1、R3、R4、C1。如下圖6。
由于該換向的原理是發(fā)送數(shù)據(jù)0的時(shí)候,DE/RE引腳為高電平,U2為發(fā)送狀態(tài),數(shù)據(jù)有U2發(fā)送出去。而發(fā)送數(shù)據(jù)1的時(shí)候,DE/RE引腳為低電平,U2實(shí)際為接收狀態(tài),AB總線上的 邏輯1其實(shí)是有R1、R2的上下拉電阻使得Va-Vb>200mV的。因此,我們的設(shè)計(jì)主要保證發(fā)送數(shù)據(jù)0的時(shí)候,方向引腳比數(shù)據(jù)延遲30%~50%左右,保證數(shù)據(jù)順利發(fā)送出去。
實(shí)現(xiàn)的原理如下:TXD發(fā)送數(shù)據(jù)0的時(shí)候,經(jīng)過反相器U1,DE/RE引腳為高電平,使得U2為發(fā)送狀態(tài),下一bit數(shù)據(jù)即將為1,但是經(jīng)過R4、C1的RC充電效應(yīng),U2的pin3引腳并不會(huì)立即為高電平,而是經(jīng)過延遲后才為高電平,延遲的時(shí)間即是我們?cè)O(shè)計(jì)的方向延遲時(shí)間。舉例子,假設(shè)U1的高電平閾值為1.5V,U1的供電電壓為5V,R4=36K,C1=300pF,根據(jù)公式:t = RC*Ln[(V1-V0)/(V1-Vt)],可以估算出切換方向延遲的時(shí)間約3.1uS。
TXD發(fā)送數(shù)據(jù)1的時(shí)候,經(jīng)過反相器U1,DE/RE引腳為低電平,使得U2為接收狀態(tài),接收狀態(tài)下,AB總線上的值由上拉R1,下拉R2決定,不再需要U2發(fā)送數(shù)據(jù),因此方向控制信號(hào)等同于無效。
圖6:方向信號(hào)延后措施
使用100K的頻率進(jìn)行仿真,結(jié)果顯示方向引腳可以延后1.85uS,可以滿足要求。
圖7:100K頻率仿真圖
總結(jié)
本文主要通過增加RC延遲和反相器波形整形,從而達(dá)到方向切換比數(shù)據(jù)bit延后的目的,讀者在實(shí)際使用過程,還需要根據(jù)自己設(shè)計(jì)的最高波特率來選擇RC的參數(shù),如RC時(shí)間太長(zhǎng),在頻率很高的情況下,反相器可能沒有輸出,一致時(shí)0,一般設(shè)置為位寬的30%左右即可,例如115200bps的波特率,位寬是8.6uS,延遲參數(shù)可以設(shè)置為8.6*0.3=2.5u左右。二極管D1和R3主要是為了應(yīng)付TXD信號(hào)由高變低的時(shí)候,能夠快速的釋放反相器輸入引腳的電壓,讓反相器的輸出為高電平,及時(shí)將數(shù)據(jù)0發(fā)送出去。