Intouch在烟草行业自动化领域中的应用

扫码手机浏览

关键词: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 (即返回值



本文转载自互联网,如有侵权,联系删除

展开