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, StringLe(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 );
www.it168.com
SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" );
ELSE
DL_START=1;
Recor d=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 可以做到车间层与管理层的紧密结合,管理者可以在办公室里浏览到生产一线的数据,使企业以更高的效率进行生产和管理。