張玉亮 雷 革 徐廣磊 朱 鵬
(中國科學院高能物理研究所 北京 100049)
EPICS(Experimental physics and industrial control system)[1]軟件應用于粒子加速器、大型射電天文望遠鏡及飛機工業等領域。其組成包括運行在客戶端的操作員接口模塊OPI(Operator inter face)、運行在服務器端的輸入輸出控制模塊 IOC(Input output controller)和網絡通訊模塊 CA(Channel access),它們以客戶/服務器模式工作在網絡環境中。
CA(Channel access)就像客戶端和數據庫之間的網關,提供與EPICS PV(Process variable)建立網絡透明連接,連接建立后,CAC(Channel access client)可通過CA訪問運行在CAS(Channel access server)[2]的PV。應用中,每當客戶端應用程序調用CAC庫的任何請求時即會建立CAC,當CAC的請求發送到CAS后,CAS的工作就是調用數據庫程序完成讀、寫或監測等任務。
目前,大多數EPICS客戶端工具,只能和具有EPICS功能模塊的數據庫一起使用,不能和EPICS的異構系統一起使用,因為這些EPICS客戶端工具均通過上面的方法訪問PV變量的。比如EDM,通過調用 CAC庫請求與服務器建立連接,而后這些連接被映射成EPICS數據庫程序請求來操作EPICS數據記錄(Record)或者域(Field),但是,EPICS數據庫程序請求只能操作EPICS數據庫。
利用CAS服務器級別的應用程序接口(API)可解決上述問題,這種服務器級別的 API稱為PCAS(Portable channel access server)。PCAS可以和EPICS數據庫I/O程序及異構系統程序建立聯系。使用PCAS可直接創建EPICS PV的特性,開發出專門用于特殊低優先級任務的EPICS CA服務器程序,這樣EPICS客戶端應用程序就可和基于PCAS的服務器進行通信。在EPICS CAS工具CaSnooper[3]、PV Gateway[4]以及 NameServer[5]中都用到PCAS技術,用來在程序中直接創建EPICS PV。
本文介紹PCAS的使用方法,利用PCAS開發了名為pcasdll的動態鏈接庫。并以win32平臺為例,介紹了使用pcasdll開發的BEPCII電子槍定時插件測溫采集系統。
PCAS是一個具有簡單類接口的C++庫[6,7],利用 API可開發具有 CA服務器功能的應用程序—EPICS服務器工具,圖1所示為PCAS服務器工具接入EPICS示意圖。可創建EPICS PV,并將用戶定義變量賦值給EPICS PV,或把EPICS PV賦值給用戶定義變量,OPI可直接通過CA訪問EPICS服務器工具中的 PV。PCAS對開發者隱藏了實現CA服務的全部細節,PCAS中包含服務器創建/撤銷,PV創建/撤銷,響應客戶端的PV搜索和PV讀/寫請求,發出PV 狀態事件等功能。
PCAS由九個類組成,每類包含多個成員函數,有些成員函數是虛函數,即這些函數可以在派生類中重新定義,實現該函數具體的功能;還有一部分成員函數是純虛函數,即需在開發應用程序時,完成這些函數的實現。盡管如此,實現一個基本功能的服務器程序的代碼量很少,同時CA實現的復雜性也在面向對象的編程類接口中隱藏了。PCAS的API的九個類為:服務器類 caServer、過程變量類casPV、過程變量查詢類 pvExistReturn、過程變量創建類pvAttachReturn、通道訪問類casChannel;4個異步I/O類為casAsyncPVExistIO、casAsync-CreatePVIO、casAsyncReadIO、casAsyncWriteIO。
實現一個 PCAS,須繼承前四個類的,即:實現caServer、casPV、pvExistReturn、pvAttachReturn的派生類。另外,casChannel類輔助實現CA訪問控制功能,異步I/O類可以實現異步讀寫操作功能。

圖1 PCAS服務器工具接入EPICS示意圖Fig.1 Schematics of the PCAS server tool porting to EPICS.
為方便使用EPICS PCAS開發應用程序,利用PCAS開發了名為pcasdll的動態鏈接庫[6–8],pcasdll程序源代碼可在linux平臺或Win32平臺上編譯,分別生成linux平臺或windows平臺的動態鏈接庫,實現跨平臺使用。pcasdll基于EPICS Base3.14.x (Base 3.14系列)開發,共包含七個類:Server、Record、Field、EnumRecord、StringRecord、Num-Record和exChannel。
Server類從caServer類繼承而來,主要實現注冊Record(本地變量)至RecordTable,關聯EPICS PV至Record,響應Client端對EPICS PV查詢的功能;Field類從casPV類繼承而來,主要實現創建EPICS PV,響應Client端EPICS PV讀/寫請求,返回EPICS PV屬性的功能;exChannel類從casChannel類繼承而來,用來實現EPICS PV的訪問控制功能;Record類主要實現保存Record的值與屬性,對Record值與屬性進行操作,發送EPICS狀態事件,注冊/撤銷Field(EPICS PV),實現寫EPICS PV時的callback機制等功能;EnumRecord、NumRecord和String-Record繼承于 Record類,分別用來實現對枚舉類型、數字類型和字符串類型Record的支持。
pcasdll的實現框圖如圖2。在pcasdll設計中,Record的名字放在map型變量RecordTable中,調用pcasdll開發的應用程序,每生成一個xxxRecord實例,其基類 Record的構造函數通過調用 Server類成員registerRecord(),把xxxRecord實例名字置于 RecordTable中。當應用程序收到來自客戶端的PV查詢請求時,通過調用Server類成員函數pvExist-Test(),檢查應用程序的RecordTable中是否擁有該名字。若有,則返回pverExistsHere,并調用Server類成員函數pvAttach()創建一個EPICS PV與該名字關聯,這樣就建立了EPICS PV與應用程序本地變量的聯系;若無,則返回pverDoesNotExistHere。

圖2 pcasdll實現框圖Fig.2 Implementation block diagram of pcasdll.
pcasdll對于PV的書寫格式,采取類似EPICS數據庫中PV“Record.Field”的形式,在Record類中,保存了與PV值與屬性。當客戶端軟件請求讀/寫PV時,pcasdll首先調用Field類成員函數read()/write(),根據Client請求數據的類型,繼而調用Record類成員函數readxx()或writexx()來讀/寫PV屬性,如函數readValue()和wirteValue()分別用來讀取PV的值和向PV寫入值。若Client請求的數據類型在Record中未找到,則返回S_casApp_noSupport。
pcasdll提供接口函數setxxx()和getxxx(),用來獲取當前PV值或設定PV值。用戶調用pcasdll開發的應用程序,通過調用函數 setxxx(),把應用程序的本地變量值賦給EPICS PV變量,或用getxxx()函數獲取 EPICS PV的值。其中函數 setxxx()和getxxx()可根據PV不同的屬性,進行選擇調用。比如:函數setval()和getval用于給PV賦值和獲取PV值;函數 setHihi()和 getHihi()用于設置和獲取 PV最高、最低報警界限。
pcasdll實現了 EPICS的 callback機制和postEvent機制。當客戶端通過CA改變了PV值或屬性值,通過調用函數doWriteCallback()對應用程序進行通知,修改相應的本地變量;當應用程序通過setxxx()函數改變了PV值或屬性值,通過調用函數postEvents()向客戶端發送EPICS事件通知,以實現客戶端程序和本地應用程序數據的同步更新。
為檢測pcasdll的CA響應性能,選取同為運行在非實時操作系統上的EPICS SoftIOC服務器程序作為比較對象,利用catime工具對PCAS服務器與SoftIOC進行CA訪問測試。測試中,PCAS服務器與SoftIOC運行在同一臺運行Windows XP系統的機器上,運行了100個EPICS PV,catime工具運行在與 Windows機器網線插于同一個交換機中的一臺運行Linux Redhat enterprise 4.0操作系統機器上。利用catime分別對兩個EPICS服務器中的其中一個PV進行10000次CA測試,選取網絡速度近似相等的測試結果進行比較,對單精度、字符串和雙精度型數據同步訪問測試結果如表 1所示,可以看到PCAS服務器和SoftIOC對CA同步訪問響應性能基本上一致。

表1 PCAS與SoftIOC CA測試結果對比Table 1 CA test comparison between PCAS and SoftIOC.
BEPCII電子槍定時插件溫度數據采集系統結構如圖3所示,此程序運行于一臺運行Windows XP系統的Tektronix示波器上,負責讀取示波器測量的電子槍觸發信號抖動值。由于Tektronix示波器運行Windows XP系統,程序開發中使用了 pcasdll的win32版本,即pcasdll.dll。數據采集程序通過串口讀取溫度數據,在采集程序內部利用PCAS把溫度數據賦值給 EPICS PV,從而實現溫度數據通過EPICS進行實時監測。圖4為通過EPICS Archiver-Viewer查詢到的溫度歷史數據。

圖3 BEPCII電子槍定時插件測溫采集系統Fig.3 Temperature measurement of timing module for electron-gun of BEPCII.

圖4 BEPCII電子槍定時插件溫度歷史數據Fig.4 History temperature of timing module for electron-gun of BEPCII.
介紹了EPICS PCAS類庫接口,并研究了如何利用PCAS把EPICS異構系統接入EPICS中。為方便使用PCAS類庫,開發了基于PCAS的動態鏈接庫pcasdll,pcasdll源代碼可在linux平臺和win32平臺編譯,實現了跨平臺使用。此外,還對 PCAS服務器進行了CA訪問測試,其CA同步訪問響應和SoftIOC性能相當。
對于EPICS異構系統,可使用PCAS把本地程序接入EPICS中。利用PCAS開發應用程序,方便靈活、易于移植,極大降低了軟件開發周期和系統開發成本。本文利用 pcasdll動態鏈接庫開發了BEPCII電子槍定時插件溫度數據采集系統,經長時間檢測,其運行穩定,可很好滿足調束人員的需求。
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