版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【转】(C#)OPC客户端源码 转载申明 申明:本文为转载,如需转载本文,请获取原文作者大尾巴狼啊的同意,谢谢合作!转自:大尾巴狼啊原文出处: 前几天我就发布过这篇文章,可惜的是,发布后代码有的却看不到,后来我就删了,至今不明白什么原因- -!关于C+、VB来开发OPC客户端的资料网上有很多,但C#的至今没发现有多少。由于近期项目的需要,就开发了OPC客户端的一个模块。在我想来,程序员挺累的,原因我很累。所以我想大家也很累嘿嘿。特别是刚接手OPC客户端开发的前几天,天天盯住显示器,百度、GOOGLE不停的搜索。每天早上醒来,眼睛都瑟瑟的。从事3年以上软件开发的朋友们,估计都会腰酸背痛
2、吧!反正我是这样的。不说那么多废话了,贴上源码,让需要的同行看看吧,代码的质量并不高,就当做抛砖引玉吧! 1、枚举本地服务器2、获取服务器信息3、列出了服务器上Tag4、可以设置组的属性5、读写功能6、可进行远程连接(DCOM需配置)先看图:引用类库:OPC服务器:开发工具:当前环境: 源码: Code/摘要/程式使用C#.NET 2005 编写/引用类库OPCDAAuto.dll/OPCServer采用KEPWare/在windows xp sp2、sp3、windows 2003上测试通过/完成于:2008年1
3、2月31日/测试于:2009年01月05日/作者:潇洒草/Email:zhkai868/QQ:44649029/ /如分发,请保留此摘要。/鄙视那些拿代码当宝贝的人,鄙视那些你不拿源码换就不稀罕你的人,鄙视那些自私的人。/别人看到你的代码,你能死啊?对你有多大威胁啊?强烈鄙视/如果你是这样的人,赶紧关了。偶不欢迎。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing
4、;using System.Text;using System.Windows.Forms;using System.Net;using System.Collections;using OPCAutomation;namespace OPC测试通过 public partial class MainFrom : Form
5、 public MainFrom() InitializeComponent(); #region 私有变量
6、; / <summary> / OPCServer Object / </summary> OPCServer KepServer;
7、60; / <summary> / OPCGroups Object / </summary> OPCGroups KepGroups; &
8、#160; / <summary> / OPCGroup Object / </summary> OPCGroup KepGroup;
9、160;/ <summary> / OPCItems Object / </summary> OPCItems KepItems; / &l
10、t;summary> / OPCItem Object / </summary> OPCItem KepItem; / <summary>
11、60; / 主机IP / </summary> string strHostIP = "" / <summary>
12、60; / 主机名称 / </summary> string strHostName = "" / <summary> &
13、#160; / 连接状态 / </summary> bool opc_connected = false; / <summary>
14、; / 客户端句柄 / </summary> int itmHandleClient = 0; / <summary>
15、; / 服务端句柄 / </summary> int itmHandleServer = 0; #endregion #region
16、0;方法 / <summary> / 枚举本地OPC服务器 / </summary> private void GetLocalServer()
17、60; /获取本地计算机IP,计算机名称 IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);
18、0; if (IPHost.AddressList.Length > 0) strHostIP = IPHost.A
19、ddressList0.ToString(); else
20、60; return; /通过IP来获取计算机名称,可用在局域网内 IPHostEntry
21、ipHostEntry = Dns.GetHostByAddress(strHostIP); strHostName=ipHostEntry.HostName.ToString(); /获取本地计算机上的OPCServerName
22、60; try KepServer = new OPCServer();
23、; object serverList = KepServer.GetOPCServers(strHostName); foreach (string turn in (Array)serverList)
24、60; cmbServerName.Items.Add(turn);
25、60; cmbServerName.SelectedIndex = 0; btnConnServer.Enabled = true;
26、 catch(Exception err)
27、; MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);
28、60; / <summary> / 创建组 / </summary> private bool CreateGroup()
29、160; try KepGroups = KepServer.OPCGroups;
30、; KepGroup = KepGroups.Add("OPCDOTNETGROUP"); SetGroupProperty(); &
31、#160; KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); KepGroup.AsyncWriteComplete += new
32、;DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete); KepItems = KepGroup.OPCItems;
33、0; catch (Exception err) MessageBox.Show("创建组出现错误:"+err.Mess
34、age,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning); return false;
35、 return true; / <summary> / 设置组属性 / </summary>
36、0; private void SetGroupProperty() KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text); &
37、#160; KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text); KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);
38、60; KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text); KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text); &
39、#160; / <summary> / 列出OPC服务器中所有节点 / </summary> / <param name
40、="oPCBrowser"></param> private void RecurBrowse(OPCBrowser oPCBrowser) /展开分支
41、 oPCBrowser.ShowBranches(); /展开叶子 oPCBrowser.ShowLeafs(true);
42、160; foreach (object turn in oPCBrowser) listBox1.Items.Add(turn.ToString();
43、160; / <summary> / 获取服务器信息,并显示在窗体状态栏上 / &l
44、t;/summary> private void GetServerInfo() tsslServerStartTime.Text ="开始时间:"+ KepServer.StartTime.ToStr
45、ing()+" " tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToString()+"."+KepServer.BuildNumber
46、.ToString(); / <summary> / 连接OPC服务器 / </summary>
47、 / <param name="remoteServerIP">OPCServerIP</param> / <param name="remoteServerName">OPCServer名称</param> private bool Con
48、nectRemoteServer(string remoteServerIP, string remoteServerName) try
49、160; KepServer.Connect(remoteServerName, remoteServerIP); if (KepServer.ServerState = (int)OPCServerState.OPCRunning)
50、60; tsslServerState.Text = "已连接到-" + KepServer.ServerName
51、0;+ " " else
52、; /这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档
53、 tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + " "
54、160; catch (Exception err) MessageBox.Show(&qu
55、ot;连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false;
56、 return true; #endregion #region 事件
57、 / <summary> / 写入TAG值时执行的事件 / </summary> / <param name="TransactionID"></param>
58、0; / <param name="NumItems"></param> / <param name="ClientHandles"></param> / <param nam
59、e="Errors"></param> void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
60、160; lblState.Text = "" for (int i = 1; i <= NumItems; i+) &
61、#160; lblState.Text += "Tran:" + TransactionID.ToString() + " CH:" + ClientHandles.GetValue(i).ToString()
62、;+ " Error:" + Errors.GetValue(i).ToString(); / <summary>
63、; / 每当项数据有变化时执行的事件 / </summary> / <param name="TransactionID">处理ID</param> / <pa
64、ram name="NumItems">项个数</param> / <param name="ClientHandles">项客户端句柄</param> / <param name="ItemValues">TAG值</param>
65、160; / <param name="Qualities">品质</param> / <param name="TimeStamps">时间戳</param> void KepGroup_D
66、ataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
67、60; /为了测试,所以加了控制台的输出,来查看事物ID号 /Console.WriteLine("*"+TransactionID.ToString()+"*"); for (int i =
68、0;1; i <= NumItems; i+) this.txtTagValue.Text = ItemValues.GetValue(i).ToString();
69、 this.txtQualities.Text = Qualities.GetValue(i).ToString(); this.txtTimeStamps.Text = TimeStamps.GetValue(i)
70、.ToString(); / <summary> / 选择列表项时处理的事情
71、160; / </summary> / <param name="sender"></param> / <param name="e"></param>
72、160;private void listBox1_SelectedIndexChanged(object sender, EventArgs e) try
73、 if (itmHandleClient != 0)
74、160; this.txtTagValue.Text = "" this.txtQualities.Text =""
75、; this.txtTimeStamps.Text = "" Array Errors;
76、; OPCItem bItem = KepItems.GetOPCItem(itmHandleServer); /注:OPC中以1为数组的基数
77、 int temp = new int2 0, bItem.ServerHandle &
78、#160;Array serverHandle = (Array)temp; /移除上一次选择的项
79、60;KepItems.Remove(KepItems.Count, ref serverHandle, out Errors); itmHandleClient =&
80、#160;1234; KepItem = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient); itmHa
81、ndleServer = KepItem.ServerHandle; catch(Exception err)
82、60; /没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。 itmHandleClient = 0;
83、 txtTagValue.Text = "Error ox" txtQualities.Text = "Error ox"
84、; txtTimeStamps.Text = "Error ox" MessageBox.Show("此项为系统保留项:"+err.Message,"提示信息"); &
85、#160; / <summary> / 载入窗体时处理的事情 / </summary>
86、; private void MainFrom_Load(object sender, EventArgs e) GetLocalServer();
87、; / <summary> / 关闭窗体时处理的事情 / </summary> private void MainFrom_FormClosing(object&
88、#160;sender, FormClosingEventArgs e) if (!opc_connected)
89、160; return; if (KepGroup != null) &
90、#160; KepGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange); &
91、#160; if (KepServer != null) KepServer.Disconnect(); &
92、#160; KepServer = null; opc_connected = false;
93、160; / <summary> / 【按钮】设置 / </summary> private voi
94、d btnSetGroupPro_Click(object sender, EventArgs e) SetGroupProperty(); &
95、#160;/ <summary> / 【按钮】连接服务器 / </summary> private void btnConnLocalServer_Click(object sender, EventArgs e)
96、 try if (
97、!ConnectRemoteServer(txtRemoteServerIP.Text,cmbServerName.Text) return;
98、160; btnSetGroupPro.Enabled = true;
99、0; opc_connected = true; GetServerInfo(); RecurBrowse(KepServer.CreateBrowser();
100、60; if (!CreateGroup()
101、0; return; catch (Exception
102、err) MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIco
103、n.Warning); / <summary> / 【按钮】写入
104、160; / </summary> private void btnWrite_Click(object sender, EventArgs e) OPCItem bItem&
105、#160;= KepItems.GetOPCItem(itmHandleServer); int temp = new int2 0, bItem.ServerHandle Array serverHandles
106、=(Array)temp; object valueTemp = new object2 "",txtWriteTagValue.Text Array values=(Array)valueTemp;
107、 Array Errors; int cancelID; KepGroup.AsyncWrite(1,ref serverHandles,ref values
108、,out Errors, 2009,out cancelID); /KepItem.Write(txtWriteTagValue.Text);/这句也可以写入,但并不触发写入事件 GC.Collect();
109、0; #endregion 自动化接口API文档:关于DCOM的配置:有需要的留下EMAIL。update:1、例子代码下载地址:点击下载2、客户端连接OPC服务器注意事项:a、本例采用的OPCDAAuto.dll版本是0。b、需要使用“regsvr32 /s OPCDAAuto.dll”命令在客户端计算机上注册这个程序集。c、首先保证客户机和服务器的网络是联通的。Tag标签: opc,OPC客户端,C#开发OPC,O
110、PC远程访问,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、160; 想要文档和源码,请问下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未注册用户 #5楼楼主 回复
112、引用查看 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 #8楼 221.215.13
113、2.* 回复引用 你好博主: 可以发送给我一份文档和代码吗? 谢谢! 我的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
- 管道拆除安全措施方案
- 成人2型糖尿病口服降糖药联合治疗专家共识(2025版)课件
- 英语北京市昌平区2026年高三年级第一次统一练习(昌平高三一模)(4.7-4.10)
- 2026成都市八年级语文下册部编版期末考试卷含答案
- 便利店工作制度详细流程
- 2025秋季《中华民族共同体概论》期末综合考试-国开(XJ)-参考资料
- 高速公路服务区建设项目可行性研究报告
- LY/T 2015-2012大熊猫饲养管理技术规程
- 文史资料选辑合订本(46卷本第1辑至第136辑)
评论
0/150
提交评论