C#获取PLC信息 (KepServer)
首先注册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)的更多相关文章
- C#获取PLC信息 (KepServer)二
具体应用呢,不多说了,上代码,取长补短就是原创 using OPCAutomation; using System; using System.Collections.Generic; using S ...
- android 获取IMSI信息(判断是移动,联通,电信手机卡)
首先我们需要知道手机IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信.那么第一步就是先获取手机IMSI号码:代码如下 /** *获取IMSI信息 * ...
- FastDFS 通过文件名获取文件信息
/** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...
- Android获取位置信息的方法总结
1.位置服务的简介:位置服务,英文翻译为Location-Based Services,缩写为LBS,又称为定位服务或基于位置的服务,融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综 ...
- tp框架获取常量信息、方法、命名空间
获取系统常量信息: public function ShowInFo() { var_dump(get_defined_constants(true)); //如果参数为true,则分类显示 } 在这 ...
- ios获取设备信息总结
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名 ...
- JS根据经纬度获取地址信息
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 半吊子学习Swift--天气预报程序-获取天气信息
昨天申请的彩云天气Api开发者今天上午已审核通过  饭后运动过后就马不停蹄的来测试接口,接口是采用经纬度的方式来获取天气信息,接口地址如下 https://api.caiyunapp.com/v2/ ...
- js get browser vertion (js获取浏览器信息版本)
1问题:js get browser vertion (js获取浏览器信息版本) 2解决方案 Copy this script into your JavaScript files. It works ...
随机推荐
- Canvas 制作海报
HTML <template> <view class="content"> <view class="flex_row_c_c mod ...
- Spring Security的使用
spring security使用目的:验证,授权,攻击防护. 原理:创建大量的filter和interceptor来进行请求的验证和拦截,以此来达到安全的效果. Spring Security主要包 ...
- 人机交互BS
B/S结构用户界面设计 [实验编号] 10003809548j Web界面设计 [实验学时] 8学时 [实验环境] l 所需硬件环境为微机: l 所需软件环境为dreamweaver ...
- 浅谈一下流式处理平台Flink
浅谈一下流式处理平台(Flink) 大数据框架听过很多,比如 Hadoop,HDFS...不过自己的项目都没有上过 为什么突然提到 Flink,因为最近一个项目需要用到,所以学习最好的方式就是项目驱动 ...
- java四种访问修饰符及各自的权限
1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...
- JetBrains Rider C# 学习①
Rider 发现 Alt+F7 键无效: 把GeForce Experience里的游戏覆盖关闭 前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5D ...
- IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退
大家在Debug程序的时候,是否遇到过因为"下一步"按太快,而导致跳过了想要深入分析的那段代码?是不是很想要有"回到上一步"这样的操作呢? 在IDEA中就提供了 ...
- 查找SQL SERVER卡顿语句
SELECT [session_id], [blocking_session_id] AS '正在阻塞其他会话的会话ID', DB_NAME([database_id]) AS '数据库名称', [r ...
- GeoServer style中文乱码解决方法
在说明这个问题之前,有三点需要明确: 一是创建New style时,网页中文本框内的内容才是最终会应用到GeoServer的sld内容,这与本地sld文件没有关系. 二是xml的encoding定义的 ...
- python @符号用法的简单理解
一.用作函数修饰符 作用是为现有函数增加额外的功能,常用于插入日志.性能测试.事务处理等等 创建函数修饰符的规则:(1)修饰符是一个函数(2)修饰符取被修饰函数为参数(3)修饰符返回值取代被修饰函数 ...