如何在C#中实现OPC的自主识字 同步读写写

1360人阅读
学习笔记:
1.OPC 读数有三种方式:同步、异步、订阅
同步通讯适用于 OPC 客户程序较少,数据量较小时的场合。
相对于同步通讯,异步通讯的效率更高。
订阅方式时,OPC 客户程序对服务器进行请求时,OPC 客户程序操作后立刻返回,不
用等待 OPC 服务器的操作,可以进行其它操作, OPC 服务器的 Group 组在组内有数据发
生改变时,自动根据更新周期刷新相应的客户端数据,如下图,客户端只向 OPC 服务发送
一次请求,之后不再对服务器请求。
2.OPC 访问接口方式
OPC 主要包含两种接口:CUSTOM 标准接口和 OLE 自动化标准接口,自定义接口是服务商必须提供的,而自动化接口则是可选的。
自定义接口是一组 COM 接口,主要用于采用 C++语言的应用程序开发;
自动化接口是一组 OLE 接口,主要用于采用 VB,DELPHI,Excel 等基于脚本编程语
言的应用程序开发。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1718次
排名:千里之外如何在C#中实现OPC数据访问09-第3页
上亿文档资料,等你来发现
如何在C#中实现OPC数据访问09-3
Txt_R2_TimeStamp.Text=Ti;Page27-47;{try{if(MyOpcItem1!=null;8.2自定义接口同步读写usingusingus;System.R;pilerS;n;//引用usi;privatevoidBtn_Conn_Clic;=
j < 3; j++) { if (Convert.ToInt32(ClientHandles.GetValue(i + 1)) == j) { if (ItemValues.GetValue(i + 1) != null) { Txt_R2_Value.Text = ItemValues.GetValue(i + 1).ToString(); Txt_R2_Quality.Text = Qualities.GetValue(i + 1).ToString();
IA&DT Service & Support
Page 26-47
Txt_R2_TimeStamp.Text = TimeStamps.GetValue(i + 1).ToString(); } } } } } catch (System.Exception error) { MessageBox.Show(error.Message, \- 订阅\MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void Btn_Write_A_Click(object sender, EventArgs e)//异步写 { int[] handle = new int[3] { ServerHandle[0], ServerHandle[1],0 }; Array MyServerHandles = (Array) object[] values = new object[3] {14,Txt_W2.Text,\Array Myvalues=(Array) A int cancelID; try { MyOpcGroup.AsyncWrite(2, ref MyServerHandles, ref Myvalues, out errors, WRITEASYNC_ID, out cancelID); } catch (System.Exception error) { MessageBox.Show(error.Message, \- 异步写\MessageBoxButtons.OK, MessageBoxIcon.Error); } } //异步写完成 void MyOpcGroup_WriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) { Txt_WriteStatus2.Text = Errors.GetValue(1).ToString(); } private void CHK_Btn_CheckedChanged(object sender, EventArgs e) { if (CHK_Btn.Checked != true) { MyOpcGroup.IsSubscribed = } else { MyOpcGroup.IsSubscribed = } } //推出释放连接及对象 private void Btn_Disconn_Click(object sender, EventArgs e)
IA&DT Service & Support
Page 27-47
{ try { if (MyOpcItem1 != null) MyOpcItem1 = if (MyOpcItem2 != null) MyOpcItem2 = if (MyOpcGroup != null) MyOpcGroup = MyOpcServer.Disconnect(); } catch (System.Exception error) { MessageBox.Show(error.Message, \- 异步写\MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
8.2 自定义接口同步读写
using using using using using using using using using S System.C System.Runtime.InteropS System.D ponentM System.Windows.F System.D System.R pilerS //引用 using OpcRcw.Da;//引用 namespace Sync_RW { public partial class Form1 : Form { public Form1() { InitializeComponent(); } OpcRcw.Da.IOPCServer ServerO//定义OPCServer 对象 OpcRcw.Da.IOPCSyncIO IOPCSyncIO2Obj =//同步读对象 OpcRcw.Da.IOPCGroupStateMgt IOPCGroupStateMgtObj =//管理OPCGroup组对象 internal const int LOCALE_ID = 0x407;//OPCServer语言码-英语 Object MyobjGroup1 =//OPCGroup对象 int[] ItemServerH//Item句柄数组 int pSvrGroupHandle = 0;//OPCGroup 句柄
IA&DT Service & Support
Page 28-47
private void Btn_Conn_Click(object sender, EventArgs e) { Type svrC Int32 dwRequestedUpdateRate = 1000;//订阅读取速度 Int32 hClientGroup = 1; Int32 pRevUpdateR OpcRcw.Da.OPCITEMDEF[] ItemA float deadband = 0; int TimeBias = 0; GCHandle hTimeBias, hD hTimeBias = GCHandle.Alloc(TimeBias, GCHandleType.Pinned); hDeadband = GCHandle.Alloc(deadband, GCHandleType.Pinned); Guid iidRequiredInterface = typeof(IOPCItemMgt).GUID; try { svrComponenttyp = Type.GetTypeFromProgID(\\ServerObj = (OpcRcw.Da.IOPCServer)Activator.CreateInstance(svrComponenttyp); //注册 try { ServerObj.AddGroup(\增加组 0, dwRequestedUpdateRate, hClientGroup, hTimeBias.AddrOfPinnedObject(), hDeadband.AddrOfPinnedObject(), LOCALE_ID, out pSvrGroupHandle, out pRevUpdateRate, ref iidRequiredInterface, out MyobjGroup1); IOPCSyncIO2Obj = (IOPCSyncIO)MyobjGroup1; //Query interface for sync calls on group object IOPCGroupStateMgtObj = (IOPCGroupStateMgt)MyobjGroup1; ItemArray = new OPCITEMDEF[2];//定义读写的item,共个变量 ItemArray[0].szAccessPath = \地址,不同数据类型表示方法不同 ItemArray[0].bActive = 1;//是否激活 ItemArray[0].hClient = 1;//表示ID ItemArray[0].dwBlobSize = 0; ItemArray[0].pBlob = IntPtr.Z ItemArray[0].vtRequestedDataType = 2; ItemArray[1].szAccessPath = \ItemArray[1].szItemID = \地址,不同数据类型表示方法不同 ItemArray[1].bActive = 1;//是否激活 ItemArray[1].hClient = 2;//表示ID
IA&DT Service & Support
Page 29-47
ItemArray[1].dwBlobSize = 0; ItemArray[1].pBlob = IntPtr.Z ItemArray[1].vtRequestedDataType =8;
IntPtr pResults = IntPtr.Z IntPtr pErrors = IntPtr.Z try { ((OpcRcw.Da.IOPCItemMgt)MyobjGroup1).AddItems(2, ItemArray, out pResults, out pErrors); int[] errors = new int[2]; IntPtr pos = pR ItemServerHandle = new int[2]; Marshal.Copy(pErrors, errors, 0, 2); if (errors[0] == 0) { OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT)); ItemServerHandle[0] = result.hS } if (errors[1] == 0) { pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT))); OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT)); ItemServerHandle[1] = result.hS } } catch (System.Exception error) // catch for add items { MessageBox.Show(error.Message, \- Adding Items\MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // Free the memory if (pResults != IntPtr.Zero) { Marshal.FreeCoTaskMem(pResults); pResults = IntPtr.Z } if (pErrors != IntPtr.Zero) { Marshal.FreeCoTaskMem(pErrors); pErrors = IntPtr.Z } } } catch (System.Exception error) // catch for group adding { MessageBox.Show(String.Format(\
IA&DT Service & Support
Page 30-47
error.Message), \- Add group\MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (hDeadband.IsAllocated) hDeadband.Free(); if (hTimeBias.IsAllocated) hTimeBias.Free(); } } catch (System.Exception error) // catch for server instance creation { MessageBox.Show(String.Format(\creating server object:-{0}\error.Message), \- Create Server\MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void Btn_Read_Click(object sender, EventArgs e)//同步读 { IntPtr pItemValues = IntPtr.Z IntPtr pErrors = IntPtr.Z try { IOPCSyncIO2Obj.Read(OPCDATASOURCE.OPC_DS_DEVICE, 2, ItemServerHandle, out pItemValues, out pErrors); int[] errors = new int[2]; Marshal.Copy(pErrors, errors, 0, 2); OPCITEMSTATE[] pItemState = new OPCITEMSTATE[2]; if (errors[0] == 0) { (OPCITEMSTATE)Marshal.PtrToStructure(pItemValues, pItemValues=new TATE))); // String.Format(\pItemState[0] = typeof(OPCITEMSTATE)); IntPtr(pItemValues.ToInt32()+Marshal.SizeOf(typeof(OPCITEMS update the UI //txt_R1.Text = Txt_R1_Value.Text Txt_R1_Quality.Text dt DateTime = = = pItemState[0].vDataValue); String.Format(\GetQuality(pItemState[0].wQuality); ToDateTime(pItemState[0].ftTimeStamp); Txt_R1_TimeStamp.Text = dt.ToString(); // quality } if (errors[1] == 0) { pItemState[1]= (OPCITEMSTATE)Marshal.PtrToStructure(pItemValues, typeof(OPCITEMSTATE)); pItemValues = new IntPtr(pItemValues.ToInt32()+ Marshal.SizeOf(typeof(OPCITEMSTATE))); // update the UI Txt_R2_Value.Text = String.Format(\pItemState[1].vDataValue); Txt_R2_Quality.Text = GetQuality(pItemState[1].wQuality); DateTime dt = ToDateTime(pItemState[1].ftTimeStamp); Txt_R2_TimeStamp.Text = dt.ToString();
IA&DT Service & Support
Page 31-47
// quality } } catch (System.Exception error) { MessageBox.Show(error.Message, \- Read Items\MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { // Free the unmanaged memory if (pItemValues != IntPtr.Zero) { Marshal.FreeCoTaskMem(pItemValues); pItemValues = IntPtr.Z } if (pErrors != IntPtr.Zero) { Marshal.FreeCoTaskMem(pErrors); pErrors = IntPtr.Z } } } private void Btn_Write_Click(object sender, EventArgs e)//同步写 { IntPtr pErrors = IntPtr.Z object[] values = new object[2]; values[0] = Txt_W1.T values[1] = Txt_W2.T try { IOPCSyncIO2Obj.Write(2, ItemServerHandle, values, out pErrors); int[] errors = new int[2]; Marshal.Copy(pErrors, errors, 0, 2); String pstrE String pstrError1; ServerObj.GetErrorString(errors[0], LOCALE_ID, out pstrError); ServerObj.GetErrorString(errors[1], LOCALE_ID, out pstrError1); } catch (System.Exception error) { MessageBox.Show(error.Message, \MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (pErrors != IntPtr.Zero) { Marshal.FreeCoTaskMem(pErrors); pErrors = IntPtr.Z }
IA&DT Service & Support
Page 32-47
} } private String GetQuality(long wQuality)//质量码 { String strQuality = \switch (wQuality) { case Qualities.OPC_QUALITY_GOOD: strQuality = \case Qualities.OPC_QUALITY_BAD: strQuality = \ case Qualities.OPC_QUALITY_CONFIG_ERROR: strQuality = \case Qualities.OPC_QUALITY_NOT_CONNECTED: strQuality = \case Qualities.OPC_QUALITY_DEVICE_FAILURE: strQuality = \ case Qualities.OPC_QUALITY_SENSOR_FAILURE: strQuality = \ case Qualities.OPC_QUALITY_COMM_FAILURE: strQuality = \ case Qualities.OPC_QUALITY_OUT_OF_SERVICE: strQuality = \Qualities.OPC_QUALITY_WAITING_FOR_INITIAL_DATA: strQuality = \ case Qualities.OPC_QUALITY_EGU_EXCEEDED: strQuality = \ case Qualities.OPC_QUALITY_SUB_NORMAL: strQuality = \ default: strQuality = \handled\ } return strQ } private DateTime ToDateTime(OpcRcw.Da.FILETIME ft) { long highbuf = (long)ft.dwHighDateT long buffer = (highbuf << 32) + ft.dwLowDateT return DateTime.FromFileTimeUtc(buffer); }
IA&DT Service & Support
Page 33-47
private void Btn_Disconn_Click(object sender, EventArgs e)//对象注销,断开连接 { try { if (IOPCSyncIO2Obj != null) { Marshal.ReleaseComObject(IOPCSyncIO2Obj); IOPCSyncIO2Obj = } ServerObj.RemoveGroup(pSvrGroupHandle, 0); if (IOPCGroupStateMgtObj != null) { Marshal.ReleaseComObject(IOPCGroupStateMgtObj); IOPCGroupStateMgtObj = } if (MyobjGroup1 != null) { Marshal.ReleaseComObject(MyobjGroup1); MyobjGroup1 = } if (ServerObj != null) { Marshal.ReleaseComObject(ServerObj); ServerObj = } } catch (System.Exception error) { MessageBox.Show(error.Message, \MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } - Stop Server\
8.3 自定义接口异步读写
using using using using using using using using using S System.C System.Runtime.InteropS System.D ponentM System.Windows.F System.R pilerS System.D //引用 using OpcRcw.Da;//引用 namespace ASync_RW {
IA&DT Service & Support
Page 34-47
public partial class Form1 : Form, IOPCDataCallback { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = } OpcRcw.Da.IOPCServer ServerO//OPCServer OpcRcw.Da.IOPCAsyncIO2 IOPCAsyncIO2Obj =//异步读写对象 OpcRcw.Da.IOPCGroupStateMgt IOPCGroupStateMgtObj =//组管理对象 IConnectionPointContainer pIConnectionPointContainer = IConnectionPoint pIConnectionPoint = internal const int LOCALE_ID = 0x407; Object MyobjGroup1 = int[] ItemServerH int pSvrGroupHandle = 0; Int32 dwCookie = 0; private void Btn_Conn_Click(object sender, EventArgs e) { Type svrC Int32 dwRequestedUpdateRate = 1000; Int32 hClientGroup = 1; Int32 pRevUpdateR OpcRcw.Da.OPCITEMDEF[] ItemA float deadband = 0; int TimeBias = 0; GCHandle hTimeBias, hD hTimeBias = GCHandle.Alloc(TimeBias, GCHandleType.Pinned); hDeadband = GCHandle.Alloc(deadband, GCHandleType.Pinned); Guid iidRequiredInterface = typeof(IOPCItemMgt).GUID; try { svrComponenttyp = Type.GetTypeFromProgID(\\ServerObj = (OpcRcw.Da.IOPCServer)Activator.CreateInstance(svrComponenttyp); //注册 try { ServerObj.AddGroup(\组对象 0, dwRequestedUpdateRate, hClientGroup, hTimeBias.AddrOfPinnedObject(), hDeadband.AddrOfPinnedObject(), LOCALE_ID, out pSvrGroupHandle, out pRevUpdateRate, ref iidRequiredInterface, out MyobjGroup1);
IA&DT Service & Support
Page 35-47
IOPCAsyncIO2Obj = (IOPCAsyncIO2)MyobjGroup1; //Query interface for Async calls on group object IOPCGroupStateMgtObj = (IOPCGroupStateMgt)MyobjGroup1; pIConnectionPointContainer = (IConnectionPointContainer)MyobjGroup1; //定义特定组的异步调用连接 Guid iid = typeof(IOPCDataCallback).GUID; // Establish Callback for all async operations pIConnectionPointContainer.FindConnectionPoint(ref iid, out pIConnectionPoint); // Creates a connection between the OPC servers's connection point and this client's sink (the callback object) pIConnectionPoint.Advise(this, out dwCookie); ItemArray = new OPCITEMDEF[4];//定义读写的item,共个变量 ItemArray[0].szAccessPath = \ItemArray[0].szItemID = \connection_1]DB10,INT0\地址,不同数据类型表示方法不同 ItemArray[0].bActive = 1;//是否激活 ItemArray[0].hClient = 1;//表示ID ItemArray[0].dwBlobSize = 0; ItemArray[0].pBlob = IntPtr.Z ItemArray[0].vtRequestedDataType = 2; ItemArray[1].szAccessPath = \ItemArray[1].szItemID = \connection_1]DB10,Real4\//地址,不同数据类型表示方法不同 ItemArray[1].bActive = 1;//是否激活 ItemArray[1].hClient = 2;//表示ID ItemArray[1].dwBlobSize = 0; ItemArray[1].pBlob = IntPtr.Z ItemArray[1].vtRequestedDataType = 5; ItemArray[2].szAccessPath = \ItemArray[2].szItemID = \connection_1]DB10,STRING26.10\//地址,不同数据类型表示方法不同 ItemArray[2].bActive = 1;//是否激活 ItemArray[2].hClient = 3;//表示ID ItemArray[2].dwBlobSize = 0; ItemArray[2].pBlob = IntPtr.Z ItemArray[2].vtRequestedDataType = 8; IntPtr pResults = IntPtr.Z IntPtr pErrors = IntPtr.Z ItemArray[3].szAccessPath = \ItemArray[3].szItemID = \connection_1]DB10,X12.0\//地址,不同数据类型表示方法不同 ItemArray[3].bActive = 1;//是否激活 ItemArray[3].hClient = 4;//表示ID ItemArray[3].dwBlobSize = 0;
IA&DT Service & Support
Page 36-47
ItemArray[3].pBlob = IntPtr.Z ItemArray[3].vtRequestedDataType = 11; try { ((OpcRcw.Da.IOPCItemMgt)MyobjGroup1).AddItems(4, ItemArray, out pResults, out pErrors); int[] errors = new int[4]; IntPtr pos = pR ItemServerHandle = new int[4]; Marshal.Copy(pErrors, errors, 0, 4); if (errors[0] == 0) { OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT)); ItemServerHandle[0] = result.hS } if (errors[1] == 0) { pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT))); OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT)); ItemServerHandle[1] = result.hS } if (errors[2] == 0) { pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT))); OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT)); ItemServerHandle[2] = result.hS } if (errors[3] == 0) { pos = new 三亿文库包含各类专业文献、文学作品欣赏、中学教育、高等教育、专业论文、幼儿教育、小学教育、生活休闲娱乐、如何在C#中实现OPC数据访问09等内容。 
 具体实现了OPC客户端数据访问服务器的过程,接口步骤及其读写数据的方法,并根据...如何在C#中实现OPC数据访... 47页 免费 OPC Server 及 Client系... 23页 ...  浅谈C#中如何访问数据库_其它_高等教育_教育专区。浅谈C#中如何访问数据库? ? 浅析 C#如何连接数据库实现查询功能
14:18 编程无限 百度空间 我要评...  使用C#开发 OPC Client 的研究和应用 摘要:本文详细...现代化企业中自动化程度越来越高,数据量也在成倍...是指一个可以提供给其它组件或程序服 务的二进制可...  C#的OPC客户端实 摘要:OPC 是连接数据源(OPC 服务器)和数据的使用者(OPC ...为开发工具,按照 OPC 技术的规范标准,将 OPC 技术应用到虚拟仪器显示 组件中。...  &&指定串口的访问方式,一般设置为可读可写方 式 /...可以参阅 之前发布的&运用 VC#编程通过 OPC 方式...里面包含了大量的在托管和非托管区传输数据, 因此我们...  c# opc_计算机硬件及网络_IT/计算机_专业资料。C# ...(txtWriteTagValue.Text);//这句也可以写入,但并...PS: 1.OPCItems 是一个列表, 每次将旧数据移除,...  C#如何连接数据库实现查询功能?首先要求是进行驱动连接, 连接好数据库后, 就只...delete from 表名 (where 条件) 在.NET 中,对数据库的访问有两种方式:oledb...  OPC 数据访问服务器名和该服务器提供的 OPC 项的定义...需要在程序中包含 OPC 标准库 文件,可以从 OPC ...运用VC#编程通过OPC方式... 12页 2下载券 基于VC...如何在C#中实现OPC数据访问_文库下载
1亿文档 免费下载
当前位置: &
& 如何在C#中实现OPC数据访问
如何在C#中实现OPC数据访问
高中物理教学艺术
如何在C#中实现OPC数据访问.txt本文由zxx1987187贡献pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。如何在 C#中实现 OPC 数据访问How to accomplish data accessing through OPC by C# Getting-started Edition (2009 年 03 月)摘 要 本文主要讲述了在 C#语言环境下,编程实现通过 SimaticNet 提供的 OPC Server, 访问 PLC 中数据的步骤。此方法同样适用于 WinCC 作为 OPC Server 时的数据访问。 关键词 SimaticNet、C#、OPC、WinCC Key Words SimaticNet、C#、OPC、WinCCIA&DT Service & SupportPage 2-47如何在C#中实现OPC数据访问 …… 1 1、概述 …… 4 1.1 OPC介绍 …… 4 1.2 OPC的读写方式 …… 5 1.3 OPC访问接口方式…… 6 2、测试环境 …… 7 2.1 硬件要求…… 7 2.2 软件要求…… 7 3、OPC Server端组态配置…… 7 4、采用自定义接口过程 …… 9 4.1 同步读写…… 9 4.2 异步读写…… 12 5、采用自动化接口实现过程 …… 19 6、OPCItem的数据类型 …… 23 7、小结 …… 23 8、代码 …… 23 8.1 自动化接口 …… 23 8.2 自定义接口同步读写…… 28 8.3 自定义接口异步读写…… 34IA&DT Service & SupportPage 3-471、概述 1.1 OPC 介绍 OPC 是 Object Linking and Embedding(OLE)for Process Control 的缩写,它是微软 公司的对象链接和嵌入技术在过程控制方面的应用。OPC 以 OLE/COM/DCOM 技术为基 础,采用客户/服务器模式,为工业自动化软件面向对象的开发提供了统一的标准,这个标 准定义了应用 Microsoft 操作系统在基于 PC 的客户机之间交换自动化实时数据的方法,采 用这项标准后,硬件开发商将取代软件开发商为自己的硬件产品开发统一的 OPC 接口程 序,而软件开发者可免除开发驱动程序的工作,充分发挥自己的特长,把更多的精力投入 到其核心产品的开发上。 SimaticNet 是西门子全集成自动化系统中的一个重要组成部分,它为完善的工业自动化 控制系统的通讯提供部件和网络,同时提供多个 OPCServer,为数据的外部访问提供接 口,本文主要以 OPC.SimaticNET 为例说明。图 1:SimatcicNet 提供的 OPCServer 采用不同的通信方式,通过 OPC.SimaticNET,现场数据可以方便地提供给用户:OPC Client …… OPC ClientOPC.SimaticNETDP SNMP PNIO ……图 2:多种数据提供方式IA&DT Service & SupportPage 4-471.2 OPC 的读写方式 在实际使用中,主要包括对现场数据的读写操作。 OPC 读数有三种方式:同步、异步、订阅。 同步通讯时,OPC 客户程序向 OPC 服务器进行请求时,OPC 客户程序必须等到 OPC 服务器对应的响应全部完成以后才能返回,在此期间 OPC 客户程序一直处于等待状态,若 进行读
Word文档免费下载:(下载1-20页,共20页)
C#中实现 如何在 C#中实现 OPC 数据访问 OPC data access by C# 月年月年月年月年 Getting-started Edition (2009 05 ) C# SimaticNet OPC Server , 。问访...这里以C#为开发工具,按照OPC技术的规范标准,将OPC技术应用到虚拟仪器显示组件中。具体实现了OPC客户端数据访问服务器的过程,接口步骤及其读写数据的方法,并根据OPC...也提供 了一套编程接口,可使用 高级语言编程通过 Simatic Net 访问 PLC 数据。...如何在C#中实现OPC数据访... 47页 1下载券 opc服务器 3页 免费 opc规范 3...C#OPC_计算机软件及应用_IT/计算机_专业资料。C#OPCC#实现 OPC 历史数据存取研究...如何在C#中实现OPC数据访... 47页 1下载券 OPC配置 20页 1下载券喜欢...基于C#的OPC数据通信的设计与实现_计算机软件及应用_IT/计算机_专业资料。14 基于 C #的OP C数据通信 的设 计 与实 现 基于 C #的OP C数据通信的设计与实...(C#)OPC客户端源码 28页 免费 如何在C#中实现OPC数据访问... 47页 2财富值...具体实现了0PC客户端数据访问服务器的过程, 接口步骤及其读写数据的方法,并根据...湖南长沙 410004) 摘要:研究C#接口属性类后,编写了一个COM编排文件,将基于COM的OPC数据存取定制接口映 射到.NET接口,有效地实现了遵循OPC数据存取规范2.0版本的...服务器的句柄为了确保该组之后被访问 [out] The answer from Server to the ...(C#)OPC客户端源码 28页 免费 如何在C#中实现OPC数据访... 47页 5下载券 ...基于Visual C#的OPC客户端实现_专业资料。龙源期刊网 .cn 基于Visual现 作者:朱立军 安娜 陈未如 来源:《现代电子技术》2009 年第 02 期...基于NETFramework的OPC数据访问服务器的研究与设计_计算机...Keywords: OPC .NET C#;...文件中,在注册服务器时自动完成,操作 起来十分简便...基于Visual C#的OPC客户端实现_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于Visual C#的OPC客户端实现
&&摘 要:OPC是连接数据源(OPC服务器)和数据的使用者(OPC应用程序)之间的软件接口标准。这里以C#为开发工具,按照OPC技术的规范标准,将OPC技术应用到虚拟仪器显示组件中。具体实现了OPC客户端数据访问服务器的过程,接口步骤及其读写数据的方法,并根据OPC服务器提供的数据,最终在虚拟仪器显示组件中生成了虚拟的正弦波、方波、锯齿波、三角波等。
关键词:OPC;OPC接口;OPC服务器;C#
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 spring 读写分离 同步 的文章

 

随机推荐