0 引 言
可編程計(jì)算機(jī)控制器( PCC: Programmable Computer Controller) 以其可靠性高、開發(fā)周期短、配置靈活、功能強(qiáng)大而在工業(yè)控制領(lǐng)域得到越來越廣泛的應(yīng)用。由于其能適應(yīng)惡劣的工業(yè)現(xiàn)場,因此多被作為集散控制系統(tǒng)的下位機(jī)使用。但PCC的顯示功能較差, 因此將PC與PCC 結(jié)合起來構(gòu)成了總線式的集散控制系統(tǒng), 充分利用PC機(jī)強(qiáng)大的人機(jī)接口功能、豐富的系統(tǒng)軟件, 用圖形化界面實(shí)現(xiàn)了對整個系統(tǒng)的實(shí)時監(jiān)控。其中各設(shè)備間的通信是系統(tǒng)實(shí)現(xiàn)的關(guān)鍵。RS-232 接口是計(jì)算機(jī)及PCC共同具有的, 利用貝加萊公司的幀驅(qū)動器并加入一些輔助電路及相應(yīng)通信程序即可構(gòu)造基于RS-232的總線式多機(jī)通信網(wǎng)絡(luò)。實(shí)驗(yàn)證明, 該網(wǎng)絡(luò)具有硬件實(shí)現(xiàn)簡單、系統(tǒng)可靠、抗干擾能力強(qiáng)的特點(diǎn)。
1 多機(jī)實(shí)時通信的硬件實(shí)現(xiàn)
PC/ PCC 總線式集散控制系統(tǒng)的總體結(jié)構(gòu)如圖1 所示。
圖1 計(jì)算機(jī)與多臺PCC 組成的集散控制系統(tǒng)
系統(tǒng)采用RS-232 串行通信方式實(shí)現(xiàn)了上位機(jī)對整個系統(tǒng)的實(shí)時監(jiān)控, 同時為了提高硬件穩(wěn)定性,優(yōu)化系統(tǒng)工作性能, 本文采用硬件仲裁電路來實(shí)現(xiàn)數(shù)據(jù)總線的分配, 并合理解決了數(shù)據(jù)沖突問題, 簡化了軟件設(shè)計(jì), 提高了系統(tǒng)可靠性和抗干擾能力。
1.1 RS-232 多機(jī)通信機(jī)制
普通的RS-232采用點(diǎn)對點(diǎn)串行數(shù)據(jù)傳輸方式, 無法滿足多設(shè)備之間的實(shí)時通信, 因此需要對其連接方式作一些改進(jìn)。RS-232的點(diǎn)對點(diǎn)通信是將接口的數(shù)據(jù)發(fā)送端(TXD)連接到另一方的數(shù)據(jù)接收端(RXD) , RXD與另一方的TXD相連,雙方的地線端(GND)直接相連。但在計(jì)算機(jī)與多臺PCC相連時則發(fā)生了一些變化。如圖2所示,計(jì)算機(jī)的數(shù)據(jù)發(fā)送端直接連接到各PCC的數(shù)據(jù)接收端, 地端直接與各PCC的地端相連, 但各PCC的數(shù)據(jù)發(fā)送端不能同時連接到計(jì)算機(jī)的數(shù)據(jù)接收端, 因?yàn)閿?shù)據(jù)發(fā)送端在無數(shù)據(jù)發(fā)送時為高電平,而發(fā)送的數(shù)據(jù)為高低電平組成的脈沖序列, 直接將兩個或多個數(shù)據(jù)發(fā)送端連接到一起接入計(jì)算機(jī), 則會造成其數(shù)據(jù)接收端電平的不確定, 產(chǎn)生了數(shù)據(jù)沖突問題。為了解決上述問題設(shè)計(jì)了專門的硬件仲裁電路, 將各PCC的TXD 以及數(shù)據(jù)發(fā)送請求端(DTR)接入, 再將仲裁電路輸出端連接到計(jì)算機(jī)的數(shù)據(jù)接收端。
圖2 RS-232 多機(jī)通信連接示意圖
1.2 仲裁電路結(jié)構(gòu)與工作原理
由于上位機(jī)(PC)的發(fā)送端為一對多廣播式發(fā)送, 所以上位機(jī)發(fā)送的數(shù)據(jù)幀所有的下位機(jī)( PCC)均可以接收到, 至于數(shù)據(jù)幀由哪一臺下位機(jī)接收則由通信協(xié)議中的目的地址ID判定。但對于下位機(jī),其發(fā)送端為多對一連接, 如直接將其相連, 則會發(fā)生數(shù)據(jù)沖突。圖3 所示的仲裁電路可以確保每次只有一臺下位機(jī)能夠發(fā)送數(shù)據(jù)到上位機(jī)的數(shù)據(jù)接收線上。應(yīng)注意的是, RS-232 接口使用的高低電平與TTL 中的高、低電平不同, 需進(jìn)行電平轉(zhuǎn)換。
圖3 下位機(jī)發(fā)送數(shù)據(jù)仲裁電路
圖3 以三路PCC 為例說明。各下位機(jī)初始化時均將其DTR 設(shè)置為低電平, 因?yàn)榕c門1 、2 、3均有低電平輸入, 所以初始化后A、B、C 三點(diǎn)均為低電平, 并且與門4 、5 、6 也一直輸出低電平。假設(shè)下位機(jī)1 是第一臺要發(fā)送數(shù)據(jù)的下位機(jī), 發(fā)送前先將自己的DTR 端口設(shè)置為高電平, 而此時B、C 兩點(diǎn)仍為低電平, 經(jīng)反相器后變?yōu)楦唠娖捷斎肱c門1 , 所以與門1 的輸出A 點(diǎn)電平也為高, 此時數(shù)據(jù)發(fā)送服務(wù)程序讀取數(shù)據(jù)發(fā)送查詢端(DSR) 電平狀態(tài)(即A 點(diǎn)電平狀態(tài)) 為“1”, 說明總線未被占用,處于空閑狀態(tài)。由于下位機(jī)1 的DTR 端口已被置高, 且查詢得知總線空閑, 則其DTR 端口不變?nèi)匀辉O(shè)置為高電平, 這樣下位機(jī)1 就占用了總線, 可以開始發(fā)送數(shù)據(jù)。數(shù)據(jù)由TXD 端經(jīng)過與門4 后輸入上位機(jī)的RXD 端, 由于此時A 點(diǎn)電平為高, 保證了數(shù)據(jù)經(jīng)過與門4 后沒有失真直接上傳至上位機(jī), 同時A 點(diǎn)電平經(jīng)反相器后變?yōu)榈碗娖捷斎肱c門2 、3 , 故B、C 兩點(diǎn)電平為低, 與門5 、6 始終輸出低電平, 避免了數(shù)據(jù)沖突。當(dāng)下位機(jī)1 數(shù)據(jù)發(fā)送完畢后將其DTR 端口置低, A 點(diǎn)電平變低, 釋放了總線, 又回到初始化后的狀態(tài), 可以供給下一個要發(fā)送數(shù)據(jù)的下位機(jī)使用。假設(shè)下位機(jī)1 發(fā)送數(shù)據(jù)的過程中, 下位機(jī)2 也要發(fā)送數(shù)據(jù), 同樣先將自己的DTR 端口置高, 但此時A 點(diǎn)電平為高, 經(jīng)反相器后輸入與門2 , 所以與門2 的輸出B 點(diǎn)仍為低電平, 程序讀取DSR 端口電平(即B 點(diǎn)電平) 為“0”, 說明總線已被占用, 因此將DTR 端口重新置低, 等待下次查詢, 這樣就避免了兩臺下位機(jī)同時上傳數(shù)據(jù)。下一個查詢周期未到時, 程序持續(xù)查詢是否有更高優(yōu)先級的任務(wù)標(biāo)志位置位, 有則調(diào)用相應(yīng)的任務(wù)服務(wù)程序, 沒有則重復(fù)查詢各標(biāo)志位直至下一個查詢周期到來; 下一個查詢周期到來后,重復(fù)一次置高DTR 端口、讀取DSR 端口的過程以判斷總線狀態(tài), 空閑則DTR 端口保持高電平占用總線并發(fā)送數(shù)據(jù), 否則置低DTR 端口, 等待下次查詢。下位機(jī)2 重復(fù)上述過程直至查詢到總線空閑并占用總線以發(fā)送數(shù)據(jù)。
不同類型的數(shù)據(jù)發(fā)送其優(yōu)先級也不同, 數(shù)據(jù)發(fā)送任務(wù)的優(yōu)先級越高, 查詢周期就越短, 保證了系統(tǒng)通信的實(shí)時性。由于各發(fā)送方在發(fā)送時間上存在差異, 首先查詢到總線空閑的下位機(jī)得以使用數(shù)據(jù)總線, 在發(fā)送數(shù)據(jù)前已將其DTR 由低電平轉(zhuǎn)為高電平, 仲裁電路將總線狀態(tài)轉(zhuǎn)為忙碌, 避免其余下位機(jī)同時使用總線造成數(shù)據(jù)沖突。當(dāng)數(shù)據(jù)傳輸結(jié)束則將DTR 轉(zhuǎn)為低電平, 仲裁電路將總線狀態(tài)轉(zhuǎn)為空閑。由于PC 為一對多發(fā)送, 下位機(jī)通過仲裁機(jī)制鎖死總線只是保證同一時刻數(shù)據(jù)上傳總線上只有一臺PCC 向PC 發(fā)送數(shù)據(jù), 并不會影響PC 通過數(shù)據(jù)下行總線發(fā)送數(shù)據(jù)到各PCC , 從而實(shí)現(xiàn)了總線的合理分配, 解決了數(shù)據(jù)沖突問題。
2 多機(jī)實(shí)時通信的軟件實(shí)現(xiàn)
2.1 RS-232 的數(shù)據(jù)傳輸格式
RS-232 的數(shù)據(jù)是以字節(jié)的形式發(fā)送的, 一次發(fā)送一個字節(jié), 其數(shù)據(jù)傳輸格式如圖4 所示。
圖4 RS-232 數(shù)據(jù)傳輸格式
包含一個起始位、8 個數(shù)據(jù)位以及一個校驗(yàn)位和停止位, 數(shù)據(jù)位為所發(fā)送的對象, 而數(shù)據(jù)幀則是多個字節(jié)按一定格式打包而成的一個字節(jié)序列, 以字節(jié)流形式發(fā)送。
2.2 幀驅(qū)動器
幀驅(qū)動器是貝加萊公司為實(shí)現(xiàn)與第三方設(shè)備之間進(jìn)行通信而設(shè)計(jì)的軟件工具箱, 存放在PCC 應(yīng)用程序ROM 中, 完全控制了通信的硬件部分而不改變幀的形式。通常數(shù)據(jù)通信, 對數(shù)據(jù)進(jìn)行讀寫操作, 用戶必須對端口的細(xì)節(jié)了解很清楚, 才能通過編程實(shí)現(xiàn)對接口各管腳進(jìn)行操作。而幀驅(qū)動器將這些操作集中起來, 用戶只需要了解第三方產(chǎn)品的通信協(xié)議細(xì)節(jié)(包括信息幀格式的組成等) , 并用幀驅(qū)動器寫出與第三方產(chǎn)品通信協(xié)議一樣的通信規(guī)約,就可方便地實(shí)現(xiàn)PCC 與第三方產(chǎn)品之間的通信。同時, 幀驅(qū)動器支持RS-232 、RS-422 、RS-485 、CAN 等接口, 因此軟件中只要稍微作些改動, 便可支持不同的接口進(jìn)行數(shù)據(jù)通信, 具有可擴(kuò)展性和廣泛的應(yīng)用前景。
2.3 通信協(xié)議制定
PC 和PCC 以及PCC 之間能進(jìn)行通信首先需要制定一個合理的通信協(xié)議, 才能進(jìn)行通信。為此本著充分利用資源、結(jié)構(gòu)簡單、可擴(kuò)充性強(qiáng)的原則定義了數(shù)據(jù)幀的結(jié)構(gòu)。對于數(shù)據(jù)幀的格式, 考慮到組網(wǎng)以及適應(yīng)不同通信接口的需要做了如表1 定義。
表1 數(shù)據(jù)幀的格式定義
目的ID 和源ID 均分配一個字節(jié), 用于標(biāo)志數(shù)據(jù)幀的接收設(shè)備和發(fā)送設(shè)備, 以便接收設(shè)備判斷接收和發(fā)生接收錯誤時呼叫發(fā)送設(shè)備重發(fā)。命令字給定數(shù)據(jù)幀的類型(數(shù)據(jù)或控制字) , 指明隨后的DA TA 是數(shù)據(jù)內(nèi)容還是控制字。這樣系統(tǒng)中的各設(shè)備可根據(jù)事先制定的通信協(xié)議將欲發(fā)送的控制指令或數(shù)據(jù)打包寫入DA TA 中, 或者將接受的數(shù)據(jù)幀按協(xié)議解包為控制命令并執(zhí)行或?qū)邮盏降臄?shù)據(jù)進(jìn)行處理。幀數(shù)指明了當(dāng)前發(fā)送的是第幾個數(shù)據(jù)幀, 以便于接收設(shè)備判斷是否有數(shù)據(jù)幀丟失以呼叫發(fā)送設(shè)備重發(fā)。最后判斷接收的校驗(yàn)位與自行計(jì)算校驗(yàn)位結(jié)果是否一致, 一致則進(jìn)行相應(yīng)操作, 否則丟棄該幀并呼叫發(fā)送設(shè)備重發(fā)。
為了確保數(shù)據(jù)接收的可靠性, 使用應(yīng)答方式進(jìn)行通信, 接收機(jī)接收到數(shù)據(jù)后返回一個應(yīng)答幀加以確認(rèn), 發(fā)送機(jī)收到此幀再發(fā)送下一幀數(shù)據(jù), 如無應(yīng)答則周期循環(huán)發(fā)送同一幀, 如超時未應(yīng)答則向上位機(jī)發(fā)送數(shù)據(jù)幀報(bào)錯, 上位機(jī)接收后顯示發(fā)送與接收設(shè)備ID及錯誤類別并報(bào)警以提示監(jiān)控人員排除錯誤。
2.4 系統(tǒng)內(nèi)各設(shè)備間的通信
①PC 與PCC 之間的通信。PC 向下位機(jī)發(fā)送數(shù)據(jù)幀采用廣播式, 但只有符合目標(biāo)地址ID 的下位機(jī)能夠接受, 而下位機(jī)采用仲裁機(jī)制向上位機(jī)發(fā)送數(shù)據(jù)。
②PCC 與PCC 之間的通信。PCC 與PCC 之間是通過PC 以數(shù)據(jù)轉(zhuǎn)發(fā)的形式進(jìn)行數(shù)據(jù)幀傳送的。當(dāng)監(jiān)控計(jì)算機(jī)收到不是以自己為目的地址的數(shù)據(jù)幀時, 直接將其送入數(shù)據(jù)傳送總線由目的PCC判斷接受。
2.5 基于C語言的PCC數(shù)據(jù)通信的實(shí)現(xiàn)及程序流程圖
?、傧挛粰C(jī)編程。使用貝加萊公司提供的標(biāo)準(zhǔn)PC。
PCC 發(fā)送程序流程如圖5 (a) 所示。PC 發(fā)送程序流程由于為一對多廣播式發(fā)送, 省略查詢總線過程, 直接發(fā)送即可。PC 接收程序流程如圖5 (b) 所示。PCC 接收程序流程基本與PC 接收程序流程一致, 但在判斷接收數(shù)據(jù)幀目的ID 與本機(jī)ID 不符后, PCC 直接退出事件觸發(fā)服務(wù)程序返回, 而PC則將得到的數(shù)據(jù)幀發(fā)送給各下位機(jī)以使目的PCC 接收該數(shù)據(jù)幀。
②上位機(jī)編程。使用Visual Basic , 流程中需要發(fā)送數(shù)據(jù)或命令只要按定義好的通信協(xié)議進(jìn)行數(shù)據(jù)裝幀并調(diào)用數(shù)據(jù)發(fā)送程序?qū)⑵渫ㄟ^串行口發(fā)送即可。為了實(shí)現(xiàn)數(shù)據(jù)的實(shí)時接收, 在VB 工程中導(dǎo)入了PComm Pro (此軟件借助Windows API 函數(shù)的調(diào)用來控制使用串行通信端口) 的通信函數(shù)庫和控件以實(shí)現(xiàn)接受數(shù)據(jù)的實(shí)時觸發(fā)。事件的觸發(fā)除了定時器或循環(huán)的輪詢(Polling) 方式外, 還可以使用回調(diào)函數(shù)(CallBack Function) 實(shí)現(xiàn)。PComm 針對事件的處理就是采用回調(diào)函數(shù)的方式處理, 欲建立事件, 需給定一個函數(shù)的地址, 當(dāng)事件發(fā)生時, 便到該回調(diào)函數(shù)所在地址去執(zhí)行該程序代碼。因此定義了回調(diào)函數(shù)作為接受數(shù)據(jù)的事件觸發(fā)服務(wù)程序, 當(dāng)接受數(shù)據(jù)事件發(fā)生時便執(zhí)行該事件觸發(fā)程序, 保存接受到的數(shù)據(jù), 并按協(xié)議進(jìn)行數(shù)據(jù)幀的解包, 將數(shù)據(jù)取出并作相應(yīng)處理顯示在監(jiān)視器上, 以便實(shí)時監(jiān)控, 或執(zhí)行相應(yīng)的命令。
多機(jī)實(shí)時通信測試程序?qū)嶒?yàn)結(jié)果如圖6 所示。
3 結(jié)束語
本文利用硬件仲裁電路巧妙地實(shí)現(xiàn)了數(shù)據(jù)總線分配, 解決了數(shù)據(jù)沖突問題, 簡化了系統(tǒng)設(shè)計(jì), 優(yōu)化了系統(tǒng)性能。通過PCC 與PC 的有機(jī)結(jié)合, 構(gòu)成了基于RS-232 的總線式集散控制系統(tǒng), 充分利用了PCC 和PC 的優(yōu)點(diǎn), 用可視化的圖形界面實(shí)現(xiàn)對整個系統(tǒng)的實(shí)時監(jiān)控。實(shí)驗(yàn)證明, 系統(tǒng)運(yùn)行良好, 監(jiān)控準(zhǔn)確無誤, 還可應(yīng)用于其它分布式測控系統(tǒng)和類似系統(tǒng), 具有一定的工程應(yīng)用價(jià)值。