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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

(OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法...

發布時間:2025/3/20 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 背景

OPC Data Access?規范是基于COM/DCOM定義的,因此大多數的OPC DA Server和client都是基于C++開發的,因為C++對COM/DCOM有最好的支持?,F在,隨著微軟的開發平臺漸漸的轉移到.NET框架上,好多OPC Client程序都需要建立在.NET平臺上,用.NET提供的技術開發OPC Client就成為一種需求。網上很多網友都有提過,.NET開發OPC Client不外乎下面三種方法:

  • 使用OPCNetAPI 2.0,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll;
  • 使用自動化接口,需要用到OPCDAAuto.dll;
  • 使用自定義接口,需要用到多個.NET Wrapper:OpcRcw.Ae.dll,OpcRcw.Batch.dll,OpcRcw.Comn.dll,OpcRcw.Da.dll,OpcRcw.Dx.dll,OpcRcw.Hda.dll,OpcRcw.Sec.dll;

    ? ?

    OPCNetAPI 2.0由OPC foundation提供,只有注冊會員才能得到,是需要付費的。其他的dll不需要付費,很容易得到。網上有網友已經介紹過使用OPCDAAuto.dll開發.NET Client的方法,?這種方法的優點是比較簡單,缺點是不夠靈活。本文使用自定義接口,借助OpcRcw.Da.dll,開發出一個OPC .NET Client的類庫,可供其他client程序調用。

    ?

  • 必要文件:

    OpcRcw.Comn.dll ---?包含對IConnectionPointContainer的包裝。

    OpcRcw.Da.dll ---.NET?對OPC COM?接口?定義的包裝。

    ?

  • 適應版本:

    OPC Data Access specification 2.05

    ?

  • 說明:

    該類庫正在開發中,這是第一個版本,只實現了一些基本功能,好多功能如OPC Browse等還未實現,代碼也未經過測試,存在bug在所難免,感興趣的朋友請繼續關注。。。

    ? ?

2. VS2008工程項目文件

  • 基本類庫視圖

    ? ?

    下圖是OpcDa.Client組件實現的基本類庫:

    ? ?

    ? ?

  • 3. 類庫實現的基本功能

    OpcServer:

    Connect

    連接OPC Server。

    Disconnect

    斷開Server。

    GetStatus

    獲得Server的當前狀態,返回ServerStatus。

    AddGroup

    添加group

    RemoveGroup

    刪除group

    FindGroupByName

    通過名字獲取OpcGroup對象

    ? ?

    Opc Group:

    AddItems

    添加Opc Items到組

    RemoveItems

    刪除items

    AsyncRead

    異步讀取Items,調用IOPCAsyncIO2::Read接口

    AsyncWrite

    異步寫items,調用IOPCAsyncIO2::Write接口

    Refresh

    刷新當前group,調用IOPCAsyncIO2::Refresh接口

    GetState

    獲得當前group狀態,返回GroupState

    SetState

    設置當前group狀態,返回設置后的group狀態

    DataChanged

    事件,客戶端注冊,可用來接收OnDataChange事件

    ? ?

    4. 類庫使用方法

    1) 連接OPC DA server

    ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 string?serverProgID = "OPCSample.OpcDa20Server.1"; // opc da sample server prog id string?hostName = string.Empty; //local server Type tp = Type.GetTypeFromProgID(serverProgID); this._opcServer = new?OpcServer(tp.GUID.ToString(), hostName); try { ????this._opcServer.Connect(); } catch?(Exception ex) { ????MessageBox.Show(ex.Message, ????????"Error", ????????MessageBoxButtons.OK, ????????MessageBoxIcon.Error); }

    ?

    ??

    2) 斷開OPC Server

    ?

    1 2 3 4 5 if?(this._opcServer != null) ?{ ?????this._opcServer.Disconnect(); ?????this._opcServer = null; ?}

    ?

    3) 添加Group

    ?

    ?

    ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 string?groupName = "grp_0";? // group name int?updateRate = 1000; bool?active = true; try { ????OpcGroup grp = this._opcServer.AddGroup(groupName, updateRate, active); ????grp.DataChanged += OnDataChange; //register OnDataChange Event } catch?(Exception ex) { ????MessageBox.Show(ex.Message, ????????????????????????"Error", ????????????????????????MessageBoxButtons.OK, ????????????????????????MessageBoxIcon.Error); }

    ?

    其中OnDataChange?定義為DataChangedEventHandler類型:

    ?

    1 2 3 public?delegate?void?DataChangedEventHandler(object?subscriptionHandle, object?requestHandle, ItemValueResult[] values); private?void?OnDataChange(object?subscriptionHandle, object?requestHandle, ItemValueResult[] values);

    ?

    ?

    4) 刪除Group

    ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 try { ?????OpcGroup grp = this._opcServer.FindGroupByName(groupName ); ?????if?(grp != null) ?????{ ??????????????grp.DataChanged -= OnDataChange; //unregister OnDataChange Event ??????????????this._opcServer.RemoveGroup(grp); ?????} } catch?(Exception ex) { ????MessageBox.Show(ex.Message, ?????????????????"Error", ??????????????????MessageBoxButtons.OK, ??????????????????MessageBoxIcon.Error); }

    ?

    5) 添加Items

    ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 List<string> items = new?List<string>(); Items.Add("itemname"); OpcGroup grp = this._opcServer.FindGroupByName(groupName); if?(grp != null) { ????try ????{ ????????ItemResult[] results = grp.AddItems(items.ToArray()); ????????foreach?(ItemResult result in?results) ????????{ ????????????if?(result.ResultID.Failed()) ????????????{ ????????????????string?message = "Failed to add item \'"?+ result.ItemName + "\'"?+ " Error: "?+ result.ResultID.Name; ????????????????MessageBox.Show(message); ????????????} ????????????else ????????????{ ????????????????AddItemToList(result); // add item to view list ????????????} ????????} ????} // end try ????catch?(Exception ex) ????{ ????????MessageBox.Show(ex.Message, ????????????????????????????"Error", ????????????????????????????MessageBoxButtons.OK, ????????????????????????????MessageBoxIcon.Error); ????} // end catch } // end if

    ?

    6) 刪除Items

    ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 // remove items // List<object> itemsClientHandle = new List<object>();?? // if?(itemsClientHandle.Count > 0) { ????try ????{ ????????// get group ????????OpcGroup grp = this._opcServer.FindGroupByName(groupName); ????????if?(grp != null) ????????{ ????????????IdentifiedResult[] results = grp.RemoveItems(itemsClientHandle.ToArray()); ????????????for?(int?i = 0; i < results.Length; i++) ????????????{ ????????????????if?(results[i].ResultID.Succeeded()) ????????????????{ ????????????????????// remove opc item from server successfully, remove it from list ????????????????????RemoveItemFromList(results[i]); ????????????????} ????????????????else ????????????????{ ????????????????????string?message = "Remove item \'"?+ results[i].ItemName + "\' error: "?+ results[i].ResultID.ToString(); ????????????????????MessageBox.Show(message); ????????????????} ????????????} ????????} ????} ????catch?(Exception ex) ????{ ????????MessageBox.Show(ex.Message, ????????????????????????????"Error", ????????????????????????????MessageBoxButtons.OK, ????????????????????????????MessageBoxIcon.Error); ????} // end catch }

    ?

    7) 異步讀取Items

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 List<object> clientHandles = new?List<object>(); foreach?(ListViewItem lvItem in?items) { ????ItemResult item = (ItemResult)lvItem.Tag; ????if?(item != null) ????{ ????????clientHandles.Add(item.ClientHandle); ????} } if?(clientHandles.Count > 0) { ????// get group ????OpcGroup grp = this._opcServer.FindGroupByName(groupName); ????if?(grp != null) ????{ ????????try ????????{ ????????????IdentifiedResult[] results = grp.AsyncRead(clientHandles.ToArray(), ++this._handle, new?ReadCompleteEventHandler(OnReadComplete), out?this._request); ????????????for?(int?i = 0; i < results.Length; i++) ????????????{ ????????????????if?(results[i].ResultID.Failed()) ????????????????{ ????????????????????string?message = "Failed to read item \'"?+ results[i].ItemName + "\' error: "?+ results[i].ResultID.ToString(); ????????????????????MessageBox.Show(message); ????????????????} ????????????} ????????} ????????catch?(Exception ex) ????????{ ????????????MessageBox.Show(ex.Message); ????????} ????} }

    ???

    其中OnReadComplete用來接收異步讀取的數據結果,其定義為:

    1 private?void?OnReadComplete(object?clientHandle, ItemValueResult[] values);

    ???

    8)?異步寫Items

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 // get group ?OpcGroup grp = this._opcServer.FindGroupByName(groupName); ?if?(grp != null) ?{ ?????try ?????{ ?????????IdentifiedResult[] results = grp.AsyncWrite(new?ItemValue[] { itemValue }, ++_handle, new?WriteCompleteEventHandler(this.OnWriteComplete), out?_request); ?????????for?(int?i = 0; i < results.Length; i++) ?????????{ ?????????????if?(results[i].ResultID.Failed()) ?????????????{ ?????????????????string?message = "Failed to write item \'"?+ results[i].ItemName + "\' error: "?+ results[i].ResultID.ToString(); ?????????????????MessageBox.Show(message); ?????????????} ?????????} ?????} ?????catch?(Exception ex) ?????{ ?????????MessageBox.Show(ex.Message); ?????} ?}

    其中OnWriteComplete用來接收異步寫的返回結果,其定義為:

    private void OnWriteComplete(object clientHandle, IdentifiedResult[] results);

    ? ?

    類庫的具體使用舉例可以參照OpcTestClient程序。

    ?

    5.?OpcTestClient?用戶界面

    ?

    OPC 接口 .NET 包裝組件下載:

    OpcRcw.zip

    源代碼下載:

    OpcDaClient.zip

    總結

    以上是生活随笔為你收集整理的(OPC Client .NET 开发类库)网上很多网友都有提过,.NET开发OPC Client不外乎下面三种方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美 日韩 国产 成人 在线 | 日本免费a级片 | 国产一道本| se日韩| 国产天天射 | 久久久久亚洲av成人片 | 成人自拍偷拍 | 色综合天天操 | 亚洲无码一区二区三区 | 精品精品视频 | 亚洲无码精品一区二区三区 | 法国空姐在线观看视频 | 日本在线一本 | 亚洲爱爱网 | 四川黄色一级片 | 在线国产日韩 | 色噜噜网站 | 天堂va蜜桃一区二区三区漫画版 | 欧美中文日韩 | www..com色 | 美女网站全黄 | 九九久久视频 | 国产日视频 | 免费三级网站 | 国产亚洲精品成人av在线 | 免费看av网 | 精品少妇久久久 | 第一页在线视频 | 成人午夜免费福利视频 | 国产区视频在线观看 | 你懂的国产在线 | videosex抽搐痉挛高潮 | 香港台湾日本三级大全 | 欧美成人国产精品高潮 | 国产精品815.cc红桃 | 亚洲一区不卡 | 在线观看亚洲视频 | 少妇搡bbbb搡bbb搡打电话 | 免费成人高清 | 国产网站免费观看 | av免费看网址 | 女futa攻玩遍整个后宫 | 很黄的性视频 | 日韩淫视频 | 综合热久久 | 亚洲区综合 | 久久日精品 | 亚洲一二三区在线观看 | 免费毛片在线播放免费 | 十大污视频 | 91黄漫| 性欧美极品 | 亚洲性少妇 | 舐丝袜脚视频丨vk | 欧美丰满熟妇xxxxx | 精品乱码一区二区三区 | 四虎精品一区二区三区 | 欧美成人精品激情在线视频 | 亚洲综合精品国产一区二区三区 | 日韩精品欧美精品 | 久久九九热视频 | 在线观看中文字幕码 | 嫩色av | 国产一区二区三区观看 | 亚洲黄色网络 | 91精品免费看 | 国产精品久久久久久福利 | 丁香花高清在线观看完整动漫 | 国产精品后入内射日本在线观看 | 少妇导航av | 欧美色一区二区三区在线观看 | 色偷偷久久 | 91成品人影院 | 超碰蜜臀 | 热99在线| 国产18在线 | 福利视频亚洲 | 日韩毛片在线观看 | 亚洲伦理影院 | 亚洲天堂女人 | 日韩国产欧美综合 | 夜夜摸夜夜爽 | 齐天大性床战铁扇公主 | 麻豆精品在线播放 | 国产精品美女久久久久av爽 | 91视频你懂的 | 香蕉久久国产av一区二区 | 91视频色版 | 亚洲精品久久久久中文字幕二区 | 国产综合视频一区 | 一二三区免费视频 | 日本不卡一区视频 | 华丽的外出在线观看 | 国产一级色| 美女视频黄a视频全免费观看 | 四虎影院永久地址 | 国产精品无码一区二区无人区多人 | 一级片中文 | av生活片|