張玉亮 雷 革 徐廣磊 朱 鵬
(中國(guó)科學(xué)院高能物理研究所 北京 100049)
EPICS(Experimental physics and industrial control system)[1]軟件應(yīng)用于粒子加速器、大型射電天文望遠(yuǎn)鏡及飛機(jī)工業(yè)等領(lǐng)域。其組成包括運(yùn)行在客戶端的操作員接口模塊OPI(Operator inter face)、運(yùn)行在服務(wù)器端的輸入輸出控制模塊 IOC(Input output controller)和網(wǎng)絡(luò)通訊模塊 CA(Channel access),它們以客戶/服務(wù)器模式工作在網(wǎng)絡(luò)環(huán)境中。
CA(Channel access)就像客戶端和數(shù)據(jù)庫(kù)之間的網(wǎng)關(guān),提供與EPICS PV(Process variable)建立網(wǎng)絡(luò)透明連接,連接建立后,CAC(Channel access client)可通過CA訪問運(yùn)行在CAS(Channel access server)[2]的PV。應(yīng)用中,每當(dāng)客戶端應(yīng)用程序調(diào)用CAC庫(kù)的任何請(qǐng)求時(shí)即會(huì)建立CAC,當(dāng)CAC的請(qǐng)求發(fā)送到CAS后,CAS的工作就是調(diào)用數(shù)據(jù)庫(kù)程序完成讀、寫或監(jiān)測(cè)等任務(wù)。
目前,大多數(shù)EPICS客戶端工具,只能和具有EPICS功能模塊的數(shù)據(jù)庫(kù)一起使用,不能和EPICS的異構(gòu)系統(tǒng)一起使用,因?yàn)檫@些EPICS客戶端工具均通過上面的方法訪問PV變量的。比如EDM,通過調(diào)用 CAC庫(kù)請(qǐng)求與服務(wù)器建立連接,而后這些連接被映射成EPICS數(shù)據(jù)庫(kù)程序請(qǐng)求來操作EPICS數(shù)據(jù)記錄(Record)或者域(Field),但是,EPICS數(shù)據(jù)庫(kù)程序請(qǐng)求只能操作EPICS數(shù)據(jù)庫(kù)。
利用CAS服務(wù)器級(jí)別的應(yīng)用程序接口(API)可解決上述問題,這種服務(wù)器級(jí)別的 API稱為PCAS(Portable channel access server)。PCAS可以和EPICS數(shù)據(jù)庫(kù)I/O程序及異構(gòu)系統(tǒng)程序建立聯(lián)系。使用PCAS可直接創(chuàng)建EPICS PV的特性,開發(fā)出專門用于特殊低優(yōu)先級(jí)任務(wù)的EPICS CA服務(wù)器程序,這樣EPICS客戶端應(yīng)用程序就可和基于PCAS的服務(wù)器進(jìn)行通信。在EPICS CAS工具CaSnooper[3]、PV Gateway[4]以及 NameServer[5]中都用到PCAS技術(shù),用來在程序中直接創(chuàng)建EPICS PV。
本文介紹PCAS的使用方法,利用PCAS開發(fā)了名為pcasdll的動(dòng)態(tài)鏈接庫(kù)。并以win32平臺(tái)為例,介紹了使用pcasdll開發(fā)的BEPCII電子槍定時(shí)插件測(cè)溫采集系統(tǒng)。
PCAS是一個(gè)具有簡(jiǎn)單類接口的C++庫(kù)[6,7],利用 API可開發(fā)具有 CA服務(wù)器功能的應(yīng)用程序—EPICS服務(wù)器工具,圖1所示為PCAS服務(wù)器工具接入EPICS示意圖??蓜?chuàng)建EPICS PV,并將用戶定義變量賦值給EPICS PV,或把EPICS PV賦值給用戶定義變量,OPI可直接通過CA訪問EPICS服務(wù)器工具中的 PV。PCAS對(duì)開發(fā)者隱藏了實(shí)現(xiàn)CA服務(wù)的全部細(xì)節(jié),PCAS中包含服務(wù)器創(chuàng)建/撤銷,PV創(chuàng)建/撤銷,響應(yīng)客戶端的PV搜索和PV讀/寫請(qǐng)求,發(fā)出PV 狀態(tài)事件等功能。
PCAS由九個(gè)類組成,每類包含多個(gè)成員函數(shù),有些成員函數(shù)是虛函數(shù),即這些函數(shù)可以在派生類中重新定義,實(shí)現(xiàn)該函數(shù)具體的功能;還有一部分成員函數(shù)是純虛函數(shù),即需在開發(fā)應(yīng)用程序時(shí),完成這些函數(shù)的實(shí)現(xiàn)。盡管如此,實(shí)現(xiàn)一個(gè)基本功能的服務(wù)器程序的代碼量很少,同時(shí)CA實(shí)現(xiàn)的復(fù)雜性也在面向?qū)ο蟮木幊填惤涌谥须[藏了。PCAS的API的九個(gè)類為:服務(wù)器類 caServer、過程變量類casPV、過程變量查詢類 pvExistReturn、過程變量創(chuàng)建類pvAttachReturn、通道訪問類casChannel;4個(gè)異步I/O類為casAsyncPVExistIO、casAsync-CreatePVIO、casAsyncReadIO、casAsyncWriteIO。
實(shí)現(xiàn)一個(gè) PCAS,須繼承前四個(gè)類的,即:實(shí)現(xiàn)caServer、casPV、pvExistReturn、pvAttachReturn的派生類。另外,casChannel類輔助實(shí)現(xiàn)CA訪問控制功能,異步I/O類可以實(shí)現(xiàn)異步讀寫操作功能。
圖1 PCAS服務(wù)器工具接入EPICS示意圖Fig.1 Schematics of the PCAS server tool porting to EPICS.
為方便使用EPICS PCAS開發(fā)應(yīng)用程序,利用PCAS開發(fā)了名為pcasdll的動(dòng)態(tài)鏈接庫(kù)[6–8],pcasdll程序源代碼可在linux平臺(tái)或Win32平臺(tái)上編譯,分別生成linux平臺(tái)或windows平臺(tái)的動(dòng)態(tài)鏈接庫(kù),實(shí)現(xiàn)跨平臺(tái)使用。pcasdll基于EPICS Base3.14.x (Base 3.14系列)開發(fā),共包含七個(gè)類:Server、Record、Field、EnumRecord、StringRecord、Num-Record和exChannel。
Server類從caServer類繼承而來,主要實(shí)現(xiàn)注冊(cè)Record(本地變量)至RecordTable,關(guān)聯(lián)EPICS PV至Record,響應(yīng)Client端對(duì)EPICS PV查詢的功能;Field類從casPV類繼承而來,主要實(shí)現(xiàn)創(chuàng)建EPICS PV,響應(yīng)Client端EPICS PV讀/寫請(qǐng)求,返回EPICS PV屬性的功能;exChannel類從casChannel類繼承而來,用來實(shí)現(xiàn)EPICS PV的訪問控制功能;Record類主要實(shí)現(xiàn)保存Record的值與屬性,對(duì)Record值與屬性進(jìn)行操作,發(fā)送EPICS狀態(tài)事件,注冊(cè)/撤銷Field(EPICS PV),實(shí)現(xiàn)寫EPICS PV時(shí)的callback機(jī)制等功能;EnumRecord、NumRecord和String-Record繼承于 Record類,分別用來實(shí)現(xiàn)對(duì)枚舉類型、數(shù)字類型和字符串類型Record的支持。
pcasdll的實(shí)現(xiàn)框圖如圖2。在pcasdll設(shè)計(jì)中,Record的名字放在map型變量RecordTable中,調(diào)用pcasdll開發(fā)的應(yīng)用程序,每生成一個(gè)xxxRecord實(shí)例,其基類 Record的構(gòu)造函數(shù)通過調(diào)用 Server類成員registerRecord(),把xxxRecord實(shí)例名字置于 RecordTable中。當(dāng)應(yīng)用程序收到來自客戶端的PV查詢請(qǐng)求時(shí),通過調(diào)用Server類成員函數(shù)pvExist-Test(),檢查應(yīng)用程序的RecordTable中是否擁有該名字。若有,則返回pverExistsHere,并調(diào)用Server類成員函數(shù)pvAttach()創(chuàng)建一個(gè)EPICS PV與該名字關(guān)聯(lián),這樣就建立了EPICS PV與應(yīng)用程序本地變量的聯(lián)系;若無,則返回pverDoesNotExistHere。
圖2 pcasdll實(shí)現(xiàn)框圖Fig.2 Implementation block diagram of pcasdll.
pcasdll對(duì)于PV的書寫格式,采取類似EPICS數(shù)據(jù)庫(kù)中PV“Record.Field”的形式,在Record類中,保存了與PV值與屬性。當(dāng)客戶端軟件請(qǐng)求讀/寫PV時(shí),pcasdll首先調(diào)用Field類成員函數(shù)read()/write(),根據(jù)Client請(qǐng)求數(shù)據(jù)的類型,繼而調(diào)用Record類成員函數(shù)readxx()或writexx()來讀/寫PV屬性,如函數(shù)readValue()和wirteValue()分別用來讀取PV的值和向PV寫入值。若Client請(qǐng)求的數(shù)據(jù)類型在Record中未找到,則返回S_casApp_noSupport。
pcasdll提供接口函數(shù)setxxx()和getxxx(),用來獲取當(dāng)前PV值或設(shè)定PV值。用戶調(diào)用pcasdll開發(fā)的應(yīng)用程序,通過調(diào)用函數(shù) setxxx(),把應(yīng)用程序的本地變量值賦給EPICS PV變量,或用getxxx()函數(shù)獲取 EPICS PV的值。其中函數(shù) setxxx()和getxxx()可根據(jù)PV不同的屬性,進(jìn)行選擇調(diào)用。比如:函數(shù)setval()和getval用于給PV賦值和獲取PV值;函數(shù) setHihi()和 getHihi()用于設(shè)置和獲取 PV最高、最低報(bào)警界限。
pcasdll實(shí)現(xiàn)了 EPICS的 callback機(jī)制和postEvent機(jī)制。當(dāng)客戶端通過CA改變了PV值或?qū)傩灾担ㄟ^調(diào)用函數(shù)doWriteCallback()對(duì)應(yīng)用程序進(jìn)行通知,修改相應(yīng)的本地變量;當(dāng)應(yīng)用程序通過setxxx()函數(shù)改變了PV值或?qū)傩灾?,通過調(diào)用函數(shù)postEvents()向客戶端發(fā)送EPICS事件通知,以實(shí)現(xiàn)客戶端程序和本地應(yīng)用程序數(shù)據(jù)的同步更新。
為檢測(cè)pcasdll的CA響應(yīng)性能,選取同為運(yùn)行在非實(shí)時(shí)操作系統(tǒng)上的EPICS SoftIOC服務(wù)器程序作為比較對(duì)象,利用catime工具對(duì)PCAS服務(wù)器與SoftIOC進(jìn)行CA訪問測(cè)試。測(cè)試中,PCAS服務(wù)器與SoftIOC運(yùn)行在同一臺(tái)運(yùn)行Windows XP系統(tǒng)的機(jī)器上,運(yùn)行了100個(gè)EPICS PV,catime工具運(yùn)行在與 Windows機(jī)器網(wǎng)線插于同一個(gè)交換機(jī)中的一臺(tái)運(yùn)行Linux Redhat enterprise 4.0操作系統(tǒng)機(jī)器上。利用catime分別對(duì)兩個(gè)EPICS服務(wù)器中的其中一個(gè)PV進(jìn)行10000次CA測(cè)試,選取網(wǎng)絡(luò)速度近似相等的測(cè)試結(jié)果進(jìn)行比較,對(duì)單精度、字符串和雙精度型數(shù)據(jù)同步訪問測(cè)試結(jié)果如表 1所示,可以看到PCAS服務(wù)器和SoftIOC對(duì)CA同步訪問響應(yīng)性能基本上一致。
表1 PCAS與SoftIOC CA測(cè)試結(jié)果對(duì)比Table 1 CA test comparison between PCAS and SoftIOC.
BEPCII電子槍定時(shí)插件溫度數(shù)據(jù)采集系統(tǒng)結(jié)構(gòu)如圖3所示,此程序運(yùn)行于一臺(tái)運(yùn)行Windows XP系統(tǒng)的Tektronix示波器上,負(fù)責(zé)讀取示波器測(cè)量的電子槍觸發(fā)信號(hào)抖動(dòng)值。由于Tektronix示波器運(yùn)行Windows XP系統(tǒng),程序開發(fā)中使用了 pcasdll的win32版本,即pcasdll.dll。數(shù)據(jù)采集程序通過串口讀取溫度數(shù)據(jù),在采集程序內(nèi)部利用PCAS把溫度數(shù)據(jù)賦值給 EPICS PV,從而實(shí)現(xiàn)溫度數(shù)據(jù)通過EPICS進(jìn)行實(shí)時(shí)監(jiān)測(cè)。圖4為通過EPICS Archiver-Viewer查詢到的溫度歷史數(shù)據(jù)。
圖3 BEPCII電子槍定時(shí)插件測(cè)溫采集系統(tǒng)Fig.3 Temperature measurement of timing module for electron-gun of BEPCII.
圖4 BEPCII電子槍定時(shí)插件溫度歷史數(shù)據(jù)Fig.4 History temperature of timing module for electron-gun of BEPCII.
介紹了EPICS PCAS類庫(kù)接口,并研究了如何利用PCAS把EPICS異構(gòu)系統(tǒng)接入EPICS中。為方便使用PCAS類庫(kù),開發(fā)了基于PCAS的動(dòng)態(tài)鏈接庫(kù)pcasdll,pcasdll源代碼可在linux平臺(tái)和win32平臺(tái)編譯,實(shí)現(xiàn)了跨平臺(tái)使用。此外,還對(duì) PCAS服務(wù)器進(jìn)行了CA訪問測(cè)試,其CA同步訪問響應(yīng)和SoftIOC性能相當(dāng)。
對(duì)于EPICS異構(gòu)系統(tǒng),可使用PCAS把本地程序接入EPICS中。利用PCAS開發(fā)應(yīng)用程序,方便靈活、易于移植,極大降低了軟件開發(fā)周期和系統(tǒng)開發(fā)成本。本文利用 pcasdll動(dòng)態(tài)鏈接庫(kù)開發(fā)了BEPCII電子槍定時(shí)插件溫度數(shù)據(jù)采集系統(tǒng),經(jīng)長(zhǎng)時(shí)間檢測(cè),其運(yùn)行穩(wěn)定,可很好滿足調(diào)束人員的需求。
1 http://www.aps.anl.gov/epics/, 2012
2 http://www.aps.anl.gov/epics/extensions/cas/index.php, 2012
3 http://www.aps.anl.gov/epics/extensions/caSnooper/index. php, 2012
4 http://www.aps.anl.gov/epics/extensions/gateway/index. php, 2012
5 http://www.aps.anl.gov/epics/extensions/nameserver/inde x.php, 2012
6 Philip Stanley. Channel access portable server API tutorial, 1999, http://www.aps.anl.gov/epics/extensions/cas/index.php, 2012
7 Philip Stanley. Channel access portable server reference guide, 1997, http://www.aps.anl.gov/epics/extensions/cas/index.php, 2012
8 http://www.aps.anl.gov/epics/EpicsDocumentation/Epics General/gddref2.html, 2012