摘要:
Honeywell TDC3000系統的CL/AM程序設計在復雜運算方面能力突出,在罐區儲量計量中能力卓越,本文在這方面有詳細闡述并且提供另一種近似計算方法和程序源碼,并且利用到了面向對象程序設計方法的設計思想。
關鍵詞:
CL/AM,程序設計,罐區、儲量、計算、程序源碼、面向對象
引言:
CL/AM程序設計是Honeywell TDC3000 DCS系統中一個運算功能強大的工具。在DCS系統中有一部分復雜算法是標準測量算法無法實現的,這是就要借助CL/AM程序設計語言來實現。化工區乙烯罐區乙烯丙烯的儲量計算就是應用此法。
1、 CL語言的分類
CL語言可分為CL/MC、CL/PM、CL/AM三種設計方法:
(1)、CL/MC既是應用于多功能控制器(Multifunction control)的控制語言;
(2 )、CL/PM既是應用于過程管理器(Process Managers)的控制語言;
(3 )、CL/AM既是應用于應用模塊(Application Module)的控制語言,其主要參與連續控制的應用。
而本文主要涉及CL/AM的應用。
2、 CL/AM的功能及方法
基于AM的CL程序適用于較大規模程序及大量數據支持的應用。由于這一點,就需要得到數據庫的支持,而這個數據庫就包含了DCS系統中所有的數據點。
在DCS系統中,如果標準數據點處理功能或者標準PV或控制算法不能提供所需求的有效算法,即:
(1)、標準PV算法不能提供所需求的足夠的算法和邏輯,那么在建立數據點時設定PVALGID= CL并將CL/AM程序連接來代替標準PV算法;
(2)、標準控制算法不能滿足所需求的控制動作,那么在建立該數據點時,設參數CTLALGID=CL并將相應CL/AM程序連接來代替標準控制算法;
(3)、CL/AM程序也能被連接到,例如Regulatory Control、Custom或Switch類型的數據點上來擴大數據點的處理功能。
3、 CL/AM程序的結構
一個完整的CL/AM結構如下:
PACKAGE
CUSTOM — —參數聲明區
----------------------------------------
----------------------------------------
END CUSTOM
BLOCK 塊名 (作用范圍;AT 代替算法)
---------------------------------------- — —程序代碼區
---------------------------------------
END 塊名
END PACKAGE
4、 CL/AM程序在乙烯罐區儲量計算中的應用
4.1、設計思路:
因為在罐區的儲罐為非完全標準球罐,很難在數據點的標準PV算法中計算出其實時的儲量,即根據球罐的實時液位及密度等參數來計算出罐內液體的質量。所以在實際的運用中DCS采用了CL/AM程序來代替AM Regulatory點的PVALGID算法。乙烯罐區9501A、9501B兩罐的罐內液體質量計算即用CL/AM程序來實現。在這里,罐內液體的密度是0.442。程序設計思路如下,在積分學中為了計算某一不規則圖形的面積或體積時會將其細分為若干個近似規則的有可遵循計算方法的小圖形來計算,之后再集合成該圖形的面積或體積,當然分的越細則越精確。設下圖為不規則圖形:
我們可以將其劃分為n個高為h,寬為dn的方形來計算,n決定其精度。而9501A、B罐的CL/AM計算質量程序就采用此思路。將球罐等高度劃分為143段,計算出每個高度所對應的體積并將其放入數組中。實時的液位高度將在143段的某兩段之間或等于某一段,然后根據該段的體積數Vn加兩段之間按比例計算的V` 得出總的體積,繼而根據密度計算出罐的儲量。
4.2程序結構圖:
4.3 程序部分源代碼及代碼注釋:
本例是DCS中9501A、B兩罐的儲量計算公式。兩罐的規格相同,則在同一個CL/AM程序中一起計算,結果外送到數據點MI9501A.PV和MI9501B.PV。部分程序源代碼如下:
PACKAGE CUSTOM(NOT BLD_VISIBLE) ——數據段聲明開始;
PARAMETER MIN:ARRAY(1..144) —— 包含143段體積數的數組;
VALUE (0.0,0.224,. . . ,1531.115) —— 每一層對應的體積,略去141個數組值;PARAMETER LI:ARRAY(1.. 10) — —中間數組,保存臨時用到的高度;
PARAMETER MI:ARRAY(1..10) — —中間數組,保存用到的儲量和密度;
END CUSTOM— —數據段聲明結束;
BLOCK MC302(POINT MC302;AT PV_ALG) — —程序塊開始,綁定在MC302上;
EXTERNAL LI9501A_30, LI9501B_30 — —輸入點液位接口;
EXTERNAL MI9501A, MI9501B — —輸出點儲量接口;
LOCAL I,J,K — —臨時變量;
SET J=2 — — 罐的數量,即A、B罐;
SET MI(6)=0.442 — — 罐內液體的密度;
A2: LOOP FOR I IN 1 . . 5 — —變量初始化;
SET LI (I)=0.0
MI (I)=0.0
REPEAT A2
IF LI9501A_30.PV>0.0 THEN SET LI(1)=LI9501A_30.PV — —如果有液位,賦值;
IF LI9501B_30.PV>0.0 THEN SET LI(2)=LI9501B_30.PV — —同上;
A1: LOOP FOR I IN 1 . . J — —儲量的計算過程,A、B兩罐;
IF LI(I)=0.0 THEN GOTO A3 — —如果沒有液位則跳轉,按體積為零計算;
IF LI(I)>=14.30 THEN SET LI(I)=14.30 — —如果超滿液位則按體積為滿計算;
SET K=INT(LI(I)*10) — — 用取整函數取液位達到或超過的最近的層數;
SET LI(8)=MIN(K+2) -MIN(K+1) — — 取液位所在兩層之間的體積差;
SET LI(9)=LI(I)*10 -K — — 取液位K+1和K+2層之間部分高度;
SET MI(I)=MIN(K+1)+LI(8)*LI(9) — — 計算出當前液位所對應的體積數;
A3: REPEAT A1 — —LOOP A1循環結束;
SET MI9501A.PV=MI(1)*MI(6) — —A罐儲量=A罐體積*密度;
SET MI9501B.PV=MI(2)*MI(6) — —B罐儲量=B罐體積*密度;
SET K=MI(1) — —A罐體積交給K;
CALL ALLOW_BAD(PVCALC,K) — —如果K值有錯誤,同樣可以賦值,不忽略;
— —下一句K為BAD值時,綁定點的PVAUTOST模式為BAD,其他則正常模式;
SET PVAUTOST=(WHEN BADVAL(K):BAD;WHEN OTHERS:NORMAL)
END MC302
END PACKAGE
4.4 以上思路的優缺點:
從以上思路可以看出來CUSTOM數據段是一個長為144的數組數值,是通過人工測量計算后得到的球罐143個平均高度層每層所對應的體積數,然后在寫入程序時編碼到源代碼中。其優點是對于同一種規格的球罐來說數組值不會有變化,從而一個程序能計算多個球罐體積(但擴展時需要重新編碼)。
優缺點是:
(1)、計算量大:
對于每一個分層所對應的體積數都要計算而得,這在設計階段的計算量太大;
(2)、可維護性差:
因本例中9501A、B罐儲量在一個程序中計算,且31系列的乙烯A、B、C、D和丙烯A、B、C罐也在另一個程序中一起計算(原理相同),若要對數據段數據或密度等進行維護修改,則會引起通程序中其他的儲量計算出現問題;
(3)、通用性差:
因為數據段的體積數是具體的數據,所以每一種直徑的罐都是不同的,那么每一種罐都需要一個單獨的邨CL/AM程序來計算,增大了工作量也增加了HM的存儲壓力,更不利于改造時的擴展。
5、CL/AM程序在乙烯罐區中應用的面向對象程序設計優化思路
5.1.1 CL/AM程序GENERIC應用:
這種應用適合于一批情況相似的計算應用,不必對每一個都設計出CL/AM程序,而是對相似的計算設計出一個程序來讓所有其它的相似計算共同引用。不同的是在CUSTOM數據段中引用的GENERIC INPUT是不同的數據源。其中ENENRIC INPUT是在被綁定點PED端口設置NOGINPTS的值為引用的數據源的個數,這也是面向對象程序設計方法,如對9501A罐儲量計算時被綁定點的部分組態如下:
5.1.2 CUSTOM數據段的應用:
該思路中還用到密度和半徑,應該也包括在CUSTOM數據段中。對于不同的半徑球罐和罐內液體,可以在綁定點得PED組態時更改為相應的半徑和密度。
5.1.3 計算公式: 所用到的公式如下
V = 3.1415926*LEVEL*LEVEL*(3*RADIUS-LEVEL)/3 ……….①M=V*DENSITY ………………………………………………………②
5.2 程序流程圖:
![]()