本人学习了一下.Net,恰好,51自学网,又要用这个。而网上很多VC6,VB6,VB .Net的但,很少C#的。现在研究一下,给出例子:

测试平台,是VS2008,KEPServer,OpcNetApi.dll和OpcNetApi.Com.dll。当然我也同时安装了,51自学网,西门子的Net2006和Step7,其中Net2006是负责OPC的,可能会在系统中创建一些dll之类的,自学,因为我的程序换到一台没有Net2006的机子上既然有问题,不知其电脑问题还是因为没装Net2006。不过,理论上,OpcNetApi.dll和OpcNetApi.Com.dll足矣。还有,Net2006的安装路径下会有写dll和例子。例如我的是默认安装,C:\Program Files\Siemens\SIMATIC.NET\opc2\samples下有Automation、Custom、dotnet、xml四种应用的例子,有兴趣的可以研究研究。

下面给出我的代码,是基于控制台的,代码不长,如果 您有C#经验和OPC基础应不难理解,而且还有注释,希望您能喜欢:)

以下是Program.cs,有些测试操作我注释掉了,大家也可以玩玩。

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading;
  6 using Opc;
  7 using Opc.Da;
  8 using OpcCom;
  9
 10 namespace OPCAPITest
 11 {
 12   class Tester
 13   {
 14     private Opc.Da.Server m_server = null;//定义数据存取服务器
 15     private Opc.Da.Subscription subscription = null;//定义组对象(订阅者)
 16     private Opc.Da.SubscriptionState state = null;//定义组(订阅者)状态,相当于OPC规范中组的参数
 17     private Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();//定义枚举基于COM服务器的接口,用来搜索所有的此类服务器。
 18     public void Work()
 19     {
 20       //查询服务器
 21       Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20,"TX1" , null);
 22       //daver表示数据存取规范版本,Specification.COMDA_20等于2.0版本。
 23       //host为计算机名,null表示不需要任何网络安全认证。
 24       if (servers != null)
 25       {
 26         foreach (Opc.Da.Server server in servers)
 27         {
 28           //server即为需要连接的OPC数据存取服务器。
 29           if (String.Compare(server.Name,"TX1.KEPware.KEPServerEx.V4",true) == 0)//为true忽略大小写
 30           //if (String.Compare(server.Name, "localhost.KEPware.KEPServerEx.V4", true) == 0)//不带计算机名为本地访问
 31           {
 32             m_server = server;//建立连接。
 33             break;
 34           }
 35         }
 36       }
 37
 38       //连接服务器
 39       if (m_server != null)//非空连接服务器
 40         m_server.Connect();
 41       else
 42         return;
 43
 44       //设定组状态
 45       state = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
 46       state.Name = "测试";//组名
 47       state.ServerHandle = null;//服务器给该组分配的句柄。
 48       state.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
 49       state.Active = true;//激活该组。
 50       state.UpdateRate = 100;//刷新频率为1秒。
 51       state.Deadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
 52       state.Locale = null;//不设置地区值。
 53
 54       //添加组
 55       subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//创建组
 56       //定义Item列表
 57       //对应类型为:{Byte,Byte,Char,Short,String,Word,Boolean}
 58       string[] itemName = { "BPJ.DB1.dbb0", "BPJ.DB1.dbb1", "BPJ.DB1.dbc2", "BPJ.DB1.dbi3",
 59                   "BPJ.DB1.dbs4", "BPJ.DB1.dbw5", "BPJ.DB1.dbx6" };
 60
 61       //定义item列表
 62       Item[] items = new Item[7];//定义数据项,即item
 63       int i;
 64       for (i = 0; i < items.Length; i++)//item初始化赋值
 65       {
 66         items[i] = new Item();//创建一个项Item对象。
 67         items[i].ClientHandle = Guid.NewGuid().ToString();//客户端给该数据项分配的句柄。
 68         items[i].ItemPath = null; //该数据项在服务器中的路径。
 69         items[i].ItemName = itemName[i]; //该数据项在服务器中的名字。
 70       }
 71
 72       //添加Item
 73       subscription.AddItems(items);
 74
 75       //注册回调事件
 76       subscription.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange);
 77
 78       //以下测试同步读
 79       //以下读整个组
 80       ItemValueResult[] values = subscription.Read(subscription.Items);
 81       //以下检验item的quality
 82       /*if (values[0].Quality .Equals(Opc.Da.Quality.Good))
 83         Console.WriteLine("检测质量成功!");*/
 84       //以下读部分组
 85       Item[] r_items=new Item[2];
 86       for (i = 1; i < 3; i++)
 87         r_items[i-1] = subscription.Items[i];
 88       ItemValueResult[] values2 = subscription.Read(r_items);
 89       //以下遍历读到的全部值
 90       /*foreach (ItemValueResult value in values2)
 91       {
 92         Console.WriteLine("同步读:ITEM:{0},value:{1},quality:{2}", value.ItemName, value.Value, value.Quality);
 93       }*/
 94
 95       //以下测试异步读
 96       IRequest quest=null ;
 97       subscription.Read(subscription.Items,1,this.OnReadComplete,out quest ) ;
 98
 99       //以下测试同步写
100       //以下写整个组
101       ItemValue[] itemvalues= new ItemValue[subscription.Items.Length];
102       for (i = 0; i < subscription.Items.Length; i++)
103         itemvalues[i] = new ItemValue((ItemIdentifier)subscription.Items[i]);
104       itemvalues[0].Value = 255;
105       itemvalues[1].Value = 126;
106       itemvalues[2].Value = 'A';
107       itemvalues[3].Value = -128;
108       itemvalues[4].Value = "Good Lucky!";
109       itemvalues[5].Value = 65535;
110       itemvalues[6].Value = true;
111       subscription.Write(itemvalues);
112       Thread.Sleep(500);//暂停线程以让DataChange反映
113       //以下写部分组
114       ItemValue[] itemvalues2 = new ItemValue[3];
115       itemvalues2[0] = new ItemValue((ItemIdentifier)subscription.Items[1]);//TItem类要先转成ItemIdentifier,才能转成ItemValue
116       itemvalues2[1] = new ItemValue((ItemIdentifier)subscription.Items[2]);//TItem类要先转成ItemIdentifier,才能转成ItemValue
117       itemvalues2[2] = new ItemValue((ItemIdentifier)subscription.Items[3]);//TItem类要先转成ItemIdentifier,才能转成ItemValue   
118       itemvalues2[0].Value = 12;
119       itemvalues2[1].Value = 112;
120       itemvalues2[2].Value = 122;
121       subscription.Write(itemvalues2);
122
123       //以下测试异步写
124       Thread.Sleep(500);//暂停线程以让DataChange反映
125       subscription.Write(itemvalues, 1, this.OnWriteComplete, out quest);
126
127       //END
128       Console.WriteLine("************************************** hit <return> to close...");
129       Console.ReadLine();
130
131       //取消回调事件
132       subscription.DataChanged -= new Opc.Da.DataChangedEventHandler(this.OnDataChange);
133       //移除组内item
134       subscription.RemoveItems(subscription.Items);
135       //结束:释放各资源
136       m_server.CancelSubscription(subscription);//m_server前文已说明,通知服务器要求删除组。
137       subscription.Dispose();//强制.NET资源回收站回收该subscription的所有资源。
138       m_server.Disconnect();//断开服务器连接
139     }
140
141     //DataChange回调
142     public void OnDataChange(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
143     {
144       Console.WriteLine("_____________________DataChange事件");
145       foreach (ItemValueResult item in values)
146       {
147         Console.WriteLine("发生DataChange事件");
148         Console.WriteLine("ITEM:{0},value:{1}", item.ItemName,item.Value);
149         Console.WriteLine("ITEM:{0},value:{1}", item.Quality,item.Timestamp);
150         Console.WriteLine("事件信号句柄为{0}", requestHandle);
151
152       }
153
154     }
155
156     //ReadComplete回调
157     public void OnReadComplete(object requestHandle, Opc.Da.ItemValueResult[] values)
158     {
159       /*Console.WriteLine("发生异步读name:{0},value:{1}", values[0].ItemName, values[0].Value);
160       if ((int)requestHandle == 1)
161         Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
162     }
163
164     //WriteComplete回调
165     public void OnWriteComplete(object requestHandle, Opc.IdentifiedResult[] values)
166     {
167       /*Console.WriteLine("发生异步写name:{0},value:{1}", values[0].ItemName, values[0].GetType());
168       if ((int)requestHandle == 2)
169         Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
170     }
171
172     static void Main(string[] args)
173     {
174       Tester tst = new Tester();
175       tst.Work();
176     }
177   }
178 }

用OpcNetApi.dll连接上opc服务器后,如何展现opc服务器上所有的数据项名。
是不是用BrowseElement[] elements = m_server.Browse(itemID, m_filters, out position)函数,如果是这个函数怎么用啊,参数是什么?有没有例子?

http://bbs.csdn.net/topics/390777396
Opc.Da.BrowseFilters filters = new Opc.Da.BrowseFilters();filters.BrowseFilter = Opc.Da.browseFilter.all;Opc.Da.BrowsePosition pos = null;Opc.Da.BrowseElement[] elements = m_server.Browse(null, filters,out pos);

转载于:https://www.cnblogs.com/zouhao/p/6386805.html

C#使用OpcNetApi.dll和OpcNetApi.Com.dll操作OPC相关推荐

  1. Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.解决方案

    Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.解决方案 在运行python代 ...

  2. dll的概念、dll导出类(转)

    1. DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数.变量或类.这些可以直接拿来使用. 静态链接库与动态链接库的区别: (1)静态链接库与 ...

  3. Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

    报错时执行的代码: from skimage import transform as trans Initializing libiomp5md.dll, but found libiomp5md.d ...

  4. VC++钩子DLL框架代码(MFC Extension DLL using shared MFC DLL)

    // HookDllDemo.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h&quo ...

  5. php5ts.dll 注册码,修复php5ts.dll

    php5ts.dll是电脑系统必备的一个DLL组件修复程序.系统重要文件php5ts.dll.丢失php5ts.dll会导致计算机中的某些软件或程序无法正确运行.如果发生这种情况,请从站点下载文件进行 ...

  6. 计算机中缺少d3dx9_35.dll,d3dx9_35.dll丢失怎么办-d3dx9_35.dll丢失的解决办法

    在使用计算机过程中,遇到d3dx9_35.dll丢失这种情况,该怎么办呢?那么现在小编就将和大家讲解一下d3dx9_35.dll丢失的解决办法,有需要的朋友可以来看看哦,希望可以帮助到大家. 一.如果 ...

  7. 找不到编译动态表达式所需的一种或多种类型。是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用?...

    提示"找不到编译动态表达式所需的一种或多种类型.是否缺少对 Microsoft.CSharp.dll 和 System.Core.dll 的引用? "错误 解决方法:   将引入的 ...

  8. 【TensorFlow】:解决TensorFlow的ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败...

    [背景] 在scikit-learn基础上系统结合数学和编程的角度学习了机器学习后(我的github:https://github.com/wwcom614/machine-learning),意犹未 ...

  9. python27.dll引起的appcrash_python27.dll错误代码126怎么解决

    python27.dll文件下载,解决找不到python27.dll的问题 python27.dll控件常规安装方法(仅供参考): 一.如果在运行某软件或编译程序时提示缺少.找不到python27.d ...

  10. VS2008创建dll,并使用dll

    原来一直使用vc6.0做开发,但是公司主要使用vs2008工具,刚开始使用的时候感觉非常不好用,但是一周下来,不禁感叹,还是新的好啊,嘿嘿! 这里总结一下vs2008下创建dll并使用dll导出函数的 ...

最新文章

  1. 调用 微信接口报错 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}...
  2. SpringBoot实现微信点餐
  3. 《高效程序员的45个习惯》-之三
  4. python地理数据处理 下载_python-doc/将Python用于地理空间数据处理.md at master · zhuxinyizhizun/python-doc · GitHub...
  5. 最全的数据结构解析与归纳
  6. 漫画:什么是SnowFlake算法
  7. 2020蓝桥杯省赛---java---B---1(门牌制作)
  8. 如何成为一名有效的软件工程师
  9. 面试题:为什么Java中的字符串对象是不可变的
  10. 一款好用的切换目录的工具autojump
  11. 在SpringMVC中使用拦截器(interceptor)拦截CSRF***
  12. 如何使用LDAP用户单点登录到Horizon桌面和应用
  13. php 数据类型 map,es6中Set和Map的对比介绍(附代码)
  14. C#基础16:事件与观察者模式
  15. activiti7对接springboot
  16. 时间序列分析实验报告总结_时间序列分析实验报告
  17. excel单元格中换行的办法/word中添加脚注的方法
  18. Spring 事务源码(2)—<tx:annotation-driven/>事务标签源码解析
  19. Docker安装(Alibaba Cloud Linux 3)
  20. dvdfab虚拟光驱使用教程

热门文章

  1. python2和python3共存时,设置默认python为python3
  2. 20165309 《网络对抗技术》实验二:后门原理与实践
  3. Android service Binder用法
  4. BPM实例分享——日期自动计算
  5. Unsafe in Java
  6. java的关闭钩子(Shutdown Hook)
  7. sax解析xml案例一
  8. ubuntu软件中心打不开Python error
  9. [function.strtotime] 错误对策
  10. Asp.Net中的正则表达式问题可以在此提问,今后大家一起研究!贴出基本语法参考...