李德华,许立梓,李文国
1 引言 InTouch是当今最流行的工控软件开发工具之一,是美国Wonderware公司开发的世界上第一个集成的、基于组件的MMI(生产制造管理信息)系统FactorySuite2000中的一个核心组件。它具有世界领先的HMI(人机接口界面)和面向对象的图形开发环境,便于高效、快捷地配置用户的应用程序。笔者在使用InTouch7.1开发工控软件的过程中发现在安全功能的实现上,传统的方法不能完全满足用户的要求,因而有必要在此进行探讨并给出解决方案。 2 实现安全功能的传统方法 2.1 方法一:用InTouch7.1自带的安全功能菜单 InTouch7.1包括WindowMaker和WindowViewer两部分。其中,WindowMaker是InTouch的可视化开发环境,用于开发基于Windows的应用程序;WindowViewer是InTouch的运行环境,显示和执行在WindowMaker中编写好的应用程序。InTouch自带的安全功能,在WindowMaker和WindowViewer的Security菜单下均可以找到,有关选项包括Log on、Change Password、Configure Users和Log off。一般来说,客户使用应用程序,都是运行在WindowViewer环境下,而不允许切换到WindowMaker下去修改源程序,即安全功能是通过对WindowViewer的Security菜单操作来实现的。但这种方法有以下几种弊端: (1) 开发国内的工控软件,界面的文字一般都使用中文,但InTouch7.1是英文版,Security菜单下的各选项和其中的设置内容都是用英文显示,因而不协调。 (2) Security菜单的位置固定在窗口的最上方,不够灵活,有时同整个系统的界面不一致。 (3) 在InTouch7.1中用户权限设置是通过Configure Users窗口里的Access Level(0~9999)来设定的,权限最高是9999,权限最低是0,为缺省权限。什么样的权限享有什么样的功能可以在软件编写的时候通过语句来控制。这样带来一个管理上的不便,就是要附加一份权限和功能对应的记录交给客户,客户必须严格遵循这份记录来设定用户的级别,而且也不够直观。 2.2 方法二:创建控件和使用系统变量 在InTouch7.1中,提供了能实现安全功能的对外接口,这些接口都属于系统变量。它们分别是$Operator、$AccessLevel、$OperatorEntered、$PasswordEntered、$ChangePassword和$ConfigureUsers。其中,$OperatorEntered和$PasswordEntered分别对应用户名输入和用户密码输入,用于用户登陆,当它们的值都输入正确时,$Operator和$AccessLevel就会分别设置为当前用户名和当前用户的对应权限,这两项要先在Configure Users窗口里配置好。另外,把$ChangePassword和$ConfigureUsers置1,能分别显示Security菜单中的Change Password和Configure Users对话窗口。因此,我们可以在WindowViewer的属性设置中把Security菜单隐藏起来,而用InTouch7.1里的控件和Script语言来重新创建能实现Security菜单同样功能的安全功能条(如图1所示)。单击登陆、改变密码和设置用户可分别弹出对应的窗口(如图2所示)。其中,登陆窗口是自己用控件创建的,Change Password窗口和Configure Users窗口都是InTouch自带的,因而是英文界面。方法二比方法一在界面设计上多了一些灵活性,克服了方法一中的第二种弊端,但由于使用了$ChangePassword和$ConfigureUsers系统变量,因而也避免不了方法一中的第一、三种弊端。
 图1 安全功能条


 图2 登陆、更改密码和设置用户的窗口
3 实现安全功能的新方法 该方法是对方法二的改进,它不使用$ChangePassword和$ConfigureUsers系统变量,而是开发人员自己创建更改密码窗口和配置用户窗口(如图3所示)。

 图3 更改密码窗口和配置用户窗口
但是,这样做会带来一个难题就是自行创建的窗口如何读取系统的用户管理数据文件的数据。InTouch7.1并没有提供这样的接口。但提供了访问数据库的接口,因而,我们自己可以建立一个用户管理数据表,表中有UserName、Password和Privilege 3个字段,分别记录图3配置用户窗口中的用户名、密码和用户身份,密码窗口和配置用户窗口可直接对这个数据表进行读写;另一方面,当用户登陆时,根据用户名和密码来查找这个数据表中的匹配记录,如果找到(只能有一个记录符合),就把这条记录的Privilege字段值读取出来,再以这个值为真正的系统用户名,加上对应密码(这两个值已在Configure Users窗口中配置好)分别赋值给$OperatorEntered和$PasswordEntered来登陆InTouch系统。用户管理数据表在这里的作用类似网络中防火墙的功能,要登陆的用户必须先经过它来验证身份,通过后再以相应的身份登陆InTouch系统。 为了进一步说明,下面着重举例说明配置用户窗口和登陆窗口的实现方法,更改密码窗口的做法类似。 第一步,在Security菜单的Configure Users窗口中,做如图2中Configure Users窗口中的用户设置,也就是为系统设置了以下几种用户(见表1)。
表1
用户名 |
密码 |
用户权限 |
Administrator |
Wonderware |
9999 |
Manager |
abc |
8888 |
Operator |
123 |
2000 |
第二步,新建一个名为用户的Access数据库,数据库里新建一个名为table1的表(如图4所示),并在系统的ODBC数据源里将这个数据库绑定。
 图4 table1表图
第三步,在InTouch的SQL Access Manager\Table Template中定义一个名字和字段都跟table1一样的表;然后在InTouch的SQL Access Manager\Bind List中为这张表定义一个绑定列bind1,注意表与绑定列的格式和数据类型应完全一样。在这里,绑定的TagName和绑定列名也取为一样,都是UserName、Password和Privilege。 第四步,分别建立如图2中的登陆窗口和图3中的配置用户窗口,并在窗口中写入脚本程序。由于篇幅所限,只能以登陆窗口为例,说明登陆脚本程序的编写。在登陆窗口的确认按钮的Action Script窗口中写入以下程序。 SQLConnect(ConnectionId, "DSN=用户");/*连接数据库*/ SQLSelect(ConnectionId,"table1","bind1","UserName='"+OperatorEntered_Temp+"'"+" and "+"Password ='"+ PasswordEntered_Temp+"'","");/*查找匹配的记录*/ NumRows=SQLNumRows(ConnectionId);/*读取记录的条数*/ IF NumRows>0 THEN SQLFirst(ConnectionId);/*如果有符合条件的记录,则读取记录*/ SQLEnd(ConnectionId);/*释放记录缓冲区*/ SQLDisconnect(ConnectionId);/*关闭数据库*/ IF Privilege=="Manager" THEN /*以下8行到20行语句功能为:检查记录的Privilege字段值是Manager、Administrator和Manager中的哪一个,并以相应的身份来登陆系统*/ $OperatorEntered ="Manager"; $PasswordEntered="abc"; ENDIF; IF Privilege=="Administrator" THEN $OperatorEntered ="Administrator"; $PasswordEntered="Wonderware"; ENDIF; IF Privilege=="Operator" THEN $OperatorEntered ="Operator"; $PasswordEntered="123"; ENDIF; ENDIF; IF NumRows =0 THEN /*如果没有符合条件的记录*/ $OperatorEntered ="None";/*以None身份来登陆*/ ENDIF; 程序中的OperatorEntered_Temp和Password- Entered_Temp变量分别对应登陆窗口中输入用户名和密码的两个TextBox的TagName属性。 4 结语 用这种新方法实现安全功能,可以有效的克服传统方法中的弊端,而且在安全性、灵活性和实用性方面都有所提高。
参考文献: [1] WonderWare FactorySuite InTouch User’s Guide. WonderWare Corporation, Revision C, July 1999. [2] WonderWare FactorySuite SQL Access Manager User’s Guide. WonderWare Corporation, Revision B, July 1999.
|