生活随笔
收集整理的這篇文章主要介紹了
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ò),歡迎將生活随笔推薦給好友。