前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」

C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」

作者头像
全栈程序员站长
发布2022-08-31 15:12:53
8.3K0
发布2022-08-31 15:12:53
举报

大家好,又见面了,我是你们的朋友全栈君。

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

如果没有积分,无所谓,不要也罢,因为我们的vs中本来就有,为了方便大家理解学习,我新建项目为控制台程序,连接对象为Kepserver服务器,针对KepServer服务器,我已经配置好了,可以匿名登录,具体配置方法,可参看我的博文(https://blog.csdn.net/wanghuaihu/article/details/88903273)。

新建控制台程序后,引用右键选择添加引用,依次选择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,就是你需要订阅的哪些数据。

//具体根据需求而来。

图1
图1

List<string> ItemIds= new List<string>() { “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()); } } } }

最终结果输出如下:

图2
图2

这就是一个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)

{

}

} }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151313.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档