具体应用呢,不多说了,上代码,取长补短就是原创

using OPCAutomation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace XSDLOPCClinet
{
public partial class Form1 : Form
{
OPCServer ObjOPCServer;
OPCGroups ObjOPCGroups;
OPCGroup ObjOPCGroup;
string OPCServerName;
private OPCItem[] OPC_ITEMS_ADDED;
Dictionary<string, string> MAP_CLIENTHANDLE_TAG = new Dictionary<string, string>(); public Form1()
{
try
{
InitializeComponent();
InitServer();// 启动服务
}
catch (Exception e)
{
MessageBox.Show("cuowu1"+e.Message);
}
} private void InitServer()
{
OPCServerName = "Kepware.KEPServerEX.V5";
ObjOPCServer = new OPCServer();
ObjOPCServer.Connect(OPCServerName, "127.0.0.1");
if (ObjOPCServer.ServerState == (int)OPCServerState.OPCRunning)
{
label1.Text = $"OPC服务器名:{ObjOPCServer.ServerName}";
label4.Text = $"连接启动时间:{ObjOPCServer.StartTime.ToString()}";
label3.Text = "服务运行中,请勿关闭";
//创建并设置组
bool bSucce = this.InitGetDataConfig();
//group添加items
AddGroupItems();
//采集opc数据
GetOPCData();
}
else
{
label3.Text = "OPC服务器状态异常: " + ObjOPCServer.ServerState.ToString();
}
} private bool InitGetDataConfig()
{
ObjOPCGroups = ObjOPCServer.OPCGroups;
ObjOPCGroup = ObjOPCGroups.Add();// 初始化Groups组
ObjOPCGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupAsyncReadComplete);
ObjOPCGroup.IsActive = true;
ObjOPCGroup.IsSubscribed = true;
ObjOPCServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组
return true;
} private void GetOPCData()
{
try
{
//异步读opc数据
int[] temp = new int[OPC_ITEMS_ADDED.Length + 1];
temp[0] = 0;
for (int i = 1; i <= OPC_ITEMS_ADDED.Length; i++)
{
temp[i] = OPC_ITEMS_ADDED[i - 1].ServerHandle;
}
Array serverHandles = (Array)temp;
Array Errors;
int cancelID;
Random rd = new Random();
int TransactionID = rd.Next(1, 100);
ObjOPCGroup.AsyncRead(serverHandles.Length - 1, ref serverHandles, out Errors, TransactionID, out cancelID);//第一参数为item数量
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void AddGroupItems()
{
List<string> l_str = new List<string>();
//读取配置文件,获取需要的传感器ID
l_str.Add("10A.PLC");
l_str.Add("10B.PLC");
List<OPCItem> ItemsAdded = new List<OPCItem>();
int n = 0;
foreach (string tag in l_str)
{
ItemsAdded.Add(ObjOPCGroup.OPCItems.AddItem($"{tag}.address12138", n));
//clientHandle tag关系
MAP_CLIENTHANDLE_TAG.Add(n + "", tag);
n++;
}
OPC_ITEMS_ADDED = ItemsAdded.ToArray();
}
// 异步获取t,v信息
private void GroupAsyncReadComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
try
{
//C# Dictionary 字典
Dictionary<string, string> tagValueMap = new Dictionary<string, string>();
for (int i = 1; i <= NumItems; i++)
{
string clientHandle = ClientHandles.GetValue(i).ToString();
string tag = MAP_CLIENTHANDLE_TAG[clientHandle];
string val = ItemValues.GetValue(i).ToString();
//C# Dictionary 字典 添加数据
tagValueMap.Add(tag, val); }
// 在这里可以调用SQL语句进行value值的更新,是异步的,不是同步更新
// textBox1.Text = tagValueMap["10A.PLC"];
}
catch (Exception ex)
{
label3.Text = ex.Message;
}
} // 退出时释放资源
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
ObjOPCServer.Disconnect();
} }
}

多设备多地址的设置

 private void AddGroupItems()
{
List<string> l_str = new List<string>();
l_str.Add("10A.PLC");
l_str.Add("10B.PLC");
List<OPCItem> ItemsAdded = new List<OPCItem>();
int n = 0;
foreach (string tag in l_str)
{
string address1 = $"{tag}.address12138";
string address2 = $"{tag}.address12139";
string address3 = $"{tag}.address12140";
ItemsAdded.Add(ObjOPCGroup.OPCItems.AddItem(address1, n));
ItemsAdded.Add(ObjOPCGroup.OPCItems.AddItem(address2, n +1));
ItemsAdded.Add(ObjOPCGroup.OPCItems.AddItem(address3, n + 2));
//clientHandle tag关系
MAP_CLIENTHANDLE_TAG.Add(n + "", address1);
MAP_CLIENTHANDLE_TAG.Add(n + 1 + "", address2);
MAP_CLIENTHANDLE_TAG.Add(n + 2 + "", address3);
n = n + 3;
}
OPC_ITEMS_ADDED = ItemsAdded.ToArray();
}

C#获取PLC信息 (KepServer)二的更多相关文章

  1. C#获取PLC信息 (KepServer)

    首先注册DLL 我这里把此DLL放到我自己的网站上了,供大家下载 https://blog.nwctwang.top/OPCDAAuto.dll 把此dll复制到C:\Windows\SysWOW64 ...

  2. winPcap编程之获取适配器信息(二)

    首先要读一下这一页的东西:http://www.winpcap.org/docs/docs_412/html/group__wpcapsamps.html 可以结合中文版本看http://www.fe ...

  3. 使用URLConnection获取网页信息的基本流程

    参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...

  4. 使用URLConnection获取网页信息的基本流程 分类: H1_ANDROID 2013-10-12 23:51 3646人阅读 评论(0) 收藏

    参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...

  5. .Net Standard(.Net Core)实现获取配置信息

    一.前言 在.Net Framework框架有专门获取webconfig配置的方法供我们使用,但是在.Net Core或者.Net Standard中没有可以直接使用的方法来获取配置文件信息,下面就来 ...

  6. SharePoint 2013 APP 开发示例 (二)获取用户信息

    SharePoint 2013 APP 开发示例 (二)获取用户信息 这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的  SharePo ...

  7. java反射子之获取方法信息(二)

    一.获取方法 1.方法作用. 2. 二.获取方法信息.(修饰符,返回值,方法名称,参数列表,抛出的异常). ############################################## ...

  8. PHP微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo(二)

    一.这个文件微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:判断有没有code,有code去第三步,没有code去第二步 第二步:用户同意授权,获取code 第三步:通过co ...

  9. Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】

    作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...

随机推荐

  1. Mybatis的简介+简单实现增删改查案例

    @ 目录 总结内容 1. 基本概念 2. Mybatis的使用 需求 配置文件简介 总结 总结内容 1. 基本概念 Mybatis是一款优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射.My ...

  2. IE zoom

    zoom是IE浏览器特有的属性,它可以设置或检索对象的缩放比例(它的中文解释是:放大),它的作用通常可以概括为三个方面: 1.hasLayout 2.清除浮动 3.清除div的垂直外边距合并问题 什么 ...

  3. Java报错:Injection of resource dependencies failed

    在学习springMVC+Mabatis的时候,添加注解@Resource报错 Injection of resource dependencies failed de完bug后发现有几个点注意一下, ...

  4. ubuntu连接不到WiFi

    ubuntu连接不到WiFi 在软件与更新中,进入附加驱动. 搜到对应的无线网卡驱动,安装后在重启电脑.

  5. uniapp-h5之canvans上文本的展示

    ctx.font = 'bold 14px arial';ctx.fillStyle = '#e9e6e6';ctx.fillText('长按图片保存到相册', (this.pwidth -250/e ...

  6. JavaScript学习基础2

    ##JavaScript基本对象 1 .function:函数(方法)对象 * 创建: 1.var fun =new Function(形式参数,方法体): 2.function 方法名(参数){ 方 ...

  7. contact 和 footer 的页面制作

    1. html 结构 <section id="contact"> <div class="contact-form bg-primary p-2&qu ...

  8. Apache Doris ODBC Mysql外表在Ubuntu下使用方法及配置

    Apache Doris 社区 2022 年的总体规划,包括待开展或已开展.以及已完成但需要持续优化的功能.文档.社区建设等多方面,我们期待有更多的小伙伴参与进来讨论.同时也希望多多关注Doris,给 ...

  9. WinForm中TextBox文本过长解决

    方案1: 如果界面有足够的空间 可以使用Multiline属性设置多行 方案2:  可以使用文本框的MouseHover事件,触发弹窗,缺点需要按确定 private void txt_Fnote_M ...

  10. ReLabel:自动将ImageNet转化成多标签数据集,更准确地有监督训练 | 2021新文

    人工标注数据集中普遍存在噪声,ReLabel能够自动且低成本地将原本的单标签数据集转化为多标签数据集,并且提出配合random crop使用的高效LabelPooling方法,能够更准确地指导分类网络 ...