(C#)OPC客戶端源碼
【轉(zhuǎn)】(C#)OPC客戶端源碼 轉(zhuǎn)載申明 申明:本文為轉(zhuǎn)載,如需轉(zhuǎn)載本文,請獲取原文作者大尾巴狼啊的同意,謝謝合作!轉(zhuǎn)自:大尾巴狼啊原文出處: 前幾天我就發(fā)布過這篇文章,可惜的是,發(fā)布后代碼有的卻看不到,后來我就刪了,至今不明白什么原因- -!關(guān)于C+、VB來開發(fā)OPC客戶端的資料網(wǎng)上有很多,但C#的至今沒發(fā)現(xiàn)有多少。由于近期項目的需要,就開發(fā)了OPC客戶端的一個模塊。在我想來,程序員挺累的,原因我很累。所以我想大家也很累嘿嘿。特別是剛接手OPC客戶端開發(fā)的前幾天,天天盯住顯示器,百度、GOOGLE不停的搜索。每天早上醒來,眼睛都瑟瑟的。從事3年以上軟件開發(fā)的朋友們,估計都會腰酸背痛吧!反正我是這樣的。不說那么多廢話了,貼上源碼,讓需要的同行看看吧,代碼的質(zhì)量并不高,就當做拋磚引玉吧! 1、枚舉本地服務器2、獲取服務器信息3、列出了服務器上Tag4、可以設置組的屬性5、讀寫功能6、可進行遠程連接(DCOM需配置)先看圖:引用類庫:OPC服務器:開發(fā)工具:當前環(huán)境: 源碼: Code/摘要/程式使用C#.NET 2005 編寫/引用類庫OPCDAAuto.dll/OPCServer采用KEPWare/在windows xp sp2、sp3、windows 2003上測試通過/完成于:2008年12月31日/測試于:2009年01月05日/作者:瀟灑草/Email:zhkai868/QQ:44649029/ /如分發(fā),請保留此摘要。/鄙視那些拿代碼當寶貝的人,鄙視那些你不拿源碼換就不稀罕你的人,鄙視那些自私的人。/別人看到你的代碼,你能死???對你有多大威脅???強烈鄙視/如果你是這樣的人,趕緊關(guān)了。偶不歡迎。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 私有變量 / <summary> / OPCServer Object / </summary> OPCServer KepServer; / <summary> / OPCGroups Object / </summary> OPCGroups KepGroups; / <summary> / OPCGroup Object / </summary> OPCGroup KepGroup; / <summary> / OPCItems Object / </summary> OPCItems KepItems; / <summary> / OPCItem Object / </summary> OPCItem KepItem; / <summary> / 主機IP / </summary> string strHostIP = "" / <summary> / 主機名稱 / </summary> string strHostName = "" / <summary> / 連接狀態(tài) / </summary> bool opc_connected = false; / <summary> / 客戶端句柄 / </summary> int itmHandleClient = 0; / <summary> / 服務端句柄 / </summary> int itmHandleServer = 0; #endregion #region 方法 / <summary> / 枚舉本地OPC服務器 / </summary> private void GetLocalServer() /獲取本地計算機IP,計算機名稱 IPHostEntry IPHost = Dns.Resolve(Environment.MachineName); if (IPHost.AddressList.Length > 0) strHostIP = IPHost.AddressList0.ToString(); else return; /通過IP來獲取計算機名稱,可用在局域網(wǎng)內(nèi) 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); / <summary> / 創(chuàng)建組 / </summary> 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("創(chuàng)建組出現(xiàn)錯誤:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning); return false; return true; / <summary> / 設置組屬性 / </summary> 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); / <summary> / 列出OPC服務器中所有節(jié)點 / </summary> / <param name="oPCBrowser"></param> private void RecurBrowse(OPCBrowser oPCBrowser) /展開分支 oPCBrowser.ShowBranches(); /展開葉子 oPCBrowser.ShowLeafs(true); foreach (object turn in oPCBrowser) listBox1.Items.Add(turn.ToString(); / <summary> / 獲取服務器信息,并顯示在窗體狀態(tài)欄上 / </summary> private void GetServerInfo() tsslServerStartTime.Text ="開始時間:"+ KepServer.StartTime.ToString()+" " tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToString()+"."+KepServer.BuildNumber.ToString(); / <summary> / 連接OPC服務器 / </summary> / <param name="remoteServerIP">OPCServerIP</param> / <param name="remoteServerName">OPCServer名稱</param> private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName) try KepServer.Connect(remoteServerName, remoteServerIP); if (KepServer.ServerState = (int)OPCServerState.OPCRunning) tsslServerState.Text = "已連接到-" + KepServer.ServerName + " " else /這里你可以根據(jù)返回的狀態(tài)來自定義顯示信息,請查看自動化接口API文檔 tsslServerState.Text = "狀態(tài):" + KepServer.ServerState.ToString() + " " catch (Exception err) MessageBox.Show("連接遠程服務器出現(xiàn)錯誤:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return false; return true; #endregion #region 事件 / <summary> / 寫入TAG值時執(zhí)行的事件 / </summary> / <param name="TransactionID"></param> / <param name="NumItems"></param> / <param name="ClientHandles"></param> / <param name="Errors"></param> 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(); / <summary> / 每當項數(shù)據(jù)有變化時執(zhí)行的事件 / </summary> / <param name="TransactionID">處理ID</param> / <param name="NumItems">項個數(shù)</param> / <param name="ClientHandles">項客戶端句柄</param> / <param name="ItemValues">TAG值</param> / <param name="Qualities">品質(zhì)</param> / <param name="TimeStamps">時間戳</param> 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(); / <summary> / 選擇列表項時處理的事情 / </summary> / <param name="sender"></param> / <param name="e"></param> 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為數(shù)組的基數(shù) int temp = new int2 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) /沒有任何權(quán)限的項,都是OPC服務器保留的系統(tǒng)項,此處可不做處理。 itmHandleClient = 0; txtTagValue.Text = "Error ox" txtQualities.Text = "Error ox" txtTimeStamps.Text = "Error ox" MessageBox.Show("此項為系統(tǒng)保留項:"+err.Message,"提示信息"); / <summary> / 載入窗體時處理的事情 / </summary> private void MainFrom_Load(object sender, EventArgs e) GetLocalServer(); / <summary> / 關(guān)閉窗體時處理的事情 / </summary> 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; / <summary> / 【按鈕】設置 / </summary> private void btnSetGroupPro_Click(object sender, EventArgs e) SetGroupProperty(); / <summary> / 【按鈕】連接服務器 / </summary> 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); / <summary> / 【按鈕】寫入 / </summary> private void btnWrite_Click(object sender, EventArgs e) OPCItem bItem = KepItems.GetOPCItem(itmHandleServer); int temp = new int2 0, bItem.ServerHandle Array serverHandles=(Array)temp; object valueTemp = new object2 "",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);/這句也可以寫入,但并不觸發(fā)寫入事件 GC.Collect(); #endregion 自動化接口API文檔:關(guān)于DCOM的配置:有需要的留下EMAIL。update:1、例子代碼下載地址:點擊下載2、客戶端連接OPC服務器注意事項:a、本例采用的OPCDAAuto.dll版本是2.2.5.20。b、需要使用“regsvr32 /s OPCDAAuto.dll”命令在客戶端計算機上注冊這個程序集。c、首先保證客戶機和服務器的網(wǎng)絡是聯(lián)通的。Tag標簽: opc,OPC客戶端,C#開發(fā)OPC,OPC遠程訪問,OPC服務器遠程訪問,OPC源碼badnewfish關(guān)注 - 0粉絲 - 0關(guān)注博主4 0 0 (請您對文章做出評價)« 上一篇:異步Socket【轉(zhuǎn)】» 下一篇:【轉(zhuǎn)】c# xml添加 刪除 修改數(shù)據(jù)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.* 回復引用 想要文檔和源碼,請問下timestemp能作為item的value改變的依據(jù)么? 2009-01-22 13:27 | lordfish_sl未注冊用戶 #3樓樓主 回復引用查看 lordfish_sl轉(zhuǎn)的文章,你自己研究一下! 2009-02-02 09:49 | badnewfish #4樓 58.49.110.* 回復引用 樓主發(fā)份資料給我,謝謝,贊共享精神,誰說java才開源:) 2009-02-04 12:03 | tensai未注冊用戶 #5樓樓主 回復引用查看 tensai你的郵件地址發(fā)不出去 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.132.* 回復引用 你好博主: 可以發(fā)送給我一份文檔和代碼嗎? 謝謝! 我的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文檔和關(guān)于DCOM的配置:能發(fā)一份給我么? 最近在研究OPC,麻煩你了,不感激! 郵箱:yantongdong 2009-03-02 11:09 | yantongdong未注冊用戶 #13樓 219.242.110.* 回復引用 博主,麻煩發(fā)一份啊,不勝感激,郵箱:kbl81716 2009-03-02 15:07 | 迷離無間未注冊用戶 #14樓 58.17.231.* 回復引用 感謝! 我郵箱是:cmy8653 2009-03-02 22:28 | cmy #15樓 210.77.87.* 回復引用 麻煩發(fā)一份啊,不勝感激,最好可以發(fā)DCOM的配置的文檔和OPC服務器,OPC服務器:你這個挺多items的我需要一個多點的items的服務器來測試一下。 datianyo 2009-03-03 16:58 | 特尼未注冊用戶 #16樓 121.229.101.* 回復引用 謝謝博主!資料很好!可能的話給我一份參考下,麻煩了!comapple 2009-03-04 09:59 | Zoo1234未注冊用戶 #17樓 60.19.219.* 回復引用 你好我現(xiàn)在站在研究想看看一看,可以給我發(fā)一份嗎 2009-03-05 10:49 | 莊子未注冊用戶 #18樓 59.46.104.* 回復引用 謝謝博主,我也在學習!給我發(fā)一份 自動化接口API文檔 謝謝,不勝感激??! 2009-03-10 21:36 | 方法未注冊用戶 #19樓 59.46.104.* 回復引用 謝謝博主,我也在學習!給我發(fā)一份 自動化接口API文檔 謝謝,不勝感激??! 郵箱breten 2009-03-10 21:37 | 方法未注冊用戶 #20樓 219.135.161.* 回復引用 謝謝博主,我也在學習!給我發(fā)一份 自動化接口API文檔 謝謝,不勝感激?。?郵箱hz_ljc 2009-03-14 09:54 | 游客131未注冊用戶 #21樓 58.41.15.* 回復引用 謝謝博主,我也在學習! 請給我發(fā)一份文檔,代碼已經(jīng)下載了 謝謝! 2009-03-19 09:35 | 黃時未注冊用戶 #22樓 121.26.133.* 回復引用 給我一份謝謝,sun_zzz 2009-03-19 19:37 | 王大鵬未注冊用戶 #23樓 218.65.14.* 回復引用 博主:您發(fā)的文件內(nèi)容正是我想找的,請給我發(fā)一份好嗎?小弟不勝感激。 我的e-mail:s_dl1984,再次感謝 2009-03-24 13:41 | 詹子韓未注冊用戶 #24樓 60.171.12.* 回復引用 博主,可以發(fā)給我一份學習么?小弟不勝感激 郵箱:114663000 2009-03-25 10:00 | 非常困未注冊用戶 #25樓 119.114.62.* 回復引用 非常需要源代碼和文檔,非常感謝,發(fā)給我一份吧! 2009-03-25 16:15 | yp_c未注冊用戶 #26樓 119.114.62.* 回復引用 非常需要源代碼和文檔,非常感謝,發(fā)給我一份吧! 郵箱:yp_c 2009-03-25 16:16 | yp_c未注冊用戶 #27樓 218.25.125.* 回復引用 謝謝樓主,我需要源碼和文檔,E-MAIL:lccly000 2009-03-30 13:25 | 柳長春未注冊用戶 #28樓 124.172.246.* 回復引用 非常感謝了,給我一份好嗎?急需學習.Email: zeedian 2009-03-31 15:01 | 李默未注冊用戶 #29樓 121.26.149.* 回復引用 能給我份源碼嗎? 2009-04-04 19:01 | 滕大鵬未注冊用戶 #30樓 121.26.149.* 回復引用 我想要文檔,能給份嗎?謝謝 2009-04-04 19:03 | 滕大鵬未注冊用戶 #31樓 222.241.252.* 回復引用 謝謝樓主,我的郵箱是tjc076336,能給我發(fā)一份全部的資料嗎? 2009-04-07 14:02 | TJC #32樓 121.229.181.* 回復引用 謝謝,傳份給我,要全部資源(文檔+源碼),萬分感謝! 2009-04-08 22:02 | hxf未注冊用戶 #33樓 222.244.124.* 回復引用 急需一份資料謝謝jhjohn001 2009-04-11 16:34 | jhjohn未注冊用戶 #34樓 218.56.161.* 回復引用 麻煩傳份給我,要全部資源(文檔+源碼),萬分感謝 2009-04-13 08:36 | yldx #35樓 124.160.56.* 回復引用 您好!麻煩傳分全部資源(文檔+源碼),謝謝 xhm0924 2009-04-15 13:00 | xhm0924未注冊用戶 #36樓 116.228.64.* 回復引用 謝謝,傳份給我,要全部資源(文檔+源碼),萬分感謝!急用 2009-04-25 09:35 | bestyaq #37樓 218.107.133.* 回復引用 謝謝,傳份給我,要全部資源(文檔+源碼),萬分感謝! 2009-04-26 12:13 | carson1978未注冊用戶 #38樓 218.107.133.* 回復引用 謝謝,傳份給我,要全部資源(文檔+源碼),萬分感謝! 郵箱:ss_189 2009-04-26 12:14 | carson1978未注冊用戶 #39樓 218.18.115.* 回復引用 我也要一份,謝謝!xudong.huang 2009-04-27 11:59 | 黃旭東未注冊用戶 #40樓樓主 回復引用查看 你們不會自己下載?。肯氲牡矫?!還讓我給你們傳呢!工資也直接打我卡上算了!2009-04-28 13:17 | badnewfish #41樓 218.26.117.* 回復引用 謝謝樓主分享,后面的三個文檔可以麻煩給發(fā)一份嗎?現(xiàn)在項目上遇到了這樣的問題,希望能借鑒一下!萬分感謝!lonely.sea.1983 2009-05-04 13:25 | 陸海成未注冊用戶 #42樓 222.74.231.* 回復引用 可否給我發(fā)一份。我正要做opc客戶端。 2009-05-14 10:18 | 游客游客游客未注冊用戶 #43樓 222.74.231.* 回復引用 給我發(fā)一份吧,現(xiàn)在正在做opc還不知道從何下手 lilopeng 2009-05-14 10:19 | 游客游客游客未注冊用戶 #44樓 221.224.52.* 回復引用 給我發(fā)一份吧,謝謝了 hanjibo 2009-05-16 13:09 | 韓未注冊用戶 #45樓 221.236.61.* 回復引用 renyuhui1981麻煩把文檔發(fā)給我一個吧謝謝 2009-07-07 19:37 | 大個未注冊用戶 #46樓 60.17.231.* 回復引用 及其寶貴的資源感謝感謝如果方便發(fā)給我一份吧261234087 2009-07-10 14:14 | 寧寧土豆未注冊用戶 #47樓 222.129.51.* 回復引用 謝謝提供寶貴經(jīng)驗,煩請給我也發(fā)一份,謝謝!2009-07-13 11:20 | eflong2008未注冊用戶 #48樓 222.69.213.* 回復引用 swb1356 謝謝樓主無私分享。方便的話個請給我發(fā)一份 2009-07-18 11:59 | swb1356未注冊用戶 #49樓 60.21.206.* 回復引用 首先感謝共享,希望能向你請教,交流,我是初學者,幫老師做項目! 2009-07-23 11:43 | 既生瑜未注冊用戶 #50樓 60.21.206.* 回復引用 另外想問下,服務器端的程序是什么樣的! 2009-07-23 11:45 | 既生瑜未注冊用戶 #51樓 220.168.209.* 回復引用 想學習,需求API接口文檔和DCOM配置文件,如有可能,清同時提供opcdaauto.dll文件,在下不勝感激! 2009-08-04 16:02 | wdkshp未注冊用戶 #52樓樓主 回復引用查看 wdkshp你視力有缺陷,即使我提供的有下載你也看不到,真可悲??! 2009-08-05 10:07 | badnewfish 推薦精選