日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

OPCDAAuto.dll的C#使用方法浅析(转载)

發(fā)布時(shí)間:2025/3/16 C# 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OPCDAAuto.dll的C#使用方法浅析(转载) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上次研究了.Net版本的OPC API dll,這次我采用OPCDAAuto.dll來(lái)介紹使用方法。
以下為我的源代碼,有詳細(xì)的注釋無(wú)需我多言。
編譯平臺(tái):VS2008SP1、WINXP、KEPServer
除此之外,我也安裝了西門子的Net2006和Step7,其中Net2006是負(fù)責(zé)OPC的,可能會(huì)在系統(tǒng)中創(chuàng)建一些dll之類的,并提供幾個(gè)OPC服務(wù)器
以下是我Program.cs(基于控制臺(tái)的)的全部?jī)?nèi)容,仍舊采用C#語(yǔ)言:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Collections; using OPCAutomation; using System.Threading;namespace OPCDAAutoTest {class Tester{static void Main(string[] args){Tester tester=new Tester();tester.work();}#region 私有變量/// <summary>/// OPCServer Object/// </summary> OPCServer MyServer;/// <summary>/// OPCGroups Object/// </summary> OPCGroups MyGroups;/// <summary>/// OPCGroup Object/// </summary> OPCGroup MyGroup;OPCGroup MyGroup2;/// <summary>/// OPCItems Object/// </summary> OPCItems MyItems;OPCItems MyItems2;/// <summary>/// OPCItem Object/// </summary> OPCItem[] MyItem;OPCItem[] MyItem2;/// <summary>/// 主機(jī)IP/// </summary>string strHostIP = "";/// <summary>/// 主機(jī)名稱/// </summary>string strHostName = "";/// <summary>/// 連接狀態(tài)/// </summary>bool opc_connected = false;/// <summary>/// 客戶端句柄/// </summary>int itmHandleClient = 0;/// <summary>/// 服務(wù)端句柄/// </summary>int itmHandleServer = 0;#endregion//測(cè)試用工作方法public void work(){//初始化item數(shù)組MyItem = new OPCItem[4];MyItem2 = new OPCItem[4];GetLocalServer();//ConnectRemoteServer("TX1", "KEPware.KEPServerEx.V4");//用計(jì)算機(jī)名的局域網(wǎng)//ConnectRemoteServer("192.168.1.35", "KEPware.KEPServerEx.V4");//用IP的局域網(wǎng)if (ConnectRemoteServer("", "KEPware.KEPServerEx.V4"))//本機(jī) {if (CreateGroup()){Thread.Sleep(500);//暫停線程以讓DataChange反映,否則下面的同步讀可能讀不到//以下同步寫(xiě)MyItem[3].Write("I love you!");//同步寫(xiě)MyItem[2].Write(true);//同步寫(xiě)MyItem[1].Write(-100);//同步寫(xiě)MyItem[0].Write(120);//同步寫(xiě) //以下同步讀object ItemValues; object Qualities; object TimeStamps;//同步讀的臨時(shí)變量:值、質(zhì)量、時(shí)間戳MyItem[0].Read(1,out ItemValues,out Qualities,out TimeStamps);//同步讀,第一個(gè)參數(shù)只能為1或2int q0 = Convert.ToInt32(ItemValues);//轉(zhuǎn)換后獲取item值MyItem[1].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步讀,第一個(gè)參數(shù)只能為1或2int q1 = Convert.ToInt32(ItemValues);//轉(zhuǎn)換后獲取item值MyItem[2].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步讀,第一個(gè)參數(shù)只能為1或2bool q2 = Convert.ToBoolean(ItemValues);//轉(zhuǎn)換后獲取item值MyItem[3].Read(1, out ItemValues, out Qualities, out TimeStamps);//同步讀,第一個(gè)參數(shù)只能為1或2string q3 = Convert.ToString(ItemValues);//轉(zhuǎn)換后獲取item值,為防止讀到的值為空,不用ItemValues.ToString() Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");Console.WriteLine("0-{0},1-{1},2-{2},3-{3}",q0,q1,q2,q3);//以下為異步寫(xiě)//異步寫(xiě)時(shí),Array數(shù)組從下標(biāo)1開(kāi)始而非0!int[] temp = new int[] { 0,MyItem[0].ServerHandle,MyItem[1].ServerHandle,MyItem[2].ServerHandle, MyItem[3].ServerHandle };Array serverHandles = (Array)temp;object[] valueTemp = new object[5] { "",255,520,true, "Love" };Array values = (Array)valueTemp;Array Errors;int cancelID;MyGroup.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//第一參數(shù)為item數(shù)量//由于MyGroup2沒(méi)有訂閱,所以以下這句運(yùn)行時(shí)將會(huì)出錯(cuò)!//MyGroup2.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//以下異步讀MyGroup.AsyncRead(4, ref serverHandles, out Errors, 1, out cancelID);//第一參數(shù)為item數(shù)量/*MyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string*/Console.WriteLine("************************************** hit <return> to Disconnect...");Console.ReadLine(); //釋放所有組資源 MyServer.OPCGroups.RemoveAll();//斷開(kāi)服務(wù)器 MyServer.Disconnect();}}//ENDConsole.WriteLine("************************************** hit <return> to close...");Console.ReadLine(); }//枚舉本地OPC服務(wù)器private void GetLocalServer(){//獲取本地計(jì)算機(jī)IP,計(jì)算機(jī)名稱strHostName = Dns.GetHostName();//或者通過(guò)局域網(wǎng)內(nèi)計(jì)算機(jī)名稱strHostName = "TX1";//獲取本地計(jì)算機(jī)上的OPCServerNametry{MyServer = new OPCServer();object serverList = MyServer.GetOPCServers(strHostName);foreach (string server in (Array)serverList){//cmbServerName.Items.Add(turn);Console.WriteLine("本地OPC服務(wù)器:{0}", server);}}catch (Exception err){Console.WriteLine("枚舉本地OPC服務(wù)器出錯(cuò):{0}",err.Message);}}//連接OPC服務(wù)器/// <param name="remoteServerIP">OPCServerIP</param>/// <param name="remoteServerName">OPCServer名稱</param>private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName){try{MyServer.Connect(remoteServerName, remoteServerIP);//連接本地服務(wù)器:服務(wù)器名+主機(jī)名或IPif (MyServer.ServerState == (int)OPCServerState.OPCRunning){Console.WriteLine("已連接到:{0}",MyServer.ServerName);}else{//這里你可以根據(jù)返回的狀態(tài)來(lái)自定義顯示信息,請(qǐng)查看自動(dòng)化接口API文檔Console.WriteLine("狀態(tài):{0}",MyServer.ServerState.ToString());}MyServer.ServerShutDown+=ServerShutDown;//服務(wù)器斷開(kāi)事件 }catch (Exception err){Console.WriteLine("連接遠(yuǎn)程服務(wù)器出現(xiàn)錯(cuò)誤:{0}" + err.Message);return false;}return true;}//創(chuàng)建組private bool CreateGroup(){try{MyGroups = MyServer.OPCGroups;MyGroup = MyServer.OPCGroups.Add("測(cè)試");//添加組MyGroup2 = MyGroups.Add("測(cè)試2");OPCGroup MyGroup3 = MyGroups.Add("測(cè)試3");//測(cè)試刪除組//以下設(shè)置組屬性 {MyServer.OPCGroups.DefaultGroupIsActive = true;//激活組。MyServer.OPCGroups.DefaultGroupDeadband = 0;// 死區(qū)值,設(shè)為0時(shí),服務(wù)器端該組內(nèi)任何數(shù)據(jù)變化都通知組。MyServer.OPCGroups.DefaultGroupUpdateRate = 200;//默認(rèn)組群的刷新頻率為200msMyGroup.UpdateRate = 100;//刷新頻率為1秒。MyGroup.IsSubscribed = true;//使用訂閱功能,即可以異步,默認(rèn)false } MyGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);MyGroup.AsyncReadComplete += new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);//由于MyGroup2.IsSubscribed是false,即沒(méi)有訂閱,所以以下的DataChange回調(diào)事件不會(huì)發(fā)生!MyGroup2.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange2);MyGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete); MyServer.OPCGroups.Remove("測(cè)試3");//移除組AddGroupItems();//設(shè)置組內(nèi)items }catch (Exception err){Console.WriteLine("創(chuàng)建組出現(xiàn)錯(cuò)誤:{0}", err.Message);return false;}return true;}private void AddGroupItems()//添加組 {//itmHandleServer;MyItems = MyGroup.OPCItems;MyItems2 = MyGroup2.OPCItems;//添加itemMyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string//移除組內(nèi)item Array Errors; int []temp=new int[]{0,MyItem[3].ServerHandle};Array serverHandle = (Array)temp;MyItems.Remove(1, ref serverHandle, out Errors);MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string MyItem2[0] = MyItems2.AddItem("BPJ.Db1.dbb96", 0);//byteMyItem2[1] = MyItems2.AddItem("BPJ.Db1.dbw10", 1);//shortMyItem2[2] = MyItems2.AddItem("BPJ.Db16.dbx0", 2);//boolMyItem2[3] = MyItems2.AddItem("BPJ.Db11.S0", 3);//string }public void ServerShutDown(string Reason)//服務(wù)器先行斷開(kāi) {Console.WriteLine("服務(wù)器已經(jīng)先行斷開(kāi)!");}/// <summary>/// 每當(dāng)項(xiàng)數(shù)據(jù)有變化時(shí)執(zhí)行的事件/// </summary>/// <param name="TransactionID">處理ID</param>/// <param name="NumItems">項(xiàng)個(gè)數(shù)</param>/// <param name="ClientHandles">項(xiàng)客戶端句柄</param>/// <param name="ItemValues">TAG值</param>/// <param name="Qualities">品質(zhì)</param>/// <param name="TimeStamps">時(shí)間戳</param>1 `void GroupDataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){Console.WriteLine("++++++++++++++++DataChanged+++++++++++++++++++++++");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("item值:{0}", ItemValues.GetValue(i).ToString());//Console.WriteLine("item句柄:{0}", ClientHandles.GetValue(i).ToString());//Console.WriteLine("item質(zhì)量:{0}", Qualities.GetValue(i).ToString());//Console.WriteLine("item時(shí)間戳:{0}", TimeStamps.GetValue(i).ToString());//Console.WriteLine("item類型:{0}", ItemValues.GetValue(i).GetType().FullName);}*/}void GroupDataChange2(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){Console.WriteLine("----------------------DataChanged2------------------");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("item2值:{0}", ItemValues.GetValue(i).ToString());//Console.WriteLine("item2質(zhì)量:{0}", Qualities.GetValue(i).ToString());//Console.WriteLine("item2時(shí)間戳:{0}", TimeStamps.GetValue(i).ToString()); }*/}/// <summary>/// 異步寫(xiě)完成/// 運(yùn)行時(shí),Array數(shù)組從下標(biāo)1開(kāi)始而非0!/// </summary>/// <param name="TransactionID"></param>/// <param name="NumItems"></param>/// <param name="ClientHandles"></param>/// <param name="Errors"></param>void GroupAsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors){Console.WriteLine("%%%%%%%%%%%%%%%%AsyncWriteComplete%%%%%%%%%%%%%%%%%%%");/*for (int i = 1; i <= NumItems; i++){Console.WriteLine("Tran:{0} ClientHandles:{1} Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());}*/}/// <summary>/// 異步讀完成/// 運(yùn)行時(shí),Array數(shù)組從下標(biāo)1開(kāi)始而非0!/// </summary>/// <param name="TransactionID"></param>/// <param name="NumItems"></param>/// <param name="ClientHandles"></param>/// <param name="ItemValues"></param>/// <param name="Qualities"></param>/// <param name="TimeStamps"></param>/// <param name="Errors"></param>void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors){Console.WriteLine("****************GroupAsyncReadComplete*******************");for (int i = 1; i <= NumItems; i++){//Console.WriteLine("Tran:{0} ClientHandles:{1} Error:{2}", TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString());Console.WriteLine("Vaule:{0}",Convert.ToString(ItemValues.GetValue(i)));}}} }

?

轉(zhuǎn)載于:https://www.cnblogs.com/qq458978/p/9789441.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的OPCDAAuto.dll的C#使用方法浅析(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。