关于OPCClient编写hapican8955热门2014-02-2320:14昨天又有人问我OPCClient编写,实际是他们不了解OPC客户端的工作原理,要想写客户端程序,必须知道OPC对象,OPC逻辑对象模型包括3类对象:OPCserver对象、OPCgroup对象、OPCitem对象,每类对象都包括一系列接口。OPCServer对象主要功能为:1、创建和管理OPCGroup对象;2、管理服务器内部的状态信息;OPCGroup对象主要功能为:1、管理OPCGroup对象的内部状态信息;2、创建和管理Items对象。3、OPC服务器内部的实时数据存取服务(同步与异步方式)。OPC组中有以下几个主要属性:Name:组的名字;Active:组的激活状态标志;UpdateRateOPC:服务器向客户程序提交数据变化的刷新速率;PercentDeadband:数据死区,即能引起数据变化的最小数值百分比。OPCITEM是非COM对象,在OPC标准中用来描述实时数据,是客户端不可见的对象。代表了与服务器中的数据的连接,它并不是数据源,而仅仅是与数据源的连接。每个项都有以下主要属性:Active项的激活状态、Value项的数值、类型为VARIANT、Quality项的品质,代表数值的可信度,类型为SHORT、TimeStamp时间戳,代表数据的存取时间。你不管用什么开发语言只要了解上面几个对象,就会写程序了下面举个VC的例子HRESULTr1;CLSIDclsid;LONGTimeBias=0;FLOATPercentDeadband=0.0;DWORDRevisedUpdateRate;LPWSTRErrorStr;charstr[100];CStringszErrorText;m_pItemResult=NULL;客户端程序必须对DCOM进行初始化设置,以保证OPC服务器端回调函数不会被堵塞。r1=CoInitialize(NULL);if(r1!=S_OK){if(r1==S_FALSE){MessageBox(COMLibraryalreadyinitialized,ErrorCoInitialize(),MB_OK+MB_ICONEXCLAMATION);}else{szErrorText.Format(InitialisationofCOMLibraryfailed.ErrorCode=%4x,r1);MessageBox(szErrorText,ErrorCoInitialize(),MB_OK+MB_ICONERROR);SendMessage(WM_CLOSE);return;}}通过OPC服务器的ProgID查询注册表中相关CLSID。每个COM服务器都有一个字符串型的ProgID,通过ProgID可以得到全球惟一的CLSID,使用CLSIDFromProgID()函数实现ProgID到CLSID的转换。r1=CLSIDFromProgID(LOPC.SimaticNET,&clsid);if(r1!=S_OK){MessageBox(RetrivalofCLSIDfailed,ErrorCLSIDFromProgID(),MB_OK+MB_ICONERROR);CoUninitialize();SendMessage(WM_CLOSE);return;}连接OPC服务器,查询对象的IID_IOPCServer接口。在连接OPC服务器前,OPC客户端需要事先指定计算机名和OPC数据访问服务器名,建立连接后,创建OPC组并添加OPC数据项。r1=CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,IID_IOPCServer,(void**)&m_pIOPCServer);if(r1!=S_OK){MessageBox(CreationofIOPCServer-Objectfailed,ErrorCoCreateInstance(),MB_OK+MB_ICONERROR);m_pIOPCServer=NULL;CoUninitialize();SendMessage(WM_CLOSE);return;}创建OPC组,查询IOPCItemMgt接口。IOPCServer接口的AddGroup()方法可以创建一个有指定名称和属性的OPC组。r1=m_pIOPCServer-AddGroup(Lgrp1,//[in]groupnameTRUE,//[in]active500,//[in]requestthisUpdateRatefromServer1,//[in]Clienthandle&TimeBias,//[in]notimeintervaltosystemUTCtime&PercentDeadband,//[in]nodeadband,soalldatachangesarereportedLOCALE_ID,//[in]ServerusesEnglishlanguagefortextvalues&m_GrpSrvHandle,//[out]Serverhandletoidentifythisgroupinlatercalls&RevisedUpdateRate,//[out]theanswerformtheServertotherequestedupdaterateIID_IOPCItemMgt,//[in]requestedinterfacetypeofthegroupobject(LPUNKNOWN*)&m_pIOPCItemMgt);//[out]pointertotherequestedinterfaceif(r1==OPC_S_UNSUPPORTEDRATE){szErrorText.Format(RevisedUpdateRate%disdifferentfromRequestedUpdateRate500,RevisedUpdateRate);AfxMessageBox(szErrorText);}elseif(FAILED(r1)){MessageBox(Can'taddGrouptoServer!,ErrorAddGroup(),MB_OK+MB_ICONERROR);m_pIOPCServer-Release();m_pIOPCServer=NULL;CoUninitialize();SendMessage(WM_CLOSE);return;}添加OPC数据项。使用IOPCItemMgt接口的AddItem()方法可以添加具有特殊属性的指定数量的数据项。//defineanitemtablewithoneitemasin-paramterforAddItemm_Items[0].szAccessPath=L;m_Items[0].szItemID=szItemID;//影响数据类型m_Items[0].bActive=TRUE;m_Items[0].hClient=1;m_Items[0].dwBlobSize=0;m_Items[0].pBlob=NULL;m_Items[0].vtRequestedDataType=0;//definedbytheitemitselfr1=m_pIOPCItemMgt-AddItems(1,//[in]addoneitemm_Items,//[in]seeabove&m_pItemResult,//[out]arraywithadditionalinformationabouttheitem&m_pErrors);//[out]tellswhichoftheitemswassuccessfullyadded.//Foranyitemwhichfaileditprovidesareason程序退出时OPC连接断开,释放接口指针。当程序退出或停止服务器时,依次删除Item(RemoveItems)、Group(RemoveGroups),释放资源。voidCAsynOPCDlg::OnStop()停止服务器。h1=m_IOPCItemMgt-RemoveItems(1,phServer,&pErrors);删除Items。h1=m_IOPCServer-RemoveGroup(m_GrpSrvHandle,TRUE);删除Group。m_IOPCServer-Release();释放服务器。m_IOPCServer=NULL;CoUninitialize();关闭COM库。觉得写得很好,供大家参考转自远程连接(2012-05-1616:45:18)转载▼标签:rslinx分类:RSLinx2一、启用Gateway功能在被连接和需要连接的主机上都要启用Gateway功能,步骤如下:1、在这之前我已经安装好了RSLinx,并且安装好了RSLinx的Gateway授权,重启RSLinx。首先打开RSLinx,点选communications——ConfigureGateway;2、在弹出的窗口中勾选EnableRSLinxClassicGateway;3、点击OK;4、在ClientAccessList(客户端列表)标签中勾选限制访问;5、点击AddNew;6、输入正确的客户端IP;7、点击应用;3二、在需要连接的主机上建立TOPIC(主题)这里没有写被连接主机的设置,被连接主机的设置就是之前说过的RSLinx连接PLC的设置8、点击DDE/OPC——TopicConfiguration9、点击New;10、输入主题名;11、选择主题名对应的CUP;12、点击Apply;然后在点击New,建好所有的主题后,点击Done;4三、用RSI-OPCTestClient软件测试连接是否成功在开始菜单——所有程序——RockwellSoftware——RSLinx——Tools——OPCTestClient13、点击Server——connect14、在弹出的窗口中选择RSLinxOPCServer;15、点击OK;16、点击Group——AddGroup17、在弹出的弹出的窗口中点击OK;18、点击Item——AddItem;19、电机加号可以浏览标签,浏览标签添加需要的标签到左上角的的窗口中;20、点击OK;21、浏览到了添加进来的标签总结:这种方式是通过RSLinx作为网关远程访问到PLC,还是在HMI服务器上用RSLinx建立并配置TOPIC,说到底这种连接方式也RSLinx直接与PLC连接相比只是网络路径不同,连接之后的效果是一样的。5不同类型RSLinxClassic的区别(2012-05-1516:26:11)转载▼标签:rslinx分类:RSLinxRSLinxClassic共有五种版本,以满足不同价格和功能需求。根据运行版本的不同,某些功能不一定可用。有关具体版本的功能,请参阅以下部分。正在运行的RSLinxClassic版本信息显示在主窗口顶部的标题栏上。如果启动RSLinxClassic版本时没有正确的激活文件,它将作为RSLinxClassicLite运行。RSLINXCLASSIC入门指南RSLinxClassicLiteRSLinxClassicLite提供了支持RSLogix和RSNetWorx所需的最基本功能。不单独出售该版本,而是与仅需直接访问RSLinxClassic网络驱动程序的产品捆绑出售。该版本不支持OPC、DDE或已发布的RSLinxClassicC应用程序编程接口(API)。RSLinxClassicLite适用于以下情况:使用RSLogix产品的梯形逻辑编程。使用RSNetWorx配置与诊断网络和设备。配置以太网模块/设备(例如,1756-ENET、1756-DHRIO等)。使