CL/AM程序设计在罐区中的应用

供稿:霍尼韦尔中国

  • 关键词:CL/AM程序设计,储量,计算,优化思路,程序源码
  • 作者:王雨辰
  • 摘要:Honeywell TDC3000系统的CL/AM程序设计在复杂运算方面能力突出,在乙烯罐区9501A、B罐及其他乙烯和丙烯罐储量计量中能力卓越,本文在这方面有详细阐述并且提出一些优化思路。

引言:
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 程序部分源代码及代码说明
本例是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) — — 每一个高度对应的体积数,有省略
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是不同的数据源。其中GENENRIC 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 程序流程图:


5.3 部分代码如下:

PACKAGE
CUSTOM - - 数据段参数声明开始
PARAMETER LEVEL “level of tank” - - 被测球罐实时液位
PARAMETER DENSITY “density of liquid” - - 罐内液体的密度
PARAMETER RADIUS “radius of tank” - - 球罐的半径
END CUSTOM - - 参数声名结束

BLOCK TANK_CALC(GENERIC; AT PV_ALG) -- 程序块开始
LOCAL level1,diameter,V,M - - 临时变量声明,液位、直径、体积、储量
PARAMETER PVCALC - - 返回绑定点的测量值接口
PARAMETER PVAUTOST:PVVALST - - 返回绑定点的测量值模式接口
SET level1=0.0 - - 临时液位变量初值
SET diameter=2*RADIUS - - 临时直径(总高)初值
IF LEVEL<0.0 THEN SET level1=0.0 - - 产生负值液位时,设没有液位
IF LEVEL>diameter THEN SET level1=diameter - - 产生超大液位时,设满罐
IF (LEVEL>=0.0) AND (LEVEL<=diameter) THEN SET level1=LEVEL - -液位正常
- - 计算实时液位所达到的液体体积
SET V=3.1415926*level1*level1*(3*RADIUS – level1)/3
- - 计算储量
SET M=V*DENSITY
- -
CALL ALLOW_BAD(PVCALC,M) - - 输出计算储量值到绑定点测量值,对错误处理
SET PVAUTOST=NORMAL - - 设定绑定点测量工作模式为正常
END TANK_C
END PACKAGE

5.4 绑定点的部分组态值:
绑定点为AM REGULATORY 点:


5.5 优化方式与原方式的比较
5.5.1 计算量:
发布时间:2007年11月7日 17:03  人气:  
更多内容请访问(霍尼韦尔中国
相关链接

我有需求