没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:王香|2019-04-17 11:52:38.000|阅读 3253 次
概述:如果从.NET访问OPC Server,则需要交换COM和.NET的包装器。 它解释了C#.NET在这里使用RCW(Runtime Callble Wrapper)访问OPC服务器的实现。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
OPC Server是一套利用微软的COM/DCOM技术实现工业自动化资料获取的架构。OPC Server提供OPC接口,它将与之相连的物理设备(PLC)的信息值通过接口返回到客户端应用程序。也就是说,客户端通过这些接口,可以获得与OPC Server连接的物理设备的信息。对于集成应用程序,只要支持OPC接口,就能轻易访问物理设备,而无需相关的技术信息。 程序设计者可以使用相同的程序代码,操作不同的硬件装置,充分达成软件复用的目的。
如果从.NET访问OPC Server,则需要交换COM和.NET的包装器。 它解释了C#.NET在这里使用RCW(Runtime Callble Wrapper)访问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服务器中创建的,所以请注意CPU负载增加过多细分。
// Add OPCGroup guidGroupStateMgt = 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 OPCItems for (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);
OPC有两种数据访问方式,Synchronize和Asynchronous。在Synchronize中,客户端应用程序必须等待完成服务器工作。但客户端应用程序可以确认服务器事务正常完成,因为OPC服务器在完成通信工作时返回结果。这是一种通常的程序。
在异步模式下,OPC服务器会在收到请求后立即将句柄转为客户端,并在后台继续执行事务。完成此工作后,调用客户端应用程序的处理程序。异步模式减少了通信的等待时间,并能够运行客户端应用程序。
提示:在建议模式下启用异步访问。
// Read by IOPCSyncIO OPCSyncIO2 = (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 IOPCASyncIO OPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2; OPCAsyncIO3.Read(iItemCount, ServerHd, wTransID, out wCancelID, out ppErrors); // Write by IOPCASyncIO OPCAsyncIO3 = (IOPCAsyncIO3)m_OPCGroup2; OPCAsyncIO3.Write(iItemCount, ServerHd, Value, wTransID, out wCancelID, out ppErrors); Marshal.FreeCoTaskMem(ppErrors);
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn
本教程演示DevExpress WinForms的Banded Grid View 是如何进行用户自定义的,欢迎下载最新版组件体验!
可视化项目时间线对于有效规划和跟踪至关重要。在本篇教程中,您将学习如何使用 C# 在 Excel 中创建组合图,只需几行代码,即可自动生成动态、美观的组合图。
本文将为大家介绍DevExpress XAF将.NET Aspire集成到Blazor项目中后如何实现数据库依赖,欢迎下载最新版组件体验!
FP3 文件是使用流行的报表生成工具FastReport创建的报表。这种格式广泛用于存储可立即查看的报表数据,这些数据可以轻松共享或保存以供日后分析。但是,要打开和查看此类文件,需要一个特殊的程序——FastReport Viewer。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@dpuzeg.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢