版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流(C#)OPC客户端源码.精品文档.【转】(C#)OPC客户端源码 转载申明 申明:本文为转载,如需转载本文,请获取原文作者大尾巴狼啊的同意,谢谢合作!转自:大尾巴狼啊原文出处:前几天我就发布过这篇文章,可惜的是,发布后代码有的却看不到,后来我就删了,至今不明白什么原因- -!关于C+、VB来开发OPC客户端的资料网上有很多,但C#的至今没发现有多少。由于近期项目的需要,就开发了OPC客户端的一个模块。在我想来,程序员挺累的,原因我很累。所以我想大家也很累嘿嘿。特别是刚接手OPC客户端开发的前几天,天天盯住显示器,百度、GOOGLE不停的搜索
2、。每天早上醒来,眼睛都瑟瑟的。从事3年以上软件开发的朋友们,估计都会腰酸背痛吧!反正我是这样的。不说那么多废话了,贴上源码,让需要的同行看看吧,代码的质量并不高,就当做抛砖引玉吧!1、枚举本地服务器2、获取服务器信息3、列出了服务器上Tag4、可以设置组的属性5、读写功能6、可进行远程连接(DCOM需配置)先看图:引用类库:OPC服务器:开发工具:当前环境:源码:Code/摘要/程式使用C#.NET 2005 编写/引用类库OPCDAAuto.dll/OPCServer采用KEPWare/在windows xp sp2、sp3、windows
3、2003上测试通过/完成于:2008年12月31日/测试于:2009年01月05日/作者:潇洒草/Email:zhkai868/QQ:44649029/ /如分发,请保留此摘要。/鄙视那些拿代码当宝贝的人,鄙视那些你不拿源码换就不稀罕你的人,鄙视那些自私的人。/别人看到你的代码,你能死啊?对你有多大威胁啊?强烈鄙视/如果你是这样的人,赶紧关了。偶不欢迎。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using
4、 System.Drawing;using System.Text;using System.Windows.Forms;using System.Net;using System.Collections;using OPCAutomation;namespace OPC测试通过 public partial class MainFrom : Form
5、0; public MainFrom() InitializeComponent(); #region&
6、#160;私有变量 / <summary> / OPCServer Object / </summary> OPCServer KepServer;&
7、#160; / <summary> / OPCGroups Object / </summary> OPCGroups KepGroups;
8、; / <summary> / OPCGroup Object / </summary> OPCGroup KepGroup;
9、 / <summary> / OPCItems Object / </summary> OPCItems KepItems; &
10、#160; / <summary> / OPCItem Object / </summary> OPCItem KepItem; /
11、0;<summary> / 主机IP / </summary> string strHostIP = "" / <
12、summary> / 主机名称 / </summary> string strHostName = "" / <summ
13、ary> / 连接状态 / </summary> bool opc_connected = false; / <summary>
14、60; / 客户端句柄 / </summary> int itmHandleClient = 0; / <summary>
15、60; / 服务端句柄 / </summary> int itmHandleServer = 0; #endregion
16、60; #region 方法 / <summary> / 枚举本地OPC服务器 / </summary> private void
17、;GetLocalServer() /获取本地计算机IP,计算机名称 IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);
18、160; if (IPHost.AddressList.Length > 0) strHostIP&
19、#160;= IPHost.AddressList0.ToString(); else &
20、#160; return; /通过IP来获取计算机名称,可用在局域网内
21、60;IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP); strHostName=ipHostEntry.HostName.ToString(); /获取本地计算机上的OPCServerName &
22、#160; try KepServer = new OPCServer();
23、60; object serverList = KepServer.GetOPCServers(strHostName); foreach (string turn in (Array)serverList)&
24、#160; cmbServerName.Items.Add(turn); &
25、#160; cmbServerName.SelectedIndex = 0; btnConnServer.Enabled
26、0;= true; catch(Exception err)
27、60; MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning); &
28、#160; / <summary> / 创建组 / </summary> private bool CreateGroup()
29、 try KepGroups = KepServer.OPCGrou
30、ps; KepGroup = KepGroups.Add("OPCDOTNETGROUP"); SetGroupProperty();
31、; KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); KepGroup.AsyncWriteComplete
32、160;+= new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete); KepItems = KepGroup.OPCItems;
33、160; catch (Exception err) MessageBox.Show("创建组
34、出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning); return false;
35、0; return true; / <summary> / 设置组属性 / </s
36、ummary> private void SetGroupProperty() KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive
37、.Text); KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text); KepGroup.UpdateRate = Convert.ToInt32(txtUpdate
38、Rate.Text); KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text); KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);
39、; / <summary> / 列出OPC服务器中所有节点 / </summary> /
40、;<param name="oPCBrowser"></param> private void RecurBrowse(OPCBrowser oPCBrowser) /展开分支
41、0; oPCBrowser.ShowBranches(); /展开叶子 oPCBrowser.ShowLeafs(true);
42、 foreach (object turn in oPCBrowser) listBox1.Items.Add(turn.ToString();
43、 / <summary> / 获取服务器信息,并显示在窗体状态栏上 &
44、#160; / </summary> private void GetServerInfo() tsslServerStartTime.Text ="开始时间:"+ KepSe
45、rver.StartTime.ToString()+" " tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToString()+"."+K
46、epServer.BuildNumber.ToString(); / <summary> / 连接OPC服务器 / </summary>
47、0; / <param name="remoteServerIP">OPCServerIP</param> / <param name="remoteServerName">OPCServer名称</param> privat
48、e bool ConnectRemoteServer(string remoteServerIP, string remoteServerName) try
49、 KepServer.Connect(remoteServerName, remoteServerIP); if (KepServer.ServerState = (int)OPCServer
50、State.OPCRunning) tsslServerState.Text = "已连接到-" + KepS
51、erver.ServerName + " " else
52、60; /这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
53、0; tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + " "
54、 catch (Exception err)
55、;MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false;
56、0; return true; #endregion #region 事件
57、0; / <summary> / 写入TAG值时执行的事件 / </summary> / <param name="TransactionID"&g
58、t;</param> / <param name="NumItems"></param> / <param name="ClientHandles"></param> /
59、0;<param name="Errors"></param> void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
60、 lblState.Text = "" for (int i = 1; i <= NumItems; i+)
61、; lblState.Text += "Tran:" + TransactionID.ToString() + " CH:" + ClientHandles.GetValu
62、e(i).ToString() + " Error:" + Errors.GetValue(i).ToString(); / <summary>
63、60; / 每当项数据有变化时执行的事件 / </summary> / <param name="TransactionID">处理ID</param>
64、; / <param name="NumItems">项个数</param> / <param name="ClientHandles">项客户端句柄</param> / <param name="ItemValues">
65、TAG值</param> / <param name="Qualities">品质</param> / <param name="TimeStamps">时间戳</param>
66、void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) &
67、#160; /为了测试,所以加了控制台的输出,来查看事物ID号 /Console.WriteLine("*"+TransactionID.ToString()+"*"); for (i
68、nt i = 1; i <= NumItems; i+) this.txtTagValue.Text = ItemValues.GetValue(i).ToString(
69、); this.txtQualities.Text = Qualities.GetValue(i).ToString(); this.txtTimeStamps.Text = Ti
70、meStamps.GetValue(i).ToString(); / <summary> / 选择列表项时处理的事情
71、 / </summary> / <param name="sender"></param> / <param name="e"></param>
72、 private void listBox1_SelectedIndexChanged(object sender, EventArgs e) try
73、0; if (itmHandleClient != 0)
74、 this.txtTagValue.Text = "" this.txtQualities.Text =""
75、60; this.txtTimeStamps.Text = "" Array Errors;
76、60; OPCItem bItem = KepItems.GetOPCItem(itmHandleServer); /注:OPC中以1为数组的
77、基数 int temp = new int2 0, bItem.ServerHandle
78、; Array serverHandle = (Array)temp; /移除上一次选择的项 &
79、#160; KepItems.Remove(KepItems.Count, ref serverHandle, out Errors); itm
80、HandleClient = 1234; KepItem = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient);
81、60; itmHandleServer = KepItem.ServerHandle; catch(Exception err) &
82、#160; /没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。 itmHandleClient = 0;
83、0; txtTagValue.Text = "Error ox" txtQualities.Text = "Error ox"
84、60; txtTimeStamps.Text = "Error ox" MessageBox.Show("此项为系统保留项:"+err.Message,"提示信息");
85、; / <summary> / 载入窗体时处理的事情 / </summary&
86、gt; private void MainFrom_Load(object sender, EventArgs e) GetLocalServer();
87、60; / <summary> / 关闭窗体时处理的事情 / </summary> private void MainFrom
88、_FormClosing(object sender, FormClosingEventArgs e) if (!opc_connected)
89、 return; if (KepGroup != null)
90、; KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
91、; if (KepServer != null) KepServer.Discon
92、nect(); KepServer = null; opc_connected =
93、false; / <summary> / 【按钮】设置 / </summary>
94、160;private void btnSetGroupPro_Click(object sender, EventArgs e) SetGroupProperty();
95、; / <summary> / 【按钮】连接服务器 / </summary> private void btnConnLocalServer_Click(object sender,
96、60;EventArgs e) try &
97、#160; if (!ConnectRemoteServer(txtRemoteServerIP.Text,cmbServerName.Text) r
98、eturn; btnSetGroupPro.Enabled = true;
99、160; opc_connected = true; GetServerInfo(); RecurBrowse(KepServer.Creat
100、eBrowser(); if (!CreateGroup()
101、160; return; catch
102、160;(Exception err) MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK
103、, MessageBoxIcon.Warning); / <summary> / 【按钮】写入
104、 / </summary> private void btnWrite_Click(object sender, EventArgs e)
105、;OPCItem bItem = KepItems.GetOPCItem(itmHandleServer); int temp = new int2 0, bItem.ServerHandle Arra
106、y serverHandles=(Array)temp; object valueTemp = new object2 "",txtWriteTagValue.Text Array values=(Array)va
107、lueTemp; Array Errors; int cancelID; KepGroup.AsyncWrite(1,ref serverHan
108、dles,ref values,out Errors, 2009,out cancelID); /KepItem.Write(txtWriteTagValue.Text);/这句也可以写入,但并不触发写入事件 GC.Collect();
109、160; #endregion 自动化接口API文档:关于DCOM的配置:有需要的留下EMAIL。update:1、例子代码下载地址:点击下载2、客户端连接OPC服务器注意事项:a、本例采用的OPCDAAuto.dll版本是0。b、需要使用“regsvr32 /s OPCDAAuto.dll”命令在客户端计算机上注册这个程序集。c、首先保证客户机和服务器的网络是联通的。Tag标签: opc,OP
110、C客户端,C#开发OPC,OPC远程访问,OPC服务器远程访问,OPC源码badnewfish关注 - 0粉丝 - 0关注博主4 0 0 (请您对文章做出评价)« 上一篇:异步Socket【转】» 下一篇:【转】c# xml添加 删除 修改数据posted on 2009-01-13 16:10 badnewfish 阅读(3374) 评论(52) 编辑 收藏 所属分类: OPC 评论1605778 #1楼 219.239.36.* 回复引用 想要文档和源码,谢谢! 2009-01-13 16:26 | 小毛未注册用户 #2楼 221.232.69.
111、* 回复引用 想要文档和源码,请问下timestemp能作为item的value改变的依据么? 2009-01-22 13:27 | lordfish_sl未注册用户 #3楼楼主 回复引用查看 lordfish_sl转的文章,你自己研究一下! 2009-02-02 09:49 | badnewfish #4楼 58.49.110.* 回复引用 楼主发份资料给我,谢谢,赞共享精神,谁说java才开源:) 2009-02-04 12:03 | tensai
112、未注册用户 #5楼楼主 回复引用查看 tensai你的邮件地址发不出去 2009-02-04 17:46 | badnewfish #6楼 159.226.77.* 回复引用 楼主我也需要文档和源码!谢谢! 2009-02-09 09:50 | HHH未注册用户 #7楼楼主 回复引用查看 HHH老大,你的阅读能力有限啊! 2009-02-10 09:29 | badnewfish
113、#8楼 221.215.132.* 回复引用 你好博主: 可以发送给我一份文档和代码吗? 谢谢! 我的email是: 2009-02-19 14:44 | guojian未注册用户 #9楼 61.183.133.* 回复引用 你好,想要你的代码和文档,谢谢 2009-02-27 09:07 | zhippy未注册用户 #10楼 60.174.132.* 回复引用 zhenghan01 需要代码和文档,谢谢楼主 2009-02-27 23:38 | zhenghan未注册用户 #11楼 221.223.47.* 回复引用 谢谢楼主 我的课题也需要代码和文档 30514gyf 2009-02-28 01:15 | siren未注册用户 #12楼 58.218.185.* 回复引用 博主你好! 自动化接口API文档和关于DCOM的配置:能发一份给我么? 最近在研究OPC,麻烦你了,不感激! 邮箱:yantongdong 2009-03-02 11:09 | yantongdong未注册用户 #13楼 219.242.110.* 回复引用 博主,麻烦发一份啊,不胜感激,邮箱:kbl81716 2009-03-02 15:07
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届上海市杨浦区九级第一期期末一模考试物理九上期末监测模拟试题含解析
- 河南省信阳九中学2026届物理八上期末学业水平测试试题含解析
- 榆林市重点中学2026届物理八年级第一学期期末质量检测试题含解析
- 2026届湖南省长沙市周南教育集团九年级物理第一学期期末教学质量检测试题含解析
- 甘肃省武威五中学2026届九年级物理第一学期期末复习检测试题含解析
- 胆固醇控制剂行业跨境出海项目商业计划书
- 精准医疗个性化治疗芯片企业制定与实施新质生产力项目商业计划书
- 生态景区创新创业项目商业计划书
- 纳米纤维石墨材料行业跨境出海项目商业计划书
- 2026届甘肃省武威市第九中学物理八上期末学业水平测试试题含解析
- correlation 测量相关性模板
- 山西农行笔试题目及答案
- 第三单元 分数除法 (讲义)-2025-2026学年六年级上册数学人教版
- 工厂玩手机管理办法规定
- DB35∕T 2169-2024 仲裁庭数字化建设规范
- 2025年福建省国有资产管理有限公司人员招聘笔试备考试题及答案
- 岭南版美术五年级上册3. 童眼看世界 课件(内嵌视频)
- 2025年党员党的基本理论应知应会知识100题及答案
- 2025方便速食行业线上消费趋势洞察
- 讨论防冰涂层的研究现状以及抗冻蛋白在防覆冰领域的应用前景
- 家政公司大酬宾活动方案
评论
0/150
提交评论