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

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. pydev+eclipse写python代码

    首先,下载pydev:PyDev for Eclipse - Browse /pydev at SourceForge.net (建议下载到本地,之前看其他文章时,进行了如下安装: 启动 Eclips ...

  2. java中checked异常和unchecked异常区别?

    马克-to-win:checked和unchecked异常区别:结论就是:1)RuntimeException和他的子类都是unchecked异 常.其他的都是checked异常.马克-to-win: ...

  3. 安装并使用Junit

    在Eclipse中配置Junit的方法有两种方式: 第一种方法: 1.下载junit的jar包,目前它的版本是junit3.8.1,可以从www.junit.org上下载. 2.在要使用Junit的p ...

  4. caioj 1000: [视频]整数运算[水题]

    题目大意:输入两个整数a和b,输出他们的和. 题解:水题不用题解,简单看一下就知道了-- 代码: #include <cstdio> int a, b; int main() { whil ...

  5. MyBatis起步搭建

    1 步骤 数据库环境 创建Maven项目 导入依赖 编写MyBatis配置文件 编写MyBatis工具类 编写实体类 编写Mapper 测试 2 数据库环境 MySQL 8.0版本 create da ...

  6. redis 指定db库导入导出数据

    最近根据之前的项目重新改编一个新的项目,发现上一个项目的搭建者,把一些区域权限和划分放在redis上存储,因此不得不照搬过来,所以搜索一下相关如何做的 发现一个比较简单的做法,记录一下操作过程,方便以 ...

  7. java连接mysql8.0.28数据库实例

    首先说明,由于是8版本的数据库,所以配置类的写法上与5版本的有所区别,需要注意,同时用idea或eclipse时需要导入jar包,jar包的下载链接: https://dev.mysql.com/ge ...

  8. uTools .SRT 转 .VTT 格式转换自动化小工具

    不想用网上的转换工具,要有网,先上传,再下载,可能还要看广告.有些工具也不是很方便.打算配合uTools的自动化助手插件搞一个一键格式转换.

  9. NodeJs学习日报day7——简单中间件

    const express = require('express') const app = express() const mw = function(req, resp, next) { cons ...

  10. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...