精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

以C#編寫并使用NET-Framework的OPC自定義接口

機器人及PLC自動化應用 ? 來源:機器人及PLC自動化應用 ? 作者:機器人及PLC自動化 ? 2022-04-11 10:09 ? 次閱讀

使用示例程序

該程序包括多個元素,操作員可使用這些元素觸發以下動作:

以C#編寫并使用NET-Framework的OPC自定義接口

啟動程序時,僅啟用“啟動示例” (Start Sample) 按鈕。單擊此按鈕后,程序將生成所需的 OPC 對象。隨即會啟用其它按鈕。

以C#編寫并使用NET-Framework的OPC自定義接口

單擊“ 啟動示例” (Start Sample) 按鈕后,以 C# 編寫并使用 .NET- Framework 的 OPC 自定義接口(異步通信)的示例程序的啟動對話框 .

程序說明:

1 選擇 .NET 組件

2 將 ProgID 轉換為 CLSID

3 建立與 OPC 服務器的連接

4 創建 OPC 組

5 添加數據項

6 請求 IConnectionPointContainer 接口

7 請求 IOPCAsyncIO2 接口

8 創建回調對象

9 連接 OPC 服務器與客戶端的回調對象

10 執行所需的寫入和讀取操作

11 接收 OPC 服務器的通知

12 刪除對象并釋放內存

步驟 1:選擇 .NET 組件

要配合使用 OPC 數據訪問的自定義接口和 .NET,必須在您的 Visual Basic 項目中使用上述運行時可調用包裝 (RCW) 。在該示例項目中,OpcRcw.Da 和 OpcRcw.Comn 組件已添完畢。

如果它們未出現在選項中,也可使用“瀏覽” (Browse) 按鈕從下列文件夾中進行選擇:“ <安裝路徑> SIEMENS SIMATIC.NET opc2in”

步驟 2:將 ProgID 轉換為 CLSID

為了對其進行標識,每個 COM 服務器都有一個 ProgID 且該 ProgID 分配給世界上唯一的類型。使用 GetTypeFromProgID() 函數可實現上述操作。SIMATIC NET 的 OPC 服務器的 ProgID 是 L"OPC.SimaticNET":

Type svrComponenttyp = Type.Get TypeFromProgID(L"OPC.SimaticNET");

步驟 3:建立與 OPC 服務器的連接

Activator 類的 CreateInstance() 函數生成一個具有之前指定類型的類的實例:

pIOPCServer =

(IOPCServer)Activato r.CreateInstance(svrComponenttyp

);

該程序段的結果是 IOPCServer 類型的接口變量 pIOPCServer。

步驟 4:創建 OPC 組

IOPCServer 接口具有用于創建組的 AddGroup() 方法:

pIOPCServer.AddGroup(GROUP_NAME,

0,

dwRequestedUpdateRate,

hClientGroup,

hTimeBias..AddrOfPinnedObject(),

hDeadban d.AddrOfPinnedObject(),

dwLCID,

out pSvrGroupHandle,

out pRevUpdateRate,

ref out pobjGroup1)

注意

hDeadband 和 hTimeBias 的內存分配由 GCHandle.Alloc() 函數完成。

GCHandle hTimeBias;

hTimeBias = GCHandle.Alloc(tim ebias,GCHandleType.Pinned);

GCHandle hDeadband;

hDeadband = GCHandle.Alloc(deadband,GCHandleType.Pinned);

這些函數處理傳送變量時間偏倚和死區(百分比死區)的非管理型內存。

當不再需要管理句柄時,必須按如下所示再次將其釋放:

if (hTimeBias.IsAllocated) hTimeBias. Free();

if (hDeadband.IsAllocated) hDeadband.Free();

該程序段的結果是一個具有指定名稱和所需屬性的組。AddGroup() 還返回 pobjGroup1變量作為返回參數,即組對象的接口。

使用類型調整調用 IOPCGroupStateMgt ,可以只從返回的組接口 pobjGroup1 獲取該接口。該調用的簡化形式對應于 COM 方法 Queryinterface()。

稍后需使用 IOPCGroupStateMgt 接口的 S etState() 方法激活和禁用組。

pIOPCGroupStateMgt = (IOPCGroupStateMgt)pob jGroup1;

步驟 5:添加數據項

IOPCItemMgt 接口具有用于創建 OPC 數據項的 AddItems() 方法:

((IOPCItemMgt)pobjGroup1).AddItems(2,ItemDeffArray,out

pResults,out pErrors);

該程序段的結果是服務器添加兩個具有 itemd efs 參數中所指定屬性的數據項。此外,還會對結果結構 OPCITEMRESULT 的變量(服務器句柄、目標系統上數據項的數據類型等)進行初始化。

由于結果通過基礎 COM 接口寫入至非管理型內存,因此來自管理型 .NET 代碼的訪問必須利用封送函數:

OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos,

typeof(OPCITEMRESULT));

Ite mSvrHandleArray[0] = result.hServer;

pos = new IntPtr(pos.ToInt32() +

Marshal.SizeOf(typeof(OPCITEMRESULT)));

OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure

(pos,typ eof(OPCITEMRESULT));

ItemSvrHandleArray[1] = result.hServer;

步驟 6:請求 IConnectionPointContainer 接口

IConnectionPointContainer 類型的 pIConnectionPointContainer 變量可源自 m_group_1 變量。

pIConnectionPointContai ner =

(IConnectionPointContainer)pobjGroup1;

定位 IConnectionPoint 接口需要使用該接口。

步驟 7:請求 IOPCAsyncIO2 接口

pIOPCAsyncIO2 類型的 pIOPCAsyncIO2 變量可源自 pobjGroup1 變量。

pIOPCAsyncIO2 = (IOPCAsyncIO2)pobjGroup1;

該接口提供用于異步讀取和寫入值的方法。

步驟 8:創建回調對象

為了允許 OPC 服務器返回異步操作的值,必須在客戶端上執行 I OPCDataCallback 接口。

public class OPCAsync :System.Windows.Forms.Form ,

IOPCDataCallback

使用 IConnectionPointContainer 接口的 FindConnectionPoint() 方法建立 OPC 服務器的 IConnectionPoint 和 IOPCDataCallback 接口間的連接。該連接將為異步調用生成一個回調對象。

Guid iid = typeof(IO PCDataCallback).GUID;

pIConnectionPointContainer.FindConnectionPoint(ref iid,

out

pIConnectionPoint);

步驟 9:連接 OPC 服務器與客戶端的回調對象

OPC 服務器的回調對象與客戶端應用程序間的連接通過 Advise() 方法來建立。返回變量 dwCookie 是該連接的 ID 。

pIConnectionPoint.Advise(this,out dwCookie);

步驟 10:執行所需的寫入或讀取操作

在步驟 7 中生成的 Read() 和 Write() 方法可通過 IOPCAsyncIO2 接口來訪問:

pIOPCAsyncIO2.Read(1,ItemSvrHandleArray,nTransactionID+1,

out nCancelid,out pErrors);

步驟 11:接收 OPC 服務器的通知

如果激活組中激活數據項的數據發生更改,服務器將調用回調對象的 OnDataC hange 方法。讀取操作完成后,服務器調用 OnReadComplete() 方法;寫入操作完成后,服務器調用 OnWriteComplete() 方法。服務器將返回值以參數的形式傳遞至方法。

virtual void OnDataChange(

Int32 dwTransid,

Int32 hGroup,

Int32 hrMasterquality,

Int32 hrMastererror,

Int32 dwCount,

int[] phClientItems,

object[] pvValues,

short[] pwQualities,

FILETIME[] pftTimeStamps,

int[] pErrors,

)

步驟 12:刪除對象并釋放內存

退出程序前或單擊“ 停止”(Stop) 后,必須刪除已生成的 OPC 對象并釋放所占用的內存。

pIConnectionPoint.Unadvise(dwCookie);

Marshal.ReleaseComObject(pIConnectionPoint);

Mar shal.ReleaseComObject (pIConnectionPointContainer);

Marshal.ReleaseComObject(pIOPCAsyncIO2);

Marshal.ReleaseComObject(pIOPCGroupStateMgt);

Marshal.ReleaseComObject(pobjGroup1);

Marshal.ReleaseComObject(pIOPCServer);

釋放內存

使用 COM 時,客戶端有時需要釋放服務器所請求的內存。相關規則如下:

? [out]:將從服務器請求具有該屬性的參數的內存。

? [in,out] :將從客戶端請求此類參數的內存。服務器可以再次釋放內存并對其進行重新分配。

? [in] :客戶端將請求內存。服務器不負責釋放內存。

原文標題:以 C# 編寫的 OPC 自定義接口(異步通信)

文章出處:【微信公眾號:機器人PLC自動化應用】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8504

    瀏覽量

    150846
  • OPC
    OPC
    +關注

    關注

    7

    文章

    326

    瀏覽量

    46108

原文標題:以 C# 編寫的 OPC 自定義接口(異步通信)

文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    《Visual C# 2005開發技術》C#與.NET Framework簡介.pdf

    《Visual C# 2005開發技術》C#與.NET Framework簡介.pdf[hide][/hide]
    發表于 06-24 19:50

    如何創建自定義狀態回調函數呢

    狀態回調函數依賴于SDK的framework框架,且已經為用戶預留了自定義回調函數的框架,audio,bt,fs,net的狀態回調框架都是完全公開的,參照編寫即可。如何創建
    發表于 12-29 06:06

    基于Microsoft .NET FrameworkOPC

    介紹了OPC (OLE for Process Control) Data Access 規范基本內容Microsoft .NetFramework 特點。基于Microsoft .Net Framework 2.0 介紹了托管
    發表于 05-25 13:57 ?22次下載

    NET中激活基于COM的OPC數據存取定制接口

    研究C#接口屬性類后,編寫了一個COM 編排文件,將基于COM 的OPC 數據存取定制接口映射到.NET
    發表于 06-18 11:18 ?24次下載

    研究C#程序與基于COM的OPC數據存取服務器交換數據

    研究了OPC NET COM 自動化包裝器所封裝的COM 編排技術和OPC NET 應用程序接口內的設計模式。在其基礎上使用
    發表于 09-02 17:17 ?16次下載

    OPC接口技術

      •概述   •OPC基本原理   •OPC自定義接口
    發表于 10-22 16:44 ?25次下載

    DOS下自定義時間重啟

    DOS環境下,C語言編寫自定義時間重啟。
    發表于 03-16 09:40 ?6次下載

    C#教程之自定義窗體的最大化、最小化和關閉按鈕

    C#教程之自定義窗體的最大化、最小化和關閉按鈕,很好的C#資料,快來學習吧。
    發表于 04-20 09:59 ?4次下載

    C#教程之自定義屏保

    C#教程之自定義屏保,很好的C#資料,快來學習吧。
    發表于 04-20 09:59 ?7次下載

    C#教程之自定義水晶按鈕控件

    C#教程之自定義水晶按鈕控件,很好的C#資料,快來學習吧。
    發表于 04-20 10:50 ?5次下載

    C#教程之自定義動畫鼠標

    C#教程之自定義動畫鼠標,很好的C#資料,快來學習吧。
    發表于 04-20 14:46 ?4次下載

    《Visual C# 2005開發技術》C#與.NET Fram

    《Visual C# 2005開發技術》C#與.NET Framework簡介
    發表于 02-07 15:11 ?0次下載

    AVR編寫1602自定義字符

    AVR編寫自定義字符不錯的練習題目
    發表于 03-20 14:21 ?1次下載

    C#自定義開關按鈕控件(WINFORM)

    C#自定義開關按鈕控件(WINFORM)轉載于:https://www.cnblogs.com/macT/p/10212711.html
    發表于 10-21 18:36 ?17次下載
    <b class='flag-5'>C#</b><b class='flag-5'>自定義</b>開關按鈕控件(WINFORM)

    C#與STM32自定義通信協議

    C#與STM32自定義通信協議功能:1.可通過C#上位機對多臺STM32下位機進行控制2.自定義上位機與下位機通信協議
    發表于 12-24 18:59 ?37次下載
    <b class='flag-5'>C#</b>與STM32<b class='flag-5'>自定義</b>通信協議