关于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)
{}
?
?
總結
以上是生活随笔為你收集整理的关于OPC自动化接口编程(OPCDAAuto.dll)几点注意问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Modbus通讯
- 下一篇: redis.conf 配置项说明