开发OPC客户端程序时,首先应该生成OPC服务器支持的OPC对象,然后就可以使用OPC对象支持的属性和方法,对其进行各种操作。这样使得客户程序可以像使用自己支持的数据和功能一样,去使用服务器对象支持的数据和功能。在VisualBasic6.0里,是以对象为单位对OPC服务器进行访问的。通过OPC自动化服务器的对象模型,可以得知OPC自动化接口由以下四种对象所定义。1OPCServer服务器对象OPCServer的一个实例,OPC服务器自动含有一个OPC组集合对象,并可在其基础上生成一个OPC浏览器对象。OPCServer服务器对象在使用其它OPC对象前必须生成,也就是说在引用其他对象之前必须先创建OPCServer。OPCServer对象提供了对数据源访问和通信的方法,其提供了“Connect”方法来连接OPC自动化服务器。主要的属性有:StartTime(只读属性,服务器启动运行的时间)、CurrentTime(只读属性,返回服务器显示的当前时间)、LastUpdateTime(对于本OPC应用程序的最后数据更新时间)、MajorVersion(只读属性,OPC服务器的主版本号)、MinorVersion(只读属性,OPC服务器的次版本号)、Bandwith(只读属性,返回OPC服务器的不敏感区的百分比)、ServerState(只读属性,返回服务器的运行状态,这个属性是比较重要的,方便客户端程序查询服务器的状态,从而达到排除故障的目的)、ServerName(只读属性,返回客户程序所要连接的服务器名,也就是OPC服务器的ProgID)、ServerNode(服务器所在计算机名或者计算机的IP,用于连接远程的计算机)等。主要方法有:GetOPCservers(获得己经注册的OPC服务器的程序标识符,即ProgID)、Connect(用来建立与OPC数据存取服务器的连接)、Disconnect(断开与服务器的连接)、CreatBrowser(创建OPC浏览器的对象)等。事件:只有一个ServerShutDown(关闭服务器,这个事件在服务器即将关闭之前发生,OPC服务器以此通知OPC客户程序预告即将关闭,OPC客户程序应该在接到此事件通知后,立即清除所有的OPC组并断开与OPC服务器的连接)。2OPCGroups组集合对象OPC组的容器,包含所有客户端创建的OPCGroup对象的自动化集合。这个对象的用途是添加、清除和管理OPC组主要的属性有:DefaultGroupIsActive(新添加的OPC组的活动状态的默认值。默认初始值是活动状态)、DefaultGroupUpdateRate(新添加的OPC组的默认数据更新周期,默认初始值是1000毫秒)、DefaultGrouPDeadband(新添加的OPC组的默认不敏感区的默认值,即能引起数据变化的最小数值百分比,默认值是0%)、DefaultGroupLocaleID(新添加的OPC组区域标识符的默认值)、DefaultGroupTimeBias(新添加的OPC组的时间偏差的默认值)等。主要方法:Item(OPC组集合的默认方法。返回由集合索引指定的OPC组对象)、Add(在OPC组集合对象中添加一个组对象)、GetOPCGroup(返回指定的OPC组)、RemoveAll(为服务器关机作准备,删除所有组和标签)、Remove(删除一个指定的组)、ConnectPublicGroup(连接到公共组)等。事件:AllGroupsDataChange(由多个OPC组的数据变化而引发的事件)。3OPCGroup组对象,OPCGroup的一个实例,它包含自身的信息,同时向OPCItems对象提供数据获取服务,它自动含有一个Items集合对象,允许客户端来组织它们需要访问的数据。OPCGroup可以作为一个单元来进行激活或停止激活操作。主要属性:Name(OPC组的名称)、IsPublic(判断是否公共组)、IsActive(控制组的激活状态。只有活动状态的OPC组才进行定期的数据更新)、IsSubscribed(控制组的订阅状态)、ClientHandle(客户句柄是由客户端程序指定的用于识别某个OPC组的长整型数。当进行数据访问或询问OPC组状态时,服务器将这个数值和结果一起返回给OPC客户程序)、TimeBias(数据采样时间的时间偏差值,用于调整设备时间和OPC服务器时间的偏差)、DeadBand(不敏感区,只有数据变化超过此不敏感区时,服务器才触发数据变化事件发生)、UpdateRate(数据更新周期)、OPCItems(OPC组的默认属性,OPC标签集合对象)。主要方法:SyncRead(同步读OPC组内单个或多个OPC项的数据值、质量标志和采样时间)、Syncwrite(同步写入OPC组内单个或多个OPC项的数据值)、AsyncRead(异步读)、Asyncwrite(异步写)、AsyncRefresh(触发数据变化事件发生,刷新OPC组内所有活动的OPC标签的数据。结果有数据变化事件DataChange返回)等。主要事件:DataChange(在OPC组内任何OPC项的数据值或质量标志变化时触发的事件)、AsyncReadComplete(异步读结束时发生的事件)、AsyncWriteComplete(异步写结束时发生的事件)等。4OPCItems项集合对象,是OPC项对象的容器,自动化客户程序创建的OPCGroup对象所包含的所有OPCItems对象的自动化集合。属性:Parent(返回所属的OPC组对象)、DefaultRequestedDataType(添加OPC项时,默认的要求的数据类型。初始值是控制设备的固有数据类型,既是VT_Empty)、DefaultAccessPath(添加OPC项时,默认的数据访问路径。初始值是空)、DefaultIsActive(添加OPC项时,默认的激活状态,初始值是真)、Count(集合对象的固有属性。OPC项集合中的OPC项数)。方法:Item(返回OPC标签集合中由集合索引指定的OPC标签)、GetOPCItem(返回OPC项集合中由服务器句柄指定的OPC项)、Addltem(在OPC项集合中添加新的OPC项)、Remove(删除指定的项)、Aalidate(检查项创建的有效性)、SetActive(分别设置项为活动或非活动状态)、SetClientHandles(设置OPC项的客户句柄)、SetDataTypes(设置OPC项要求的数据类型)。5OPCItem项对象表示与OPC服务器内某个数据的连接。各个项包含了数据值、质量标志以及采样时间。数据值的类型为VARIANT。主要属性:ClientHandle(客户句柄是由客户端程序指定的用于识别某个OPC组的长整型数。当OPC组事件发生时,服务器将这个客户句柄和结果一起返回给OPC客户程序)、ServerHandle(服务器句柄是有OPC服务器设置的用于识别某个OPC标签的一个全局唯一长整型数)、AccessPath(返回OPC客户程序指定的访问路径)、AccessRights(返回OPC项的访问权)、ItemID(返回识别这个OPC项的标识符)、IsActive(用以控制OPC项的活动状态)、RequestedDataType(获取项的值的数据类型)、Value(返回从OPC服务器读取的最新数据值)、Quality(返回从OPC服务器读取的最新数据值的质量标志)、TimeStamp(时间戳)等。主要方法:Read(从服务器读取OPC项的数值)、Write(向服务器写入OPC项的数值)。6OPC浏览器对象OPCBrowser是OPC服务器名称空间的枝和叶的集合,可以浏览服务器配置中项的名字,一个OPCServer对象实例中只能有一个OPCBrowser对象的实例。浏览器功能是选用功能,OPC服务器不支持浏览器的时候,即使执行CreateBrowser也不生成这个对象。主要属性:Organization(OPC服务器的名称空间的类型,有平面型和树型两种类型)、Filter(使用ShowBrancher或ShowLeafs方法时的浏览对象过滤器,使用这个过滤器可以缩小被浏览的名称范围)、DataType(使用ShowLeafs方法时,希望浏览的标签的数据类型)、Count(浏览结果中的浏览标签数)。主要方法:Item(返回浏览结果中按集合索引ItemSpecifier指定的对象)、ShowBranches(将现在位置下的所有符合过滤条件的枝加入到浏览结果中)、ShowLeafs(将现在位置下的所有符合过滤条件的叶加入到浏览结果中)、MoveUp(向现在位置的上一层移动)、MoveToRoot(向名称空间的最上层移动)、MoveDown(向现在位置的下一层移动)、MoveTo(向浏览器的绝对位置移动)、GetItemID(由浏览标签的名称返回OPC标签的标识符)。(1)建立新工程或项目,在“工程”菜单下选择“引用”,如图5-3所示。只有引用OPCDAAuoto.DLL后,在程序中才能创建服务器对象,然后进行一系列的操作。(2)在弹出的引用窗口里单击“浏览(B)…”按钮,弹出添加引用窗口,选择OPCDAAuoto.DLL文件。(3)在引用窗口里的OPCAutomation2.0前面打钩,按“确定”按钮。(4)定义全局变量,这样可以在窗体的任何方法的代码内应用。变量类型应该指定为对象型。这些对象最好在窗体的通用部分声明加上“OptionExplicit”语句,表示模块里的所有变量都需要显式声明。由于OPC自动化接口的数组的索引要求必须从1开始,而系统默认是从0开始,为了避免错误最好在代码的最初加上“OptionBase1”语句。为了使对象可以处理事件,必须将objTestGrp和objServer的声明中加上“WithEvents”语句,表示声明的对象可以响应事件。OptionExplicitOptionBase1DimWithEventsobjServerAsOPCServerDimobjGroupsAsOPCGroupsDimWithEventsobjTestGrpAsOPCGroupDimobjItemsAsOPCItems(5)连接OPC服务器和建立OPC组考虑到代码的可反复使用性,采用子程序进行编程。SubConnect(strProgIDAsString,OptionalstrNodeAsString)IfobjServerIsNothingThen'建立一个OPC服务器对象SetobjServer=NewOPCServerEndIf服务器状态ServerState属性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六个值,分别表示正在运行、失败、没有配置、暂停、测试和没有连接六种OPC服务器当前的状态。如果OPC服务器没有连接,我们才执行objServer.ConnectstrProgID,strNode语句。strProgID就是ProgID,strNode就是用于远程通信的IP地址。IfobjServer.ServerState=OPCDisconnectedThen'连接OPC服务器objServer.ConnectstrProgID,strNodeEndIf在VisualBasic中,通过执行一个Set操作实现调用其它接口的方法。IfobjGroupsIsNothingThen'建立一个OPC组集合SetobjGroups=objServer.OPCGroupsEndIfIfobjTestGrpIsNothingThen'添加一个OPC组SetobjTestGrp=objGroups.Add(Group)EndIfEndSub(6)添加OPC标签对服务器进行访问前,必须先在OPC组里添加要访问的OPC标签。OPC客户端程序要按照用户指定的标签或者从组