C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)
admin
2023-02-15 01:20:04
0

  编写OPC客户端,网上的资料一般是一上来就要求找OPCDAAuto.dll,其实我想说,用VS,那都是多此一举,当然,如果你是在需要,我也可以提供给您最新版 OPCDAAuto.dll(v2.2.5.30)

  如果没有积分,无所谓,不要也罢,因为我们的vs中本来就有,为了方便大家理解学习,我新建项目为控制台程序,连接对象为Kepserver服务器,针对KepServer服务器,我已经配置好了,可以匿名登录,

  新建控制台程序后,引用右键选择添加引用,依次选择COM/OPC DA Automation Wrapper 2.02选中,确定。这样就把OPCAutomation 添加到了引用中了。

  接着,写如下程序(所有程序如下,完整版本,稍作修改即可使用。):

  using OPCAutomation;//需要手动添加

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Net;//需要手动添加

  using System.Text;

  using System.Threading.Tasks;

  namespace ConsoleApp1

  {

  class Program

  {

  static void Main(string[] args)

  {

  OPCServer server = new OPCServer();

  //此处127.0.0.1字符串,为本地IP地址,也可别的电脑IP或者电脑名称;此处测试,就以本地IP测试;

  IPHostEntry host = Dns.GetHostEntry("127.0.0.1");

  //获取此电脑上的所有OPC服务器的ProgId,有了它,才能连接到OPC服务器。注意此处为一组OPC服务器集合,

  //而非单个,具体数量根据实际情况而定,当然,也可以是一个,我只是想说它是一个服务器的集合。

  object progIds = server.GetOPCServers(host.HostName);

  foreach (string progId in (Array)progIds)

  {

  //此处是获得单个progId,方便后面连接。

  server.Connect(progId);

  }

  //此处为常规设置,group中还有许多参数没有设置,我都采取了它的默认值,我没有特殊要求,所以不用改。

  OPCGroups groups = server.OPCGroups;

  OPCGroup group = groups.Add("myGroup");

  //此处必须修改,因为默认订阅功能为false;当然你也可以根据别的方式获取数据。

  group.IsSubscribed = true;

  group.DataChange += Group_DataChange;

  //此处为设定需要的ItemIds,就是你需要订阅的哪些数据。

  //具体根据需求而来。

  List ItemIds= new List()

  {

  "S7-1200.0-166.BOOL",

  "S7-1200.0-166.BYTE",

  "S7-1200.0-166.INT",

  "S7-1200.0-166.WORD",

  "S7-1200.0-166.REAL",

  };

  //把需要订阅的项添加到group中。@

  //此处由于个人的疏忽,导致各位同僚们的疑惑,我在此做出更正。谢谢 阿露法的指出。

  //原为 for (int i = 0; i < progids.Count; i++)

  //修改为 for (int i = 0; i < ItemIds.Count; i++)

  //20191024091435

  for (int i = 0; i < ItemIds.Count; i++)

  {

  OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i);

  }

  Console.ReadKey();

  }

  private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)

  {

  //此处注意i是从1开始,因为getvalue没有0.下面输出分别为数据的ClientHandles(就是上文AddItem方法的第二个参数。),Itemvalue就是值,Qualities为质量,timestamps为时间。

  for (int i = 1; i < NumItems+1; i++)

  {

  Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" + Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());

  }

  }

  }

  }

  最终结果输出如下:

  这就是一个OPC客户端,我想应该是最简单的了。。。

  2019.03.30增补:

  想起前两天群友说,由于网络原因,OPC通讯中断了,断了之后重新连接了就不能自动恢复了,如果是这样,我们只需做小小的修改即可:

  private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)

  {

  //此处注意i是从1开始,因为getvalue没有0.下面输出分别为数据的ClientHandles(就是上文AddItem方法的第二个参数。),Itemvalue就是值,Qualities为质量,timestamps为时间。

  for (int i = 1; i < NumItems+1; i++)

  {

  try

  {

  Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" +

  Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());

  }Catch(exception e)

  {

  }

  }


相关内容

热门资讯

“从造王者沦为票房毒药,5月多... 【文/观察者网 熊超然】美国总统特朗普在共和党内长期扮演“造王者”的角色,但随着年底的中期选举日益临...
风声丨为完成指标,引诱少年吸毒... 作者丨陈碧中国政法大学教授近日,媒体报道了一起“诱人犯罪”案。南京一派出所副所长马某犯欺骗他人吸毒罪...
女游客体验景区悬崖秋千项目高空... 极目新闻记者 谢茂5月5日,多位网友发视频称,一处景区悬崖秋千项目发生事故,致一名女游客受伤。网友发...
凤凰女记者战地日记丨广场之内和... 【编者按】这是凤凰卫视驻伊朗记者李睿的战地日记。她身处德黑兰,既是战争的亲历者,也是观察者。在她的日...
伊朗两枚导弹击中美国军舰 伊朗法尔斯通讯社5月4日报道,两枚导弹击中了一艘美国海军舰艇。法尔斯通讯社称,这艘舰艇今日在贾斯克附...
罗晴秋:悦读,让张家界更硬核起... 4月21日晚,悟空研究院院长罗晴秋应邀主持2026悦读共创大会暨华人国学大典丙午春集闭门交流会。4月...
伊朗外长启程访华 据凤凰卫视报道,伊朗外交部5日宣布,伊朗外长阿拉格齐当天启程,到中国北京展开访问。伊朗外交部在其电报...
女子体验瀑布秋千坠亡,四川华蓥... 情况通报5月3日下午,华蓥市玛琉岩探险公园发生一起人员伤亡事故,游客刘某某(女)在体验瀑布秋千项目时...
凤凰直击浏阳烟花厂爆炸:3公里... 湖南长沙浏阳市华盛烟花制造燃放有限公司5月4日发生爆炸,截至目前已造成26人遇难、61人受伤。凤凰卫...
涵盖6大类花品及10种特色花 ... 4月27日,在文化和旅游部主办的2026年全国“五一”文化和旅游消费周与首届中国新文创市集媒体推介会...