HMI软件InTouch的应用 |
2007-6-20 10:35:00 网络转载 供稿 |
简介: 本文介绍的是InTouch在某醋酸纤维有限公司《动力工段自控系统改造》项目中的应用。 关键字:intouch 自控 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, 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” 的数据库中。 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 可以做到车间层与管理层的紧密结合,管理者可以在办公室里浏览到生产一线的数据,使企业以更高的效率进行生产和管理。 |







