首先注册DLL

我这里把此DLL放到我自己的网站上了,供大家下载

https://blog.nwctwang.top/OPCDAAuto.dll

把此dll复制到C:\Windows\SysWOW64目录下

以管理员身份运行CMD

cd C:\Windows\SysWOW64
regsvr32 OPCDAAuto.dll

然后就可以在VS中使用了

由于手头没有现成的OPC服务器和PLC设备,故采用KepServer模拟

下载地址

安装方法就不赘述了,安装完打开是这样

启动完服务器,先到项目里引入刚才的DLL然后再撸代码,直接上成品

其中的treeView控件、textBox控件需要你自己定义。

其余要注意的点已用注释写出

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; public Form1()
{
try
{
InitializeComponent();
OPCServerName = "Kepware.KEPServerEX.V5";
ObjOPCServer = new OPCServer();
ObjOPCServer.Connect(OPCServerName, "127.0.0.1");// 启动一个Connect会顶掉其他线程的Connect,注意
object serverList = ObjOPCServer.GetOPCServers();
OPCBrowser opcBrowser = ObjOPCServer.CreateBrowser();
TreeNode Root = treeView1.Nodes.Add(ObjOPCServer.ServerName);
Root.Tag = ObjOPCServer;
opcBrowser.MoveToRoot();
ShowInTreeView(opcBrowser, Root);
ObjOPCGroups = ObjOPCServer.OPCGroups;
ObjOPCGroup = ObjOPCGroups.Add("Data Type Examples.16 Bit Device.R Registers");// 组名对应的是左边树状第一大项里的小项
ObjOPCGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(ObjOPCGroup_DataChange);
// 第一个参数是设备Tag名(加上group),第二个参数是item ID,是自己定义的,用于ObjOPCGroup_DataChange获取相应ID的item数据
ObjOPCGroup.OPCItems.AddItem("Data Type Examples.16 Bit Device.R Registers.Double1", 1);// Item对应的是组名里的Tag,一定要写全称,否则报错
ObjOPCGroup.OPCItems.AddItem("Data Type Examples.16 Bit Device.R Registers.Float1", 2);
// ObjOPCGroup.UpdateRate = 100; // 刷新速率
ObjOPCGroup.IsActive = true;
ObjOPCGroup.IsSubscribed = true;
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
// 当数据发生变化时,采取的动作
private void ObjOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{ for (int i = 1; i <= NumItems; i++)
{
if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 1))// ID为1的设备数据
{
textBox1.Text = ItemValues.GetValue(i).ToString();
}
if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 2))// ID为2的设备数据
{
textBox2.Text = ItemValues.GetValue(i).ToString();
}
} }
// 树状展示设备节点
private void ShowInTreeView(OPCBrowser brower, TreeNode node)
{
TreeNode childNode = null;
brower.ShowBranches();
int BranchCount = brower.Count;
List<string> lst = null;
if (brower.Count > 0)
//回溯的添加branch
{
lst = new List<string>();
foreach (string t in brower)
lst.Add(t);
foreach (string branch in lst)
{
childNode = new TreeNode(branch);
childNode.Tag = brower.GetItemID(branch);
node.Nodes.Add(childNode);
brower.MoveDown(branch);
ShowInTreeView(brower, childNode);
brower.MoveUp();
}
}
brower.ShowLeafs();
int LeafsCount = brower.Count;
foreach (string leaf in brower)
{
childNode = new TreeNode(brower.GetItemID(leaf));
childNode.Tag = brower.GetItemID(leaf);
node.Nodes.Add(childNode);
}
} // 退出时释放资源
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
ObjOPCServer.Disconnect();
}
}
}

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

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

    具体应用呢,不多说了,上代码,取长补短就是原创 using OPCAutomation; using System; using System.Collections.Generic; using S ...

  2. android 获取IMSI信息(判断是移动,联通,电信手机卡)

    首先我们需要知道手机IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信.那么第一步就是先获取手机IMSI号码:代码如下 /** *获取IMSI信息 * ...

  3. FastDFS 通过文件名获取文件信息

    /** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...

  4. Android获取位置信息的方法总结

    1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...

  5. tp框架获取常量信息、方法、命名空间

    获取系统常量信息: public function ShowInFo() { var_dump(get_defined_constants(true)); //如果参数为true,则分类显示 } 在这 ...

  6. ios获取设备信息总结

    1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name;       //获取设备所有者的名 ...

  7. JS根据经纬度获取地址信息

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 半吊子学习Swift--天气预报程序-获取天气信息

    昨天申请的彩云天气Api开发者今天上午已审核通过  饭后运动过后就马不停蹄的来测试接口,接口是采用经纬度的方式来获取天气信息,接口地址如下 https://api.caiyunapp.com/v2/ ...

  9. js get browser vertion (js获取浏览器信息版本)

    1问题:js get browser vertion (js获取浏览器信息版本) 2解决方案 Copy this script into your JavaScript files. It works ...

随机推荐

  1. 【VUE】 前端面试题小结

    1,对代码重构的理解: 2,http和https协议有什么区别 3,从输入URL到页面加载全过程 4,前端怎么控制管理路由 5,缓存机制(描述一下 cookies,sessionStorage 和 l ...

  2. java继承时能包括静态的变量和方法吗?举例说明!

    子类继承了超类定义的所有实例变量和方法包括静态的变量和方法(马克-to-win见下例),并且为它自己增添了独特的元素.子类只能有一个超类.Java不支持多超类的继承. 子类拥有超类的所有成员,但它不能 ...

  3. PAT B1002写出这个数

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1. 输出格式: 在一行内输出 n 的 ...

  4. ThinkCMF[仿骑呗共享单车官网]

    学习Thinkcmf内容管理系统(Thinkphp3.2.3框架)时候,用来练手的,简单的模仿骑呗官网首页,并对后台管理做了点小修改. 安装: 下载地址:https://pan.baidu.com/s ...

  5. Mysql_事务_存储过程_触发器

    一.什么是事务? 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言( ...

  6. 解决PHP下载大文件失败,并限制下载速度

    1.问题: PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错: 2.原因: 这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出: ...

  7. 安全市场迎来新挑战,FinClip助力车联网数据安全

    随着汽车工业的发展与电子技术的进步,智能汽车迎来了前所未有的蓬勃发展,随着汽车电动化.网联化.智能化交融发展,车辆运行安全.数据安全和网络安全风险交织叠加,安全形势更加复杂严峻......

  8. linux压缩打包、定时任务

    压缩打包 gzip压缩 win中的压缩包:zip rar Linux常见的压缩包有哪些? gzip bzip2 1.gzip压缩 压缩命令:gzip [压缩文件] 解压命令:gzip -d [压缩包] ...

  9. select下拉框获取下拉项值的问题

    新发现: select option如果里面不写value值,默认提交<option></option>中间的值. 切记:真正提交的值写在value属性里面,option之间只 ...

  10. 【Example】C++ STL 常用容器概述

    前排提醒: 由于 Microsoft Docs 全是机翻.所以本文表格是我人脑补翻+审校. 如果有纰漏.模糊及时评论反馈. 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素的容器. 这些 ...