|
某天然氣公司的生產信息平台,是一個生產運行關鍵數據統計和展示的平台,其中的裝置關鍵參數合格率、設備運行狀態、振動設備報警監測這三部分,由紫金橋實時數據庫提供數據。
客戶在功能上要求是這樣的:
1、裝zhuang置zhi關guan鍵jian參can數shu合he格ge率lv,報bao警jing上shang下xia限xian值zhi要yao從cong指zhi定ding的de關guan係xi數shu據ju庫ku表biao中zhong讀du取qu,該gai表biao由you工gong藝yi人ren員yuan根gen據ju需xu要yao修xiu改gai報bao警jing上shang下xia限xian的de限xian值zhi,紫zi金jin橋qiao軟ruan件jian根gen據ju此ci限xian值zhi計ji算suan裝zhuang置zhi關guan鍵jian參can數shu的de合he格ge率lv,計ji算suan完wan成cheng後hou,再zai存cun入ru關guan係xi數shu據ju庫ku指zhi定ding的de表biao中zhong。
2、設備運行狀態,實時值由信息平台實時讀取,曆史值要定時存入關係數據庫指定的表中。
3、設備振動報警監測,實時值由信息平台實時讀取,不需要存儲曆史值。
設備運行狀態以及設備振動監測的實時數據是通過開放OPC Server接jie口kou,由you對dui方fang直zhi接jie實shi時shi采cai集ji,裝zhuang置zhi關guan鍵jian參can數shu的de合he格ge率lv以yi及ji設she備bei運yun行xing狀zhuang態tai曆li史shi兩liang部bu分fen的de數shu據ju,是shi通tong過guo紫zi金jin橋qiao實shi時shi數shu據ju庫ku軟ruan件jian,將jiang曆li史shi數shu據ju寫xie入ru到daoSQL Server數據庫中,再由生產信息平台係統從SQL Server中按照需要讀取。
係統使用的軟件版本:紫金橋實時數據庫軟件V6.5。
功能窗口截圖如下,由於該窗口不需要展示,故未做任何美化:

各部分功能說明:
1-報警時間統計組件,用於統計位號的累計報警時間,以便計算合格率。
2-設備狀態實時報表,實時顯示設備狀態值,通過腳本將對應位號的值存儲到數據庫中。
3-位號的報警上下限值報表,從關係數據庫讀取參數的報警限值。
4-手動讀取合格率報警限值按鈕,點擊後讀取關係數據庫的報警限值。
5-查看當天已經寫入數據的報表,用來查看數據庫中已經寫入的數據。
6-查看設備狀態/合格率數據按鈕。點擊按鈕分別查看最近一天的設備狀態或者合格率數據。
窗口最下方的部分即5、6兩塊實際上不是功能必須的,隻是方便開發者自己查看遠程數據庫中的數據是否成功存儲。
本文主要介紹“裝置關鍵參數合格率”這部分的功能,“設備運行狀態”部分大同小異,“設備振動監測”部分不需要向關係數據庫存儲數據,所以這兩部分不再過多敘述。接
下來開始說明關鍵參數合格率功能部分:
1、窗口中新增報警時間統計組件,命名為Alarm1,在組件中添加需要進行統計的位號,設置位號使用自身報警限值。
2、點組態中,新增‘報表關係數據源點’,連接要讀取數據的關係數據庫。
3、窗口中新增自由報表,關係數據庫連接裏麵,連接新建的報表關係數據源點,並將報表命名。本案例中,該報表名為Fr1 。
4、建立表模板。
使用紫金橋軟件預定義的SQL函數向關係數據庫插入數據,首先要按照固定表結構在關係數據庫先創建表, SQL函數無法直接生成表,而是需要一個給定的模板,按照模板進行表的創建,這就需要事先定義好一個表模板。
下圖是合格率數據表要使用的表模板,要創建的表一共有4個字段,分別是‘日期、位號名、值、權重’,對應的字段名分別是‘UpdateTime、TagName、TagValue、TagLevel’,權重這個字段是客戶要求的。

合格率表模版
創建表使用函數SQLCreateTable(),這裏定義一個窗口整型變量w_cID,供SQL函數使用。關於紫金橋實時數據庫預定義的SQL函數的用法,請讀者自行查看幫助,這裏不再詳述。
yidanshujubiaochuangjianwanbi,biaomobanjiubuzaixuyaole。jiyuciyuanyin,zuikaishideshujubiaoshishiyonganniuchuangjiande,chuangjianwanbihou,anniujiushanchule,suoyichuangkouzhongmeiyouchuangjianshujubiaodejiaoben。
5、建立綁定表。
數據表創建完畢後,接下來就是向表內插入數據了。要向關係數據庫表內插入數據,需要使用紫金橋實時數據庫的‘綁定表’,綁定表裏的字段名設置要和表模版裏的字段完全一致,否則插入數據時會失敗。
另外,需要建立4個中間變量(圖中變量名部分),分別對應數據表的4個字段,供綁定表使用,具體用法在後麵腳本部分會詳細介紹。

合格率綁定表
6、腳本。
由於紫金橋實時數據庫6.5版軟件裏,窗口周期執行腳本的周期不能大於15分鍾,所以為了實現需要的功能,定義以下整型窗口變量:w_cID、w_t1、w_t2、w_t3、w_t4、w_TBegin,具體使用在後麵的腳本中說明。
進入窗口:
進入窗口後,執行下麵腳本,前三行是給w_t1、w_t2、w_t3賦值為次日零點的時間;第五行w_TBegin賦值為當日零點的時間,是報警統計組件執行統計的起始時間;第六行連接數據存儲所使用的數據庫,由於連接字符涉及到客戶信息,所以這裏去掉了,讀者可以自己查看幫助中關於紫金橋軟件內置SQL函數的用法,裏麵有關於連接數據庫的詳細說明。w_t4賦值為次日上午8:30分的時間,設備狀態數據存儲腳本使用,與合格率數據存儲無關。w
_t1 = LongTime(StrLeft(StrTime($Curtime,0),10) + " 00:00:00") + 86400;
w_t2 = w_t1;
w_t3 = w_t1;
w_t4 = LongTime(StrLeft(StrTime($Curtime,0),10) + " 08:30:00") + 86400;
w_TBegin = LongTime(StrLeft(StrTime($Curtime,0),10) + " 00:00:00");
SQLConnect(w_cID,"此部分是數據庫服務器連接字符串,不便公開");
周期執行:
首先,每天淩晨前5分鍾,從關係數據庫讀取關鍵參數的報警限值到報表Fr1中。由於報警限值由工藝人員維護,可能根據工藝需要有修改,所以每天計算合格率之前要重新讀取。腳本如下:
if $Curtime >= w_t1-300 && $Curtime < w_t1-240 then
w_t1 = $Curtime + 86400;
#Fr1.SqlSelectCmd("select 位號,指標級別,下限,上限 from TM_裝置關鍵控製參數");
Delay(1500);
for i = 1 to #Fr1.RowCount()+1
#本地.SetDataStr(#Fr1.Txt(1,i)+".EU",#Fr1.Txt(2,i));
#本地.SetDataReal(#Fr1.Txt(1,i)+".EULO",#Fr1.Val(3,i));
#本地.SetDataReal(#Fr1.Txt(1,i)+".EUHI",#Fr1.Val(4,i));
#next
#本地.RegUpdate();
endif
腳本第1行是判斷本段腳本執行的時間,當係統時間處於零點前5分鍾至前4分鍾這段時間內,開始執行腳本;
第2行是將變量w_t1的值增加一天的時間,以便下次執行的時間是在下一天的同一時間;
第3行是報表Fr1從關係數據庫的表中讀取報警限值;
第4行是延遲時間,以便報表Fr1能夠完全讀取表中的數據;
第5~9行循環,將報表Fr1中的報警限值以及權重設置到對應的位號,第6行是設置權重,第7行是設置報警下限,第8行是設置報警上限;
第10行,刷新第6、7、8行操作以後的點的信息。
讀取報警限值後,接下來就是根據報警限值計算位號的合格率了。下麵這段腳本是判斷係統時間在零點前4分鍾至3分鍾之間,開始執行,同樣把變量w_t2的值增加一天,即與w_t1相同,然後開始報警組件進行報警時間的統計,統計的時間是一天,即86400秒。
if $Curtime >= w_t2-240 && $Curtime < w_t2-180 then
#w_t2 = w_t1;
#Alarm1.Start(w_TBegin,86400,1);
endif
在報警統計組件完成統計後,接下來就需要將統計的數據提取出來,然後計算,再把計算結果存入數據庫的表中了。
if $Curtime > w_t3-60 && $Curtime <= w_t3 then
w_t3 = w_t1;
for i = 0 to #Alarm1.GetTagCount()
Bind_TagValue = 1 - (#Alarm1.GetCellHi(0,i) + #Alarm1.GetCellLow(0,i))/86400;
Bind_TagName = #Alarm1.GetTag(i) + ".PV";
Bind_StrTime = StrTime($Curtime,1);
for j = 0 to #Fr1.RowCount()
if #Alarm1.GetTag(i) == #Fr1.Txt(1,j+1) then
Bind_TagLevel = #Fr1.Txt(2,j+1)
endif
next
SQLInsert(w_cID,"XHQ_HGL","XHQ_BindHGL");
next
endif
這部分腳本就是向數據庫表內寫入數據了。
第1行仍然是判斷時間,當時間達到零點前一分鍾時,開始執行腳本,首先還是將時間變量w_t3增加一天,與w_t1相同;
第3~13行循環,將報警組件中所有位號的值逐個進行計算,然後存入數據庫的表中。
第4行是把報警組件第i列的位號報警上限時間和報警下限時間求和,然後除以一天的時間,得到不合格率,再用1減去不合格率得到合格率的數值,賦給綁定表使用的變量;
第5行是把報警組件第i列的位號賦給綁定表變量;
第6行是把當前時間賦給綁定表變量;
第7~11行,是在報表Fr1中查找當前第i列位號的權重,然後賦給綁定表變量;
第12行,4個綁定表變量都已經賦值,此行使用紫金橋軟件的SQL函數,將綁定表變量的值插入到關係數據庫表中。
至此,完成報警組件第i列的一個循環,直至報警組件中所有位號的合格率統計值都插入數據表後,循環完成。
退出窗口:
這裏隻有一行腳本,就是當退出窗口時,斷開與關係數據庫的連接。
SQLDisconnect(w_cID);
整個腳本的關鍵,就是周期執行部分,這裏使用了一個小技巧,由於紫金橋實時數據庫6.5版,周期執行腳本的周期不能大於15分(fen)鍾(zhong),所(suo)以(yi)這(zhe)裏(li)使(shi)用(yong)一(yi)個(ge)整(zheng)型(xing)變(bian)量(liang),通(tong)過(guo)該(gai)變(bian)量(liang)的(de)值(zhi)與(yu)係(xi)統(tong)當(dang)前(qian)時(shi)間(jian)比(bi)較(jiao),隻(zhi)有(you)符(fu)合(he)條(tiao)件(jian)才(cai)能(neng)執(zhi)行(xing)腳(jiao)本(ben),否(fou)則(ze)不(bu)執(zhi)行(xing),這(zhe)就(jiu)保(bao)證(zheng)了(le)腳(jiao)本(ben)隻(zhi)在(zai)每(mei)天(tian)指(zhi)定(ding)的(de)零(ling)點(dian)附(fu)近(jin)執(zhi)行(xing)。
另外,為了保證每一部分的腳本能夠完全執行完畢,並且不在時間上有交叉衝突,所以設置3個不同的時間變量,並且在不交叉的時間執行。而且通過這樣的方法,不會影響其他需要頻繁執行的周期腳本正常運行。
總結:
benlizhongshiyonglebaobiaoguanxishujuyuandianyuziyoubaobiaoxiangjiehe,duquguanxishujukubiaozhongdeshuju,zheyangdehaochushicaozuojiandan,buxuyaoxieguoduojiaoben,danshiwufaxiangshujukubiaozhongxierushuju。
又使用了紫金橋實時數據庫軟件預定義的SQL函數,向關係數據庫中寫入數據。SQL函數的優點是功能全麵,幾乎能夠完成對關係數據庫表的所有操作,包括查詢、插入、刪除、建表、刪表等等;缺點就是操作相對自由報表和報表關係數據源點的結合要繁瑣一些,需要建立表模版、綁定表,還要手動寫一些腳本等。
|