关键词:1、系统简介 《动力工段自控系统改造》项目是对南纤公司原有动力工段的自控系统进行改造和优化。目标是充分利用原有软硬件资源,用最少的投入获得高效、安全的系统性能。 原动力工段包括:化水车间、冷冻空压车间(简称动力车间)、软水站及一二泵房车间,各自拥有自己的控制室。改造前,化水车间已采用了一套SIEMENS TI545和两台全点的INTOUCH 操作站实...
- 关键词:
1 、系统简介 《动力工段自控系统改造》项目是对南纤公司原有动力工段的自控系统进行改造和优化 。目标是充分利用原有软硬件资源 ,用最少的投入获得高效、安全的系统性能。 原动力工段包括:化水车间、冷冻空压车间(简称动力车间) 、软水站及一二泵房车间,各自拥有自己的控制室。改造前,化水车间已采用了一套SIEMENS TI545和两台全点的INTOUCH 操作站实现监控 ,泵房车间也已采用了一套SIEMENS TI545 PLC 和两台256 点的INTOUCH 操作站实现监控,动力车间除5 台压缩空气干燥器采用GE 90-30PLC 控制外其余设备的监控均用盘装仪表实现 。原动力工段系统结构如下图所示。
图1 改造前的系统结构系统改造后,泵房车间和动力车间由原泵房车间的SIEMENS TI545 PLC 控制(需增加一些卡件) ,化水车间在原系统基础上增加一些功能。将原有的两台全点INTOUCH 和一台256 点INTOUCH 移入新设的集中控制室,实现三个车间的集中监控,在化水车间设一台256 点INTOUCH 操作站 ,供现场巡回检查时使用 。 同时系统通过一台新设的数据及Web 服务器与公司管理网连接,公司和工段管理者可通过公司区域网获取生产过程的数据和报表。
图2 改造后的系统结构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 及总线的当前状态。
图3图中红线表示操作站在线 ,黑色表示离线。在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#过滤泵,弹出操作窗口 ,如下图所示:
图43#过滤泵的操作变量为“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, StringLen( 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 );
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ELSE
DL_START=1;
Record=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” 的数据库中。 (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 (即返回值