1. 系統簡介
《動力工段自控系統改造》項目是對南纖公司原有動力工段的自控系統進行改造和優化。目標是充分利用原有軟硬件資源,用最少的投入獲得高效、安全的系統性能。
原動力工段包括:化水車間、冷凍空壓車間(簡稱動力車間)、軟水站及一二泵房車間,各自擁有自己的控制室。改造前,化水車間已采用了一套SIEMENS TI545 PLC 和兩臺全點的INTOUCH 操作站實現監控,泵房車間也已采用了一套SIEMENS TI545 PLC 和兩臺256 點的INTOUCH 操作站實現監控,動力車間除5 臺壓縮空氣干燥器采用GE 90-30PLC 控制外其余設備的監控均用盤裝儀表實現。原動力工段系統結構如下圖所示。
改造前的系統結構
系統改造后,泵房車間和動力車間由原泵房車間的SIEMENS TI545 PLC 控制(需增加一些卡件),化水車間在原系統基礎上增加一些功能。將原有的兩臺全點INTOUCH 和一臺256 點INTOUCH
移入新設的集中控制室,實現三個車間的集中監控,在化水車間設一臺256 點INTOUCH 操作站,供現場巡回檢查時使用。
同時系統通過一臺新設的數據及Web 服務器與公司管理網連接,公司和工段管理者可通過公司區域網獲取生產過程的數據和報表。
改造后的系統結構
2. 系統功能及特點
2.1冗余的總線及操作站
系統包含2 臺全點的INTOUCH(SERVER1、SERVER2)和2 臺256 點的INTOUCH(CLIENT1、CLIENT2),SERVER1、SERVER2 分別通過各自的TIWAY 卡與化水、泵房的PLC 構成兩條冗余的TIWAY 總線。CLIENT1、CLIENT2 則通過遠程變量訪問某臺全點INTOUCH 上的數據從而實現對現場的監控。通常CLIENT1、CLIENT2只與SERVER1、SERVE2 中的一臺通訊,當發生通訊故障時會自動嘗試與另一臺SERVER 連接。INTOUCH 中的“通訊狀態”畫面顯示了各工作站、PLC 及總線的當前狀態。
圖中紅線表示操作站在線,黑色表示離線。在CLIENT1、CLIENT2 的“通訊狀態”畫面中,工程師可以手動切換CLIENT 與SERVER 的連接。
2.2“瘦”操作站模式
256 點的CLIENT 通過遠程變量訪問全點的SERVER 從而訪問PLC,這樣CLIENT的變量配置不超過256點。同時系統運用了“分布式報警”和“分布式歷史趨勢”等功能,所有的報警記錄及歷史趨勢都存儲在全點的SERVER上,CLIENT上顯示的報警和歷史趨勢是從SERVER上獲得的。可以說,SERVER充當了INTOUCH服務器而CLIENT是一個INTOUCH 客戶端,只需較低的配置即可。當切換SERVER時,“分布式報警”和“分布式歷史趨勢”也跟著自動切換。
1.“分布式報警”的設置
在INTOUCH 組態中需用“分布式報警”控件,在控件的報警查詢欄中輸入“\\SERVER1\INTOUCH!DONGLI”,SERVER1 為缺省連接的計算機名,DONGLI 表示INTOUCH 中的DONGLI 報警組(報警組包括DONGLI、HS)。在SERVER 的計算機屬性需選中“本機將提供報警”;而在CLIENT 的計算機屬性中需選中“本機將顯示報警”。運行時CLIENT 將通過函數切換與SERVER 的連接。
為了統一報警設置,我們將報警做在PLC 的報警模塊中通過對PLC 變量“AHA(報警上限)、AHHA(報警上上限)、ALA(報警下限)、ALLA(報警下下限)、APV(報警過程值)、AVF(報警狀態字)”的讀寫來判斷和設置報警。有報警發生時,只有SERVER 會將報警信息寫入報警記錄,SERVER2 在寫報警信息前先判斷SERVER1是否在運行,以免重復寫入。
2.“分布式歷史趨勢”的設置(以SERVER1 為例)
在SERVER 的INTOUCH 組態中需將歷史數據的存放路徑設為INTOUCH 默認路徑。CLIENT 的INTOUCH 組態需在“分布式名稱管理器”中的“分布式歷史”里添加一項,供應器名稱為“SERVER1”,路徑為“\\SERVER1\D\NCFC2000S1”(工程路徑)即可。在CLIENT 中訪問SERVER1 的歷史數據需寫成“SERVER1.TAGNAME”。SERVER2 的設置與SERVER1 相同。
3.遠程變量的引用
在CLIENT 上使用遠程變量只需在變量名前加計算機
名即可,無需在標記名字典中新建變量,所以不占點數。(SERVER:TAGNAME)
4.自動切換功能
CLIENT 通過遠程變量觀察SERVER 上的$Second 變量,若它在在一段時間內無變化則表明與SERVER 的連接出現問題,這時可通過SetAccessName 函數將CLIENT 上的遠程變量切換到另一臺SERVER 上。
2.3公用的操作窗口
系統中對于具有相同操作接口設備使用了公用的操作窗口,而不是對應每個設備都創建一個操作窗口,這樣大大減少了窗口的數量。實現它需要用到間接變量,可以將間接變量看作一個指針,當對某個設備操作時,利用間接變量指向操作變量,這樣,對間接變量的賦值就會作用到操作變量上,操作變量的變化也會反應到間接變量上。
以過濾水泵為例,在過濾水處理系統中,點擊3#過濾泵,彈出操作窗口,如下圖所示:
3#過濾泵的操作變量為“RUN-3#GLB(啟動)”、“STOP-3#GLB(停止)”、“RL-3#GLB(反饋)”、“AUTO-3#GLB(自動)”、“REPAIR-3#GLB(檢修)”點擊過濾泵時執行語句:
DL_START.NAME=RUN-3#GLB.NAME;
DL_STOP.NAME=STOP-3#GLB.NAME;
DL_RL.NAME = RL-3#GLB.NAME;
AUTO.NAME = AUTO-3#GLB.NAME;
DL_REPAIR.NAME=REPAIR-3#GLB.NAME;
“DL_XXX”為間接變量。在操作窗口中只需對間接變量賦值即可。例如在“啟動”按鈕的動作屬性中寫到:
IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN
DL_START=1;
DL_STOP=0;
Record=DL_START.Comment;
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); //寫操作紀錄
ELSE
IF DL_START.Name = = "NULL" THEN
DL_STOP=0;
Record=StringLeft( DL_STOP.Comment, StringLe(DL_STOP.Comment )/2 );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ELSE
DL_START=1;
Record=StringLeft( DL_START.Comment, StringLen(DL_START.Comment )/2 );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ENDIF;
ENDIF;
因為設備的啟停一般有兩種:1.啟動與停止是一個輸出;2.啟動與停止是兩個輸出。為一個輸出時我們將輸出變量的COMMENT 屬性寫為“XXX 啟動XXX 停止”這樣,在寫操作記錄時需取COMMENT 的左一半或右一半;若為兩個輸出時,變量的COMMENT 將為“XXX 啟動”或“XXX 停止”,寫記錄時取對應變量的COMMENT即可。
CLIENT 的情況比較特殊,因為CLIENT 需用間接變量指向遠程變量,而遠程變量的COMMENT 無法賦給間接變量的COMMENT,所以為了在公用窗口中獲得遠程變量的COMMENT 我們只能利用間接變量的NAME(即遠程變量的NAME)在數據庫中查找到COMMENT,再寫操作記錄。語句如下:(寫記錄的操作參見“數據庫的應用”。)
IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN
DL_START=1;
DL_STOP=0;
Record=StringRight( DL_START.Name ,StringLen( DL_START.Name )-7 );
SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" ); //查找COMMENT
SQLFirst( ConnectionId );
Record=StringTrim( COM, 3 );
SQLEnd( ConnectionId );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); //寫操作紀錄
ELSE
IF DL_START.Name=="NULL" THEN
DL_STOP=0;
Record=StringRight( DL_STOP.Name ,StringLen( DL_STOP.Name )-7 );
SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" );
SQLFirst( ConnectionId );
Record=StringTrim( COM, 3 );
Record=StringLeft( Record, StringLen( Record )/2 );
SQLEnd( ConnectionId );
www.it168.com
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ELSE
DL_START=1;
Recor d=StringRight( DL_START.Name ,StringLen( DL_START.Name )-7 );
SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" );
SQLFirst( ConnectionId );
Record=StringTrim( COM, 3 );
Record=StringLeft( Record, StringLen( Record )/2 );
SQLEnd( ConnectionId );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ENDIF;
ENDIF;
2.4數據庫的應用
系統中的IBM 服務器作為數據存儲和發布的服務器,安裝了SQL SERVER 2000,系統的報警歷史記錄和操作記錄以及設備檔案都存放在名為“DL” 的數據庫中。
2.4.1 ODBC的連接
INTOUCH 通過ODBC 訪問SQL SERVER,在ODBC 中建立名為“DL”的用戶DSN,在INTOUCH 中用語句:
SQLConnect( ConnectionId, "DSN=DL");
建立連接,若連接成功則ConnectionId > 0 。在執行每一條SQL 語句時都會有一個返回值,若返回值為0 則表示執行成功,否則表示與數據庫連接不正常,需重新建立連接。為了時刻檢測與數據庫服務器的連接情況,在應用程序腳本中每5 秒鐘執行一條查詢語句:
IF ResultCode = = 0 THEN
ResultCode = SQLSelect(ConnectionId , "SYSUSERS" ,"SYSUSERS","UID=0", "" );
ENDIF;
同時在條件腳本中判斷ResultCode (即返回值)若ResultCode <> 0 則斷開連接:
SQLDisconnect( ConnectionId );
ConnectionId = 0;
SHOW “通訊狀態”;
打開“通訊狀態”畫面,顯示信息“與服務器連接失敗!”及“重試”、“取消”兩個按鈕。按“重試”,置位系統將每20 秒進行一次嘗試連接:
IF RETRY = = 1 THEN
ResultCode = SQLConnect( ConnectionId, "DSN=DL");
ENDIF;
直到ResultCode = 0 為止。
嘗試連接時系統將變得很忙。若想取消連接,則按“取消”按鈕,系統將不再與服務器連接,對現場 的監控可以正常進行,但操作與報警記錄都將不寫入服務器(數據發布不受影響)。希望重新連接服務器時,只需在“通訊狀態”畫面下按“重試”按鈕即可。
2.4.2 綁定列表
在全點INTOUCH 中需建立四個綁定列表:“alarmhis”,“cortrolog”,“device”,“sysusers”分別對應數據庫中的表格。“sysusers”只是為了檢查ODBC 連接用的,并無其他用處。在每個列表中用變量與各字段相對應,如“cortrolog” 中變量“DATETIME” 對應字段“DATETIME” ;變量“$OPERATER”對應字段“USERNAME” ;變量“RECORD”對應字段“RECORD”等。在寫記錄前,只需先對變量復值,再執行語句:
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
即可。
查詢記錄時,首先準備一個查詢條件,例如在“稀礬池液位”的動作腳本中有以下語句
DEVICE_ID= LT51027.Name;
ShowAt("設備檔案",$ObjHor +200, $ObjVer +50);
SQLSelect( ConnectionId , "DevICE" , "DevICE" , "Device_ID=" + "’"+ device_id +"’" , "" );
SQLFirst( ConnectionId );
首先將要查詢的設備名(LT51027)賦給DEVICE_ID。
“SQLSelect”語句實際上執行了一條SQL 語句:
SELECT * FROM DEVICE WHERE DEVICE_ID = ‘LT51027’
后將查詢到的記錄的字段值賦給綁定列表中的變量。這樣在設備檔案中里,只要放上綁定 列表中的變量就能顯示查詢的結果了。下圖為從數據庫中查到的設備’ LT51027’的信息。
3 管理層應用程序
有了數據庫中的“操作記錄”、“報警記錄”和“設備檔案”,可以方便的開發管理層應用程序。下圖是用Delphi 開發的一個客戶端軟件,用來查詢記錄及維護設備檔案,它可以運行在工程師的PC 上。
另外,利用Intouch 的NETDDE 功能,可將生產數據實時地通過第三方軟件進行發布,這里涉及更多的軟件編程技術,就不在深入了。下圖為將數據以WEB 的方式進行發布。
結束語
以上的數據庫及WEB 功能也可以通過IndustrialSQL Sever 和SuiteVoyager 實現,以上的應用可以說明InTouch 無論在腳本和第三方軟件的接口方面都是非常靈活的。在過去,組態軟件往往只針對下位機,一個控制系統通常與外界隔離,成為信息孤島,使用Intouch 可以做到車間層與管理層的緊密結合,管理者可以在辦公室里瀏覽到生產一線的數據,使企業以更高的效率進行生產和管理。