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

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. 软件构造实验-JFinal

    导入JFinal的demo 可以增删改查 根据demo以及自己的理解,使用JFinal实现学生信息管理系统.

  2. java实现MD5文件加密

    package me.zhengjie.modules.logdump.util; import java.io.FileInputStream; import java.io.IOException ...

  3. Golang 泛型的简单使用

    go 学习泛型,利用泛型编写对数据集合执行操作的方法.

  4. javascript中的Ajax基础(一)

    一.手写一个ajax 1 const xhr = new xmlHttpRequest() 2 3 xhr.open(请求方式:post get, 请求地址, 同步或者异步) 4 5 xhr.onre ...

  5. 不care工具,在大数据平台中Hive能自动处理SQL

    摘要:有没有更简单的办法,可以直接将SQL运行在大数据平台? 本文分享自华为云社区<Hive执行原理>,作者: JavaEdge . MapReduce简化了大数据编程的难度,使得大数据计 ...

  6. 【虚拟机】VMware-open-vm-tools安装

    open-vm-tools(VMware-tools的进化版) VMware Tool 和 open-vm-tools任选一样安装即可 在终端进入超级用户 换源下载,依次输入下面命令 sudo cp ...

  7. 05. 树莓派初始配置——开启VNC远程桌面

    开启VNC远程桌面 不插显示器就可以看到树莓派系统界面的方式. 1. 如果你下的系统镜像有包含一些基本软件(Raspberry Pi OS with desktop and recommended s ...

  8. Redis6通信协议升级至RESP3,一口气看完13种新数据类型

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在前面的文章 Redis:我是如何与客户端进行通信的 中,我们介绍过RESP V2版本协议的规范,RESP的全程是Redis Serializa ...

  9. React ant table 用 XLSX 导出excel文件

    近期做了一个react ant design 的table转换成excel 的功能 总结下 首先我们会自己定义下 antdesign 的table的columns其中有可能有多语言或者是render方 ...

  10. 二叉查找树速通攻略 图文代码精心编写(Java实现)

    说在前面 如题目所言 这篇文章为了给下一篇二叉查找数做铺垫和前期知识准备,以便大家有良好的阅读体验,本来想合在一起的,但觉得有些长,所以就拆开了哈哈哈,还是新手向,两篇文章有些长,但如果能认真看下去, ...