電工學習網

 找回密碼
 立即注冊
電工學習網 電工學習網 技術文庫 plc OPC 查看內容

基于OPC UA客戶端上位機編寫應用心得分享

2021-2-9 09:18| 編輯:電工學習網| 查看: 2041| 評論: 0

 基于opc UA客戶端上位機編寫

使用自動化接口進行OPCDA的客戶端編寫,但是OPCDA是基于COM/DCOM的技術,如果服務器與客戶端不在同一臺電腦上配置較為復雜;基于COM/DCOM的技術有著不可根除的缺點,因此隨著技術的進步,以及數據交換各方面需求的提高,OPC基金會在2008年發布了新的規范:OPC UA。OPC UA規范不再是基于COM/DCOM技術,因此OPC UA不僅能在Windows平臺上實現,更可以在Linux,以及其他的嵌入式平臺中實現。

與傳統OPC規范相同,OPC UA同樣有著相同的設計目標:

1.功能等價:所有的基于COM的OPC規范中的功能,都映射到了OPC UA中。

2. 多平臺支持:支持從嵌入式的微控制器到基于云的分散式控制架構。

3.安全:信息加密,互訪認證以及安全監聽功能。

4.擴展性:不影響現有應用程序的情況下,就可以添加新的功能。

5.豐富的信息建模:可定義復雜的信息,而不再是單一的數據。

OPCUA服務器配置

本次OPCUA服務器依然使用KEPServerEX 6,配置如下:

1、在托盤找到KEPServerEX 6圖標,右鍵彈出菜單,點擊OPCUA配置

1.jpg

2、在彈出的配置界面進行如下圖的配置:

2.jpg

3、打開KEPServerEX 6主界面,右鍵點擊項目,選擇屬性,進行配置如下,即完成OPCUA服務器配置;

3.jpg


03

軟件編寫

1、軟件實現節點瀏覽,添加訂閱,移除訂閱,清空訂閱的功能,演示界面如下:

4.gif

2、本次代碼實現主要基于OPC UA的最新官方庫二次封裝的一個類庫:OpcUaHelper.dll,開源地址:
https://github.com/dathlin/OpcUaHelper;準備好開發的IDE,新建項目。注意:項目的.NET Framework版本最低為4.6。打開NuGet管理器,引用OpcUaHelper;

5.jpg


3、代碼編寫:

<1> 建立連接

private void button1_Click(object sender, EventArgs e)

{

opcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());

opcUaClient.ConnectServer(textBox1.Text);

PopulateBranch(ObjectIds.ObjectsFolder, treeView1.Nodes);

}

<2>節點瀏覽

private async void PopulateBranch(NodeId sourceId, TreeNodeCollection nodes)

{

odes.Clear();

nodes.Add(new TreeNode("Browsering..."));

// fetch references from the server.

TreeNode[] listNode = await Task.Run(() =>

{

ReferenceDescriptionCollection references = GetReferenceDescriptionCollection(sourceId);

List<TreeNode> list = new List<TreeNode>();

if (references != null)

{

// process results.

for (int ii = 0; ii < references.Count; ii++)

{

ReferenceDescription target = references[ii];

TreeNode child = new TreeNode(Utils.Format("{0}", target));

child.Tag = target;

child.Nodes.Add(new TreeNode());

list.Add(child);

}

}

return list.ToArray();

});

//更新顯示的屬性

// DisplayAttributes(sourceId);

nodes.Clear();

nodes.AddRange(listNode.ToArray());

}

private ReferenceDescriptionCollection GetReferenceDescriptionCollection(NodeId sourceId)

{

//TaskCompletionSource<ReferenceDescriptionCollection> task = new TaskCompletionSource<ReferenceDescriptionCollection>();

// 找到所有組件的節點

BrowseDescription nodeToBrowse1 = new BrowseDescription();

nodeToBrowse1.NodeId = sourceId;

nodeToBrowse1.BrowseDirection = BrowseDirection.Forward;

nodeToBrowse1.ReferenceTypeId = ReferenceTypeIds.Aggregates;

nodeToBrowse1.IncludeSubtypes = true;

nodeToBrowse1.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.View | NodeClass.VariableType | NodeClass.DataType);

nodeToBrowse1.ResultMask = (uint)BrowseResultMask.All;

// 找到所有節點組織的節點.

BrowseDescription nodeToBrowse2 = new BrowseDescription();

nodeToBrowse2.NodeId = sourceId;

nodeToBrowse2.BrowseDirection = BrowseDirection.Forward;

nodeToBrowse2.ReferenceTypeId = ReferenceTypeIds.Organizes;

nodeToBrowse2.IncludeSubtypes = true;

nodeToBrowse2.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable | NodeClass.Method | NodeClass.View | NodeClass.ReferenceType | NodeClass.ObjectType | NodeClass.VariableType | NodeClass.DataType);

nodeToBrowse2.ResultMask = (uint)BrowseResultMask.All;

BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection();

nodesToBrowse.Add(nodeToBrowse1);

nodesToBrowse.Add(nodeToBrowse2);

// 從服務器獲取引用

ReferenceDescriptionCollection references = FormUtils.Browse(opcUaClient.Session, nodesToBrowse, false);

return references;

}

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)

{

try

{

// check if node has already been expanded once.

if (e.Node.Nodes.Count != 1)

{

return;

}

if (e.Node.Nodes.Count > 0)

{

if (e.Node.Nodes[0].Text != String.Empty)

{

return;

}

}

// get the source for the node.得到的源節點

ReferenceDescription reference = e.Node.Tag as ReferenceDescription;

if (reference == null || reference.NodeId.IsAbsolute)

{

e.Cancel = true;

return;

}

// populate children.

PopulateBranch((NodeId)reference.NodeId, e.Node.Nodes);

}

catch (Exception exception)

{

ClientUtils.HandleException(this.Text, exception);

}

}

看過《基于OPC UA客戶端上位機編寫應用心得分享》的人還看了以下文章:

最新評論

|電工學習網 ( )

GMT+8, 2021-5-10 04:57

Powered by © 2011-2021 www.zbkzs.com 版權所有 免責聲明 不良信息舉報

技術驅動未來! 電工學習網—專業電工基礎知識、電工技術學習網站。

欄目導航: 工控家園 | 三菱plc | 西門子plc | 歐姆龍plc | plc視頻教程

返回頂部
深圳欢乐海岸门票