【实例简介】

【实例截图】

【核心代码】

///摘要

///程式使用C#.NET 2005 编写

///引用类库OPCDAAuto.dll

///OPCServer采用KEPWare

///在windows xp sp2、sp3、windows 2003上测试通过

///完成于:2008年12月31日

///测试于:2009年01月05日

///

///作者:潇洒草

///Email:zhkai868@163.com

///QQ:44649029

///

///如分发,请保留此摘要。

///鄙视那些拿代码当宝贝的人,鄙视那些拿源码换源码的人,鄙视那些自私的人。

///别人看到你的代码,你能死啊?对你有多大威胁啊?强烈鄙视~~~

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Net;

using System.Collections;

using OPCAutomation;

namespace OPC测试通过

{

public partial class MainFrom : Form

{

public MainFrom()

{

InitializeComponent();

}

#region 私有变量

///

/// OPCServer Object

///

OPCServer KepServer;

///

/// OPCGroups Object

///

OPCGroups KepGroups;

///

/// OPCGroup Object

///

OPCGroup KepGroup;

///

/// OPCItems Object

///

OPCItems KepItems;

///

/// OPCItem Object

///

OPCItem KepItem;

///

/// 主机IP

///

string strHostIP = "";

///

/// 主机名称

///

string strHostName = "";

///

/// 连接状态

///

bool opc_connected = false;

///

/// 客户端句柄

///

int itmHandleClient = 0;

///

/// 服务端句柄

///

int itmHandleServer = 0;

#endregion

#region 方法

///

/// 枚举本地OPC服务器

///

private void GetLocalServer()

{

//获取本地计算机IP,计算机名称

IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);

if (IPHost.AddressList.Length > 0)

{

strHostIP = IPHost.AddressList[0].ToString();

}

else

{

return;

}

//通过IP来获取计算机名称,可用在局域网内

IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);

strHostName=ipHostEntry.HostName.ToString();

//获取本地计算机上的OPCServerName

try

{

KepServer = new OPCServer();

object serverList = KepServer.GetOPCServers(strHostName);

foreach (string turn in (Array)serverList)

{

cmbServerName.Items.Add(turn);

}

cmbServerName.SelectedIndex = 0;

btnConnServer.Enabled = true;

}

catch(Exception err)

{

MessageBox.Show("枚举本地OPC服务器出错:" err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);

}

}

///

/// 创建组

///

private bool CreateGroup()

{

try

{

KepGroups = KepServer.OPCGroups;

KepGroup = KepGroups.Add("OPCDOTNETGROUP");

SetGroupProperty();

KepGroup.DataChange = new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);

KepGroup.AsyncWriteComplete = new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete);

KepItems = KepGroup.OPCItems;

}

catch (Exception err)

{

MessageBox.Show("创建组出现错误:" err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);

return false;

}

return true;

}

///

/// 设置组属性

///

private void SetGroupProperty()

{

KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text);

KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text);

KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);

KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text);

KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);

}

///

/// 列出OPC服务器中所有节点

///

///

private void RecurBrowse(OPCBrowser oPCBrowser)

{

//展开分支

oPCBrowser.ShowBranches();

//展开叶子

oPCBrowser.ShowLeafs(true);

foreach (object turn in oPCBrowser)

{

listBox1.Items.Add(turn.ToString());

}

}

///

/// 获取服务器信息,并显示在窗体状态栏上

///

private void GetServerInfo()

{

tsslServerStartTime.Text ="开始时间:" KepServer.StartTime.ToString() " ";

tsslversion.Text ="版本:" KepServer.MajorVersion.ToString() "." KepServer.MinorVersion.ToString() "." KepServer.BuildNumber.ToString();

}

///

/// 连接OPC服务器

///

/// OPCServerIP

/// OPCServer名称

private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName)

{

try

{

KepServer.Connect(remoteServerName, remoteServerIP);

if (KepServer.ServerState == (int)OPCServerState.OPCRunning)

{

tsslServerState.Text = "已连接到-" KepServer.ServerName " ";

}

else

{

//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档

tsslServerState.Text = "状态:" KepServer.ServerState.ToString() " ";

}

}

catch (Exception err)

{

MessageBox.Show("连接远程服务器出现错误:" err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

return false;

}

return true;

}

#endregion

#region 事件

///

/// 写入TAG值时执行的事件

///

///

///

///

///

void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)

{

lblState.Text = "";

for (int i = 1; i <= NumItems; i )

{

lblState.Text = "Tran:" TransactionID.ToString() " CH:" ClientHandles.GetValue(i).ToString() " Error:" Errors.GetValue(i).ToString();

}

}

///

/// 每当项数据有变化时执行的事件

///

/// 处理ID

/// 项个数

/// 项客户端句柄

/// TAG值

/// 品质

/// 时间戳

void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)

{

//为了测试,所以加了控制台的输出,来查看事物ID号

//Console.WriteLine("********" TransactionID.ToString() "*********");

for (int i = 1; i <= NumItems; i )

{

this.txtTagValue.Text = ItemValues.GetValue(i).ToString();

this.txtQualities.Text = Qualities.GetValue(i).ToString();

this.txtTimeStamps.Text = TimeStamps.GetValue(i).ToString();

}

}

///

/// 选择列表项时处理的事情

///

///

///

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

try

{

if (itmHandleClient != 0)

{

this.txtTagValue.Text = "";

this.txtQualities.Text ="";

this.txtTimeStamps.Text = "";

Array Errors;

OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);

//注:OPC中以1为数组的基数

int[] temp = new int[2] { 0, bItem.ServerHandle };

Array serverHandle = (Array)temp;

//移除上一次选择的项

KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);

}

itmHandleClient = 1234;

KepItem = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient);

itmHandleServer = KepItem.ServerHandle;

}

catch(Exception err)

{

//没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。

itmHandleClient = 0;

txtTagValue.Text = "Error ox";

txtQualities.Text = "Error ox";

txtTimeStamps.Text = "Error ox";

MessageBox.Show("此项为系统保留项:" err.Message,"提示信息");

}

}

///

/// 载入窗体时处理的事情

///

private void MainFrom_Load(object sender, EventArgs e)

{

GetLocalServer();

}

///

/// 关闭窗体时处理的事情

///

private void MainFrom_FormClosing(object sender, FormClosingEventArgs e)

{

if (!opc_connected)

{

return;

}

if (KepGroup != null)

{

KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);

}

if (KepServer != null)

{

KepServer.Disconnect();

KepServer = null;

}

opc_connected = false;

}

///

/// 【按钮】设置

///

private void btnSetGroupPro_Click(object sender, EventArgs e)

{

SetGroupProperty();

}

///

/// 【按钮】连接OPC服务器

///

private void btnConnLocalServer_Click(object sender, EventArgs e)

{

try

{

if (!ConnectRemoteServer(txtRemoteServerIP.Text,cmbServerName.Text))

{

return;

}

btnSetGroupPro.Enabled = true;

opc_connected = true;

GetServerInfo();

RecurBrowse(KepServer.CreateBrowser());

if (!CreateGroup())

{

return;

}

}

catch (Exception err)

{

MessageBox.Show("初始化出错:" err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}

///

/// 【按钮】写入

///

private void btnWrite_Click(object sender, EventArgs e)

{

OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);

int[] temp = new int[2] { 0, bItem.ServerHandle };

Array serverHandles=(Array)temp;

object[] valueTemp = new object[2] {"",txtWriteTagValue.Text };

Array values=(Array)valueTemp;

Array Errors;

int cancelID;

KepGroup.AsyncWrite(1,ref serverHandles,ref values,out Errors, 2009,out cancelID);

//KepItem.Write(txtWriteTagValue.Text);//这句也可以写入,但并不触发写入事件

GC.Collect();

}

#endregion

}

}

php opc数据,OPC连接获取数据相关推荐

  1. ajax请求数据 ztree_ajax 异步获取数据填充到表格显示(ajax) 文档(Options API) DataTables中文网...

    描述(Description) 使用这个参数可以让 DataTables 像使用jQuery ajax 一样从一个数据源获取数据,最终获取到返回的数据 来显示表格,DataTables 支持 Java ...

  2. element excel导入数据,解析获取数据

    前端导入excel表格,解析为json格式数据 npm install xlsx -g 全局安装xlsx 新建一个组件,随意命名,键入以下代码,复制即可用 <template><sp ...

  3. ajax读取数据失败,ajax 获取数据失败

    1.想获取后台数据,但是前台调用不到,自己写了一个简单测试还是获取不到数据,直接提示数据加载失败 $(document).ready(function(e) { $("#submit&quo ...

  4. python如何获取传感器数据_连接获取传感器数据的几大方法

    传感器的数量在整个地球表面和人们生活周遭空间激增,提供世界各种数据讯息.这些价格亲民的传感器是物联网(IoT)发展和我们的社会正面临数字化革命,背后的驱动力. 然而,连接和获取来自传感器的数据并不总是 ...

  5. MQTT数据处理之从tcp连接获取数据过程

  6. vuex异步获取数据_vuex 异步获取数据,却无法渲染页面

    报错信息为 无法获取到program.teacher 返回undefined 但是奇怪的是 program.title 都能获取到..唯独获取不到多层的.. 模拟的数据 { "program ...

  7. windox连接电子秤通过COM口获取数据(java)

    文档说明:该文档局限性太大(后端java连接COM端口获取数据),前端连接COM端口获取数据能连接获取不到,如果有大佬会前端获取的可以评论一下. 1.所需物品:java项目(JDK1.8),可以连接串 ...

  8. zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据

    文章目录 1. zookeeper原生客户端 2. Curator客户端 1. zookeeper原生客户端 zookeeper原生客户端就是zookeeper官方自带的客户端,作为代码与zk服务器交 ...

  9. 利用串口网络助手上传数据、图片到OneNet平台以及获取数据(HTTP)

    利用串口网络助手上传数据.图片到OneNet平台以及获取数据(HTTP) 使用网络助手连接OneNet服务器 HTTP上传数据至OneNet 获取数据 上传图片至OneNet 使用网络助手连接OneN ...

  10. java调用别人的接口获取数据存到mysql数据库

    1.根据接口返回的字段创建数据库表 2.创建对应这个表的controller,service,mapper,pojo 3.在controller层调用Impl实现类.具体业务:接收数据并保存在数据库, ...

最新文章

  1. redis 哨兵_docker里创建redis哨兵
  2. 网页视频播放php拉伸代码,网页在线视频播放代码大全
  3. rails3系统架构
  4. 第十一章:【UCHome二次开发】功能修改
  5. 文献阅读课13-DSGAN: Generative Adversarial Training for (远程监督关系抽取,句子级去噪)
  6. JavaBean和Servlet
  7. 11g DG中的参数
  8. 三菱mode bus tcp通讯_绍兴三菱MR-J4-70B
  9. 数据库接口实验--php实现--
  10. Rost CM使用手册
  11. c语言的常用英语单词和翻译,c语言通用英语词汇带翻译
  12. html弹框整体缩放,网页弹出对话框无法放大
  13. USB(十)2022-03-03
  14. python requests post 二进制流_Python的requests如何同时post图片二进制流和json数据application/octet-stream...
  15. 微分积分电路及其波形转换
  16. win10 任务栏无法使用鼠标一直转圈圈解决方式
  17. Docker部署Flask网站
  18. 网络变压器的介绍分类及工作原理
  19. 棋牌娱乐盛宴推动全民游戏健康发展
  20. 2022,视频号的十大机会

热门文章

  1. NoSQL--Redis
  2. ipad如何与计算机连接网络连接不上,苹果平板ipad的无法连接无线网络WiFi如何解决...
  3. 渗透测试实验_安装Windows7旗舰版
  4. 解决笔记本HDMI外接显示器没声音的问题
  5. 4816 江哥的dp题b
  6. 虚拟地址与虚拟内存的理解
  7. Rhino6.5软件安装教程|兼容WIN10
  8. 《富爸爸穷爸爸》--读书笔记(5)-2020
  9. 陶哲轩实分析 3.4
  10. skyWalking相关