摘要:該文詳細(xì)論述了基于Modbus協(xié)議的RS485總線通訊機(jī)設(shè)計(jì)原理及應(yīng)用。物理結(jié)構(gòu)上包括上位機(jī)、主站、和多個(gè)從站節(jié)點(diǎn)。在上位機(jī)與各從站節(jié)點(diǎn)間增加主站,承擔(dān)上位機(jī)的輪詢工作,使上位機(jī)從繁忙的通信工作中解放出來,并能夠提高系統(tǒng)獨(dú)立性,加快系統(tǒng)從故障中恢復(fù)的速度。軟件方面基于Modbus協(xié)議,并且添加CRC校驗(yàn),從而有效地提高了系統(tǒng)的可靠性、安全性。本設(shè)計(jì)已成功應(yīng)用于某監(jiān)獄門禁控制系統(tǒng)。
現(xiàn)場(chǎng)總線被譽(yù)為自動(dòng)化領(lǐng)域的計(jì)算機(jī)局域網(wǎng)。在總線種類多樣化的今天,Modbus技術(shù)以其先進(jìn)性、開放性、成熟性使得基于Modbus串行鏈路通信的設(shè)備得到了廣泛的使用,Modbus通信有3種方式:串行鏈路、TCP/IP和ModbusPLUS。本文的研究對(duì)象是基于串行鏈路主從式通信結(jié)構(gòu)的設(shè)備。在這種總線網(wǎng)絡(luò)中,系統(tǒng)間的通信一般采取上位機(jī)輪詢各節(jié)點(diǎn)的方式,即上位機(jī)對(duì)各節(jié)點(diǎn)不間斷地進(jìn)行輪詢,當(dāng)輪詢到某節(jié)點(diǎn)時(shí),上位機(jī)與此節(jié)點(diǎn)在一定時(shí)間間隔內(nèi)互相交換信息。但是當(dāng)節(jié)點(diǎn)數(shù)目眾多時(shí),出于系統(tǒng)響應(yīng)及時(shí)性的要求,上位機(jī)對(duì)各節(jié)點(diǎn)輪詢的時(shí)間間隔需要盡可能短,而這樣,輪詢工作將會(huì)給上位機(jī)造成沉重的負(fù)擔(dān),占用其較多的CPU資源,使得上位機(jī)不能專注于完成數(shù)據(jù)處理,同時(shí)導(dǎo)致系統(tǒng)的可靠性與安全性降低。
基于此原因,本文提出一種針對(duì)串行鏈路的新方法,在上位機(jī)與各節(jié)點(diǎn)之間增加一個(gè)通訊機(jī)(為不至于和各節(jié)點(diǎn)混淆,本文稱其為主站),并給出了基于此主站的上位PC機(jī)與各節(jié)點(diǎn)(該系統(tǒng)稱各節(jié)點(diǎn)為從站)的通信流程以及此主站的主程序流程。
1系統(tǒng)的硬件環(huán)境設(shè)計(jì)
系統(tǒng)硬件環(huán)境主要包括以下幾個(gè)模塊:上位機(jī)、主站、從站。對(duì)于串行鏈路的Modbus系統(tǒng),其物理接口可以選用RS232或RS485。最常用的接口是RS485兩線制接口。本系統(tǒng)中的上位機(jī)采用PC機(jī),其物理接口為RS232接口,而主站的物理接口為RS485接口。所以PC機(jī)不能直接連接RS485接口,必須在主站與PC機(jī)間進(jìn)行RS232與RS485轉(zhuǎn)換。通過RS232/RS485轉(zhuǎn)換電路將PC機(jī)串口RS232信號(hào)轉(zhuǎn)換成RS485信號(hào)。
圖1硬件框圖
綜上所述,主站和從站硬件的總體設(shè)計(jì)如圖1所示,主站與上位機(jī)的通信采用RS232的方式,主站與各節(jié)點(diǎn)間的通信采用RS485的方式。從站把來不及傳到PC機(jī)的數(shù)據(jù)暫時(shí)放到FLASN存儲(chǔ)區(qū)中。從站和FLASH存儲(chǔ)器間通過SPI通訊。
2網(wǎng)絡(luò)通訊協(xié)議
2.1Modbus協(xié)議簡(jiǎn)介
Modbus串行鏈路協(xié)議是一個(gè)主站-從站協(xié)議,Modbus應(yīng)用層報(bào)文傳輸協(xié)議提供了總線或網(wǎng)絡(luò)上連接的設(shè)備之間的客戶機(jī)/服務(wù)器通信。在Modbus串行鏈路上,主節(jié)點(diǎn)提供客戶機(jī)的功能,而子節(jié)點(diǎn)則作為服務(wù)器。由于Modbus協(xié)議具有幀格式結(jié)構(gòu)、傳輸方式、功能及內(nèi)容簡(jiǎn)單、傳輸效率高等優(yōu)點(diǎn),近年來在控制系統(tǒng)中得到了廣泛的應(yīng)用。本論文所涉及的Modbus協(xié)議,是在采用串行鏈路的RTU模式標(biāo)準(zhǔn)協(xié)議的基礎(chǔ)上,結(jié)合實(shí)際應(yīng)用,擴(kuò)展了其幀格式結(jié)構(gòu)和范圍。
主機(jī)傳輸?shù)拿顖?bào)文如下:
ADOD0D1…DXCRC1CRC2
說明:
ADO:目標(biāo)地址,即站點(diǎn)地址(或稱網(wǎng)絡(luò)設(shè)備地址)。
D0-DX:報(bào)文內(nèi)容,X最大為255,(不含CRC1,CRC2)
CRC1,CRC2:CRC校驗(yàn)結(jié)果。Modbus-RTU協(xié)議采用CRC-16(16位循環(huán)冗余校驗(yàn)碼)校驗(yàn)方法,包含16位二進(jìn)制。CRC校驗(yàn)碼由發(fā)送端計(jì)算,放置于發(fā)送信息的尾部。接收端重新計(jì)算接收到的信息的校驗(yàn)碼,并與接收到的校驗(yàn)碼相比較,如果二者不相符,則表明通訊出錯(cuò)。
2.2主要通訊過程描述
首先PC機(jī)每隔一段時(shí)間掃描主站一次,若通訊無異常主站向PC機(jī)發(fā)送應(yīng)答碼;同理主站空閑時(shí),也是每隔一段時(shí)間依次掃描從站,若通訊無異常從站向主站發(fā)送應(yīng)答碼。而且主站通過優(yōu)先級(jí)優(yōu)先接收PC機(jī)發(fā)送的報(bào)文,這樣可以防止PC機(jī)和從站數(shù)據(jù)包的混亂。主站傳遞PC機(jī)發(fā)向站點(diǎn)的通訊命令報(bào)文或者主站發(fā)送掃描報(bào)文,站點(diǎn)接收到命令報(bào)文信息后,首先判斷目標(biāo)地址代碼,若目標(biāo)地址與本站點(diǎn)地址不一致則站點(diǎn)回到中斷以前狀態(tài),若地址一致則繼續(xù)判斷命令代碼,根據(jù)命令代碼進(jìn)行相應(yīng)的操作。通訊過程詳細(xì)介紹如下。
2.2.1主站掃描從站
主站首先向目標(biāo)從站發(fā)送掃描碼,從站接收到掃描碼后向主站回發(fā)應(yīng)答碼,主站接收到從站的應(yīng)答碼后即完成對(duì)一目標(biāo)從站的掃描。主站通過依次掃描所有目標(biāo)從站來維持整個(gè)通訊系統(tǒng)的正常運(yùn)行。
主站-->從站掃描碼
從站-->主站應(yīng)答碼
注:PC機(jī)掃描主站于此相同。
2.2.2主站向目標(biāo)從站下傳數(shù)據(jù)
主站在掃描任一目標(biāo)從站前會(huì)檢查數(shù)據(jù)下傳緩沖區(qū)。若有待傳送數(shù)據(jù)報(bào),則會(huì)將前一條報(bào)文發(fā)送出去,從站接收到報(bào)文后向主站發(fā)送應(yīng)答碼,主站接收到應(yīng)答碼后完成數(shù)據(jù)報(bào)文的傳送。
主站-->從站數(shù)據(jù)
從站-->主站應(yīng)答碼
2.2.3從站向主站上傳數(shù)據(jù)
從站向主站的數(shù)據(jù)傳送是被動(dòng)的。從站在接收到主站的掃描碼后會(huì)檢查上傳緩沖區(qū),若有數(shù)據(jù)報(bào)要發(fā)送,則會(huì)將數(shù)據(jù)報(bào)上傳給主站,主站在接收到數(shù)據(jù)報(bào)后繼續(xù)發(fā)送確認(rèn)碼給該從站。
主站-->從站掃描
從站-->主站數(shù)據(jù)
主站-->從站確認(rèn)碼
從站-->主站應(yīng)答碼
2.2.4通訊異常檢測(cè)
主站向某一從站發(fā)送報(bào)文(掃描碼或數(shù)據(jù)報(bào)文)后會(huì)偵聽從站的響應(yīng),若在規(guī)定的時(shí)間內(nèi)接收到了從站的報(bào)文(應(yīng)答碼或數(shù)據(jù)報(bào)文),則認(rèn)為對(duì)該站的通訊是正常的;若在規(guī)定的時(shí)間段內(nèi)沒有接收到該從站到正常響應(yīng)報(bào)文,主站會(huì)重新發(fā)送同一條報(bào)文,若連續(xù)3次發(fā)送都沒有接收到從站的正常響應(yīng)報(bào)文,就認(rèn)為主站同該從站的通訊發(fā)生了異常。
2.2.5廣播報(bào)文
主站可以向所有從站發(fā)送廣播報(bào)文,廣播報(bào)文的目的地址為0xf5。從站接收到廣播報(bào)文后不能向主站發(fā)送應(yīng)答碼或數(shù)據(jù)報(bào)。
2.2.6獲取從站狀態(tài)信息
從站在檢測(cè)到狀態(tài)改變時(shí)會(huì)記錄狀態(tài)改變信息,在主站掃描到從站時(shí)將狀態(tài)改變信息上傳到主站,主戰(zhàn)將報(bào)文添加到轉(zhuǎn)發(fā)報(bào)文緩沖區(qū)等待傳送到上位機(jī),上位機(jī)接收后向主站發(fā)送確認(rèn)碼,主站收到確認(rèn)碼后轉(zhuǎn)發(fā)到從站。
主站在系統(tǒng)啟動(dòng)時(shí)會(huì)向所有從站發(fā)送狀態(tài)請(qǐng)求廣播報(bào)文,從站收到狀態(tài)請(qǐng)求廣播報(bào)文后準(zhǔn)備狀態(tài)信息報(bào)文,在主站掃描到從站時(shí)將狀態(tài)信息報(bào)文上傳到主站。
2.2.7時(shí)間同步
主站在系統(tǒng)啟動(dòng)時(shí)會(huì)向所有從站發(fā)送時(shí)間同步廣播報(bào)文,從站在收到時(shí)間同步廣播報(bào)文后根據(jù)設(shè)置報(bào)文內(nèi)容調(diào)整時(shí)鐘。
從站在上電運(yùn)行后準(zhǔn)備請(qǐng)求時(shí)間同步報(bào)文,在主站掃描到從站時(shí)將報(bào)文上傳到主站,主站接收到請(qǐng)求時(shí)間同步報(bào)文后,即刻將本地時(shí)間以時(shí)間同步報(bào)文的形式發(fā)送到請(qǐng)求從站,從站接收到時(shí)間同步報(bào)文后,根據(jù)報(bào)文內(nèi)容調(diào)整時(shí)鐘。
2.2.8上位機(jī)發(fā)送數(shù)據(jù)到從站
PC-->主站數(shù)據(jù)包
若主站掃描狀態(tài)恰好為等待數(shù)據(jù)回應(yīng),則將數(shù)據(jù)暫時(shí)放到掃描發(fā)送緩存區(qū),并等待數(shù)據(jù)發(fā)送完畢;否則向PC回應(yīng)主站忙。
主站-->從站數(shù)據(jù)包
從站-->主站確認(rèn)碼
若收到應(yīng)答碼,向PC回應(yīng)發(fā)送成功,否則回應(yīng)發(fā)送失敗
主站-->PC確認(rèn)碼
下一PC數(shù)據(jù)
下一數(shù)據(jù)-->主站
或完成碼-->主站
完成碼-->從站
2.2.9從站提交數(shù)據(jù)到上位機(jī)
主站掃描子站時(shí),子站將數(shù)據(jù)包發(fā)送到主站,主站轉(zhuǎn)發(fā)到上位機(jī),上位機(jī)收到后發(fā)送數(shù)據(jù)收到確認(rèn)包到主站,主站收到確認(rèn)包后轉(zhuǎn)發(fā)到從站。從站未收到確認(rèn)包,不會(huì)進(jìn)行其他數(shù)據(jù)的上傳。在規(guī)定時(shí)間內(nèi)未收到確認(rèn)包認(rèn)為數(shù)據(jù)傳送失敗。
主站-->從站掃描碼
從站-->主站數(shù)據(jù)
主站-->PCFLASH存儲(chǔ)器中數(shù)據(jù)
PC-->主站確認(rèn)碼(放入FLASH存儲(chǔ)器)
主站-->從站確認(rèn)碼
從站-->主站應(yīng)答碼
3軟件實(shí)現(xiàn)
主站主要完成2個(gè)功能:對(duì)各節(jié)點(diǎn)進(jìn)行掃描以獲取并保存各節(jié)點(diǎn)的通信狀態(tài);對(duì)上位機(jī)與各從站之間的報(bào)文進(jìn)行可靠轉(zhuǎn)發(fā)。軟件流程如圖2所示,系統(tǒng)上電后,首先進(jìn)行初始化操作,主要包括設(shè)置串口、定時(shí)器,開啟開門狗,配置芯片引腳等內(nèi)容。
系統(tǒng)初始化成功后,主站向上位機(jī)請(qǐng)求從站配置信息,主要包括從站數(shù)量、各從站的地址、各從站配置情況即從站為啟用還是閑置狀態(tài)。
從站配置信息請(qǐng)求成功后,主站開始對(duì)各從站進(jìn)行掃描,并對(duì)掃描中產(chǎn)生的從站報(bào)文進(jìn)行處理。每掃描完一個(gè)從站,主站都會(huì)去查看有無來自上位機(jī)的報(bào)文,并對(duì)報(bào)文進(jìn)行適當(dāng)處理。當(dāng)經(jīng)過一定時(shí)間間隔后主站再去掃描下一個(gè)從站。
其中,在來自上位機(jī)的報(bào)文中,有的報(bào)文是需要轉(zhuǎn)發(fā)給某個(gè)從站的,在掃描期間來自從站的報(bào)文中,有的也是需要轉(zhuǎn)發(fā)給上位機(jī)的。只有合理設(shè)計(jì)轉(zhuǎn)發(fā)協(xié)議,才能既保證報(bào)文的可靠傳輸,又不致于使系統(tǒng)實(shí)時(shí)性明顯變差或產(chǎn)生網(wǎng)絡(luò)堵塞。本系統(tǒng)將來自上位機(jī)的報(bào)文分為3類:第1類是上位機(jī)直接傳給主站的,主站收到這類報(bào)文,進(jìn)行簡(jiǎn)單回復(fù),這次通信完成;第2類是上位機(jī)發(fā)給某個(gè)從站并且需要得到從站回復(fù)信息的,這時(shí)候需要主站將報(bào)文轉(zhuǎn)發(fā)給此從站,并將此從站的回復(fù)信息再轉(zhuǎn)發(fā)給上位機(jī);第3類是上位機(jī)發(fā)給某從站但不需要回復(fù)的,這時(shí)主站將報(bào)文傳給此從站,但不需要等待從站的回復(fù)信息,這次通信完成。同理,在掃描過程中,對(duì)從站產(chǎn)生的報(bào)文的處理也分為類似3種,具體處理過程如圖2所示。
圖2主程序流程圖
本控制系統(tǒng)的設(shè)計(jì)中,由于主站的使用,一方面,上位機(jī)不再承擔(dān)對(duì)眾多從站的輪詢工作,使其擁有了更多的CPU資源進(jìn)行快速響應(yīng)、處理人機(jī)交互與日志存儲(chǔ)等事件,順暢完成眾多動(dòng)畫的播放,提高了系統(tǒng)的事件處理與響應(yīng)能力;另一方面,在傳統(tǒng)的主從式RS485通信網(wǎng)絡(luò)中,當(dāng)某根通信線由于意外或者人為原因造成短接或斷路后,可能導(dǎo)致整個(gè)通信網(wǎng)絡(luò)癱瘓,主站的使用,使得原本連接在同一網(wǎng)絡(luò)上的上百個(gè)從站分成幾個(gè)相對(duì)獨(dú)立的網(wǎng)絡(luò),當(dāng)某一網(wǎng)絡(luò)發(fā)生故障時(shí),將不會(huì)對(duì)其他網(wǎng)絡(luò)的通信造成影響。同時(shí),由于主站可以脫離上位機(jī)單獨(dú)對(duì)各從站進(jìn)行掃描并實(shí)時(shí)獲取各從站的當(dāng)前狀態(tài),如果上位機(jī)需要從某種故障中恢復(fù)并進(jìn)行重新啟動(dòng),它可以直接從主站中快速獲取整個(gè)系統(tǒng)中所有從站的當(dāng)前狀態(tài),主站還可以根據(jù)掃描從站數(shù)的多少,自動(dòng)調(diào)整掃描時(shí)間間隔,在保證系統(tǒng)響應(yīng)的前提下降低通信故障率,提高系統(tǒng)可靠性與安全性。
4結(jié)語
本文詳細(xì)論述了基于Modbus協(xié)議的RS485總線通訊機(jī)設(shè)計(jì)原理。雖然此主站的增加會(huì)使系統(tǒng)成本稍有上升,但它不僅可以使上位機(jī)從繁忙的通信工作中解放出來,更好地完成人機(jī)交互、數(shù)據(jù)處理、動(dòng)畫播放等任務(wù),而且還能夠提高系統(tǒng)獨(dú)立性,加快系統(tǒng)從故障中恢復(fù)的速度,有效地提高系統(tǒng)的可靠性、安全性。本設(shè)計(jì)已成功應(yīng)用于某監(jiān)獄門禁控制系統(tǒng),實(shí)踐證明該系統(tǒng)運(yùn)行穩(wěn)定、故障率低、操作方便、安全可靠
評(píng)論