使用 OPC Browser 加载 OPC Server 监测点
1,首先第一步,要连接OPC ,创建好 OPC对象。
/// <summary>
/// 连接OPC
/// </summary>
private string OPCIP=127.0.0.1;
private string OPCName=PCAuto.OPCServer;
public void Connect()
{
if (string.IsNullOrEmpty(OPCIP))
{
throw new ArgumentNullException("UaServer");
}
if (string.IsNullOrEmpty(OPCName))
{
throw new ArgumentNullException("UaServer");
}
if (CreateServer())
{
try
{
opcServer.Connect(OPCName, OPCIP);
}
catch (Exception ex)
{
MessageBox.Show("连接到OPC服务器失败!" + ex.Message);
}
}
m_IsConnected = true;
} /// <summary>
/// 创建OPC服务
/// </summary>
/// <returns></returns>
public bool CreateServer()
{
try
{
opcServer = new OPCServer();
}
catch (Exception ex)
{
MessageBox.Show("创建OPC服务出现异常:" + ex.Message);
return false;
}
return true;
}
2.窗体加载方法,我这里时winform 开发的程序。在窗体load事件加载 opc测点。使用 tree 控件。
/// <summary>
/// 测点扫描加载监测点树
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private TreeView treeView_opcItem;
private void ScanItem_Load(object sender, EventArgs e)
{
try
{
OpcDaClient opcDaClient = new OpcDaClient();
TreeNode node = new TreeNode();
OPCBrowser opcBrowser = opcDaClient.RecurBrowse();
opcDaClient.ShowInTreeView(opcBrowser, node);
treeView_opcItem.Nodes.Add(node);
TreeNodeCollection nodes = treeView_opcItem.Nodes;
GetChildNode(nodes);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
3.用到的子方法
/// <summary>
/// 创建opc节点浏览对象
/// </summary>
/// <returns></returns>
public OPCBrowser RecurBrowse()
{
try
{
return opcServer.CreateBrowser();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
}
/// <summary>
/// 展示OPC点号列表
/// </summary>
/// <param name="opcBrowser"></param>
/// <param name="node"></param>
public void ShowInTreeView(OPCBrowser opcBrowser, TreeNode node)
{
TreeNode treeNode = null;
opcBrowser.ShowBranches();
int count = opcBrowser.Count;
List<string> list = null;
if (opcBrowser.Count > 0)
{
list = new List<string>();
foreach (string item in opcBrowser)
{
list.Add(item);
}
foreach (string item2 in list)
{
treeNode = new TreeNode(item2);
treeNode.Tag = opcBrowser.GetItemID(item2);
node.Nodes.Add(treeNode);
opcBrowser.MoveDown(item2);
ShowInTreeView(opcBrowser, treeNode);
opcBrowser.MoveUp();
}
}
opcBrowser.ShowLeafs(Type.Missing);
int count2 = opcBrowser.Count;
foreach (string item3 in opcBrowser)
{
treeNode = new TreeNode(opcBrowser.GetItemID(item3));
treeNode.Tag = opcBrowser.GetItemID(item3);
node.Nodes.Add(treeNode);
}
}
4.获取当前节点下的子节点
private void GetChildNode(TreeNodeCollection nodes)
{
string empty = string.Empty;
foreach (TreeNode node in nodes)
{
empty = node.Text;
if (node.Nodes.Count == 0)
{
itemNameList.Add(node.Text);
}
GetChildNode(node.Nodes);
}
}
5.效果展示

使用 OPC Browser 加载 OPC Server 监测点的更多相关文章
- 不同网段无法加载ArcGIS Server发布服务解决方法
问题描述: ArcGIS Server 10发布的服务, (1)在相同网段的Desktop9.3和Engine 9.3程序下可以正常显示, (2)在不同网段Desktop9.3和Engine 9.3程 ...
- Cesium如何通过addImageryProvider方法加载SkylineGlobe Server发布的WMS服务
某某某单位用SkylineGlobeServer7版本发布了好些服务,然后让我们在Cesium里都加载进来展示. 其实只要符合OGC标准的,加进来还是很容易的. 示例代码如下: function te ...
- Electron Browser加载iframe(webview src属性)
browser或者webcontents 的高度与宽度比例对webview中src的页面结构也是有一定影响的
- ArcEngine中加载ArcGIS Server地图服务
代码如下: private void addMapServerLayer(object sender, EventArgs e) { IActiveView pActiveV ...
- 天地图API加载ArcGIS Server服务
发布的服务需要选择WMS功能 wmsLayer = new T.TileLayer.WMS("http://127.0.0.1:6080/arcgis/services/Demo/Defau ...
- Tomcat源码分析——SERVER.XML文件的加载与解析
前言 作为Java程序员,对于Tomcat的server.xml想必都不陌生.本文基于Tomcat7.0的Java源码,对server.xml文件是如何加载和解析的进行分析. 加载 server.xm ...
- 加载MySQL、Oracle、SQL Server 2000、SQL Server 2005及以上版本 的加载数据库驱动程序
2018-11-04 20:00:59 开始 //getConnection(String url, String user, String password) //url:连接数据库的URL 3 ...
- 老调重弹:JDBC系列之<驱动加载原理全面解析) ----转
最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来,好好总结一番,作为自己的笔记,也是给读者 ...
- esri-leaflet入门教程(5)- 动态要素加载
esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...
随机推荐
- PAT A1107——并查集
Social Clusters When register on a social network, you are always asked to specify your hobbies in ...
- C#疑问
在Microsoft.NET里面int=Int32Int64=long但是在其他.NET环境下面可能不是这样的.C#是一门计算机编程语言,是经过标准化,也就是说其他的人也可以根据它的语法去实现它的编译 ...
- [bzoj2756]奇怪的游戏
对棋盘黑白染色后,若n和m都是奇数(即白色和黑色点数不同),可以直接算得答案(根据白-黑不变):若n和m不都是奇数,二分答案(二分的上限要大一点,开$2^50$),最后都要用用网络流来判定.考虑判定, ...
- electron另一种运行方式
编写helloword 全局安装软件 npm install -g electron 快速编写html html:5 完整代码和流程: 1.index.html <!DOCTYPE htm ...
- Plugin [id: 'org.jetbrains.kotlin.jvm'] was not found in any of the following sources: gradle配置:kotlin("jvm")后报错
本来打算兼容java和kotlin,可配置后,项目报错.查看之前项目 再打开当前报错项目: 很明显,报错的原因是jvm的运行文件没有加载进来,多次尝试无果... 只能重新搭建初始化项目了.
- 使用 CSS 轻松实现一些高频出现的奇形怪状按钮
背景 在群里会有同学问相关的问题,怎么样使用 CSS 实现一个内切角按钮呢.怎么样实现一个带箭头的按钮呢? 本文基于一些高频出现在设计稿中的,使用 CSS 实现稍微有点难度和技巧性的按钮,讲解使用 C ...
- 洛谷 P7323 - [WC2021] 括号路径(启发式合并)
题面传送门 emmmm----怎么评价这个题嘛...感觉纯论算法,此题根本谈不上难题,不过 WC 时候太智障只拿了个 48pts 就走人了.总之,技不如人,甘拜吓疯( 首先要注意到几件事情: 如果 \ ...
- Codeforces 1290F - Making Shapes(数位 dp)
Codeforces 题面传送门 & 洛谷题面传送门 数位 dp 好题. 首先,由于是凸包,一但向量集合确定,凸包的形态肯定就已经确定了.考虑什么样的向量集合能够组成符合条件的凸包,我们假设第 ...
- GO 语言使用copy 拷贝切片的问题
使用copy,直接改变原片的值,而不是先创建一个副本.
- Mysql的delimiter
告诉MySQL解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令. 有时 ...