咨詢(xún)電話(huà)
ENGLISH0755-88840386發(fā)布時(shí)間:2020-12-01 10:00:32 |來(lái)源:網(wǎng)絡(luò)轉(zhuǎn)載
作為能源、物資的計(jì)量設(shè)備——稱(chēng)重儀表,在工業(yè)生產(chǎn)中分布在現(xiàn)場(chǎng)的各個(gè)區(qū)域,給設(shè)備的監(jiān)控和數(shù)據(jù)的統(tǒng)計(jì)帶來(lái)諸多不便。隨著智能儀表技術(shù)的不斷發(fā)展,其通信技術(shù)也在不斷加強(qiáng),當(dāng)今的測(cè)量?jī)x表大多帶有RS-485或RS-232通訊接口,用現(xiàn)場(chǎng)總線(xiàn)方式可以實(shí)現(xiàn)多臺(tái)測(cè)量?jī)x表的集中監(jiān)控與數(shù)據(jù)釆集,從而可實(shí)現(xiàn)儀表直接接入PC機(jī)中的監(jiān)測(cè)系統(tǒng)中,實(shí)時(shí)顯示計(jì)量?jī)x表數(shù)據(jù),使現(xiàn)場(chǎng)配料人員做到心中有數(shù),利用“遠(yuǎn)程傳輸”實(shí)現(xiàn)了Window泌境下一臺(tái)PC機(jī)與多臺(tái)測(cè)量?jī)x表的串行通信功能,并且對(duì)儀表數(shù)據(jù)實(shí)現(xiàn)自動(dòng)計(jì)量與自動(dòng)匯總。
考慮到Delphi集中了許多技術(shù),包括可視化的開(kāi)發(fā)環(huán)境、數(shù)據(jù)庫(kù)以及編譯器的技術(shù),支持DDE和OLE以方便地與其他Windows應(yīng)用程序通信、開(kāi)發(fā)的應(yīng)用程序運(yùn)行速度快,與C++類(lèi)庫(kù)構(gòu)建的應(yīng)用程序相比代碼更小,運(yùn)行時(shí)不需要運(yùn)行解釋器等,且可以通過(guò)微軟的MSCom唯件等一些優(yōu)秀的控件來(lái)方便有效地實(shí)現(xiàn)通信功能。因此,這將使得用Delphi編寫(xiě)的監(jiān)測(cè)系統(tǒng)應(yīng)用程序與稱(chēng)重儀表之間的串行通信實(shí)現(xiàn)簡(jiǎn)單化,并且增加了程序運(yùn)行的可靠性。
Delphi應(yīng)用程序與稱(chēng)重儀表通信協(xié)議
根據(jù)RS-485電氣規(guī)定,在兩線(xiàn)制傳輸方式下,RS-485驅(qū)動(dòng)器可帶32個(gè)接收器,實(shí)現(xiàn)多半點(diǎn)雙工通信,其系統(tǒng)方框圖如圖1所示。監(jiān)測(cè)系統(tǒng)通過(guò)RS-232接口,經(jīng)232-48娘塊與多臺(tái)流量計(jì)儀表相連接,一條總線(xiàn)上最多可接32臺(tái),每臺(tái)儀表被賦予各自的通訊地址碼用于識(shí)別身份,這樣上位PC即能通過(guò)RS-485總線(xiàn)對(duì)掛在總線(xiàn)上的每臺(tái)儀表進(jìn)離信。
通常釆用MODBUS通訊協(xié)議,釆用RS-485半雙工的方式,積算儀表作為從機(jī),上位PC機(jī)作為主機(jī),控制和監(jiān)視稱(chēng)重儀表等計(jì)量?jī)x表的運(yùn)行。
要實(shí)現(xiàn)對(duì)稱(chēng)重儀表信息的外部調(diào)用就要求同時(shí)運(yùn)行稱(chēng)重儀表應(yīng)用程序和Delphi編寫(xiě)的監(jiān)測(cè)系統(tǒng)應(yīng)用程序,并在兩者之間建立起相互訪(fǎng)問(wèn)對(duì)方數(shù)據(jù)的通信協(xié)議,故在每個(gè)數(shù)據(jù)包都加上了數(shù)據(jù)包起始或終止信息,并在接受數(shù)據(jù)端維護(hù)一個(gè)環(huán)形接收緩沖區(qū)。專(zhuān)門(mén)用一個(gè)線(xiàn)程負(fù)責(zé)接收數(shù)據(jù),收到的數(shù)據(jù)包放入環(huán)形接收緩沖區(qū),同時(shí),另外一個(gè)線(xiàn)程不停地分析、處理緩沖區(qū)的數(shù)據(jù)。這是整個(gè)程序通信功能的實(shí)現(xiàn)結(jié)構(gòu)。數(shù)據(jù)包的總體結(jié)構(gòu)為:(一)傳輸速率9600bps,8位數(shù)埔立,E禺校驗(yàn)位,I位停止位;(二)數(shù)據(jù)包格式,內(nèi)容釆用16進(jìn)制。通信波特率大多為9600bps。每個(gè)從站被賦予唯一的本機(jī)地址,采用主機(jī)輪詢(xún)、從機(jī)應(yīng)答的通信方式。主機(jī)通過(guò)發(fā)送命令幀啟動(dòng)一次通信,從機(jī)接收到數(shù)據(jù)后,判斷呼叫地址是否和本機(jī)地址相同,若不同,則不予理睬,若相同則根據(jù)命令幀中的特征字(命令字),發(fā)送主機(jī)要求的數(shù)據(jù)幀。
二、Delphi平臺(tái)上MSComm控件串行通信
(一)安裝MSCommS件
在Delphi中添加MSComm控件時(shí),首先找到下列3個(gè)文件:MSComm.srg,MSComm32.ocxftMSComm32.dep,把這3個(gè)文件拷貝到system目錄下(如果安裝過(guò)VisualBasic,這3個(gè)文件已經(jīng)存在)。用Windows下的注冊(cè)工具regsvrm32注冊(cè)該ocx控件,例如:Regsvr32?”system目錄\MSComm32.ocx。另外,為了能正確使用該控件,需要修改注冊(cè)表相應(yīng)信息。在注冊(cè)表的HKEY_CLASSES_ROOT\Licenses下建f項(xiàng):4250E830-6AC2-1lcf-8ADB-OOAA00C00905,該項(xiàng)的內(nèi)容為:
kjljvjjjoquqmjjjvpqqkqmqykypoqjquou
然后啟動(dòng)Delphi,進(jìn)入Delphi環(huán)境在Component菜單下選ImportActiveXControl,這時(shí)在列表中可以看到MicrosoftCommControl6.0選項(xiàng),選中這個(gè)選項(xiàng)并點(diǎn)擊Install按鈕,編譯后完成安裝。這時(shí)在ActiveX控件頁(yè)上可以看到一個(gè)圖標(biāo)為電話(huà)的控件,這就是MSComm控件。這樣就可以像在VisualBasic中一樣方便的使用MSComm控件了。
(-)MSComm控件的主要屬性及事件
MSComm控件的屬性較多,與本文有關(guān)的屬性主要為:l.CommPort://設(shè)量并返回通信端口號(hào);2-CommEvent:雁回通信事件或錯(cuò)誤;3.1nput://返回并刪除接收緩沖區(qū)中的數(shù)據(jù),在設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)為只讀;4.InputLen:濾定被Input屬性讀取的字符數(shù);5.InputMode:〃設(shè)置并返回被Input屬性讀取的數(shù)據(jù)類(lèi)型,其中ComlnputModeText以文本形式返回,而ComlnputModeBinary以二進(jìn)制形式返回;6.0utput://向輸出緩沖區(qū)中寫(xiě)入數(shù)據(jù),在設(shè)計(jì)時(shí)無(wú)效,運(yùn)行時(shí)為只讀;7.Port0pen://設(shè)置并返回通信端口幵或關(guān)的狀態(tài),運(yùn)行時(shí)有效;8.RThreshold://在MSComm控件設(shè)置CommEvent屬性為ComnEvReceive并產(chǎn)生OnComm事件之前,設(shè)置并返回要接收的字符數(shù);^Settings://設(shè)置并返回初始化參數(shù),即波特率、奇偶校驗(yàn)、數(shù)據(jù)位和停止?。籰O.OnComm事件://當(dāng)CommEvent屬性的值變化時(shí),就產(chǎn)生此事件,標(biāo)志發(fā)生了一個(gè)通信事件或錯(cuò)誤。
(三) MSCommS件串行通信方式和步驟
MSComm控件提供了兩種處理通信的方式:
1.事件驅(qū)動(dòng)方式。相當(dāng)于一般程序中中斷方式,當(dāng)串口發(fā)生事件或錯(cuò)誤時(shí),MSComm會(huì)產(chǎn)生OnComm事件,用戶(hù)程序可以獲得該事件相應(yīng)處理,這是一種處理端口通信的有效的方法,它可以利用OnComm事件捕獲并處理串行通信中發(fā)生的字件或錯(cuò)誤,實(shí)時(shí)性較強(qiáng)。
2.查詢(xún)方式。在用戶(hù)程序中設(shè)計(jì)定時(shí)器或不定時(shí)查詢(xún)MSComm®件的某些屬性是否發(fā)生變化,從而確定相應(yīng)的處理。該方式是在程序通過(guò)查詢(xún)CommEvent屬性的值來(lái)判斷通信過(guò)程中的事件或錯(cuò)誤;這種方式適合于應(yīng)用程序較小、實(shí)時(shí)性要求不是很高的系統(tǒng)中。
為此,MSComm控件串行通信的一般步驟為:(1)設(shè)置通信對(duì)象、通信端口號(hào)以及其它屬性;(2)設(shè)定通信協(xié)議;(3)打開(kāi)通信端口,進(jìn)行數(shù)據(jù)的傳送;(4)關(guān)閉通信端口。
(四) Delphi平臺(tái)上MSComm^件串行通信實(shí)現(xiàn)
在用Delphi語(yǔ)言編寫(xiě)的監(jiān)測(cè)系統(tǒng)應(yīng)用程序中,往往只對(duì)稱(chēng)重儀表的數(shù)據(jù)進(jìn)行采集和顯示,因此只發(fā)送請(qǐng)求數(shù)據(jù)命令;接受數(shù)據(jù)過(guò)程從稱(chēng)重儀表接收時(shí)間和其它數(shù)據(jù)信息。
在FormCreate事件過(guò)程中,對(duì)串口進(jìn)行初始化:
ProcedureMForml.FormCreate(Sender:TObject)
Begin
MSComml.InBufferCount:=0//$青空接受緩沖區(qū)
MSComml.commPort:=1
MSComml.Settings-'9600,1,&r//W通信口設(shè)置為9600biVs,1位剖禺校驗(yàn)位、8個(gè)數(shù)位,1個(gè)停止位
MSComml.InputLen:=0 //Input讀取整個(gè)緩沖區(qū)內(nèi)容
MSComml.RTTireshold:=1海次接受到字符即產(chǎn)生OnComir#件MSComml.InputMode:=InputModeText
MSComml.PortOpen:=true 務(wù)J開(kāi)串口
MSComml.DTREnable:=true儺備好數(shù)據(jù)終端
MSComml.DTSEnable:=true/牖求發(fā)送
End
結(jié)束時(shí),關(guān)閉串口
ProcedureWIForml.ClosebuttonCSender:TObject)
MSComml.PortOpen:=false //關(guān)閉串口
MSComml.DTREnable:=false//關(guān)閉數(shù)據(jù)終端
MSComml.DTSEnable:=false〃停止發(fā)送
End
在通信的過(guò)程中,由于某些原因不能保證每次通信都成功,在這種情況下不能簡(jiǎn)單的宣布通信失敗或通信線(xiàn)路故障。本程序進(jìn)行了通信超時(shí)設(shè)定,只有規(guī)定的時(shí)間內(nèi)還未進(jìn)行正常的數(shù)據(jù)通信才確定是通信故障并進(jìn)行處理,從而提高了通信的容錯(cuò)能力。
在稱(chēng)重儀表回傳數(shù)據(jù)時(shí)即可在主機(jī)上引發(fā)DoEvenK)函數(shù)來(lái)解決,DoEvents()函數(shù)可以將控制權(quán)轉(zhuǎn)給其他任務(wù)使用,然后再跳回通信處理程序。函數(shù)中,首先判斷接收數(shù)據(jù)的完整性,然后將數(shù)據(jù)一次全部讀到所定義的變量參數(shù)中,根據(jù)稱(chēng)重儀表通信協(xié)議中定義的內(nèi)容,分別取出各個(gè)字節(jié),解析出意義,在屏幕上顯示,利用在Delphi監(jiān)控程序中加入DATA控件,將數(shù)據(jù)存入數(shù)據(jù)庫(kù)中,使用Delphi的報(bào)表功能即可產(chǎn)生日?qǐng)?bào)、月報(bào)及年報(bào)。
三、結(jié)束語(yǔ)
(—)在Delphi環(huán)境下用MSComm®件成功地設(shè)計(jì)了稱(chēng)重儀表與監(jiān)測(cè)主機(jī)之間的串行通信程序。實(shí)踐表明,Delphi力吐好的通信控制(如MSComm)來(lái)進(jìn)行串行通信程序的幵發(fā)不失為一種好的方式。
(二)本實(shí)例已投入實(shí)際使用,它雖然只是針對(duì)稱(chēng)重儀表的協(xié)議編寫(xiě)的,但其方法和步驟完全適用于其它儀器設(shè)備。實(shí)踐證明,這種方法是簡(jiǎn)單、可靠、可擴(kuò)充好,具有一定的通用性。
本文源于網(wǎng)絡(luò)轉(zhuǎn)載,如有侵權(quán),請(qǐng)聯(lián)系刪除