C#获取PLC信息 (KepServer)二
具体应用呢,不多说了,上代码,取长补短就是原创
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)二的更多相关文章
- C#获取PLC信息 (KepServer)
首先注册DLL 我这里把此DLL放到我自己的网站上了,供大家下载 https://blog.nwctwang.top/OPCDAAuto.dll 把此dll复制到C:\Windows\SysWOW64 ...
- winPcap编程之获取适配器信息(二)
首先要读一下这一页的东西:http://www.winpcap.org/docs/docs_412/html/group__wpcapsamps.html 可以结合中文版本看http://www.fe ...
- 使用URLConnection获取网页信息的基本流程
参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...
- 使用URLConnection获取网页信息的基本流程 分类: H1_ANDROID 2013-10-12 23:51 3646人阅读 评论(0) 收藏
参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...
- .Net Standard(.Net Core)实现获取配置信息
一.前言 在.Net Framework框架有专门获取webconfig配置的方法供我们使用,但是在.Net Core或者.Net Standard中没有可以直接使用的方法来获取配置文件信息,下面就来 ...
- SharePoint 2013 APP 开发示例 (二)获取用户信息
SharePoint 2013 APP 开发示例 (二)获取用户信息 这个示例里,我们将演示如何获取用户信息: 1. 打开 Visual Studio 2012. 2. 创建一个新的 SharePo ...
- java反射子之获取方法信息(二)
一.获取方法 1.方法作用. 2. 二.获取方法信息.(修饰符,返回值,方法名称,参数列表,抛出的异常). ############################################## ...
- PHP微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo(二)
一.这个文件微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:判断有没有code,有code去第三步,没有code去第二步 第二步:用户同意授权,获取code 第三步:通过co ...
- Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】
作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...
随机推荐
- Mybatis 实现批量插入和批量删除源码实例
Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...
- ES 架构及基础 - 1
Elasticsearch 是一款分布式,RESTful 风格的搜索和数据分析引擎,可以从海量的数据中高效的找到相关信息.如 wiki 用 ES 进行全文检索及其高亮,Github 用其检索代码,电商 ...
- 《头号玩家》AI电影调研报告(三)
[AR市场正在迅猛增长] 据<工业增强现实现状2017>报告中所述,AR不再只是值得期待的新兴技术.2018年,投资此类技术已成为很多组织机构的关键战略,尤其是对于涉及复杂的制造和运营流程 ...
- 【dp/贪心】CF 780 (Div. 3), problem: (C) Get an Even String
Problem - C - Codeforces 难度: 1300 input 6 aabbdabdccc zyx aaababbb aabbcc oaoaaaoo bmefbmuyw output ...
- Mysql、Oracle锁表处理
MySql解锁方式 1 # 1. 查看当前数据库锁表的情况 2 SELECT * FROM information_schema.INNODB_TRX; 3 # 2. 杀掉查询结果中锁表的trx_my ...
- vscode 开发项目, Prettier ESLint的配置全攻略(基础篇)
我们在做项目尤其是多人合作开发的时候经常会因为不同的开发规范和代码风格导致出现冲突, 为了能统一代码风格和规范我们需要使用到prettier和eslint,接下来就一vscode编辑器为例详细讲解下: ...
- 攻防世界-MISC:give_you_flag
这是攻防世界新手练习区的第四题,题目如下: 点击附件一下载,打开后发现是一个gif动图 可以看到动图有一瞬间出现了一个二维码,找一个网站给他分离一下 得到一张不完整的二维码(然后就不知道该怎么办了,菜 ...
- XCTF练习题---CRYPTO---safer-than-rot13
XCTF练习题---CRYPTO---safer-than-rot13 flag:no_this_is_not_crypto_my_dear 解题步骤: 1.观察题目,下载附件 2.打开后发现是个文件 ...
- [AcWing 53] 最小的 k 个数
堆排序 点击查看代码 class Solution { public: vector<int> getLeastNumbers_Solution(vector<int> inp ...
- Tensorflow 窗口时间序列数据的处理
Tensorflow 时间序列数据的处理 数据集简介 数据来源:Kaggle Ubiquant Market Prediction 数据集描述了多个投资项目在一个时间序列下的300个匿名特征(&quo ...