0 引 言
可編程計(jì)算機(jī)控制器( PCC: Programmable Computer Controller) 以其可靠性高、開發(fā)周期短、配置靈活、功能強(qiáng)大而在工業(yè)控制領(lǐng)域得到越來(lái)越廣泛的應(yīng)用。由于其能適應(yīng)惡劣的工業(yè)現(xiàn)場(chǎng),因此多被作為集散控制系統(tǒng)的下位機(jī)使用。但PCC的顯示功能較差, 因此將PC與PCC 結(jié)合起來(lái)構(gòu)成了總線式的集散控制系統(tǒng), 充分利用PC機(jī)強(qiáng)大的人機(jī)接口功能、豐富的系統(tǒng)軟件, 用圖形化界面實(shí)現(xiàn)了對(duì)整個(gè)系統(tǒng)的實(shí)時(shí)監(jiān)控。其中各設(shè)備間的通信是系統(tǒng)實(shí)現(xiàn)的關(guān)鍵。RS-232 接口是計(jì)算機(jī)及PCC共同具有的, 利用貝加萊公司的幀驅(qū)動(dòng)器并加入一些輔助電路及相應(yīng)通信程序即可構(gòu)造基于RS-232的總線式多機(jī)通信網(wǎng)絡(luò)。實(shí)驗(yàn)證明, 該網(wǎng)絡(luò)具有硬件實(shí)現(xiàn)簡(jiǎn)單、系統(tǒng)可靠、抗干擾能力強(qiáng)的特點(diǎn)。
1 多機(jī)實(shí)時(shí)通信的硬件實(shí)現(xiàn)
PC/ PCC 總線式集散控制系統(tǒng)的總體結(jié)構(gòu)如圖1 所示。

圖1 計(jì)算機(jī)與多臺(tái)PCC 組成的集散控制系統(tǒng)
系統(tǒng)采用RS-232 串行通信方式實(shí)現(xiàn)了上位機(jī)對(duì)整個(gè)系統(tǒng)的實(shí)時(shí)監(jiān)控, 同時(shí)為了提高硬件穩(wěn)定性,優(yōu)化系統(tǒng)工作性能, 本文采用硬件仲裁電路來(lái)實(shí)現(xiàn)數(shù)據(jù)總線的分配, 并合理解決了數(shù)據(jù)沖突問(wèn)題, 簡(jiǎn)化了軟件設(shè)計(jì), 提高了系統(tǒng)可靠性和抗干擾能力。
1.1 RS-232 多機(jī)通信機(jī)制
普通的RS-232采用點(diǎn)對(duì)點(diǎn)串行數(shù)據(jù)傳輸方式, 無(wú)法滿足多設(shè)備之間的實(shí)時(shí)通信, 因此需要對(duì)其連接方式作一些改進(jìn)。RS-232的點(diǎn)對(duì)點(diǎn)通信是將接口的數(shù)據(jù)發(fā)送端(TXD)連接到另一方的數(shù)據(jù)接收端(RXD) , RXD與另一方的TXD相連,雙方的地線端(GND)直接相連。但在計(jì)算機(jī)與多臺(tái)PCC相連時(shí)則發(fā)生了一些變化。如圖2所示,計(jì)算機(jī)的數(shù)據(jù)發(fā)送端直接連接到各PCC的數(shù)據(jù)接收端, 地端直接與各PCC的地端相連, 但各PCC的數(shù)據(jù)發(fā)送端不能同時(shí)連接到計(jì)算機(jī)的數(shù)據(jù)接收端, 因?yàn)閿?shù)據(jù)發(fā)送端在無(wú)數(shù)據(jù)發(fā)送時(shí)為高電平,而發(fā)送的數(shù)據(jù)為高低電平組成的脈沖序列, 直接將兩個(gè)或多個(gè)數(shù)據(jù)發(fā)送端連接到一起接入計(jì)算機(jī), 則會(huì)造成其數(shù)據(jù)接收端電平的不確定, 產(chǎn)生了數(shù)據(jù)沖突問(wèn)題。為了解決上述問(wèn)題設(shè)計(jì)了專門的硬件仲裁電路, 將各PCC的TXD 以及數(shù)據(jù)發(fā)送請(qǐng)求端(DTR)接入, 再將仲裁電路輸出端連接到計(jì)算機(jī)的數(shù)據(jù)接收端。

圖2 RS-232 多機(jī)通信連接示意圖
1.2 仲裁電路結(jié)構(gòu)與工作原理
由于上位機(jī)(PC)的發(fā)送端為一對(duì)多廣播式發(fā)送, 所以上位機(jī)發(fā)送的數(shù)據(jù)幀所有的下位機(jī)( PCC)
均可以接收到, 至于數(shù)據(jù)幀由哪一臺(tái)下位機(jī)接收則由通信協(xié)議中的目的地址ID判定。但對(duì)于下位機(jī),其發(fā)送端為多對(duì)一連接, 如直接將其相連, 則會(huì)發(fā)生數(shù)據(jù)沖突。圖3 所示的仲裁電路可以確保每次只有一臺(tái)下位機(jī)能夠發(fā)送數(shù)據(jù)到上位機(jī)的數(shù)據(jù)接收線上。應(yīng)注意的是, RS-232 接口使用的高低電平與TTL 中的高、低電平不同, 需進(jìn)行電平轉(zhuǎn)換。

圖3 下位機(jī)發(fā)送數(shù)據(jù)仲裁電路
圖3 以三路PCC 為例說(shuō)明。各下位機(jī)初始化時(shí)均將其DTR 設(shè)置為低電平, 因?yàn)榕c門1 、2 、3
均有低電平輸入, 所以初始化后A、B、C 三點(diǎn)均為低電平, 并且與門4 、5 、6 也一直輸出低電平。假設(shè)下位機(jī)1 是第一臺(tái)要發(fā)送數(shù)據(jù)的下位機(jī), 發(fā)送前先將自己的DTR 端口設(shè)置為高電平, 而此時(shí)B、C 兩點(diǎn)仍為低電平, 經(jīng)反相器后變?yōu)楦唠娖捷斎肱c門1 , 所以與門1 的輸出A 點(diǎn)電平也為高, 此時(shí)數(shù)據(jù)發(fā)送服務(wù)程序讀取數(shù)據(jù)發(fā)送查詢端(DSR) 電平狀態(tài)(即A 點(diǎn)電平狀態(tài)) 為"1", 說(shuō)明總線未被占用,處于空閑狀態(tài)。由于下位機(jī)1 的DTR 端口已被置高, 且查詢得知總線空閑, 則其DTR 端口不變?nèi)匀辉O(shè)置為高電平, 這樣下位機(jī)1 就占用了總線, 可以開始發(fā)送數(shù)據(jù)。數(shù)據(jù)由TXD 端經(jīng)過(guò)與門4 后輸入上位機(jī)的RXD 端, 由于此時(shí)A 點(diǎn)電平為高, 保證了數(shù)據(jù)經(jīng)過(guò)與門4 后沒(méi)有失真直接上傳至上位機(jī), 同時(shí)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), 可以供給下一個(gè)要發(fā)送數(shù)據(jù)的下位機(jī)使用。假設(shè)下位機(jī)1 發(fā)送數(shù)據(jù)的過(guò)程中, 下位機(jī)2 也要發(fā)送數(shù)據(jù), 同樣先將自己的DTR 端口置高, 但此時(shí)A 點(diǎn)電平為高, 經(jīng)反相器后輸入與門2 , 所以與門2 的輸出B 點(diǎn)仍為低電平, 程序讀取DSR 端口電平(即B 點(diǎn)電平) 為"0", 說(shuō)明總線已被占用, 因此將DTR 端口重新置低, 等待下次查詢, 這樣就避免了兩臺(tái)下位機(jī)同時(shí)上傳數(shù)據(jù)。下一個(gè)查詢周期未到時(shí), 程序持續(xù)查詢是否有更高優(yōu)先級(jí)的任務(wù)標(biāo)志位置位, 有則調(diào)用相應(yīng)的任務(wù)服務(wù)程序, 沒(méi)有則重復(fù)查詢各標(biāo)志位直至下一個(gè)查詢周期到來(lái); 下一個(gè)查詢周期到來(lái)后,重復(fù)一次置高DTR 端口、讀取DSR 端口的過(guò)程以判斷總線狀態(tài), 空閑則DTR 端口保持高電平占用總線并發(fā)送數(shù)據(jù), 否則置低DTR 端口, 等待下次查詢。下位機(jī)2 重復(fù)上述過(guò)程直至查詢到總線空閑并占用總線以發(fā)送數(shù)據(jù)。
不同類型的數(shù)據(jù)發(fā)送其優(yōu)先級(jí)也不同, 數(shù)據(jù)發(fā)送任務(wù)的優(yōu)先級(jí)越高, 查詢周期就越短, 保證了系統(tǒng)通信的實(shí)時(shí)性。由于各發(fā)送方在發(fā)送時(shí)間上存在差異, 首先查詢到總線空閑的下位機(jī)得以使用數(shù)據(jù)總線, 在發(fā)送數(shù)據(jù)前已將其DTR 由低電平轉(zhuǎn)為高電平, 仲裁電路將總線狀態(tài)轉(zhuǎn)為忙碌, 避免其余下位機(jī)同時(shí)使用總線造成數(shù)據(jù)沖突。當(dāng)數(shù)據(jù)傳輸結(jié)束則將DTR 轉(zhuǎn)為低電平, 仲裁電路將總線狀態(tài)轉(zhuǎn)為空閑。由于PC 為一對(duì)多發(fā)送, 下位機(jī)通過(guò)仲裁機(jī)制鎖死總線只是保證同一時(shí)刻數(shù)據(jù)上傳總線上只有一臺(tái)PCC 向PC 發(fā)送數(shù)據(jù), 并不會(huì)影響PC 通過(guò)數(shù)據(jù)下行總線發(fā)送數(shù)據(jù)到各PCC , 從而實(shí)現(xiàn)了總線的合理分配, 解決了數(shù)據(jù)沖突問(wèn)題。
2 多機(jī)實(shí)時(shí)通信的軟件實(shí)現(xiàn)
2.1 RS-232 的數(shù)據(jù)傳輸格式
RS-232 的數(shù)據(jù)是以字節(jié)的形式發(fā)送的, 一次發(fā)送一個(gè)字節(jié), 其數(shù)據(jù)傳輸格式如圖4 所示。

圖4 RS-232 數(shù)據(jù)傳輸格式
包含一個(gè)起始位、8 個(gè)數(shù)據(jù)位以及一個(gè)校驗(yàn)位和停止位, 數(shù)據(jù)位為所發(fā)送的對(duì)象, 而數(shù)據(jù)幀則是多個(gè)字節(jié)按一定格式打包而成的一個(gè)字節(jié)序列, 以字節(jié)流形式發(fā)送。
2.2 幀驅(qū)動(dòng)器
幀驅(qū)動(dòng)器是貝加萊公司為實(shí)現(xiàn)與第三方設(shè)備之間進(jìn)行通信而設(shè)計(jì)的軟件工具箱, 存放在PCC 應(yīng)用程序ROM 中, 完全控制了通信的硬件部分而不改變幀的形式。通常數(shù)據(jù)通信, 對(duì)數(shù)據(jù)進(jìn)行讀寫操作, 用戶必須對(duì)端口的細(xì)節(jié)了解很清楚, 才能通過(guò)編程實(shí)現(xiàn)對(duì)接口各管腳進(jìn)行操作。而幀驅(qū)動(dòng)器將這些操作集中起來(lái), 用戶只需要了解第三方產(chǎn)品的通信協(xié)議細(xì)節(jié)(包括信息幀格式的組成等) , 并用幀驅(qū)動(dòng)器寫出與第三方產(chǎn)品通信協(xié)議一樣的通信規(guī)約,就可方便地實(shí)現(xiàn)PCC 與第三方產(chǎn)品之間的通信。同時(shí), 幀驅(qū)動(dòng)器支持RS-232 、RS-422 、RS-485 、CAN 等接口, 因此軟件中只要稍微作些改動(dòng), 便可支持不同的接口進(jìn)行數(shù)據(jù)通信, 具有可擴(kuò)展性和廣泛的應(yīng)用前景。
2.3 通信協(xié)議制定
PC 和PCC 以及PCC 之間能進(jìn)行通信首先需要制定一個(gè)合理的通信協(xié)議, 才能進(jìn)行通信。為此本著充分利用資源、結(jié)構(gòu)簡(jiǎn)單、可擴(kuò)充性強(qiáng)的原則定義了數(shù)據(jù)幀的結(jié)構(gòu)。對(duì)于數(shù)據(jù)幀的格式, 考慮到組網(wǎng)以及適應(yīng)不同通信接口的需要做了如表1 定義。
表1 數(shù)據(jù)幀的格式定義
目的
ID
|
源ID |
命令字
|
幀數(shù) |
DAT
A1
|
DAT
A2
|
... |
DAT
An
|
校驗(yàn)
位
|
停止
位
|
目的ID 和源ID 均分配一個(gè)字節(jié), 用于標(biāo)志數(shù)據(jù)幀的接收設(shè)備和發(fā)送設(shè)備, 以便接收設(shè)備判斷接收和發(fā)生接收錯(cuò)誤時(shí)呼叫發(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ā)送的是第幾個(gè)數(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ù)后返回一個(gè)應(yīng)答幀加以確認(rèn), 發(fā)送機(jī)收到此幀再發(fā)送下一幀數(shù)據(jù), 如無(wú)應(yīng)答則周期循環(huán)發(fā)送同一幀, 如超時(shí)未應(yīng)答則向上位機(jī)發(fā)送數(shù)據(jù)幀報(bào)錯(cuò), 上位機(jī)接收后顯示發(fā)送與接收設(shè)備ID及錯(cuò)誤類別并報(bào)警以提示監(jiān)控人員排除錯(cuò)誤。
2.4 系統(tǒng)內(nèi)各設(shè)備間的通信
?、貾C 與PCC 之間的通信。PC 向下位機(jī)發(fā)送數(shù)據(jù)幀采用廣播式, 但只有符合目標(biāo)地址ID 的下
位機(jī)能夠接受, 而下位機(jī)采用仲裁機(jī)制向上位機(jī)發(fā)送數(shù)據(jù)。
②PCC 與PCC 之間的通信。PCC 與PCC 之間是通過(guò)PC 以數(shù)據(jù)轉(zhuǎn)發(fā)的形式進(jìn)行數(shù)據(jù)幀傳送
的。當(dāng)監(jiān)控計(jì)算機(jī)收到不是以自己為目的地址的數(shù)據(jù)幀時(shí), 直接將其送入數(shù)據(jù)傳送總線由目的PCC判斷接受。
2.5 基于C語(yǔ)言的PCC數(shù)據(jù)通信的實(shí)現(xiàn)及程序流程圖
?、傧挛粰C(jī)編程。使用貝加萊公司提供的標(biāo)準(zhǔn)PC。
PCC 發(fā)送程序流程如圖5 (a) 所示。PC 發(fā)送程序流程由于為一對(duì)多廣播式發(fā)送, 省略查詢總線過(guò)程, 直接發(fā)送即可。PC 接收程序流程如圖5 (b) 所示。PCC 接收程序流程基本與PC 接收程序流程一致, 但在判斷接收數(shù)據(jù)幀目的ID 與本機(jī)ID 不符后, PCC 直接退出事件觸發(fā)服務(wù)程序返回, 而PC則將得到的數(shù)據(jù)幀發(fā)送給各下位機(jī)以使目的PCC 接收該數(shù)據(jù)幀。

圖5 程序流程圖
?、谏衔粰C(jī)編程。使用Visual Basic , 流程中需要發(fā)送數(shù)據(jù)或命令只要按定義好的通信協(xié)議進(jìn)行數(shù)據(jù)裝幀并調(diào)用數(shù)據(jù)發(fā)送程序?qū)⑵渫ㄟ^(guò)串行口發(fā)送即可。為了實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)接收, 在VB 工程中導(dǎo)入了PComm Pro (此軟件借助Windows API 函數(shù)的調(diào)用來(lái)控制使用串行通信端口) 的通信函數(shù)庫(kù)和控件以實(shí)現(xiàn)接受數(shù)據(jù)的實(shí)時(shí)觸發(fā)。事件的觸發(fā)除了定時(shí)器或循環(huán)的輪詢(Polling) 方式外, 還可以使用回調(diào)函數(shù)(CallBack Function) 實(shí)現(xiàn)。PComm 針對(duì)事件的處理就是采用回調(diào)函數(shù)的方式處理, 欲建立事件, 需給定一個(gè)函數(shù)的地址, 當(dāng)事件發(fā)生時(shí), 便到該回調(diào)函數(shù)所在地址去執(zhí)行該程序代碼。因此定義了回調(diào)函數(shù)作為接受數(shù)據(jù)的事件觸發(fā)服務(wù)程序, 當(dāng)接受數(shù)據(jù)事件發(fā)生時(shí)便執(zhí)行該事件觸發(fā)程序, 保存接受到的數(shù)據(jù), 并按協(xié)議進(jìn)行數(shù)據(jù)幀的解包, 將數(shù)據(jù)取出并作相應(yīng)處理顯示在監(jiān)視器上, 以便實(shí)時(shí)監(jiān)控, 或執(zhí)行相應(yīng)的命令。
多機(jī)實(shí)時(shí)通信測(cè)試程序?qū)嶒?yàn)結(jié)果如圖6 所示。

圖6 多機(jī)實(shí)時(shí)通信測(cè)試程序?qū)嶒?yàn)結(jié)果
3 結(jié)束語(yǔ)
本文利用硬件仲裁電路巧妙地實(shí)現(xiàn)了數(shù)據(jù)總線分配, 解決了數(shù)據(jù)沖突問(wèn)題, 簡(jiǎn)化了系統(tǒng)設(shè)計(jì), 優(yōu)化了系統(tǒng)性能。通過(guò)PCC 與PC 的有機(jī)結(jié)合, 構(gòu)成了基于RS-232 的總線式集散控制系統(tǒng), 充分利用了PCC 和PC 的優(yōu)點(diǎn), 用可視化的圖形界面實(shí)現(xiàn)對(duì)整個(gè)系統(tǒng)的實(shí)時(shí)監(jiān)控。實(shí)驗(yàn)證明, 系統(tǒng)運(yùn)行良好, 監(jiān)控準(zhǔn)確無(wú)誤, 還可應(yīng)用于其它分布式測(cè)控系統(tǒng)和類似系統(tǒng), 具有一定的工程應(yīng)用價(jià)值。
參考文獻(xiàn)
[1] 齊蓉.可編程計(jì)算機(jī)控制器原理及應(yīng)用[M] .西安: 西北工業(yè)大學(xué)出版社, 2002。
[2] 齊蓉. 可編程計(jì)算機(jī)控制器高級(jí)技術(shù)[M] . 西安:西北工業(yè)大學(xué)出版社, 2002。
[3] 范逸之. Visual Basic 與分布式監(jiān)控系統(tǒng)[ M] . 北京: 清華大學(xué)出版社, 2002。
[4] 楊寧. 趙玉剛. 集散控制系統(tǒng)及現(xiàn)場(chǎng)總線[M] . 北京: 北京航空航天大學(xué)出版社, 2003。
[5] 范逸之,陳立元. Visual Basic 與RS-232 串行通信控制[M] . 北京: 清華大學(xué)出版社, 2002。
作者簡(jiǎn)介:
高 飛(1980) , 男, 碩士研究生, 從事計(jì)算機(jī)測(cè)量與控制方面的研究;
林 輝(1957) , 男, 教授, 主要從事電力科學(xué)方面的教學(xué)與科研工作。