實(shí)時(shí)數(shù)據(jù)庫系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級(jí)應(yīng)用的實(shí)時(shí)數(shù)據(jù)中樞,通過該系統(tǒng),上層應(yīng)用系統(tǒng)(如 ERP 系統(tǒng)),可以獲得良好的實(shí)時(shí)統(tǒng)計(jì)數(shù)據(jù)和實(shí)時(shí)統(tǒng)計(jì)信息的支撐。隨著SUPCON實(shí)時(shí)數(shù)據(jù)庫在現(xiàn)代企業(yè)信息化建設(shè)當(dāng)中得到了越來越廣泛的應(yīng)用,不但對(duì)WINDOWS平臺(tái)上主流編程語言提供了良好的支持,而且在ESP-iSYS4.0版本中為Java語言的開發(fā)提供了JRtdbc接口庫,該接口在Jdk1.5平臺(tái)上開發(fā),其良好的面向?qū)ο笤O(shè)計(jì)與實(shí)現(xiàn)帶來了每秒訪問磁盤數(shù)據(jù)50000點(diǎn)以上的高性能,最大化的滿足了工業(yè)實(shí)時(shí)應(yīng)用性能需求,在符合Java純面向?qū)ο蟮木幊田L(fēng)格的同時(shí),又打破了Java語言低效的束縛,以JRtdbc為橋梁,應(yīng)用Java語言可以方便快速的開出各種優(yōu)秀的實(shí)時(shí)應(yīng)用。通過閱讀本文,讀者不僅能用JRtdbc進(jìn)行java實(shí)時(shí)應(yīng)用的開發(fā),而且能夠充分體會(huì)到JRtdbc提供的簡單快速開發(fā)的優(yōu)越性。
系統(tǒng)結(jié)構(gòu)
整個(gè)JRtdbc的對(duì)象層次結(jié)構(gòu):
系統(tǒng)總體結(jié)構(gòu)圖-1
如上UML圖,實(shí)時(shí)數(shù)據(jù)庫當(dāng)中的對(duì)象體系被明確的映射到了JRtdbc中,隱藏了實(shí)時(shí)數(shù)據(jù)庫的一些艱澀的概念,其中IConnectionPool為連接池,類似于jdbc的數(shù)據(jù)庫連接池,也是用JRtdbc進(jìn)行開發(fā)時(shí)第一個(gè)要獲得的對(duì)象,可以通過其獲取實(shí)時(shí)數(shù)據(jù)庫連接IConnection,實(shí)時(shí)數(shù)據(jù)庫連接聚合了系統(tǒng)的四個(gè)核心工廠
名稱 | 功能 |
ITagFactory | 獲取位號(hào)/位號(hào)組實(shí)例 |
IUserFactory | 添加刪除枚舉用戶/用戶組 |
ITypeFactory | 添加刪除枚舉對(duì)象類型 |
IRegion getRegionRoot() | 獲取對(duì)象樹根節(jié)點(diǎn),遍歷實(shí)時(shí)數(shù)據(jù)庫對(duì)象樹 |
通過工廠方法,可以得到實(shí)時(shí)數(shù)據(jù)庫的四大功能模塊,位號(hào)與位號(hào)組;用戶與用戶組;對(duì)象類型與權(quán)限體系;整個(gè)實(shí)時(shí)數(shù)據(jù)庫對(duì)象樹的訪問與操作;設(shè)計(jì)一致而且清晰,讓開發(fā)人員更容易理解與使用,下面逐一進(jìn)行介紹并講解使用方法。
使用方法
實(shí)時(shí)數(shù)據(jù)庫連接的建立
JRtdbc提供了連接池工廠PoolFactory,包含二個(gè)工廠方法:
IConnectionPool getPool() ; ?
IConnectionPool getPool(int poolLength,int timeout) ; ?
IConnectionPool getPool(int poolLength,int timeout) ; ?
其中工廠方法?用于構(gòu)建默認(rèn)參數(shù)配置的連接池實(shí)例,工廠方法?允許用戶自定義連接池配置,參數(shù)poolLength定義為連接池連接上限,如果池中未達(dá)到上限,有新連接請(qǐng)求,直接新建連接放入池中返回,如已達(dá)上限,則償試重登錄其他用戶空閑連接,無空閑連接存在則進(jìn)入阻塞狀態(tài)直到有連接釋放,從而保證了系統(tǒng)不會(huì)無限制地增加并發(fā)連接并且可以充分利用空閑連接。參數(shù)timeout定義為連接池中的連接空閑達(dá)到一個(gè)給定的毫秒數(shù)后就自動(dòng)釋放連接,從而進(jìn)一步節(jié)省實(shí)時(shí)數(shù)據(jù)庫連接資源。IConnectionPool 連接池接口,通過getConnection(String conStr)方法獲取一個(gè)與實(shí)時(shí)數(shù)據(jù)庫之間的連接IConnection。JRtdbc連接池經(jīng)過專門設(shè)計(jì),用戶只須獲得連接,像普通對(duì)象一樣調(diào)用,無須考慮底層連接狀態(tài),完全由連接池托管,擺脫了像Jdbc那種獲得連接后還要時(shí)時(shí)不忘c(diǎn)lose()的那種煩惱,降低了使用復(fù)雜度。如何獲取實(shí)時(shí)數(shù)據(jù)庫連接?
//首先獲得連接池實(shí)例,能過連接字符串得到連接IConnection實(shí)例
IConnectionPool pool = l();
IConnection conn = nection( String conStr ) ;
IConnectionPool pool = l();
IConnection conn = nection( String conStr ) ;
連接字符串格式:
host:;user=xxxxxx;password=xxxxxx;
其中各字段具體含義如下:
字段 | 含義 |
host | 為實(shí)時(shí)數(shù)據(jù)庫所在計(jì)算機(jī)的IP和端口,其中,前指一個(gè)4段式IP地址,“:”后為實(shí)時(shí)數(shù)據(jù)庫的端口地址 |
user | 用戶名,有效內(nèi)容為大小寫英文字母、下劃線 |
password | 密碼,有效內(nèi)容為大小寫英文字母、數(shù)字、下劃線、連字符 |
如果建立連接成功,則返回一個(gè)有效的IConnection對(duì)象實(shí)例,如果在連接建立過程中存在異常情況,則拋出IOException類型的異常。
位號(hào)與位號(hào)組
位號(hào)是存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)點(diǎn),對(duì)應(yīng)底層控制系統(tǒng)的數(shù)據(jù)源,通過JRtdbc曝露給用戶的只是一個(gè)簡單的ITag對(duì)象,調(diào)用其方法即可對(duì)位號(hào)/位號(hào)組進(jìn)行操作,工業(yè)現(xiàn)場的控制設(shè)備,在提供數(shù)值的同時(shí),也提供了對(duì)數(shù)值質(zhì)量的判斷,所以,實(shí)時(shí)數(shù)據(jù)庫中的數(shù)據(jù)是有質(zhì)量碼的,通過質(zhì)量碼,可以確定讀回的值是否可信、可用。在通常的應(yīng)用中,驗(yàn)證質(zhì)量碼是缺省的,當(dāng)出現(xiàn)錯(cuò)誤質(zhì)量碼的時(shí)候,位號(hào)讀取方法會(huì)拋出BadValueException異常,除了質(zhì)量碼跟數(shù)值,位號(hào)值還包括了采集數(shù)據(jù)值的時(shí)間戳,因此把數(shù)值,質(zhì)量碼,時(shí)間戳封裝進(jìn)了一個(gè)TagValue,作為一個(gè)位號(hào)值。位號(hào)組則是以一組位號(hào)為單位的TagGroup實(shí)例,聯(lián)合讀取各位號(hào)的實(shí)時(shí)值或歷史值,以二維表的形式返回,以位號(hào)組中各位號(hào)名為列,支持以列名或者列索引獲取組內(nèi)某位號(hào)的每行數(shù)據(jù)。通過位號(hào)工廠即可獲取位號(hào)與位號(hào)組對(duì)象,ITagFactory提供如下工廠方法:
名稱 | 功能 |
getTag(String name) | 獲取位號(hào)實(shí)例 |
getTagGroup(String[] names) | 獲取位號(hào)組實(shí)例 |
getTagGroup(String regex) | 獲取位號(hào)組實(shí)例 |
(一) 讀位號(hào)實(shí)時(shí)值
通過位號(hào)工廠ITagFactory的getTag(tagNameStr)方法來獲得實(shí)際的位號(hào)實(shí)例。該方法將根據(jù)位號(hào)的具體屬性,返回虛位號(hào)或?qū)嵨惶?hào)的實(shí)體,而JRtdbc使用者并不需要關(guān)系其細(xì)節(jié)。具體的方法如下:
ITag t = Factory().getTag( tagName ) ;
通過ITag實(shí)例,可以完成讀取實(shí)時(shí)值的操作。雖然每個(gè)位號(hào)均有其原生的數(shù)據(jù)類型,但ESP-iSYS在讀取時(shí)做了安全的類型轉(zhuǎn)換,也就是說,對(duì)于一個(gè)int類型的位號(hào),仍然可以采用readFloat或readString方法,來獲得浮點(diǎn)值或字符串值。ITag接口提供了針對(duì)不同數(shù)據(jù)類型的方法,如下:
方法 | 功能 |
readBoolean | 讀取boolean類型的值 |
readDouble | 讀取double類型的值 |
readFloat | 讀取float類型的值 |
readInt | 讀取int類型的值 |
readLong | 讀取long類型的值 |
readShort | 讀取short類型的值 |
readString | 讀取String類型的值 |
這些方法均會(huì)返回實(shí)時(shí)數(shù)據(jù)庫中位號(hào)的最新值,通過TagValue位號(hào)值封裝類的getTimeStamp方法,可以獲取到該位號(hào)值對(duì)應(yīng)的時(shí)間戳。典型的使用代碼如下:
ITag t = Factory().getTag( tagName ) ;
TagValue v = lue() ;
Date timeStamp = eStamp() ;
SimpleDateFormat sft = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss " );
String timeString = ( timeStamp);
TagValue v = lue() ;
Date timeStamp = eStamp() ;
SimpleDateFormat sft = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss " );
String timeString = ( timeStamp);
如果兩種數(shù)據(jù)類型間不能正確轉(zhuǎn)換時(shí),readXXXX方法將會(huì)拋出TypeCastFailedException異常。
(二) 寫位號(hào)實(shí)時(shí)值
寫實(shí)時(shí)值的方法和讀取實(shí)時(shí)值是對(duì)應(yīng)的,寫位號(hào)同樣可以采用不同的類型寫入,其列表如下:
方法 | 功能 |
writeBoolean | 寫boolean類型的值 |
writeDouble | 寫double類型的值 |
writeFloat | 寫float類型的值 |
writeInt | 寫int類型的值 |
writeLong | 寫long類型的值 |
writeShort | 寫short類型的值 |
readString | 寫String類型的值 |
而JRtdbc會(huì)自動(dòng)為該寫操作分配時(shí)間戳和打上正確的質(zhì)量碼。
(三) 讀位號(hào)歷史數(shù)據(jù)
通過ITag實(shí)例,可以完成讀取實(shí)時(shí)數(shù)據(jù)庫內(nèi)存與磁盤歷史數(shù)據(jù) ITag接口提供了如下方法:
方法 | 功能 |
readAllMemHisValue() | 讀取全部內(nèi)存歷史值 |
readMemHisPointValue(Date p) | 讀取某時(shí)刻磁盤歷史值 |
readMemHisValue(Date b,Date e) | 讀取某個(gè)時(shí)間段的內(nèi)存歷史值 |
readMemHisValue(Date b,Date e,long i) | 采樣讀取某個(gè)時(shí)間段的內(nèi)存歷史值 |
readDiskHisPointValue(Date p) | 讀取某時(shí)刻磁盤歷史值 |
readDiskHisValue(Date b,Date e) | 讀取某個(gè)時(shí)間段的磁盤歷史值 |
readDiskHisValue(Date b,Date e,long i) | 采樣讀取某個(gè)時(shí)間段的磁盤歷史值 |
readHisValue(Date b,Date e,long i) | 自動(dòng)區(qū)分內(nèi)存或磁盤歷史 |
采樣,即為以一定的時(shí)間間隔去讀位號(hào)值,如果某時(shí)刻無值存在,以NULL填充,因此采樣讀歷史數(shù)據(jù),讀出來的是一個(gè)以相等時(shí)間間隔的值序列。不采樣純粹讀出時(shí)間條件范圍內(nèi)的所有位號(hào)值,典型的讀位號(hào)歷史值的代碼如下:
ITag t = (“TT3502”) ;
//讀取全部內(nèi)存歷史
ArrayList vs = lMemHisValue() ;
//讀取時(shí)間段的磁盤歷史,begin,end 起始與結(jié)束時(shí)間,inter采樣間隔,無值時(shí)以NULL填充進(jìn)容器。
ArrayList vs = skHisValue( begin,end,inter)
//讀取全部內(nèi)存歷史
ArrayList
//讀取時(shí)間段的磁盤歷史,begin,end 起始與結(jié)束時(shí)間,inter采樣間隔,無值時(shí)以NULL填充進(jìn)容器。
ArrayList
(四) 讀取位號(hào)組值
讀位號(hào)組的接口方法與單個(gè)位號(hào)是一樣的,統(tǒng)一接口,易于使用,首先以一組位號(hào)名為參數(shù),通過位號(hào)工廠得到位號(hào)組對(duì)象,調(diào)用讀取方法,與單個(gè)位號(hào)不同的只是位號(hào)組返回的是以位號(hào)名為列的二維表TagDataTable形式的結(jié)構(gòu),與Jdbc的Record類似,可以遍歷表中的所有行,通過位號(hào)名或者列索引獲得組內(nèi)某個(gè)位號(hào)的值,因此Java開發(fā)人員可以像處理Jdbc的Record一樣處理位號(hào)組返回的數(shù)據(jù),典型的使用代碼如下:
String[] names = {“TT3501”,”TT3502”,”TT3503”}
ITagFactory tf = conn.getTagFactory() ;
ITagGroup tgrp = tf.getTagGroup(names) ;
//讀實(shí)時(shí)值
TagDataRow r = tgrp.readValue() ;
TagValue v = r.getValue(“TT3501”) ;
//讀歷史值
TagDataTable t = tgrp.readDiskHisValue(begin,end,interval);
For(TagDataRow row : t.getRows()){
TagValue v = row.getValue(0);//以索引獲得
System.out.println( v.getTimeStamp() ) ;//打印獲取時(shí)間。
}
通過JRtdbc操作實(shí)時(shí)數(shù)據(jù)庫位號(hào)與位號(hào)組是如此的方便與直觀,用戶完全感覺不到正在操作的是深?yuàn)W的實(shí)時(shí)數(shù)據(jù)庫。
ITagFactory tf = conn.getTagFactory() ;
ITagGroup tgrp = tf.getTagGroup(names) ;
//讀實(shí)時(shí)值
TagDataRow r = tgrp.readValue() ;
TagValue v = r.getValue(“TT3501”) ;
//讀歷史值
TagDataTable t = tgrp.readDiskHisValue(begin,end,interval);
For(TagDataRow row : t.getRows()){
TagValue v = row.getValue(0);//以索引獲得
System.out.println( v.getTimeStamp() ) ;//打印獲取時(shí)間。
}
通過JRtdbc操作實(shí)時(shí)數(shù)據(jù)庫位號(hào)與位號(hào)組是如此的方便與直觀,用戶完全感覺不到正在操作的是深?yuàn)W的實(shí)時(shí)數(shù)據(jù)庫。
用戶與用戶組
登錄實(shí)時(shí)數(shù)據(jù)庫的用戶,以一個(gè)用戶對(duì)象IUser存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)內(nèi)部,當(dāng)然還有其隸屬的用戶組IUserGroup,用戶也可以在權(quán)限范圍內(nèi)增加刪除用戶,為用戶分配權(quán)限,分配用戶組,所有操作類似于平常操作系統(tǒng)的用戶用戶組結(jié)構(gòu),從系統(tǒng)UML圖可以看出,IUser與IUserGroup派生于IUserBase,IUserBase抽取出了公共的對(duì)權(quán)限訪問列表操作的方法。通過IConnection獲得IUserFacotry用戶工廠,該工廠提供了如下工廠方法:
方法 | 功能 |
addUser(UserAttribute attr) | 添加用戶 |
addUserGroup(UserGroupAttribute attr) | 添加用戶組 |
delUser( String name ) |
刪除用戶 |
delUserGroup(String name) | 刪除用戶組 |
getUsers() | 枚舉用戶 |
getUserGroups() | 枚舉用戶組 |
(一) 添加刪除枚舉用戶/用戶組
添加用戶/用戶組一般操作相當(dāng)簡單,取得連接后,得到用戶工廠,建立用戶或用戶組屬性對(duì)象,調(diào)用工廠方法addUser與addUserGroup即可,刪除用戶/用戶組只須以名稱為參數(shù)調(diào)用delUser/delUserGroup方法,典型代碼如下:
IUserFacotry uf = rFacotry() ;
//添加用戶
IUser u = r( new UserAttribute(“TESTUSER”)) ;
Boolean b = r(“TESTUSER”) ; //刪除用戶
//添加用戶組
IUserGroup grp = rGroup( new UserGroup(“admin”)) ;
Boolean b = rGroup(“admin”);//刪除用戶組
//枚舉用戶用戶組
ArrayList users = rs() ;
ArrayList grps = ups() ;
//添加用戶
IUser u = r( new UserAttribute(“TESTUSER”)) ;
Boolean b = r(“TESTUSER”) ; //刪除用戶
//添加用戶組
IUserGroup grp = rGroup( new UserGroup(“admin”)) ;
Boolean b = rGroup(“admin”);//刪除用戶組
//枚舉用戶用戶組
ArrayList
ArrayList
(二) 驗(yàn)證用戶權(quán)限
實(shí)時(shí)數(shù)據(jù)庫有完整的安全機(jī)制,每個(gè)對(duì)象類型都有一系列的權(quán)限項(xiàng)存在,只有在權(quán)限允許的情況下,用戶才能對(duì)實(shí)時(shí)數(shù)據(jù)庫中的對(duì)象進(jìn)行操作,IUser接口提供了簡單的接口來驗(yàn)證用戶是否具有操作實(shí)時(shí)數(shù)據(jù)庫對(duì)象的權(quán)限,比如用戶是否有權(quán)刪除一個(gè)位號(hào),刪除位號(hào)這個(gè)權(quán)限項(xiàng)被定義在位號(hào)對(duì)象類型內(nèi),典型代碼如下:
IUser u = new User(conn,”admin”) ;
String path = “.\水化車間\TT3502”;//某車間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. authenticate(path,right) ;
If( b ) { ……} else { n(“用戶無權(quán)限刪除該位號(hào)”);}
String path = “.\水化車間\TT3502”;//某車間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. authenticate(path,right) ;
If( b ) { ……} else { n(“用戶無權(quán)限刪除該位號(hào)”);}
(三) 用戶/用戶組權(quán)限訪問列表
用戶/用戶組擁有一個(gè)允許訪問列表和一個(gè)拒絕訪問列表,這二個(gè)列表描述的是在對(duì)象類型當(dāng)中定義的權(quán)限項(xiàng)是否具有,JRtdbc使用者可以通過IUser與IUserGroup提供的接口獲得訪問列表ArrayList
IUser u = new User(conn,”admin”) ;
String path = “.\水化車間\TT3502”;//某車間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. removeACE(path,right) ;//刪除了用戶對(duì)位號(hào)的刪除權(quán)限
IUser u2 = new User(conn,”test”) ;
Boolean b = u2.addACE(path,right) ;//用戶具有了刪除權(quán)限
//枚舉
ArrayList aces = u.getACList() ;
ArrayList dcls = u.getDCList() ;
String path = “.\水化車間\TT3502”;//某車間下的一個(gè)位號(hào)
String right = “刪除位號(hào)” ;
Boolean b = u. removeACE(path,right) ;//刪除了用戶對(duì)位號(hào)的刪除權(quán)限
IUser u2 = new User(conn,”test”) ;
Boolean b = u2.addACE(path,right) ;//用戶具有了刪除權(quán)限
//枚舉
ArrayList
ArrayList
對(duì)象類型與權(quán)限體系
實(shí)時(shí)數(shù)據(jù)據(jù)庫當(dāng)中的對(duì)象都有其對(duì)應(yīng)的對(duì)象類型,例如,位號(hào)就是一個(gè)對(duì)象樹上的特殊類型。對(duì)象類型都派生于IElementType,該接口提供了如添加自定義屬性描述、添加權(quán)限項(xiàng)等功能。類型工廠ITypeFactory提供了下列工廠方法:
名稱 | 功能 |
addType(ElementTypeAttribute attr) | 添加對(duì)象類型 |
delType(String typename) | 刪除對(duì)象類型 |
getTypes() | 枚舉對(duì)象類型 |
獲取連接,得到類型工廠后,即可添加刪除對(duì)象類型
(一) 添加刪除對(duì)象類型
在實(shí)時(shí)數(shù)據(jù)中添加對(duì)象類型非常的簡單,比如在實(shí)時(shí)數(shù)據(jù)庫當(dāng)中添加一種報(bào)表這樣的一種類型,可先獲得類型工廠,然后建立新類型的屬性對(duì)象TypeAttribute其中只有類型名必須指定,調(diào)用addType添加,刪除類型只須調(diào)用delType,并以對(duì)象類型名稱為參數(shù),典型代碼如下:
ITypeFactory typef = eFacotry() ;
TypeAttribute attr = new TypeAttribute(“報(bào)表”) ;
IElementType type = e( attr ) ;//添加對(duì)象類型。
Boolean b = e(“報(bào)表”) ;//刪除對(duì)象類型
ArrayList types = es() ;//枚舉
TypeAttribute attr = new TypeAttribute(“報(bào)表”) ;
IElementType type = e( attr ) ;//添加對(duì)象類型。
Boolean b = e(“報(bào)表”) ;//刪除對(duì)象類型
ArrayList
(二) 添加自定義屬性描述
在實(shí)時(shí)數(shù)據(jù)庫當(dāng)中,可以為實(shí)時(shí)數(shù)據(jù)庫對(duì)象添加自定義屬性,存儲(chǔ)在對(duì)象屬性ElementAttribute的Hashtable中,實(shí)時(shí)數(shù)據(jù)庫為驗(yàn)證自定義添加的屬性正確性,用戶必須提供自定義屬性的描述信息,為簡化操作,JRtdbc把描述信息抽象成TypeBase,具體描述類派生于此基類,提供了自定義屬性的相關(guān)約束條,如最大值,最小值,值類型等,目前支持三種自定義類型的添加,Int32Type整型,DoubleType浮點(diǎn)型和StringType字符串型。比如現(xiàn)有report1這么一個(gè)報(bào)表對(duì)象,用戶要為其添加一個(gè)名為path的路徑屬性,值為C:\report,則首先應(yīng)該獲取報(bào)表對(duì)象類型對(duì)象,在類型對(duì)象當(dāng)中添加這個(gè)自定義屬性的描述信息,如自定義屬性名應(yīng)該為path,類型為String,最大長度為100等信息,這樣才能正確的為具體報(bào)表對(duì)象添加進(jìn)這個(gè)自定義屬性,典型代碼如下:
StringType t = new StringType( path,true,”c:\report”) ;
Length(100);
Boolean b = ribute( t ) ;
Length(100);
Boolean b = ribute( t ) ;
(三) 添加權(quán)限項(xiàng)
實(shí)時(shí)數(shù)據(jù)庫中每種對(duì)象類型都有其權(quán)限項(xiàng)列表,比如報(bào)表這個(gè)對(duì)象類型,它有完全控制、讀報(bào)表,寫報(bào)表、添加報(bào)表、刪除報(bào)表等權(quán)限項(xiàng),用戶可以通過接口對(duì)權(quán)限項(xiàng)進(jìn)行添加或刪除,首先新建一個(gè)權(quán)限屬性對(duì)象,設(shè)置權(quán)限項(xiàng)名稱等信息,獲得對(duì)象類型對(duì)象,調(diào)用addRight添加即可,刪除操作直接以權(quán)限名為參數(shù),調(diào)用delRight即可,典型代碼如下:
RightAttribute attr = new RightAttribute(“報(bào)表完全控制”) ;
Boolean b = type.addRight( attr ) ;//添加權(quán)限項(xiàng)
Boolean b = type.delRight( rightName ) ;//刪除權(quán)限項(xiàng)
Boolean b = type.addRight( attr ) ;//添加權(quán)限項(xiàng)
Boolean b = type.delRight( rightName ) ;//刪除權(quán)限項(xiàng)
對(duì)象樹的訪問與操作
為簡化在ESP-iSYS上進(jìn)行Java開發(fā),ESP-iSYS內(nèi)部以企業(yè)資源樹的形式來組織對(duì)象,位號(hào)、報(bào)表、區(qū)域、流程圖等都是樹上的對(duì)象,其中區(qū)域里面可以有對(duì)象也可以包含子區(qū)域,就像企業(yè)里面的組織結(jié)構(gòu),比如一個(gè)部門里有許多對(duì)象,也有許多車間,車間里又有位號(hào)之類的對(duì)象可能還有二級(jí)車間,這里部門和車間或二級(jí)車間在實(shí)時(shí)數(shù)據(jù)庫里就表示為區(qū)域?qū)ο?。?duì)象樹上的所有對(duì)象都派生于IElement,使得開發(fā)人員可以統(tǒng)一對(duì)待所有對(duì)象,對(duì)象屬性有預(yù)定義屬性和自定義屬性,預(yù)定義屬性以成員變量的形式存于對(duì)象實(shí)例中,自定義屬性存放于Hashtable中,須先以TypeBase在對(duì)象類型中添加自定義屬性描述后,才能為對(duì)象正確添加自定義屬性,目前支持浮點(diǎn)型、整型、字符串型三種類型,如圖:
可以通過IConnection方法getRegionRoot()獲取對(duì)象樹的根區(qū)域節(jié)點(diǎn)IRegion,從而完全遍歷與訪問各類對(duì)象。
(一) 添加對(duì)象
連接建立后,可通過IConnection的getRegionRoot方法獲得對(duì)象樹根結(jié)點(diǎn),遍歷到欲添加對(duì)象的區(qū)域節(jié)點(diǎn),然后以對(duì)象屬性ElementAttribute為參數(shù),對(duì)象屬性封裝類已提供了大部份默認(rèn)值,用戶可只對(duì)必要字段進(jìn)行賦值即可構(gòu)建屬性對(duì)象,避免了對(duì)大串屬性一一賦值的煩瑣,簡化開發(fā),再調(diào)用addElement(ElementAttribute attr)方法添加對(duì)象,相同方法添加位號(hào)或其它對(duì)象,典型代碼如下:
IRegion root = ionRoot() ;
RealTagAttribute realTagAttr = new RealTagAttribute(“TT”);
ITag t = ( realTagAttr ) ;添加位號(hào)
//IElement e = ment(ElementAttribute attr) ;
RealTagAttribute realTagAttr = new RealTagAttribute(“TT”);
ITag t = ( realTagAttr ) ;添加位號(hào)
//IElement e = ment(ElementAttribute attr) ;
(二) 添加自定義屬性
遍歷對(duì)象樹獲取對(duì)象實(shí)例,調(diào)用getElementAttribute方法獲取對(duì)象屬性,調(diào)用addCustAttrbute(name,value)添加自定義屬性,如在對(duì)象類型屬性內(nèi)未添加自定義屬性描述,或者與描述信息不符,則拋出InValidAtrributeException,典型代碼如下:
ITagFactory tf = conn.getTagFactory() ;
ITag t = tf.getTag( “TT3502” ) ;
ElementAttribute ta = t.getElementAttribute() ;
Ta.addCustAttr(“CustAttr”,”CustAttrValue”) ;
ITag t = tf.getTag( “TT3502” ) ;
ElementAttribute ta = t.getElementAttribute() ;
Ta.addCustAttr(“CustAttr”,”CustAttrValue”) ;
異常處理模塊
JRtdbc有一套完整的異常體系,所有JRtdbc自有的異常全部派生于RtdbcException,含義明確,對(duì)拋出原因一目了然,并且大部份定義為未檢異常,因?yàn)檫@些異常拋出后,用戶無力恢復(fù),未檢異常不用讓用戶必須Try,Catch,這樣減少代碼量,降低開發(fā)復(fù)雜度。具體如下:
名稱 | 含義 |
RtdbException | 實(shí)時(shí)數(shù)據(jù)庫異?;?/TD> |
BadValueException | 位號(hào)值質(zhì)量碼異常,讀到壞值時(shí)拋出 |
InValidPackageException | 包解析錯(cuò)誤時(shí)拋出 |
InValidAttributeException | 添加自定義屬性時(shí),屬性無效時(shí)拋出 |
實(shí)例展示
下面是一個(gè)使用JRtdbc開發(fā)的一個(gè)讀取位號(hào)實(shí)時(shí)值與歷史值的完整示例,緊湊簡短的幾句Java代碼即可讀取到工業(yè)自動(dòng)化領(lǐng)域當(dāng)中的實(shí)時(shí)信息。
總結(jié)
以上詳細(xì)介紹了ESP-iSYS平臺(tái)Java接口的架構(gòu)與使用步驟,“一個(gè)連接,四個(gè)工廠”通過短短的數(shù)行Java代碼即能揭開實(shí)時(shí)數(shù)據(jù)庫的神秘面紗,讓開發(fā)人員暢游整個(gè)實(shí)時(shí)數(shù)據(jù)庫,Java愛好者們可以盡情享受用Java快速開發(fā)實(shí)時(shí)應(yīng)用所帶來的樂趣。浙江中控軟件技術(shù)有限公司在今后會(huì)不斷的對(duì)其進(jìn)行維護(hù)和升級(jí),并對(duì)開發(fā)者提供良好的技術(shù)支持,共同努力在J2EE平臺(tái)上開發(fā)出更多更優(yōu)秀的實(shí)時(shí)應(yīng)用。
(轉(zhuǎn)載)