OPC服务器用户手册(共28页).doc
精选优质文档-倾情为你奉上OPC客户端开发工具包用户手册北京华富惠通技术有限公司目录前言本文档介绍北京华富惠通技术有限公司开发的CONTROX-工具包(以下简称工具包)的特点和如何利用开发工具包进行OPC 客户端程序的开发。本文共分为六个部分:一、介绍了OPC的基本概念;二、OPC 客户端程序的开发流程;三、详细描述了工具包的开发接口;四、附录部分介绍了一些与DA开发相关的OPC规范和其他内容。一、 工具包简介(一)OPC简介:OPC(OLE for Process Control)是工控行业的软件接口标准,它试图按照标准的方法完成不同设备之间数据交换的问题。OPC基金会是OPC规范的制定者,制定了数据访问、历史数据访问、事件与报警、批处理、OPC DA XML等一系列标准。OPC基于微软的COM技术,它具有如下的优点:(1)高速的数据传输;(2)基于分布式COM的安全性管理机制;(3)降低开发成本;(4)实现具有高度柔韧性功能的系统;(5)实现具有高可靠性的系统;(二)工具包的特点:北京华富惠通技术有限公司是OPC中国促进会的五家成员之一,负责OPC技术在中国地区的技术支持工作,同时也从事着OPC的研究与开发工作。于2002年10月开发完成的工具包提供对OPC Data Access 2.04规范(以下简称 OPC DA规范)的支持,工具包具有以下特点:(1)完全符合OPC Data Access2.04标准;(2)开发人员不需要了解COM机制及OPC数据访问服务器接口细节;(3)支持多种开发工具。如VC、BC、VB、Delphi等;(4)不要求开发人员了解开发工具中实现COM的具体技术。如ATL等;(5)用户开发简单容易;二、 OPC 客户端程序开发流程(一) OPC客户端程序开发用到的相关知识一个OPC客户端可以和一个或多个OPC服务器进行连接。如图2-1图 2-1 OPC Client不同的供应商可以提供OPC Server,供应商提供的代码决定了支持何种设备并可以和之进行数据存取。图 2-2 OPC Client/Server 的关系 在高层次上说,OPC服务器包含几个对象:服务器、标签组和标签项。OPC服务器对象包含标签组,标签组包含标签项。层次关系如下:服务器标签组标签项图2-3 对象层次关系OPC的标签组为客户端提供了组织数据的一种方法。例如,用户可以根据特定的显示和报告的需要来组织标签组中的条目(标签项),并可以进行数据的读写。OPC客户端还可以配置数据的更新速率。在一个标签组中,用户可以定义一个或多个OPC标签项,如图2-3图 2-3 标签组/标签项的关系图OPC中的标签项表示了OPC服务器中相联系的数据源。从用户接口的角度,客户端不能直接存取标签项,因为没有定义直接的标签项接口,所有的标签项必须通过OPC的标签组来实现存取。和每个标签项相关联的有标签值、标签质量和时间戳,相关的内容可以参考本说明书的附录或OPC规范。(二) 用工具包 开发的OPC 客户端程序的框架驱动OPC 数据服务器OPC 客户应用程序硬件设备OPCClient.DLLOPC接口OPCClient.DLL动态库中包含了OPC客户端开发工具包所用到的功能,客户端应用程序通过工具包和OPC 服务器的接口进行操作,用户不必了解OPC相关的通讯规范和实现。实现数据的读取和回写等功能。(三) 调用工具包接口的流程图如下:工具包激活调用ActiveCode(对于序列号加密的版本)初始化调用Init服务器连接调用Connet注册回调函数调用SetDataChangeProc创建标签组调用AddGroup为标签组可添加标签调用AddItem用户数据处理注销调用UnInit关于上面流程的说明:1 对于工具包的激活说明:如果用户购买的是加密锁加密的方式,在运行时系统会自动检测。如果用户购买的是序列号加密的方式,在程序初始化之前要进行相应的激活,否则系统会认为工具为演示版。2 用户首先调用Init进行初始化。3 初始化后,可以和OPC 服务器进行连接4 初始化成功之后,注册数据改变回调函数。5 向OPC服务器对象可添加一个或多个标签组。6 向OPC标签组对象可添加一个或多个标签项。7 当相关联的OPC服务器发生数据改变时,注册的回调函数会被调用,用户可以对接到的数据进行相关的处理和操作。8 在客户程序退出时,调用Uninit。(四) 在开发过程中,用户必须完成一些工作:1建立应用程序,加载OPC运行库。2按照工具包的提供的接口进行正确的函数调用。三、工具包的接口描述以下接口均采用stdcall调用规范。(一) 初始化函数1、 初始化函数function Init: BOOL;功能说明该函数用来初始化工具包动态库。参数说明 无返 回 值如果函数成功返回TRUE,否则返回FALSE附加说明一般情况下在动态库被加载时应被调用。如果函数调用成功,在动态被卸载时应调用Uninit。2、 注销函数 procedure Uninit; 功能说明该函数用来注销工具包。参数说明 无返 回 值 无附加说明一般情况下在程序退出时调用,终止服务并释放相应的资源。3、工具包激活函数 function ActiveCode(const UserName, Password: PChar): BOOL;功能说明该函数用来激活工具包,用于序列号加密的版本。如果不调用此函数,则工具包被当做DEMO版本处理。参数说明 说明UserName用户在订货时得到的用户名Password用户在订货时得到的注册号返 回 值如果函数成功返回TRUE,否则返回FALSE附加说明用户名和注册号为配对使用。(二) 服务器连接函数1、服务器连接 function Connect(const MachineName, ServerName: PChar; Version: SHORT = 2): THANDLE;功能说明该函数用来连接服务器,服务器端构建相应的组件对象,返回OPC服务器的接口指针。参数说明 说明MachineNameOPC服务器的节点名称ServerNameOPC服务器的名称Version版本号,可有默认值返 回 值如果函数不成功返回NULL,否则返回OPC服务器的连接句柄。附加说明函数返回的接口指针很重要,对服务器的操作都要用到。2、断开服务器连接 procedure Disconnect(hConnect: THANDLE); 功能说明该函数用来断开服务器连接,释放对象资源并通知OPC服务器退出。参数说明 说明hConnectOPC服务器的连接句柄返 回 值无。附加说明程序退出时要调用该函数。3、得到OPC服务器个数函数 function GetServerCount(MachineName: PChar; Version: SHORT = 2): Integer; 功能说明该函数用来得到某节点中OPC服务器个数函数。参数说明 说明MachineNameOPC服务器的节点名称Version版本号,可有默认值返 回 值返回该节点OPC服务器个数函数。附加说明无。4、得到服务器名称 function GetServerName(Index: Integer; Buf: PChar; BufSize: Integer): BOOL; 功能说明该函数根据索引号得到服务器名称。参数说明 说明IndexOPC服务器的索引号Buf服务器名称的缓存指针,该缓存用于存放返回的服务器名称BufSize缓存的大小。返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无。5、得到服务器信息 function GetServerStatus(hConnect:THANDLE;var SvrStatus: SERVERINFORMATION): BOOL; 功能说明该函数用于得到服务器的信息。参数说明 说明hConnectOPC服务器的连接句柄SvrStatus返回的服务器状态信息返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明服务器信息结构说明typedef struct _SERVERINFORMATION FILETIME ftStartTime;/启动时间 FILETIME ftCurrentTime;/当前时间 FILETIME ftLastUpdateTime;/最近更新时间 WORD dwServerState;/服务器状态 DWORD dwGroupCount;/服务器中组的个数 DWORD dwBandWidth;/服务器带宽 WORD wMajorVersion;/主版本号 WORD wMinorVersion;/次版本号 WORD wBuildNumber;/编译序数 WORD wReserved;/保留 char* szVendorInfo;/服务器供应商信息int BufSize;/缓存尺寸 SERVERINFORMATION;服务器状态OPCSERVERSTATE声明:(在OPC DA规范中定义)enum tagOPCSERVERSTATE OPC_STATUS_RUNNING = 1,OPC_STATUS_FAILED = OPC_STATUS_RUNNING + 1,OPC_STATUS_NOCONFIG= OPC_STATUS_FAILED + 1,OPC_STATUS_SUSPENDED = OPC_STATUS_NOCONFIG + 1,OPC_STATUS_TEST = OPC_STATUS_SUSPENDED + 1 OPCSERVERSTATE;(三) 标签组函数1、增加标签组 function AddGroup(hConnect: THANDLE; Name: PChar; bActive: BOOL; dwRate: DWORD;TimeBias: PLongint; DeadBand: PSingle; dwLCID: DWORD): THANDLE;功能说明该函数用于增加标签组。参数说明 说明hConnectOPC服务器的连接句柄SvrStatus返回的服务器状态信息Name标签组的名称bActive是否同时激活dwRate本标签组的数据更新速率TimeBias数据更新的基准时间(以分钟为单位)。如果该参数为NULL表示使用系统默认的时间基准。DeadBand数据更新的死区(变化百分比),只有当标签的数据变化大于死区时才会触发回调函数给客户端。如果参数为空则表示死区为0.0dwLCID此参数用于服务器以文本方式返回值(给这个组的相关操作)时使用的语言。这包括象报警或条件状态或数字线圈的状态等。返 回 值返回新增标签组的句柄。附加说明无2、删除标签组 procedure RemoveGroup(hConnect, hGroup: THANDLE); 功能说明该函数用于删除标签组。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄返 回 值无附加说明无3、设置标签组名称 function SetGroupName(hConnect, hGroup: THANDLE; const Name: PChar): BOOL; 功能说明该函数用于设置标签组名称。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄Name标签组的名称返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无4、设置标签组状态参数 function SetGroupState(hConnect, hGroup: THANDLE; Rate: DWORD; bActive:BOOL;TimeBias: DWORD; DeadBand: Single; dwLCID: DWORD): BOOL; 功能说明该函数用于设置标签组状态参数。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄Rate本标签组的数据更新速率bActive是否同时激活TimeBias数据更新的基准时间(以分钟为单位)。如果该参数为NULL表示使用系统默认的时间基准。DeadBand数据更新的死区(变化百分比),只有当标签的数据变化大于死区时才会触发回调函数给客户端。如果参数为空则表示死区为0.0dwLCID此参数用于服务器以文本方式返回值(给这个组的相关操作)时使用的语言。这包括象报警或条件状态或数字线圈的状态等。返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无5、得到标签组状态 function GetGroupState(hConnect, hGroup: THANDLE; Name: PChar; BufSize: Integer; var pRate: DWORD; var bActive: BOOL; var pTimeBias: DWORD;var pDeadBand: Single; var pLCID: DWORD): BOOL; 功能说明该函数用于增加标签组。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄Name标签组的名称BufSize标签组的缓冲区大小pRate本标签组的数据更新速率bActive是否同时激活pTimeBias数据更新的基准时间(以分钟为单位)。如果该参数为NULL表示使用系统默认的时间基准。pDeadBand数据更新的死区(变化百分比),只有当标签的数据变化大于死区时才会触发回调函数给客户端。如果参数为空则表示死区为0.0pLCID此参数用于服务器以文本方式返回值(给这个组的相关操作)时使用的语言。这包括象报警或条件状态或数字线圈的状态等。返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无(四) 标签项函数1、增加标签项 function AddItem(hConnect, hGroup: THANDLE; ItemName: PChar): THANDLE; 功能说明该函数用于在标签组中增加标签项。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄ItemName标签项的名称返 回 值该标签项的句柄附加说明无2、删除标签项 procedure RemoveItem(hConnect, hGroup, hItem: THANDLE); 功能说明该函数用于在标签组中删除标签项。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄hItem标签项的句柄返 回 值该标签项的句柄附加说明无3、读标签的数据 function ReadItem(hConnect, hGroup, hItem: THANDLE; var Value: OleVariant;var pTimeStamp: FILETIME; var pQuality: DWORD): BOOL; 功能说明该函数用于在标签组中读取标签的数据。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄hItem标签项的句柄Value标签的值pTimeStamp标签的时间戳pQuality标签的质量返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无4、写标签项 function WriteItem(hConnect, hGroup, hItem: THANDLE; pVar: POleVariant; DoAsync: BOOL = False): BOOL;功能说明该函数用于在标签组中标签数据的回写。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄hItem标签项的句柄pVar标签的回写值DoAsync回写操作的方式(是同步方式还是异步方式)返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无5、激活标签项 function ActiveItem(hConnect, hGroup, hItem: THANDLE; bActive: BOOL): BOOL; 功能说明该函数用于在标签组中标签项的激活。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄hItem标签项的句柄bActive是否激活返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无6、验证标签项 function ValidateItem(hConnect, hGroup: THANDLE; Name: PChar; var pType: TVarType;var pAccessRights: DWORD): BOOL; 功能说明该函数用于在标签组中验证标签项。参数说明 说明hConnectOPC服务器的连接句柄hGroup标签组的句柄Name标签项的名称pType标签的数据类型pAccessRights标签的存取权限返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无7、得到标签项个数 function GetItemCount(hConnect: THANDLE): Integer; 功能说明该函数用于得到某个连接中标签项的个数。参数说明 说明hConnectOPC服务器的连接句柄返 回 值返回标签项的个数。附加说明无8、得到标签项名称 function GetItemName(hConnect: THANDLE; index: Integer; Buf: PChar; BufSize: Integer): BOOL; 功能说明该函数用于得到标签项名称。参数说明 说明hConnectOPC服务器的连接句柄index标签的索引号Buf标签名缓冲区的指针BufSize标签名缓冲区的大小返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无9、得到标签项全名 function GetItemFullName(hConnect: THANDLE; index: Integer; Buf: PChar; BufSize: Integer): BOOL; 功能说明该函数用于得到标签项全名。参数说明 说明hConnectOPC服务器的连接句柄index标签的索引号Buf标签名缓冲区的指针BufSize标签名缓冲区的大小返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无10、得到标签项属性的个数 function NumberOfItemProperties(hConnect: THANDLE; ItemName: PChar): Integer;功能说明该函数用于得到得到标签项属性的个数。参数说明 说明hConnectOPC服务器的连接句柄ItemName标签项的名称返 回 值标签项属性的个数。附加说明无11、得到标签项属性说明 function GetItemPropertyDescription(hConnect: THANDLE; PropertyIndex: Integer; var pPropertyID: DWORD;var VT: TVarType; Buf: PChar; BufSize: Integer): BOOL; 功能说明该函数用于得到得到标签项属性的描述。参数说明 说明hConnectOPC服务器的连接句柄PropertyIndex标签项属性的索引号pPropertyID属性IDVT属性的数据类型Buf属性描述缓冲区的指针BufSize属性描述缓冲区的大小返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无12、读 标签项属性值 function ReadPropertyValue(hConnect: THANDLE; ItemName: PChar; PropertyID: DWORD; pValue: POleVariant): BOOL; (五) 回调函数 procedure SetDataChangeProc(hConnect: THANDLE; lpCallback: DATACHANGEPROC; WriteCallback: WRITEFINISHPROC = nil); 功能说明该函数用于注册数据改变回调函数。参数说明 说明hConnectOPC服务器的连接句柄lpCallback回调函数的程序指针(数据改变时调用)WriteCallback写数据函数的程序指针返 回 值无附加说明当服务器中有数据改变时,会调用注册的回调函数。(六) 其它函数1、浏览标签项 function BrowseItems(hConnect: THANDLE; FilterType: WORD): Integer; 功能说明该函数用于遍历某个连接中的标签项。参数说明 说明hConnectOPC服务器的连接句柄FilterType过滤类型返 回 值返回遍历标签项的个数。附加说明无2、设置浏览标签的过滤条件 function SetBrowseFilters(hConnect: THANDLE; FilterString: PChar; DataType: TVarType; AccessType: DWORD): BOOL; 功能说明该函数用于设置浏览标签的过滤条件。参数说明 说明hConnectOPC服务器的连接句柄FilterString过滤字符串DataType数据类型AccessType标签存取类型返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无3、改变标签浏览的位置 function ChangeBrowsePosition(hConnect: THANDLE; Direction: WORD;NodeName: PChar): BOOL; 功能说明该函数用于设置标签浏览的位置。参数说明 说明hConnectOPC服务器的连接句柄Direction标签浏览的方向NodeName节点的名称返 回 值如果函数成功返回TRUE,否则返回FALSE。附加说明无四、附录:(一) OPC DA规范中关于标签数据质量的描述:在OPC中每个标签都必须有数据质量这个属性,OPC的数据质量的数据类型为VT_I2,服务器通过该标签属性向客户发布标签的数据质量。OPC基金会对标签数据质量的各个位做了一些定义,高八位由厂商自行定义,低八位的定义如下:低字描述为QQSSSSLLQ:主状态S:子状态L:限定状态低八位的高两位定义:QQ位值定义描述000SSSSLL有效的数据如果数据质量的低八位的高两位为0,数据为无效。101SSSSLL不确定的数据如果数据质量的低八位的高两位为1,数据的质量为不能确定。210SSSSLLOPC为定义未定义311SSSSLL有效的数据如果数据质量的低八位的高两位为3,数据为有效。中间四位的定义:1 状态为0:SSSS位值定义描述LL未定的的错误数据是无效的,无效的原因没有定义1LL服务器配置错误由于服务器的配置错误造成数据的无效2LL没有连接由于没有连接数据源,数据不能被正确的提供3LL设备错误发现一个设备错误,造成数据无效4LL传感器错误发现一个传感器错误,限定状态的位域有时能提供进一步的诊断信息5LL最后一次有效值由于通信失败,提供的数据是最后一次保存的有效值。6LL通信失败通信失败并且没有最后保存的有效值可以提供。7LL不在服务范围之内标签定义为不活动的。.8-15OPC未定义未定义2主状态为1:SSSS位值定义描述0LL未定义的错误不能确定数据的有效性,其原因未定义1LL最后可用的值该值返回的是最后可用的值2-3OPC未定义未定义4LL传感器精度不够该值被固定在传感的上下限上5LL超出上下限返回的值超出上下限6LL数据来自多个数据源数据需要来自多个可用的设备7-15OPC未定义未定义3主状态为3SSSS位值定义描述0LL未定义的错误数据有效,原因未定义1-5OPC未定义未定义6LL本地设定值设备不能连接,该值是本地设定值7-15OPC未定义未定义低两位的定义:LL位值定义描述0QQSSSS00没有边界这个值没有上下限1QQSSSS01下限该值被固定在下限值2QQSSSS10上限该值被固定在上限值.3QQSSSS11常量该值被固定在某个常数上以上是OPC数据质量的大致描述,详见OPC DA规范6.8。(二) OPC DA规范中关于标签的属性:OPC中每个标签都有自己属性,每个属性都要有属性ID,属性的数据类型,属性的值及属性的描述。其中规定有六种属性是必须有的,它们是:ID数据类型描述1VT_I2标签标准数据类型2<varies>标签的值3VT_I2标签的数据质量4VT_DATE 时间戳5VT_I4 标签的访问权限6VT_R4标签的扫描周期另外,OPC也定义一些其他可选的属性,详见OPC DA 2.04规范4.4.6;(三) COM相关知识:使用工具包进行OPC DA服务器的开发,需要掌握两个COM的概念:1 CLSID:用来标识一个COM对象,是一个128字节的数组。ActiveOPC应用程序中提供产生CLSID的方法。2 ProgID:一个COM对象的字符串标识,一般采用三段式格式,每段用“.”隔离。产品名 . 厂商名 . 版本号,例如CONTROX.HUAFU.1。(四) 加密锁的使用:如果工具包使用硬件加密锁进行加密。首先要安装加密锁的驱动,驱动的安装程序是工具包目录LOCKDRV。安装完驱动程序后将加密锁插到并口上即可,插上加密锁的并口可继续使用。专心-专注-专业