直播推薦
企業(yè)動(dòng)態(tài)
- 東莞市皓天試驗(yàn)設(shè)備即將亮相CIBF2025,邀您共探電池測(cè)試新未來(lái)
- 京東集團(tuán)發(fā)布2025年一季度業(yè)績(jī) 降本增效、技術(shù)創(chuàng)新引領(lǐng)京東工業(yè)高質(zhì)量發(fā)展
- 皓天試驗(yàn)設(shè)備將攜多款環(huán)境試驗(yàn)設(shè)備亮相CIBF2025深圳國(guó)際電池展
- 全場(chǎng)景節(jié)能30%以上!海爾中央空調(diào)亮相中國(guó)零售展
- igus全球環(huán)保騎行亞洲站在中國(guó)收官
- 京東工業(yè)與世達(dá)工具深化戰(zhàn)略合作 聯(lián)手推動(dòng)專業(yè)工具行業(yè)數(shù)智供應(yīng)鏈升級(jí)
- 舒瑞普中國(guó)卓越中心暨蘇州新工廠開(kāi)業(yè)典禮圓滿落成
- 華測(cè)儀器中標(biāo)華北電力大學(xué)綜合介電分析儀采購(gòu)項(xiàng)目
推薦展會(huì)
ESP-iSYS平臺(tái)開(kāi)發(fā)JAVA實(shí)時(shí)應(yīng)用系統(tǒng)
——JRtdbc 實(shí)時(shí)數(shù)據(jù)庫(kù)與JAVA的橋梁
——ESP-iSYS系列技術(shù)小品文(2)
實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)作為現(xiàn)代信息系統(tǒng)的核心,是企業(yè)級(jí)應(yīng)用的實(shí)時(shí)數(shù)據(jù)中樞,通過(guò)該系統(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ù)庫(kù)在現(xiàn)代企業(yè)信息化建設(shè)當(dāng)中得到了越來(lái)越廣泛的應(yīng)用,不但對(duì)WINDOWS平臺(tái)上主流編程語(yǔ)言提供了良好的支持,而且在ESP-iSYS4.0版本中為Java語(yǔ)言的開(kāi)發(fā)提供了JRtdbc接口庫(kù),該接口在Jdk1.5平臺(tái)上開(kāi)發(fā),其良好的面向?qū)ο笤O(shè)計(jì)與實(shí)現(xiàn)帶來(lái)了每秒訪問(wèn)磁盤數(shù)據(jù)50000點(diǎn)以上的高性能,zui大化的滿足了工業(yè)實(shí)時(shí)應(yīng)用性能需求,在符合Java純面向?qū)ο蟮木幊田L(fēng)格的同時(shí),又打破了Java語(yǔ)言低效的束縛,以JRtdbc為橋梁,應(yīng)用Java語(yǔ)言可以方便快速的開(kāi)出各種的實(shí)時(shí)應(yīng)用。通過(guò)閱讀本文,讀者不僅能用JRtdbc進(jìn)行java實(shí)時(shí)應(yīng)用的開(kāi)發(fā),而且能夠充分體會(huì)到JRtdbc提供的簡(jiǎn)單快速開(kāi)發(fā)的*性。
一 系統(tǒng)結(jié)構(gòu)
整個(gè)JRtdbc的對(duì)象層次結(jié)構(gòu):
系統(tǒng)總體結(jié)構(gòu)圖 -1
如上UML圖,實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中的對(duì)象體系被明確的映射到了JRtdbc中,隱藏了實(shí)時(shí)數(shù)據(jù)庫(kù)的一些艱澀的概念,其中IConnectionPool為連接池,類似于jdbc的數(shù)據(jù)庫(kù)連接池,也是用JRtdbc進(jìn)行開(kāi)發(fā)時(shí)*個(gè)要獲得的對(duì)象,可以通過(guò)其獲取實(shí)時(shí)數(shù)據(jù)庫(kù)連接IConnection,實(shí)時(shí)數(shù)據(jù)庫(kù)連接聚合了系統(tǒng)的四個(gè)核心工廠
名稱 | 功能 |
ITagFactory | 獲取位號(hào)/位號(hào)組實(shí)例。 |
IUserFactory | 添加刪除枚舉用戶/用戶組。 |
ITypeFactory | 添加刪除枚舉對(duì)象類型。 |
IRegion getRegionRoot() | 獲取對(duì)象樹(shù)根節(jié)點(diǎn),遍歷實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象樹(shù) |
, 通過(guò)工廠方法,可以得到實(shí)時(shí)數(shù)據(jù)庫(kù)的四大功能模塊,位號(hào)與位號(hào)組;用戶與用戶組;對(duì)象類型與權(quán)限體系;整個(gè)實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象樹(shù)的訪問(wèn)與操作;設(shè)計(jì)一致而且清晰,讓開(kāi)發(fā)人員更容易理解與使用,下面逐一進(jìn)行介紹并講解使用方法。
二 使用方法
實(shí)時(shí)數(shù)據(jù)庫(kù)連接的建立
JRtdbc提供了連接池工廠PoolFactory,包含二個(gè)工廠方法:
IConnectionPool getPool() ; IConnectionPool getPool(int poolLength,int timeout) ; |
其中工廠方法用于構(gòu)建默認(rèn)參數(shù)配置的連接池實(shí)例,工廠方法允許用戶自定義連接池配置,參數(shù)poolLength定義為連接池連接上限,如果池中未達(dá)到上限,有新連接請(qǐng)求,直接新建連接放入池中返回,如已達(dá)上限,則償試重登錄其他用戶空閑連接,無(wú)空閑連接存在則進(jìn)入阻塞狀態(tài)直到有連接釋放,從而保證了系統(tǒng)不會(huì)無(wú)限制地增加并發(fā)連接并且可以充分利用空閑連接。參數(shù)timeout定義為連接池中的連接空閑達(dá)到一個(gè)給定的毫秒數(shù)后就自動(dòng)釋放連接,從而進(jìn)一步節(jié)省實(shí)時(shí)數(shù)據(jù)庫(kù)連接資源。IConnectionPool 連接池接口,通過(guò)getConnection(String conStr)方法獲取一個(gè)與實(shí)時(shí)數(shù)據(jù)庫(kù)之間的連接IConnection。JRtdbc連接池經(jīng)過(guò)專門設(shè)計(jì),用戶只須獲得連接,像普通對(duì)象一樣調(diào)用,無(wú)須考慮底層連接狀態(tài),*由連接池托管,擺脫了像Jdbc那種獲得連接后還要時(shí)時(shí)不忘c(diǎn)lose()的那種煩惱,降低了使用復(fù)雜度。如何獲取實(shí)時(shí)數(shù)據(jù)庫(kù)連接?
//首先獲得連接池實(shí)例,能過(guò)連接字符串得到連接IConnection實(shí)例 IConnectionPool pool = PoolFactory.getPool(); IConnection conn = pool.getConnection( String conStr ) ; |
連接字符串格式:
host:192.168.0.171:5051;user=xxxxxx;password=xxxxxx;
其中各字段具體含義如下:
字段 | 含義 |
host | 為實(shí)時(shí)數(shù)據(jù)庫(kù)所在計(jì)算機(jī)的IP和端口,其中,前xxx.xxx.xxx.xxx指一個(gè)4段式IP地址,“:”后為實(shí)時(shí)數(shù)據(jù)庫(kù)的端口地址 |
user | 用戶名,有效內(nèi)容為大小寫英文字母、下劃線 |
password | 密碼,有效內(nèi)容為大小寫英文字母、數(shù)字、下劃線、連字符 |
如果建立連接成功,則返回一個(gè)有效的IConnection對(duì)象實(shí)例,如果在連接建立過(guò)程中存在異常情況,則拋出IOException類型的異常。
位號(hào)與位號(hào)組
位號(hào)是存儲(chǔ)在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中的數(shù)據(jù)點(diǎn),對(duì)應(yīng)底層控制系統(tǒng)的數(shù)據(jù)源,通過(guò)JRtdbc曝露給用戶的只是一個(gè)簡(jiǎn)單的ITag對(duì)象,調(diào)用其方法即可對(duì)位號(hào)/位號(hào)組進(jìn)行操作,工業(yè)現(xiàn)場(chǎng)的控制設(shè)備,在提供數(shù)值的同時(shí),也提供了對(duì)數(shù)值質(zhì)量的判斷,所以,實(shí)時(shí)數(shù)據(jù)庫(kù)中的數(shù)據(jù)是有質(zhì)量碼的,通過(guò)質(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ù)。通過(guò)位號(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í)值
通過(guò)位號(hào)工廠ITagFactory的getTag(tagNameStr)方法來(lái)獲得實(shí)際的位號(hào)實(shí)例。該方法將根據(jù)位號(hào)的具體屬性,返回虛位號(hào)或?qū)嵨惶?hào)的實(shí)體,而JRtdbc使用者并不需要關(guān)系其細(xì)節(jié)。具體的方法如下:
ITag t = conn.getTagFactory().getTag( tagName ) ; |
通過(guò)ITag實(shí)例,可以完成讀取實(shí)時(shí)值的操作。雖然每個(gè)位號(hào)均有其原生的數(shù)據(jù)類型,但ESP-iSYS在讀取時(shí)做了安全的類型轉(zhuǎn)換,也就是說(shuō),對(duì)于一個(gè)int類型的位號(hào),仍然可以采用readFloat或readString方法,來(lái)獲得浮點(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ù)庫(kù)中位號(hào)的值,通過(guò)TagValue位號(hào)值封裝類的getTimeStamp方法,可以獲取到該位號(hào)值對(duì)應(yīng)的時(shí)間戳。典型的使用代碼如下:
ITag t = conn.getTagFactory().getTag( tagName ) ; TagValue v = t.readValue() ; Date timeStamp = v.getTimeStamp() ; SimpleDateFormat sft = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss " ); String timeString = sft.format( 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類型的值 |
wriong | 寫long類型的值 |
writeShort | 寫short類型的值 |
writeString | 寫String類型的值 |
而JRtdbc會(huì)自動(dòng)為該寫操作分配時(shí)間戳和打上正確的質(zhì)量碼。
(三) 讀位號(hào)歷史數(shù)據(jù)
通過(guò)ITag實(shí)例,可以完成讀取實(shí)時(shí)數(shù)據(jù)庫(kù)內(nèi)存與磁盤歷史數(shù)據(jù) ITag接口提供了如下方法:
方法 | 功能 |
readAllMemHisValue() | 讀取全部?jī)?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í)刻無(wú)值存在,以NULL填充,因此采樣讀歷史數(shù)據(jù),讀出來(lái)的是一個(gè)以相等時(shí)間間隔的值序列。不采樣純粹讀出時(shí)間條件范圍內(nèi)的所有位號(hào)值,典型的讀位號(hào)歷史值的代碼如下:
ITag t = tf.getTag(“TT3502”) ; //讀取全部?jī)?nèi)存歷史 ArrayList<TagValue> vs = t.readAllMemHisValue() ; //讀取時(shí)間段的磁盤歷史,begin,end 起始與結(jié)束時(shí)間,inter采樣間隔,無(wú)值時(shí)以NULL填充進(jìn)容器。 ArrayList<TagValue> vs = t.readDiskHisValue( begin,end,inter) |
(四) 讀取位號(hào)組值
讀 位號(hào)組的接口方法與單個(gè)位號(hào)是一樣的,統(tǒng)一接口,易于使用,首先以一組位號(hào)名為參數(shù),通過(guò)位號(hào)工廠得到位號(hào)組對(duì)象,調(diào)用讀取方法,與單個(gè)位號(hào)不同的只是位號(hào)組返回的是以位號(hào)名為列的二維表TagDataTable形式的結(jié)構(gòu),與Jdbc的Record類似,可以遍歷表中的所有行,通過(guò)位號(hào)名或者列索引獲得組內(nèi)某個(gè)位號(hào)的值,因此Java開(kāi)發(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í)間。 } |
通過(guò)JRtdbc操作實(shí)時(shí)數(shù)據(jù)庫(kù)位號(hào)與位號(hào)組是如此的方便與直觀,用戶*感覺(jué)不到正在操作的是深?yuàn)W的實(shí)時(shí)數(shù)據(jù)庫(kù)。
用戶與用戶組
登錄實(shí)時(shí)數(shù)據(jù)庫(kù)的用戶,以一個(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)限訪問(wèn)列表操作的方法。通過(guò)IConnection獲得IUserFacotry用戶工廠,該工廠提供了如下工廠方法:
方法 | 功能 |
addUser(UserAttribute attr) | 添加用戶 |
addUserGroup(UserGroupAttribute attr) | 添加用戶組 |
delUser( String name ) | 刪除用戶 |
delUserGroup(String name) | 刪除用戶組 |
getUsers() | 枚舉用戶 |
getUserGroups() | 枚舉用戶組 |
(一) 添加刪除枚舉用戶/用戶組
添加用戶/用戶組一般操作相當(dāng)簡(jiǎn)單,取得連接后,得到用戶工廠,建立用戶或用戶組屬性對(duì)象,調(diào)用工廠方法addUser與addUserGroup即可,刪除用戶/用戶組只須以名稱為參數(shù)調(diào)用delUser/delUserGroup方法,典型代碼如下:
IUserFacotry uf = conn.getUserFacotry() ; //添加用戶 IUser u = uf.addUser( new UserAttribute(“TESTUSER”)) ; Boolean b = uf.delUser(“TESTUSER”) ; //刪除用戶 //添加用戶組 IUserGroup grp = uf.addUserGroup( new UserGroup(“admin”)) ; Boolean b = uf.delUserGroup(“admin”);//刪除用戶組 //枚舉用戶用戶組 ArrayList<IUser> users = uf.getUsers() ; ArrayList<IUserGroup> grps = uf.getGroups() ; |
(二) 驗(yàn)證用戶權(quán)限
實(shí)時(shí)數(shù)據(jù)庫(kù)有完整的安全機(jī)制,每個(gè)對(duì)象類型都有一系列的權(quán)限項(xiàng)存在,只有在權(quán)限允許的情況下,用戶才能對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)中的對(duì)象進(jìn)行操作,IUser接口提供了簡(jiǎn)單的接口來(lái)驗(yàn)證用戶是否具有操作實(shí)時(shí)數(shù)據(jù)庫(kù)對(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 { System.out.println(“用戶無(wú)權(quán)限刪除該位號(hào)”);} |
(三) 用戶/用戶組權(quán)限訪問(wèn)列表
用戶/用戶組擁有一個(gè)允許訪問(wèn)列表和一個(gè)拒絕訪問(wèn)列表,這二個(gè)列表描述的是在對(duì)象類型當(dāng)中定義的權(quán)限項(xiàng)是否具有,JRtdbc使用者可以通過(guò)IUser與IUserGroup提供的接口獲得訪問(wèn)列表ArrayList<ACEHeader>,ACEHeader類封裝了對(duì)象路徑與之對(duì)應(yīng)的權(quán)限名稱,并支持增加或刪除列表項(xiàng),下面以IUser為例,給出典型代碼:
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<ACEHeader> aces = u.getACList() ; ArrayList<ACEHeader> dcls = u.getDCList() ; |
對(duì)象類型與權(quán)限體系
實(shí)時(shí)數(shù)據(jù)據(jù)庫(kù)當(dāng)中的對(duì)象都有其對(duì)應(yīng)的對(duì)象類型,例如,位號(hào)就是一個(gè)對(duì)象樹(shù)上的特殊類型。對(duì)象類型都派生于IElementType,該接口提供了如添加自定義屬性描述、添加權(quán)限項(xiàng)等功能。類型工廠ITypeFactory提供了下列工廠方法:
名稱 | 功能 |
addType(ElementTypeAttribute attr) | 添加對(duì)象類型 |
delType(String typename) | 刪除對(duì)象類型 |
getTypes() | 枚舉對(duì)象類型 |
獲取連接,得到類型工廠后,即可添加刪除對(duì)象類型,
(一) 添加刪除對(duì)象類型
在實(shí)時(shí)數(shù)據(jù)中添加對(duì)象類型非常的簡(jiǎn)單,比如在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中添加一種報(bào)表這樣的一種類型,可先獲得類型工廠,然后建立新類型的屬性對(duì)象TypeAttribute其中只有類型名必須,調(diào)用addType添加,刪除類型只須調(diào)用delType,并以對(duì)象類型名稱為參數(shù),典型代碼如下:
ITypeFactory typef = conn.getTypeFacotry() ; TypeAttribute attr = new TypeAttribute(“報(bào)表”) ; IElementType type = Typef.addType( attr ) ;//添加對(duì)象類型。 Boolean b = typef.delType(“報(bào)表”) ;//刪除對(duì)象類型 ArrayList<IElementType> types = typef.getTypes() ;//枚舉 |
(二) 添加自定義屬性描述
在實(shí)時(shí)數(shù)據(jù)庫(kù)當(dāng)中,可以為實(shí)時(shí)數(shù)據(jù)庫(kù)對(duì)象添加自定義屬性,存儲(chǔ)在對(duì)象屬性ElementAttribute的Hashtable中,實(shí)時(shí)數(shù)據(jù)庫(kù)為驗(yàn)證自定義添加的屬性正確性,用戶必須提供自定義屬性的描述信息,為簡(jiǎn)化操作,JRtdbc把描述信息抽象成TypeBase,具體描述類派生于此基類,提供了自定義屬性的相關(guān)約束條,如zui大值,zui小值,值類型等,目前支持三種自定義類型的添加,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,zui大長(zhǎng)度為100等信息,這樣才能正確的為具體報(bào)表對(duì)象添加進(jìn)這個(gè)自定義屬性,典型代碼如下:
StringType t = new StringType( path,true,”c:\report”) ; t.setMaxLength(100); Boolean b = type.addAttribute( t ) ; |
(三) 添加權(quán)限項(xiàng)
實(shí)時(shí)數(shù)據(jù)庫(kù)中每種對(duì)象類型都有其權(quán)限項(xiàng)列表,比如報(bào)表這個(gè)對(duì)象類型,它有*控制、讀報(bào)表,寫報(bào)表、添加報(bào)表、刪除報(bào)表等權(quán)限項(xiàng),用戶可以通過(guò)接口對(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) |
對(duì)象樹(shù)的訪問(wèn)與操作
為簡(jiǎn)化在ESP-iSYS上進(jìn)行Java開(kāi)發(fā),ESP-iSYS內(nèi)部以企業(yè)資源樹(shù)的形式來(lái)組織對(duì)象,位號(hào)、報(bào)表、區(qū)域、流程圖等都是樹(shù)上的對(duì)象,其中區(qū)域里面可以有對(duì)象也可以包含子區(qū)域,就像企業(yè)里面的組織結(jié)構(gòu),比如一個(gè)部門里有許多對(duì)象,也有許多車間,車間里又有位號(hào)之類的對(duì)象可能還有二級(jí)車間,這里部門和車間或二級(jí)車間在實(shí)時(shí)數(shù)據(jù)庫(kù)里就表示為區(qū)域?qū)ο?。?duì)象樹(shù)上的所有對(duì)象都派生于IElement,使得開(kāi)發(fā)人員可以統(tǒng)一對(duì)待所有對(duì)象,對(duì)象屬性有預(yù)定義屬性和自定義屬性,預(yù)定義屬性以成員變量的形式存于對(duì)象實(shí)例中,自定義屬性存放于Hashtable中,須先以TypeBase在對(duì)象類型中添加自定義屬性描述后,才能為對(duì)象正確添加自定義屬性,目前支持浮點(diǎn)型、整型、字符串型三種類型,如圖:
可以通過(guò)IConnection方法getRegionRoot()獲取對(duì)象樹(shù)的根區(qū)域節(jié)點(diǎn)IRegion,從而*遍歷與訪問(wèn)各類對(duì)象。
(一) 添加對(duì)象
連接建立后,可通過(guò)IConnection的getRegionRoot方法獲得對(duì)象樹(shù)根結(jié)點(diǎn),遍歷到欲添加對(duì)象的區(qū)域節(jié)點(diǎn),然后以對(duì)象屬性ElementAttribute為參數(shù),對(duì)象屬性封裝類已提供了大部份默認(rèn)值,用戶可只對(duì)必要字段進(jìn)行賦值即可構(gòu)建屬性對(duì)象,避免了對(duì)大串屬性一一賦值的煩瑣,簡(jiǎn)化開(kāi)發(fā),再調(diào)用addElement(ElementAttribute attr)方法添加對(duì)象,相同方法添加位號(hào)或其它對(duì)象,典型代碼如下:
IRegion root = conn.getRegionRoot() ; RealTagAttribute realTagAttr = new RealTagAttribute(“TT”); ITag t = root.addTag( realTagAttr ) ;添加位號(hào) //IElement e = root.addElement(ElementAttribute attr) ; |
(二) 添加自定義屬性
遍歷對(duì)象樹(shù)獲取對(duì)象實(shí)例,調(diào)用geementAttribute方法獲取對(duì)象屬性,調(diào)用addCustAttrbute(name,value)添加自定義屬性,如在對(duì)象類型屬性內(nèi)未添加自定義屬性描述,或者與描述信息不符,則拋出InValidAtrributeException,典型代碼如下:
ITagFactory tf = conn.getTagFactory() ; ITag t = tf.getTag( “TT3502” ) ; ElementAttribute ta = t.geementAttribute() ; Ta.addCustAttr(“CustAttr”,”CustAttrValue”) ; |
異常處理模塊
JRtdbc有一套完整的異常體系,所有JRtdbc自有的異常全部派生于RtdbcException,含義明確,對(duì)拋出原因一目了然,并且大部份定義為未檢異常,因?yàn)檫@些異常拋出后,用戶無(wú)力恢復(fù),未檢異常不用讓用戶必須Try,Catch,這樣減少代碼量,降低開(kāi)發(fā)復(fù)雜度。具體如下:
名稱 | 含義 |
RtdbException | 實(shí)時(shí)數(shù)據(jù)庫(kù)異?;?/P> |
BadValueException | 位號(hào)值質(zhì)量碼異常,讀到壞值時(shí)拋出 |
InValidPackageException | 包解析錯(cuò)誤時(shí)拋出 |
InValidAttributeException | 添加自定義屬性時(shí),屬性無(wú)效時(shí)拋出 |
三 實(shí)例展示
下面是一個(gè)使用JRtdbc開(kāi)發(fā)的一個(gè)讀取位號(hào)實(shí)時(shí)值與歷史值的完整示例,緊湊簡(jiǎn)短的幾句Java代碼即可讀取到工業(yè)自動(dòng)化領(lǐng)域當(dāng)中的實(shí)時(shí)信息。
四 總結(jié)
以上詳細(xì)介紹了ESP-iSYS平臺(tái)Java接口的架構(gòu)與使用步驟,“一個(gè)連接,四個(gè)工廠”通過(guò)短短的數(shù)行Java代碼即能揭開(kāi)實(shí)時(shí)數(shù)據(jù)庫(kù)的神秘面紗,讓開(kāi)發(fā)人員暢游整個(gè)實(shí)時(shí)數(shù)據(jù)庫(kù),Java愛(ài)好者們可以盡情享受用Java快速開(kāi)發(fā)實(shí)時(shí)應(yīng)用所帶來(lái)的樂(lè)趣。浙江中控軟件技術(shù)有限公司在今后會(huì)不斷的對(duì)其進(jìn)行維護(hù)和升級(jí),并對(duì)提供良好的,共同努力在J2EE平臺(tái)上開(kāi)發(fā)出更多更的實(shí)時(shí)應(yīng)用。
免責(zé)聲明
- 凡本網(wǎng)注明"來(lái)源:智能制造網(wǎng)"的所有作品,版權(quán)均屬于智能制造網(wǎng),轉(zhuǎn)載請(qǐng)必須注明智能制造網(wǎng),http://towegas.com。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
- 企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
- 本網(wǎng)轉(zhuǎn)載并注明自其它來(lái)源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來(lái)源,并自負(fù)版權(quán)等法律責(zé)任。
- 如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
SAMPE中國(guó)第二十屆國(guó)際先進(jìn)復(fù)合材料展覽會(huì)
展會(huì)城市:北京市展會(huì)時(shí)間:2025-06-18