本人学习了一下.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,有些测试操作我注释掉了,大家也可以玩玩。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Opc;
using Opc.Da;
using OpcCom; namespace OPCAPITest
{
  class Tester
  {
    private Opc.Da.Server m_server = null;//定义数据存取服务器
    private Opc.Da.Subscription subscription = null;//定义组对象(订阅者)
    private Opc.Da.SubscriptionState state = null;//定义组(订阅者)状态,相当于OPC规范中组的参数
    private Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();//定义枚举基于COM服务器的接口,用来搜索所有的此类服务器。
    public void Work()
    {
      //查询服务器
      Opc.Server[] servers = m_discovery.GetAvailableServers(Specification.COM_DA_20,"TX1" , null);
      //daver表示数据存取规范版本,Specification.COMDA_20等于2.0版本。
      //host为计算机名,null表示不需要任何网络安全认证。
      if (servers != null)
      {
        foreach (Opc.Da.Server server in servers)
        {
          //server即为需要连接的OPC数据存取服务器。
          if (String.Compare(server.Name,"TX1.KEPware.KEPServerEx.V4",true) == )//为true忽略大小写
          //if (String.Compare(server.Name, "localhost.KEPware.KEPServerEx.V4", true) == 0)//不带计算机名为本地访问
          {
            m_server = server;//建立连接。
            break;
          }
        }
      }       //连接服务器
      if (m_server != null)//非空连接服务器
        m_server.Connect();
      else
        return;       //设定组状态
      state = new Opc.Da.SubscriptionState();//组(订阅者)状态,相当于OPC规范中组的参数
      state.Name = "测试";//组名
      state.ServerHandle = null;//服务器给该组分配的句柄。
      state.ClientHandle = Guid.NewGuid().ToString();//客户端给该组分配的句柄。
      state.Active = true;//激活该组。
      state.UpdateRate = ;//刷新频率为1秒。
      state.Deadband = ;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。
      state.Locale = null;//不设置地区值。       //添加组
      subscription = (Opc.Da.Subscription)m_server.CreateSubscription(state);//创建组
      //定义Item列表
      //对应类型为:{Byte,Byte,Char,Short,String,Word,Boolean}
      string[] itemName = { "BPJ.DB1.dbb0", "BPJ.DB1.dbb1", "BPJ.DB1.dbc2", "BPJ.DB1.dbi3",
                  "BPJ.DB1.dbs4", "BPJ.DB1.dbw5", "BPJ.DB1.dbx6" };       //定义item列表
      Item[] items = new Item[];//定义数据项,即item
      int i;
      for (i = ; i < items.Length; i++)//item初始化赋值
      {
        items[i] = new Item();//创建一个项Item对象。
        items[i].ClientHandle = Guid.NewGuid().ToString();//客户端给该数据项分配的句柄。
        items[i].ItemPath = null; //该数据项在服务器中的路径。
        items[i].ItemName = itemName[i]; //该数据项在服务器中的名字。
      }       //添加Item
      subscription.AddItems(items);       //注册回调事件
      subscription.DataChanged += new Opc.Da.DataChangedEventHandler(OnDataChange);       //以下测试同步读
      //以下读整个组
      ItemValueResult[] values = subscription.Read(subscription.Items);
      //以下检验item的quality
      /*if (values[0].Quality .Equals(Opc.Da.Quality.Good))
        Console.WriteLine("检测质量成功!");*/
      //以下读部分组
      Item[] r_items=new Item[];
      for (i = ; i < ; i++)
        r_items[i-] = subscription.Items[i];
      ItemValueResult[] values2 = subscription.Read(r_items);
      //以下遍历读到的全部值
      /*foreach (ItemValueResult value in values2)
      {
        Console.WriteLine("同步读:ITEM:{0},value:{1},quality:{2}", value.ItemName, value.Value, value.Quality);
      }*/       //以下测试异步读
      IRequest quest=null ;
      subscription.Read(subscription.Items,,this.OnReadComplete,out quest ) ;       //以下测试同步写
      //以下写整个组
      ItemValue[] itemvalues= new ItemValue[subscription.Items.Length];
      for (i = ; i < subscription.Items.Length; i++)
        itemvalues[i] = new ItemValue((ItemIdentifier)subscription.Items[i]);
      itemvalues[].Value = ;
      itemvalues[].Value = ;
      itemvalues[].Value = 'A';
      itemvalues[].Value = -;
      itemvalues[].Value = "Good Lucky!";
      itemvalues[].Value = ;
      itemvalues[].Value = true;
      subscription.Write(itemvalues);
      Thread.Sleep();//暂停线程以让DataChange反映
      //以下写部分组
      ItemValue[] itemvalues2 = new ItemValue[];
      itemvalues2[] = new ItemValue((ItemIdentifier)subscription.Items[]);//TItem类要先转成ItemIdentifier,才能转成ItemValue
      itemvalues2[] = new ItemValue((ItemIdentifier)subscription.Items[]);//TItem类要先转成ItemIdentifier,才能转成ItemValue
      itemvalues2[] = new ItemValue((ItemIdentifier)subscription.Items[]);//TItem类要先转成ItemIdentifier,才能转成ItemValue   
      itemvalues2[].Value = ;
      itemvalues2[].Value = ;
      itemvalues2[].Value = ;
      subscription.Write(itemvalues2);       //以下测试异步写
      Thread.Sleep();//暂停线程以让DataChange反映
      subscription.Write(itemvalues, , this.OnWriteComplete, out quest);       //END
      Console.WriteLine("************************************** hit <return> to close...");
      Console.ReadLine();       //取消回调事件
      subscription.DataChanged -= new Opc.Da.DataChangedEventHandler(this.OnDataChange);
      //移除组内item
      subscription.RemoveItems(subscription.Items);
      //结束:释放各资源
      m_server.CancelSubscription(subscription);//m_server前文已说明,通知服务器要求删除组。
      subscription.Dispose();//强制.NET资源回收站回收该subscription的所有资源。
      m_server.Disconnect();//断开服务器连接
    }     //DataChange回调
    public void OnDataChange(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
    {
      Console.WriteLine("_____________________DataChange事件");
      foreach (ItemValueResult item in values)
      {
        Console.WriteLine("发生DataChange事件");
        Console.WriteLine("ITEM:{0},value:{1}", item.ItemName,item.Value);
        Console.WriteLine("ITEM:{0},value:{1}", item.Quality,item.Timestamp);
        Console.WriteLine("事件信号句柄为{0}", requestHandle);       }     }     //ReadComplete回调
    public void OnReadComplete(object requestHandle, Opc.Da.ItemValueResult[] values)
    {
      /*Console.WriteLine("发生异步读name:{0},value:{1}", values[0].ItemName, values[0].Value);
      if ((int)requestHandle == 1)
        Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
    }     //WriteComplete回调
    public void OnWriteComplete(object requestHandle, Opc.IdentifiedResult[] values)
    {
      /*Console.WriteLine("发生异步写name:{0},value:{1}", values[0].ItemName, values[0].GetType());
      if ((int)requestHandle == 2)
        Console.WriteLine("事件信号句柄为{0}", requestHandle);*/
    }     static void Main(string[] args)
    {
      Tester tst = new Tester();
      tst.Work();
    }
  }
}

用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);

C#使用OpcNetApi.dll和OpcNetApi.Com.dll操作OPC的更多相关文章

  1. 多个DLL合并成一个DLL

    多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 1:) 下载 http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-425 ...

  2. 从新注册 .DLL CMD 运行regsvr32 *.dll注册该DLL 或 regsvr32 /s *.DLL 求证

    从新注册 .DLL  CMD 运行regsvr32  *.dll注册该DLL  或 regsvr32 /s  *.DLL 求证

  3. Omu.AwesomeMvc.dll 和Omu.ValueInjecter.dll 介绍

    AwesomeMvc 让你不写一行js实现下拉列表联动 AwesomeMvc是个开源项目,地址:http://awesome.codeplex.com/ Omu.AwesomeMvc.dll 和Omu ...

  4. Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll引用,导致项目无法调试问题

    最近在做录音功能,用到了Microsoft.DirectX.DirectSound.dll和Microsoft.DirectX.dll两个dll,但是引入后,无法调试项目 具体解决方法: 修改app. ...

  5. C# 调用VC++的DLL,VC++封装DLL

    VS中新建一个动态库项目 文件生成一个工程名对应的.cpp文件,该文件定义 DLL应用程序的导出函数. 工程内新建一个类OutputInt,我用类向导生成,工程中会添加OutputInt.cpp和Ou ...

  6. DLL搜索路径和DLL劫持

    DLL搜索路径和DLL劫持 环境:XP SP3 VS2005 作者:magictong 为什么要把DLL搜索路径(DLL ORDER)和DLL劫持(DLL Hajack)拿到一起讲呢?呵呵,其实没啥深 ...

  7. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  8. .Net将多个DLL打包为一个DLL(ILMerge)

    在做.Net底层编码过程中,为了功能独立,有可能会生成多个DLL,引用时非常不便.这方面微软提供了一个ILMerge工具原版DOS工具,可以将多个DLL合并成一个.下载完成后需要安装一下,然后通过DO ...

  9. VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书

    原文:VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书 dll引用小结 一.dll与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library” ...

随机推荐

  1. MS08_067漏洞渗透攻击

    MS08_067漏洞渗透攻击实践 前期准备 kali和winxp要ping通 kali开启msfconsole: 同时在这里可以看到目前可攻击载荷个数一共是471个,也可以看到其他攻击的数量如图. 用 ...

  2. ubuntu16.04深度学习环境的配置【转】

    本文转载自:https://my.oschina.net/u/3837179/blog/1920756 在ubuntu中配置GPU的深度学习环境相较于win问题要多很多,这几天琢磨了一下Ubuntu下 ...

  3. [SpringBoot] - 配置文件的多种形式及优先级

              学习两个注解: @PropertySource   @ImportResource  ↓   @ConfigurationProperties  与 @Bean 结合为属性赋值 与 ...

  4. 51Nod 1503 猪和回文

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1503 思路: 没想到要用DP去解决. 题目是从起点出发走,我们可以从起点 ...

  5. UVa 11609 组队(快速幂)

    https://vjudge.net/problem/UVA-11609 题意: 有n个人,选一个或多个人参加比赛,其中一名当队长,有多少种方案?如果参赛者完全相同,但队长不同,算作不同的方案. 思路 ...

  6. shell脚本监控Linux系统性能指标

    2016-11-04 22:41 原作者不详 分类: Linux(7) 在服务器运维过程中,经常需要对服务器的各种资源进行监控, 例如:CPU的负载监控,磁盘的使用率监控,进程数目监控等等,以在系统出 ...

  7. Python的hasattr() getattr() setattr() 函数使用方法详解--转载

    hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来 1 ...

  8. BZOJ 1875 【SDOI2009】 HH去散步

    题目链接:HH去散步 如果不考虑不能走上一次走的边的话,这道题就是一个矩乘的裸题. 现在有了这个条件其实也很好做.我们平常的矩阵都是按点建的,\(A_{i,j}\)表示从第\(i\)个点走到第\(j\ ...

  9. Kolakoski数列

    2018-04-16 15:40:16 Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列.他在整数数列大全网站上排名第二位,足见该数列在组合数学界中的重要性. K ...

  10. ADSL拨号上网或者光纤上网设置概要(原创)

    不管是在梧州设置光纤还是在太平设置ADSL拨号上网每次设置上网一体机的时候都是遇到各种麻烦...这次又是弄了N久,每次问题各不一样.总结一下操作过程,方便以后又遇问题回头查询自个微博.一.设置电话线的 ...