您的位置:控制工程论坛网论坛 » 自动化软件 » OPC客户端开发几个境界

马军成

马军成   |   当前状态:在线

总积分:13914  2024年可用积分:0

注册时间: 2006-12-01

最后登录时间: 2022-06-28

空间 发短消息加为好友

OPC客户端开发几个境界

马军成  发表于 2006/12/15 19:35:11      4767 查看 1 回复  [上一主题]  [下一主题]

手机阅读

OPC客户端开发几个境界
作者: freeboy

   
  
  开发OPC说难也不难看你想掌握到什么程度.下面写一下有浅入深的几个境界.
  
  1. 超简单的: 用组态软件去实现^_^,随便找一个组态软件,按F1找到本组态软件OPC相关的帮助,加入服务器就可以了。特点:简单实用,方便易用。缺点:组态要钱,灵活性极低。时间:最多半天。推荐
  
  2. 很简单的:利用OPC Active ,找一个控件,加入您的工程(VB的或VC的)就可以了。特点:简单不实用,方便但没用。缺点:这种组件不多,灵活性低。时间:找控件n天,应用一回就可以了。
  
  3. 简单的:利用快速开发包。用客户端的快速开发包。特点:简单实用,快速方便,灵活性高。缺点:要钱,而且对开发包有依赖性。时间:看掌握的程度。
  
  4.通用简单的:利用基金会提供的OPCDAauto.dll,用自动化接口编程,利用VB等工具编程。这是基金会的的标准,网上有很多的源码(有VB也有delphi)。推荐使用这种方法。有以下优点:a。是OPC标准,没有任何依赖性(当然要依赖OPC)b。有较好的源码可以参考,并且有相关的标准文档。C。不用其他费用。d。就掌握难度来说,只要有一点的编程基础就可以掌握。并且源码可以直接应用到系统开发中。
  
   相关资料:
  
  Kepware 的网站有vb ,VC的源码。
  
  http://www.kepware.com
  www.kepwarecn.com
  
  http://www.faweb.net/us/opc/opclabs.html#OPC_Layer
  OPC cliet相关的代码,简单的应用. vb 简单实用
  
  OPC基金会有相关的英文文档
  
  Data Access Automation Interface Standard Version 2.01
  
  书籍:《OPC应用程序入门》----很多人都说这本书很烂,其实就是很烂总比看英文好一点。
  
  5. 通用有点难的:应用VC custom 开发接口。比用自动化接口难度增大,要求对COM有一定的了解,并且能应用VC开发工具。在Vc下熟练的可以使用。优点是可以不用opcdaauto。dll了。
  
  6. 变态的:自己实现Automation Interface ,呵呵,这是最变态的做法,kepware就是这样做的,他们的kepdaauto.dll就是这个例子,可以直接取代opcdaauto.dll真是巨变态啊。
  
   总体来说OPC Cliet的客户端开发难度不是太大,尤其是不需要了解COM相关的知识。只是大家了解的资料不多。国内没有相关的专业网站,只有工控OPC论坛可以看看。有空可以来我blog看看。我会写相关的文章来给大家的。希望大家来捧场啊 ^_^
  
1楼 0 0 回复
  • shangzh

    shangzh   |   当前状态:在线

    总积分:74  2024年可用积分:0

    注册时间: 2009-07-20

    最后登录时间: 2012-12-01

    空间 发短消息加为好友

    shangzh   发表于 2011/5/10 9:52:14



    提供性能稳定,易开发,价格低廉的OPC开发套件,支持DA 1.0,2.0,3.0,包括服务器端和客户端开发包Ver3.8


    OPC服务器端开发包下载地址:http://www.xdowns.com/soft/38/110/2011/Soft_72907.html

    OPC客户端端开发包下载地址:http://www.oyksoft.com/soft/18132.html

    OPC开发包详情:http://item.taobao.com/item.htm?id=9474686238


    //OPC服务器端API部分接口定义

    /// <summary>
    /// 初始化系统运行参数和分配服务器资源
    /// </summary>
    /// <param name="lpCLSID_Svr">服务器标示,以NULL结尾</param>
    /// <param name="uServerRate">服务器支持的客户端最快异步刷新速率</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  CreateServer(LPCSTR lpCLSID_Svr, unsigned long uServerRate);

    /// <summary>
    /// 释放服务器资源
    /// </summary>
    /// <returns>void</returns>
    BmOpcDaSvr_API  VOID __stdcall  FreeServer();

    /// <summary>
    /// 构造服务器地址空间(标签列表的组织形式)
    /// </summary>
    /// <param name="hTag">父标签句柄,对于构造平面型地址空间(只有一层的地址空间),hTag=0;对于树型地址空间的第一层节点,hTag=0</param>
    /// <param name="lpName">标签名称</param>
    /// <param name="Value">标签的初始值,其中vt域所定义的数据类型被自动认为为该标签的标准数据类型,如果想修改改标签数据类型,请调用SetTagProperty函数</param>
    /// <param name="wQuality">标签的初始数据质量</param>
    /// <param name="AccessRight">访问权限,0-不能读写(例如树型空间的枝干节点),1-只读,2-只写,3-可读可写</param>
    /// <returns>标签句柄</returns>
    BmOpcDaSvr_API  unsigned long __stdcall  RegTag(unsigned long hTag,LPCSTR lpName,VARIANT Value,unsigned short wQuality,unsigned short AccessRight);


    /// <summary>
    /// 构造服务器地址空间(标签列表的组织形式)
    /// 函数增加新节点,设置标签数据类型和初始化标签值(按照给定数据类型),设置数据质量=64(不确定)
    /// </summary>
    /// <param name="hTag">父标签句柄,对于构造平面型地址空间(只有一层的地址空间),hTag=0;对于树型地址空间的第一层节点,hTag=0</param>
    /// <param name="lpName">标签名称</param>
    /// <param name="wDatatype">标签的数据类型,3-Integer 4-Single 5-Double  8-String 11-Boolean</param>
    /// <param name="AccessRight">访问权限,0-不能读写(例如树型空间的枝干节点),1-只读,2-只写,3-可读可写</param>
    /// <returns>标签句柄</returns>
    BmOpcDaSvr_API  unsigned long __stdcall  RegTagEx(unsigned long hTag,LPCSTR lpName,unsigned short wDatatype,unsigned short AccessRight);

    /// <summary>
    /// 删除标签,尽量避免调用此函数
    /// </summary>
    /// <param name="hTag">服务器标识</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  UnregTag(unsigned long hTag);

    /// <summary>
    /// 设置地址空间路径分隔符
    /// </summary>
    /// <param name="Qualifier">树型地址空间标签全路径分隔符,默认为'.'</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  SetTagQualifier(char Qualifier);

    /// <summary>
    /// 增加标签支持的属性
    /// </summary>
    /// <param name="hTag">标签句柄</param>
    /// <param name="lpName">属性名称</param>
    /// <param name="dwPropertyID">属性标识,默认支持6个属性,例如报警限、说明、条件等</param>
    /// <param name="lpDescription">属性描述</param>
    /// <param name="value">属性值</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  AddTagProperty(unsigned long hTag,LPCSTR lpName,unsigned long  dwPropertyID,LPCSTR lpDescription,VARIANT value);

    /// <summary>
    /// 增加标签支持的属性
    /// 属性值按照属性值数据类型进行初始化
    /// </summary>
    /// <param name="hTag">标签句柄</param>
    /// <param name="lpName">属性名称</param>
    /// <param name="dwPropertyID">属性标识,默认支持6个属性,例如报警限、说明、条件等</param>
    /// <param name="lpDescription">属性描述</param>
    /// <param name="wDataType">属性值数据类型</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  AddTagPropertyEx(unsigned long hTag,LPCSTR lpName,unsigned long  dwPropertyID,LPCSTR lpDescription,unsigned short wDataType);

    /// <summary>
    /// 更新标签的属性值
    /// </summary>
    /// <param name="hTag">标签句柄</param>
    /// <param name="dwPropertyID">属性标识</param>
    /// <param name="Value">属性值</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  SetTagProperty(unsigned long hTag, unsigned long dwPropertyID, VARIANT Value);


    /// <summary>
    /// 更新标签的数据值和时间戳
    /// </summary>
    /// <param name="hTag">标签句柄</param>
    /// <param name="Value">标签值</param>
    /// <param name="wQuality">标签值质量</param>
    /// <param name="TimeStamp">标签刷新时间</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  UpdateTagWithTimeStamp(unsigned long hTag , VARIANT Value,unsigned short wQuality,FILETIME TimeStamp);

    /// <summary>
    /// 更新标签的数据值
    /// 标签的刷新时间按照OPC服务器时间设定
    /// </summary>
    /// <param name="hTag">标签句柄</param>
    /// <param name="Value">标签值</param>
    /// <param name="wQuality">标签值质量</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  UpdateTag(DWORD hTag, VARIANT Value,unsigned short wQuality);

    /// <summary>
    /// 设置工具包写节点的回调函数
    /// </summary>
    /// <param name="lpCallback">回调函数指针</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  SetWriteCallback(WRITECALLBACK lpCallback);

    /// <summary>
    /// 设置工具包写节点的回调函数,支持值之外的属性值回写
    /// </summary>
    /// <param name="lpCallback">回调函数指针</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaSvr_API  BOOL __stdcall  SetWriteCallbackEx(WRITECALLBACKEX lpCallback);


    //OPC客户端API部分接口定义

    /// <summary>
    /// 初始化系统运行参数和分配资源,调用此函数初始化工具包参数,分配资源等。调用此函数后工具才能正常工作。
    /// </summary>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall BMDAC_Init();


    /// <summary>
    /// 释放工具包占用的资源等
    /// </summary>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_Uninit();


    /// <summary>
    /// 连接OPC服务器, 本机访问ComputerName 设为NULL即可
    /// </summary>
    /// <param name="ComputerName">主机名称或IP地址</param>
    /// <param name="ServerClassID">服务器标识,是一个GUID</param>
    /// <param name="Version">版本标志</param>
    /// <returns>服务器连接句柄</returns>
    BmOpcDaClt_API DWORD  __stdcall  BMDAC_Connect(LPCSTR ComputerName, LPCSTR ServerClassID, DWORD  Version);


    /// <summary>
    /// 断开服务器连接
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_Disconnect(DWORD   ServerHandle);


    /// <summary>
    /// 获取计算机上注册的OPC服务器
    /// </summary>
    /// <param name="ComputerName">主机名称或IP地址</param>
    /// <param name="Version">服务器启动时间</param>
    /// <param name="ServerNames">服务器当前时间</param>
    /// <param name="ServerClassIDs">最后数据更新时间</param>
    /// <returns>服务器数量</returns>
    BmOpcDaClt_API DWORD  __stdcall  BMDAC_GetServers(LPCSTR    ComputerName, DWORD     Version, VARIANT*  ServerNames, VARIANT*  ServerClassIDs);



    /// <summary>
    /// 获取服务器的地址空间类型
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="NameSpace">服务器启动时间,OPC_NS_HIERARCHIAL=1;树型地址空间  OPC_NS_FLAT=2;平面型地址空间</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_GetNameSpace(DWORD   ServerHandle,WORD*   NameSpace);



    /// <summary>
    /// 移动当前浏览节点
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="Direction">移动方向,OPC_BROWSE_UP  =1   移动到上级节点,忽略NodeName  OPC_BROWSE_DOWN =2   移动到下级节点 OPC_BROWSE_TO   =3   直接移动到某一个节点</param>
    /// <param name="NodeName">节点名称</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_ChangeBrowsePosition(DWORD   ServerHandle,WORD  Direction,LPCSTR  NodeName);


    /// <summary>
    /// 过滤检索节点
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="FilterType">节点类型过滤,1 枝节点,  2 叶节点</param>
    /// <param name="FilterString">节点名称过滤</param>
    /// <param name="FilterDataType">数据类型过滤</param>
    /// <param name="FilterAccessRight">访问权限过滤, 0- 不能读写  1- 只读  2- 只写  3- 可读可写</param>
    /// <param name="ItemNames">节点名称</param>
    /// <returns>返回满足条件的节点个数</returns>
    BmOpcDaClt_API DWORD  __stdcall  BMDAC_BrowseItems(DWORD   ServerHandle,WORD    FilterType,LPCSTR  FilterString,WORD    FilterDataType,WORD   FilterAccessRight,VARIANT* ItemNames);

    /// <summary>
    /// 增加组
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="Name">标签全名</param>
    /// <param name="Active">属性标识</param>
    /// <param name="UpdateRate">属性值</param>
    /// <param name="TimeBias">属性值</param>
    /// <param name="DeadBand">属性值</param>
    /// <param name="dsLCID">属性值</param>
    /// <returns>组句柄</returns>
    BmOpcDaClt_API DWORD  __stdcall  BMDAC_AddGroup(DWORD ServerHandle, LPCSTR Name, BOOL Active, DWORD UpdateRate, DWORD TimeBias,float DeadBand, DWORD dsLCID);

    /// <summary>
    /// 注册标签
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="GroupHandle">组句柄</param>
    /// <param name="ItemFullName">标签全名</param>
    /// <returns>标签句柄</returns>
    BmOpcDaClt_API DWORD  __stdcall  BMDAC_AddItem(DWORD   ServerHandle,DWORD   GroupHandle,LPCSTR  ItemFullName);


    /// <summary>
    /// 写入标签
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="GroupHandle">组句柄</param>
    /// <param name="ItemHandle">标签句柄</param>
    /// <param name="Value">写入值</param>
    /// <param name="DoAsync">写入方式,true 异步写入   false 同步写入</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_WriteItem(DWORD   ServerHandle,DWORD   GroupHandle,DWORD ItemHandle,VARIANT  Value, BOOL     DoAsync);


    /// <summary>
    /// 读取标签
    /// </summary>
    /// <param name="ServerHandle">服务器连接句柄</param>
    /// <param name="GroupHandle">组句柄</param>
    /// <param name="ItemHandle">标签句柄</param>
    /// <param name="Value">标签句柄</param>
    /// <param name="pTimeStamp">标签句柄</param>
    /// <param name="pQuality">标签句柄</param>
    /// <returns>TRUE成功,FALSE失败</returns>
    BmOpcDaClt_API BOOL  __stdcall  BMDAC_ReadItem(DWORD   ServerHandle,DWORD   GroupHandle,DWORD ItemHandle,VARIANT*  Value, FILETIME* pTimeStamp,WORD*    pQuality);




      

    2楼 回复本楼

    引用 shangzh 2011/5/10 9:52:14 发表于2楼的内容

总共 , 当前 /