OPC Server示例教程:OPC客户端——C#.NET示例

如果从.NET访问OPC Server,则需要交换COM和.NET的包装器。 它解释了C#.NET在这里使用RCW(Runtime Callble Wrapper)访问OPC服务器的实现。

OPC Server是一套利用微软的COM/DCOM技术实现工业自动化资料获取的架构。OPC Server提供OPC接口,它将与之相连的物理设备(PLC)的信息值通过接口返回到客户端应用程序。也就是说,客户端通过这些接口,可以获得与OPC Server连接的物理设备的信息。对于集成应用程序,只要支持OPC接口,就能轻易访问物理设备,而无需相关的技术信息。 程序设计者可以使用相同的程序代码,操作不同的硬件装置,充分达成软件复用的目的。

【OPC Server 最新版下载】

如果从.NET访问OPC Server,则需要交换COM和.NET的包装器。 它解释了C#.NET在这里使用RCW(Runtime Callble Wrapper)访问OPC服务器的实现。

通过COM连接到OPC服务器

创建COM连接的实例,指定OPC服务器的CLSID,您可以获取OPC的每个接口指针,例如OPC服务器对象和浏览对象等。

IOPCServerList svrList = (IOPCServerList)CreateInstance(CLSID_SERVERLIST, null);Guid clsidList;svrList.CLSIDFromProgID(sSvrName, out clsidList);m_OPCServer = (IOPCServer)CreateInstance(clsidList, sNodeName);AddGroup(sGrpName, iUpdateRate);IOPCCommon m_com = (IOPCCommon)m_OPCServer;

创建OPC组并添加标签

需要在OPC服务器中创建组对象以从外部获取实际数据。数据更新周期可以设置为组对象,并且通常将通过相同同步访问的设备注册到组。因为每个组的线程都是在OPC服务器中创建的,所以请注意CPU负载增加过多细分。

// Add OPCGroupguidGroupStateMgt = Marshal.GenerateGuidForType(typeof(IOPCGroupStateMgt2));m_OPCServer.AddGroup(sGrpName, (bActive) 1 : 0, iUpdateRate,                        iClientGroup, ptrTimeBias, ptrDeadBand, iLCID,                        out m_iServerGroup, out iRevisedUpdateRate,                        ref guidGroupStateMgt, out group);m_OPCGroup2 = (IOPCGroupStateMgt2)group;m_OPCGroup2.SetKeepAlive(iKeepAliveTime, out iKeepAliveTime);m_OPCConnPointCntnr = (IConnectionPointContainer)m_OPCGroup2;guidDataCallback = Marshal.GenerateGuidForType(typeof(IOPCDataCallback));m_OPCConnPointCntnr.FindConnectionPoint(ref guidDataCallback, out m_OPCConnPoint);// Add OPCItemsfor (i = 0; i < iItemCount; i++){  itemDef[i].szItemID = ItemName[i];  itemDef[i].bActive = 1;  itemDef[i].hClient = ClientHd[i];}m_OPCItem = (IOPCItemMgt)m_OPCGroup2;m_OPCItem.AddItems(iItemCount, itemDef, out ppResult, out ppErrors);

同步读/写和ASync读/写

OPC有两种数据访问方式,Synchronize和Asynchronous。在Synchronize中,客户端应用程序必须等待完成服务器工作。但客户端应用程序可以确认服务器事务正常完成,因为OPC服务器在完成通信工作时返回结果。这是一种通常的程序。

在异步模式下,OPC服务器会在收到请求后立即将句柄转为客户端,并在后台继续执行事务。完成此工作后,调用客户端应用程序的处理程序。异步模式减少了通信的等待时间,并能够运行客户端应用程序。

提示:在建议模式下启用异步访问。

// Read by IOPCSyncIOOPCSyncIO2 = (IOPCSyncIO2)m_OPCGroup2;OPCSyncIO2.Read(OPC_DS_DEVICE /*OPC_DS_CACHE*/, iItemCount, ServerHd, out ppItemVal, out ppErrors);Marshal.Copy(ppErrors, Errors, 0, iItemCount);posItem = ppItemVal;for (i=0; i<iItemCount; i++){  ItemState = (OPCITEMSTATE)Marshal.PtrToStructure(posItem, typeof(OPCITEMSTATE));  if (Errors[i] == 0)  {    Values[i] = ItemState.vDataValue;    TimeStamps[i] = ItemState.ftTimeStamp;    Qualities[i] = ItemState.wQuality;  }  Marshal.DestroyStructure(posItem, typeof(OPCITEMSTATE));  posItem = new IntPtr(posItem.ToInt32() + Marshal.SizeOf(typeof(OPCITEMSTATE)));}// Write by IOPCSyncIO.OPCSyncIO2.Write(iItemCount, ServerHd, Value, out ppErrors);Marshal.Copy(ppErrors, errors, 0, iItemCount);Marshal.FreeCoTaskMem(ppErrors);

高速缓存读取(OPC_DS_CACHE)立即返回服务器内存中的最新数据值,而无需通信。OPC服务器根据每个组的注册更新周期自动更新数据。当它可能不一定是最新数据时,可以进行高速访问。

// Read by IOPCASyncIOOPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2;OPCAsyncIO3.Read(iItemCount, ServerHd, wTransID, out wCancelID, out ppErrors);// Write by IOPCASyncIOOPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2;OPCAsyncIO3.Write(iItemCount, ServerHd, Value, wTransID, out wCancelID, out ppErrors);Marshal.FreeCoTaskMem(ppErrors);

OPC Server示例教程:OPC客户端——C#.NET示例

标签:OPC工业4.0工业物联网

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月13日
下一篇 2019年3月13日

相关推荐

发表回复

登录后才能评论