關於OPC自動化接口編程(OPCDAAuto.dll)幾點注意問題


為了能夠在工作中方便的應用OPC和充分的理解OPC的開發流程、內部機制,這兩天正在研究開發OPC客戶端程序,一般我們開發OPC客戶端程序有以下幾種方式:

(1)       使用OPCNetAPI,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll

(2)       使用自動化接口,需要用到OPCDAAuto.dll

(3)       使用自定義接口,需要用到多個Wrapper:OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll

相關資料可以到http://www.opcfoundation.org/去找,注冊成為會員,可以下載一些東西,但是有些是收費的。

 

我用的是OPCDAAuto.dll,版本是:2.2.5.30。大家可以到網上去下載,網上版本有可能是2.0.0.0的。網上也有相關的

DEMO例子也,但是大家都是用的VB.NET和VB開發的比較多,用C#的比較少,即使有,代碼寫的也比較混亂,並且沒有使

用的一些注意事項。我是用C#開發的,但是,也只是在試驗階段,下一步准備做一個公司內部通用的DLL.

 

經過試驗,注意事項如下:

(1)用SyncRead(組的同步讀)和AsyncRead(組的異步讀)讀取服務數據

 c#代碼原形:

SyncRead (short source,int NumItems,ref Arrray ServerHandles,out Values,out Errors,out Qualities,out

TimeStamps);

AsyncRead(int NumItems,ref Arrray ServerHandles,out Errors,int TransactionID,out int CancelID);

大家可以看出這兩個函數里邊都有一個ref Arrray ServerHandles,

如果我們在向函數傳遞參數的時候,

寫成:

int[] handle=new int []{item.ServerHandle};

System.Array ServerHandles=(System.Array)handle;

這時候會出現“參數不正確”的錯誤異常。

 

應該改成:


int[] handle=new int []{/*函數內部數據下標是從1開始的,所以要把第0位空出來*/0,item.ServerHandle};

System.Array ServerHandles=(System.Array)handle;

 


OPCDAAuto.dll內部源碼:

for (LONG ii = 1; ii <= NumItems; ii++)

{
  LONG hHandle = NULL;
  SafeArrayGetElement(*ppServerHandles, &ii, &hHandle);

  phHandles[ii-1] = hInvalidHandle;
  ppItems[ii-1]   = NULL;

  COPCItem* pItem = LookupItem(hHandle);
  
  if (pItem != NULL)
  {
   phHandles[ii-1] = pItem->GetServerHandle();
   ppItems[ii-1]   = pItem;
  }

}

 

(2)AsyncRead(組的異步讀)讀取服務數據

當用異步讀取數據的時候,必須把相應的組的IsSubscribed參數設置為true,以訂閱狀態方式讀取數據;當我們用異步方式

讀取數據就會有一個異步讀取完成的事件:

聲明:

group.AsyncReadComplete +=new

OPCAutomation .DIOPCGroupEvent_AsyncReadCompleteEventHandler (AsyncReadComplete);

實現:

 

 

private void AsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref

System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array

Errors)

{}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM