首先注册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. SQL语句总结---数据库操作

    https://blog.csdn.net/hallomrzhang/article/details/85010014 数据库操作 查看所有数据库 show databases; 1 查看当前使用的数 ...

  2. 微信小程序列表拖动排序Demo

    wxml页面编写 <view class="container"> <view bindtap="box" class="box&q ...

  3. 一篇文章带你整明白HTTP缓存知识

    最近看了很多关于缓存的文章, 每次看完,看似明白但是实际还是没明白,这次总算搞明白协商缓存是怎么回事了 首先,服务器缓存分强制缓存和协商缓存(也叫对比缓存) 强制缓存一般是服务端在请求头携带字段Exp ...

  4. MFC---典型类和函数

    在MFC中,典型的类有CString.CRect.CDialog等,这些类的使用方法是通用的,下文以CString类的使用为例做一个详细说明.类的使用主要还是使用类的方法,可以查看类的定义,查看这个类 ...

  5. XStream使用记录

    XStream使用记录 官网 http://x-stream.github.io/index.html 下载地址 http://x-stream.github.io/download.html 参考资 ...

  6. java_类的访问控制符

    1.分类: public protected default private是java中的访问控制修饰符. public String name; protected String name; Str ...

  7. instanceof 和类型转换

    instanceof 和类型转换 instanceof 判断a 和 B 类型是否相似 公式 System.out.println(a instanceof B); //true / false 编译是 ...

  8. 安卓记账本开发学习day2

    今天遇到了xml文件报错,Wrong orientation? No orientation specified, and the default is horizontal, yet this la ...

  9. 微信小程序循环列表点击每一个单独添加动画

    首先,咱们看一下微信小程序动画怎么实现,我首先想到的是anime.js,但是引入之后用不了,微信小程序内的css也无法做到循环的动态,我就去找官方文档看看有没有相应的方法,哎,还真有 点击这里查看 微 ...

  10. React + TypeScript + Taro前端开发小结

    前言 项目到一段落,先来记录一下,本文以前端新手的角度记录React.TypeScript.Taro相关技术的开发体验以及遇到的问题和解决方法. 之前总说要学React(这篇博客:代码使我头疼之Rea ...