RS485通信和Modbus通信协议汇总
1. 主從模式
RS-485上的軟件層協(xié)議ModBus主要依賴于主從模式。主從模式是指在半雙工通訊方式上,2個(gè)或者2個(gè)以上的設(shè)備組成的通訊系統(tǒng)中:
(1) 至少且只有一個(gè)主機(jī),其他的都是從機(jī)
(2) 不管任何時(shí)候,從機(jī)都不能主動(dòng)向主機(jī)發(fā)送數(shù)據(jù)
(3) 主機(jī)具有訪問(wèn)從機(jī)的權(quán)限,從機(jī)不可以主動(dòng)訪問(wèn)從機(jī),任何一次數(shù)據(jù)交換,都要由主機(jī)發(fā)起
(4)不管是主機(jī)還是從機(jī),系統(tǒng)一旦上電,都要把自己置于接收狀態(tài)(或者稱為監(jiān)聽(tīng)狀態(tài))
主從機(jī)的數(shù)據(jù)交互,需要:
a. 主機(jī)將自己轉(zhuǎn)為發(fā)送狀態(tài)
b. 主機(jī)按照預(yù)先約定的格式發(fā)出尋址數(shù)據(jù)幀。
所謂的約定,可是主機(jī)開(kāi)發(fā)者和從機(jī)開(kāi)發(fā)者約定好的規(guī)約,好,例如主機(jī)要通過(guò)從機(jī)控制接在從機(jī)的電機(jī),主機(jī)要啟動(dòng)電機(jī)就往從機(jī)發(fā)0x1,停止電機(jī)就往從機(jī)發(fā)0x2。這就是一種預(yù)
先約定好的格式,但是這樣做,互換性、兼容性、通用性差,例如其他公司是約定發(fā)送0x03讓電機(jī)轉(zhuǎn)動(dòng),發(fā)0x04讓電機(jī)停止。導(dǎo)致不同廠家的主機(jī)、從機(jī)不能相互通訊。用戶需要的,就像網(wǎng)絡(luò)操作,只要接入有網(wǎng)的網(wǎng)線那么計(jì)算機(jī)都能上網(wǎng)。
所以說(shuō),我們需要一種大家都共同遵循的規(guī)則(可以是ModBus,也可以是TCP/IP等上層協(xié)議),這種大家認(rèn)可,共同遵循的軟件層協(xié)議。軟件層協(xié)議主要是解決如何解析傳輸?shù)臄?shù)據(jù),即傳輸?shù)哪康幕蛘吒涌煽康膫鬏敂?shù)據(jù)。
半雙工通訊中,都是主機(jī)尋找從機(jī),主機(jī)的目的無(wú)非有: 主機(jī)要發(fā)數(shù)據(jù)給從機(jī),或者主機(jī)要從從機(jī)中獲取數(shù)據(jù)。
c. 主機(jī)恢復(fù)自身的接收狀態(tài)
主機(jī)等待自身所尋址的從機(jī)作回應(yīng),也就是說(shuō)從機(jī)接收到主機(jī)的尋址命令、數(shù)據(jù)后一定要回應(yīng)主機(jī),不然主機(jī)會(huì)認(rèn)為從機(jī)通訊異常?;貞?yīng)數(shù)據(jù)包也是要按照ModBus協(xié)議規(guī)約(其實(shí)不局限ModBus,像TCP/IP也需要回應(yīng)是吧!~)
2. ModBus通訊協(xié)議
通俗點(diǎn)來(lái)講,ModBus規(guī)約了起停電機(jī),主機(jī)要分別發(fā)送什么命令給從機(jī)。ModBus規(guī)定主從機(jī)之間數(shù)據(jù)的交互,需要遵循什么樣的格式,如何保證數(shù)據(jù)在傳輸過(guò)程中不發(fā)生沖突。只要都遵循這個(gè)協(xié)議,那么不同廠家的主從機(jī)就可以共用了。
ModBus一般是工作在一主多從的場(chǎng)景,還是這個(gè)圖:
主機(jī)和從機(jī)之間的連線不一定是非要485來(lái)作為載體,也可以是IIC,SPI。因?yàn)镸odBus是軟件層的協(xié)議,它既可以規(guī)約485硬件接線方式,也可以規(guī)約其他硬件接線方式。很多資料會(huì)寫(xiě)”基于RS-485的ModBus通訊協(xié)議”,意思是底層的0、1數(shù)據(jù)是通過(guò)RS-485方式去傳輸?shù)?#xff0c;0、1的意義則是通過(guò)ModBus去解析的。強(qiáng)調(diào),硬件協(xié)議可以確保數(shù)據(jù)得以傳輸出去,軟件協(xié)議保障數(shù)據(jù)的有序傳輸,數(shù)據(jù)不會(huì)發(fā)生沖突。
ModBus規(guī)定:
(1) 主從模式
有的協(xié)議規(guī)定是多主模式,意思是系統(tǒng)中的設(shè)備都是主機(jī),它們并沒(méi)有主從之分,任何時(shí)刻,誰(shuí)想發(fā)送數(shù)據(jù)都可以往總線上發(fā)送,例如網(wǎng)絡(luò)通信、CAN總線通訊,自然它們自有一套防止數(shù)據(jù)沖突機(jī)制,485由于不具備沖突檢測(cè)的硬件機(jī)制,所以它必須遵循主從模式。主從模式的原則是,整個(gè)系統(tǒng)只能有一個(gè)主機(jī),每一個(gè)從機(jī)都必須有一個(gè)唯一的地址
(2) 從機(jī)的地址是作為每個(gè)從機(jī)的唯一標(biāo)識(shí)。地址取值是0-247,0號(hào)地址表示廣播地址,廣播地址由主機(jī)保留,當(dāng)主機(jī)向0號(hào)地址發(fā)數(shù)據(jù)包的時(shí)候,每一個(gè)從機(jī)設(shè)備都會(huì)收到數(shù)據(jù)包。也就是說(shuō),當(dāng)主機(jī)發(fā)出的尋址幀的地址是0的時(shí)候,所有從機(jī)都要執(zhí)行主機(jī)要求的動(dòng)作。按理說(shuō),從機(jī)收到主機(jī)的尋址幀之后,是要做出應(yīng)答包的,但是現(xiàn)在是0號(hào)地址,也就是要回的話每臺(tái)從機(jī)都要回,那么肯定會(huì)造成RS-485通訊線上的數(shù)據(jù)混亂,因此所有從機(jī)在主機(jī)發(fā)0號(hào)地址時(shí)候不予返回?cái)?shù)據(jù)包應(yīng)答。
從機(jī)的地址有兩個(gè)作用
a. 主機(jī)向目標(biāo)從機(jī)發(fā)尋址幀時(shí)其地址部分為從機(jī)地址,這樣主機(jī)才可以檢索到目標(biāo)從機(jī)
b. 對(duì)于主機(jī)的目標(biāo)從機(jī),當(dāng)收到主機(jī)發(fā)來(lái)的非0地址時(shí),要做出數(shù)據(jù)包應(yīng)答,假設(shè)從機(jī)要返回?cái)?shù)據(jù)包給主機(jī),自然是要把數(shù)據(jù)包放到RS-485總線上,因?yàn)槊颗_(tái)從機(jī),其物理連線是在一起的,所以這就會(huì)造成其他從機(jī)認(rèn)為數(shù)據(jù)是要發(fā)送給它的現(xiàn)象,所以在從機(jī)回復(fù)主機(jī)的數(shù)據(jù)包中,加上從機(jī)自身的地址,那么其他從機(jī)讀取到這個(gè)地址值跟自己的地址不相同,就不會(huì)去響應(yīng)了。
(3) ModBus數(shù)據(jù)包的格式
主機(jī)要尋找某臺(tái)從機(jī),需要發(fā)出相應(yīng)格式的信息,這就需要談到ModBus的兩種傳輸方式:
a. RTU傳輸方式
RTU實(shí)際上也成為二進(jìn)制方式。假設(shè)主機(jī)要發(fā)送0x23,那就是發(fā)送0010 0011,按照485通訊協(xié)議,先發(fā)高位,即1100 0100。前后分別加上起始、停止位: “起始位 1100 0100 停止位”共10位數(shù)據(jù)
b. ASC傳輸方式
同樣要發(fā)送0x23,它是十六進(jìn)制數(shù),會(huì)將其拆成十位的’2’和個(gè)位的’3’,將它們的asc碼依次發(fā)出去,’0’的asc碼是0x32,’3’的asc是0x33,轉(zhuǎn)為二進(jìn)制為0011 0010和0011 0011,同樣要加上停止、起始位,共20位數(shù)據(jù)
很明顯,asc傳輸方式比較低,但是由于它傳輸?shù)氖莂sc碼,所以可以利用一些串口終端將其數(shù)值打印出來(lái)。
特別提醒,RS-485硬件協(xié)議決定,對(duì)于每一個(gè)字節(jié)數(shù)據(jù)的傳輸是先發(fā)高位,再發(fā)地位,所以假設(shè)數(shù)組u8型數(shù)組revArr[2]存放著接收到的數(shù)據(jù),那么接收端解析數(shù)據(jù)應(yīng)該是u16型data = revArr[0] * 256 + revArr[1]。
?
在工業(yè)控制、電力通訊、智能儀表等領(lǐng)域,通常情況下是采用串口通信的方式進(jìn)行數(shù)據(jù)交換。最初采用的方式是RS232接口,由于工業(yè)現(xiàn)場(chǎng)比較復(fù)雜,各種電氣設(shè)備會(huì)在環(huán)境中產(chǎn)生比較多的電磁干擾,會(huì)導(dǎo)致信號(hào)傳輸錯(cuò)誤。除此之外,RS232接口只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信,不具備聯(lián)網(wǎng)功能,最大傳輸距離也只能達(dá)到幾十米,不能滿足遠(yuǎn)距離通信要求。
而RS485則解決了這些問(wèn)題,數(shù)據(jù)信號(hào)采用差分傳輸方式,可以有效的解決共模干擾問(wèn)題,最大距離可以到1200米,并且允許多個(gè)收發(fā)設(shè)備接到同一條總線上。隨著工業(yè)應(yīng)用通信越來(lái)越多,1979年施耐德電氣制定了一個(gè)用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議Modbus協(xié)議,現(xiàn)在工業(yè)中使用RS485通信場(chǎng)合很多都采用Modbus協(xié)議,所以今天我們來(lái)了解下RS485通信和Modbus通信協(xié)議。
【RS485通信】
實(shí)際上在RS485之前RS232就已經(jīng)誕生,但是RS232有幾處不足的地方:
1、接口的信號(hào)電平值較高,達(dá)到十幾V,容易損壞接口電路的芯片,而且和TTL電平不兼容,因此和單片機(jī)電路接起來(lái)的話必須加轉(zhuǎn)換電路。
2、傳輸速率有局限,不可以過(guò)高,一般到幾十Kb/s就到極限了。
3、接口使用信號(hào)線和GND與其他設(shè)備形成共地模式的通信,這種共地模式傳輸容易產(chǎn)生干擾,并且抗干擾性能也比較弱。
4、傳輸距離有限,最多只能通信幾十米。
5、通信的時(shí)候只能兩點(diǎn)之間進(jìn)行通信,不能夠?qū)崿F(xiàn)多機(jī)聯(lián)網(wǎng)通信。
針對(duì)RS232接口的不足,就不斷出現(xiàn)了一些新的接口標(biāo)準(zhǔn),RS485就是其中之一,他具備以下的特點(diǎn):
1.邏輯“1”以兩線間的電壓差為+(2—6)V表示;邏輯“0”以兩線間的電壓差為-(2—6)V表示。接口信號(hào)電平比RS232C降低了,就不易損壞電路的芯片,且該電平與TTL電平兼容,可方便與TTL電路連接。
2.RS485通信速度快,數(shù)據(jù)最高傳輸速率為10Mbps以上
3.RS485內(nèi)部的物理結(jié)構(gòu),采用的是平衡驅(qū)動(dòng)器和查分接收器的組合,抗干擾能力大大增加。
4.傳輸速率最遠(yuǎn)可達(dá)到1200米左右,但是他的傳輸速率和傳輸距離是成反比的,只有在100KB/s以下的傳輸速率,才能達(dá)到最大的通信距離,如果需要傳輸更遠(yuǎn)距離可以使用中繼。
5.可以在總線上進(jìn)行聯(lián)網(wǎng)實(shí)現(xiàn)多機(jī)通信,總線上允許掛多個(gè)收發(fā)器,從現(xiàn)有的RS485芯片來(lái)看,有可以掛32、64、128、256等不同個(gè)設(shè)備的驅(qū)動(dòng)器。
RS-485采用平衡發(fā)送和差分接收,因此具有抑制共模干擾的能力。RS-485采用半雙工工作方式,任何時(shí)候只能有一點(diǎn)處于發(fā)送狀態(tài),因此,發(fā)送電路須由使能信號(hào)加以控制。RS-485用于多點(diǎn)互連時(shí)非常方便,可以省掉許多信號(hào)線。應(yīng)用RS-485可以聯(lián)網(wǎng)構(gòu)成分布式系統(tǒng),其允許最多并聯(lián)32臺(tái)驅(qū)動(dòng)器和32臺(tái)接收器。在RS232或RS485設(shè)備聯(lián)成的設(shè)備網(wǎng)中,如果設(shè)備數(shù)量超過(guò)2臺(tái),就必須使用RS485做通訊介質(zhì),RS485網(wǎng)的設(shè)備間要想互通信息只有通過(guò)“主(Master)”設(shè)備中轉(zhuǎn)才能實(shí)現(xiàn),這個(gè)主設(shè)備通常是PC,而這種設(shè)備網(wǎng)中只允許存在一個(gè)主設(shè)備,其余全部是從(Slave)設(shè)備。
RS485有兩線制和四線制兩種接線,四線制只能實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的通信方式,現(xiàn)很少采用,現(xiàn)在多采用的是兩線制接線方式,這種接線方式為總線式拓樸結(jié)構(gòu)在同一總線上最多可以掛接32個(gè)結(jié)點(diǎn)。在RS485通信網(wǎng)絡(luò)中一般采用的是主從通信方式,即一個(gè)主機(jī)帶多個(gè)從機(jī)。很多情況下,連接RS-485通信鏈路時(shí)只是簡(jiǎn)單地用一對(duì)雙絞線將各個(gè)接口的“A”、“B”端連接起來(lái)。而忽略了信號(hào)地的連接,這種連接方法在許多場(chǎng)合是能正常工作的,但卻埋下了很大的隱患,這有二個(gè)原因:
(1)共模干擾問(wèn)題:RS-485接口采用差分方式傳輸信號(hào)方式,并不需要相對(duì)于某個(gè)參照點(diǎn)來(lái)檢測(cè)信號(hào),系統(tǒng)只需檢測(cè)兩線之間的電位差就可以了。但人們往往忽視了收發(fā)器有一定的共模電壓范圍,RS-485收發(fā)器共模電壓范圍為-7~+12V,只有滿足上述條件,整個(gè)網(wǎng)絡(luò)才能正常工作。當(dāng)網(wǎng)絡(luò)線路中共模電壓超出此范圍時(shí)就會(huì)影響通信的穩(wěn)定可靠,甚至損壞接口。
(2)EMI問(wèn)題:發(fā)送驅(qū)動(dòng)器輸出信號(hào)中的共模部分需要一個(gè)返回通路,如沒(méi)有一個(gè)低阻的返回通道(信號(hào)地),就會(huì)以輻射的形式返回源端,整個(gè)總線就會(huì)像一個(gè)巨大的天線向外輻射電磁波。由于PC機(jī)默認(rèn)的只帶有RS232接口,有兩種方法可以得到PC上位機(jī)的RS485電路:(1)通過(guò)RS232/RS485轉(zhuǎn)換電路將PC機(jī)串口RS232信號(hào)轉(zhuǎn)換成RS485信號(hào),對(duì)于情況比較復(fù)雜的工業(yè)環(huán)境最好是選用防浪涌帶隔離珊的產(chǎn)品。(2)通過(guò)PCI多串口卡,可以直接選用輸出信號(hào)為RS485類型的擴(kuò)展卡。
【Modbus通信協(xié)議】
Modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如何回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。
Modbus具有以下幾個(gè)特點(diǎn):
(1)標(biāo)準(zhǔn)、開(kāi)放,用戶可以免費(fèi)、放心地使用Modbus協(xié)議,不需要交納許可證費(fèi),也不會(huì)侵犯知識(shí)產(chǎn)權(quán)。目前,支持Modbus的廠家超過(guò)400家,支持Modbus的產(chǎn)品超過(guò)600種。
(2)Modbus可以支持多種電氣接口,如RS-232、RS-485等,還可以在各種介質(zhì)上傳送,如雙絞線、光纖、無(wú)線等。
(3)Modbus的幀格式簡(jiǎn)單、緊湊,通俗易懂。用戶使用容易,廠商開(kāi)發(fā)簡(jiǎn)單。
R【TU協(xié)議幀數(shù)據(jù)】
Modbus有兩種通信傳輸方式,一種是ASCII模式,一種是RTU模式。由于ASCII模式的數(shù)據(jù)字節(jié)是7bit數(shù)據(jù)位,51單片機(jī)無(wú)法實(shí)現(xiàn),而且應(yīng)用也相對(duì)較少,所以這里我們只用RTU模式。兩種模式相似,會(huì)用一種另外一種也就會(huì)了。一條典型的RTU數(shù)據(jù)幀如圖所示。
和我們實(shí)用串口通信程序類似,我們一次發(fā)送的數(shù)據(jù)幀必須是作為一個(gè)連續(xù)的數(shù)據(jù)流進(jìn)行傳輸。我們?cè)趯?shí)用串口通信程序中采用的方法是定義30ms,如果接收到的數(shù)據(jù)超過(guò)了30ms還沒(méi)有接收到下一個(gè)字節(jié),我們就認(rèn)為這次的數(shù)據(jù)結(jié)束。而Modbus的RTU模式規(guī)定不同數(shù)據(jù)幀之間的間隔是3.5個(gè)字節(jié)通信時(shí)間以上。如果在一幀數(shù)據(jù)完成之前有超過(guò)3.5個(gè)字節(jié)時(shí)間的停頓,接收設(shè)備將刷新當(dāng)前的消息并假定下一個(gè)字節(jié)是一個(gè)新的數(shù)據(jù)幀的開(kāi)始。同樣的,如果一個(gè)新消息在小于3.5個(gè)字節(jié)時(shí)間內(nèi)接著前邊一個(gè)數(shù)據(jù)開(kāi)始的,接收的設(shè)備將會(huì)認(rèn)為它是前一幀數(shù)據(jù)的延續(xù)。這將會(huì)導(dǎo)致一個(gè)錯(cuò)誤,因此大家看RTU數(shù)據(jù)幀最后還有16bit的CRC校驗(yàn)。
起始位和結(jié)束符:前后都至少有3.5個(gè)字節(jié)的時(shí)間間隔,起始位和結(jié)束符實(shí)際上沒(méi)有任何數(shù)據(jù),T1-T2-T3-T4代表的是時(shí)間間隔3.5個(gè)字節(jié)以上的時(shí)間,而真正有意義的第一個(gè)字節(jié)是設(shè)備地址。
設(shè)備地址:在多機(jī)通信的時(shí)候,數(shù)據(jù)那么多,我們依靠什么判斷這個(gè)數(shù)據(jù)幀是哪個(gè)設(shè)備的呢?沒(méi)錯(cuò),就是依靠這個(gè)設(shè)備地址字節(jié)。每個(gè)設(shè)備都有一個(gè)自己的地址,當(dāng)設(shè)備接收到一幀數(shù)據(jù)后,程序首先對(duì)設(shè)備地址字節(jié)進(jìn)行判斷比較,如果與自己的地址不同,則對(duì)這幀數(shù)據(jù)直接不予理會(huì),如果如果與自己的地址相同,就要對(duì)這幀數(shù)據(jù)進(jìn)行解析,按照之后的功能碼執(zhí)行相應(yīng)的功能。如果地址是0x00,則認(rèn)為是一個(gè)廣播命令,就是所有的從機(jī)設(shè)備都要執(zhí)行的指令。
功能代碼:在第二個(gè)字節(jié)功能代碼字節(jié)中,Modbus規(guī)定了部分功能代碼,此外也保留了一部分功能代碼作為備用或者用戶自定義,這些功能碼大家不需要去記憶,甚至都不用去看,直到你有用到的那天再過(guò)來(lái)查這個(gè)表格即可。
CRC校驗(yàn):CRC校驗(yàn)是一種數(shù)據(jù)算法,是用來(lái)校驗(yàn)數(shù)據(jù)對(duì)錯(cuò)的。CRC校驗(yàn)函數(shù)把一幀數(shù)據(jù)除最后兩個(gè)字節(jié)外,前邊所有的字節(jié)進(jìn)行特定的算法計(jì)算,計(jì)算完后生成了一個(gè)16bit的數(shù)據(jù),作為CRC校驗(yàn)碼,添加在一幀數(shù)據(jù)的最后。接收方接收到數(shù)據(jù)后,同樣會(huì)把前邊的字節(jié)進(jìn)行CRC計(jì)算,計(jì)算完了再和發(fā)過(guò)來(lái)的CRC的16bit的數(shù)據(jù)進(jìn)行比較,如果相同則認(rèn)為數(shù)據(jù)正常,沒(méi)有出錯(cuò),如果比較不相同,則說(shuō)明數(shù)據(jù)在傳輸中發(fā)生了錯(cuò)誤,這幀數(shù)據(jù)將被丟棄,就像沒(méi)收到一樣,而發(fā)送方會(huì)在得不到回應(yīng)后做相應(yīng)的處理錯(cuò)誤處理。
鼎酷IOT部落(dkiot888)是由鼎易鴻基&萬(wàn)酷電子聯(lián)合出品,專注于為大家提供物聯(lián)網(wǎng)精髓的新媒體平臺(tái)。我們關(guān)注物聯(lián)網(wǎng)行業(yè)最新動(dòng)態(tài),專注做您的物聯(lián)網(wǎng)口袋知識(shí)庫(kù),旨在搭建共同學(xué)習(xí)的知識(shí)平臺(tái),讓您學(xué)得方便,聊得暢快;鼎酷IOT部落用心做大家的“良仆”。各項(xiàng)內(nèi)容鼎酷IOT部落微信公眾號(hào)同步。物聯(lián)網(wǎng)行業(yè)頂尖產(chǎn)品咨詢也歡迎留言。
總結(jié)
以上是生活随笔為你收集整理的RS485通信和Modbus通信协议汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单片机:LCD1602
- 下一篇: Skyline软件二次开发初级——1如何