本節目標:
1)安裝軟件,搭建虛擬OPC UA服務器;
2)使用UaExpert,讀取OPC UA服務器中的變量;
3)編寫Winform程序,讀寫服務器中變量值,創建訂閱觸發事件;
下圖是根據上面的要求最終的運行結果,可以讀寫PLC寄存器,OPC UA Simulation Server中的Trigger值變化會主動觸發一個顯示變化后值的彈窗。
1.1 環境配置
下載兩個軟件:OPC UA Simulation Server 和 UaExpert
Prosys OPC UA Simulation Server
OPC UA Clients?-?Unified Automation
1.1.1 OPC UA Simulation Server
1)安裝完成后,打開軟件OPC UA Simulation Server
選擇專家模式
2)新建變量Trigger
3)設置匿名登錄
設置完成后重啟軟件。
1.1.2 UaExpert使用
1)打開UaExpert,此為OPC客戶端,用于測試服務器
點擊加號
2)創建連接
輸入URL,這個是根據前面的虛擬服務器定的。
選擇匿名登錄
3)連接
4)將變量拉入到顯示界面處。
可以看到變量的值,同時也可以修改值。后面需要根據上面的Node Id來進行編程。
1.2 編程
新建Winform項目,OpcUaClient_example。
思維導圖如下:
1.2.1 界面設計
4個TextBox(txtServerUrl、txtNode、txtReadData、txtWriteData);
3個按鈕(btn_Connect、btn_Read、btn_Write);
5個Label(顯示狀態lblStatus);
1.2.2 程序設計
主界面的程序流程圖如下所示:
1)添加依賴包
項目->管理NuGet程序包,輸入OpcUaHelper,下載依賴包。
2)添加命名空間
using Opc.Ua;
using Opc.Ua.Client;
using OpcUaHelper;
3)變量
//實例化
OpcUaClient m_OpcUaClient = new OpcUaClient();
4)連接按鈕事件
private async void btnConnect_Click(object sender, EventArgs e)
{if (btn_Connect.Text == "Connect"){m_OpcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());//匿名鏈接try{await m_OpcUaClient.ConnectServer(txtServerUrl.Text.ToString());//鏈接服務器m_OpcUaClient.AddSubscription("AA", "ns=3;s=Trigger", SubCallback);//訂閱節點,值變化即觸發事件lblStatus.Text = "連接成功!";}catch (Exception ex){ClientUtils.HandleException("Connected Failed", ex);}btn_Connect.Text = "Disconnect";}else{m_OpcUaClient.RemoveSubscription("AA");//取消訂閱m_OpcUaClient.Disconnect();//斷開連接lblStatus.Text = "斷開連接!";btn_Connect.Text = "Connect";}}
5)訂閱回調函數
private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args)
{if (InvokeRequired){Invoke(new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>(SubCallback), key, monitoredItem, args);return;}if (key == "AA"){// 如果有多個的訂閱值都關聯了當前的方法,可以通過key和monitoredItem來區分MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;if (notification != null){MessageBox.Show("Trigger變量值變化:"+notification.Value.WrappedValue.Value.ToString()); //獲取變化的值}}
}
6)讀取按鈕事件
private void btnRead_Click(object sender, EventArgs e)
{try{double value = m_OpcUaClient.ReadNode<double>(txtNode.Text);//讀取單個節點值txtReadData.Text = value.ToString();}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}
7)寫入按鈕事件
private void btnWrite_Click(object sender, EventArgs e)
{try{m_OpcUaClient.WriteNode(txtNode.Text, Convert.ToDouble(txtWriteData.Text));//寫入單個節點值}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}
1.3 運行
編譯完成后,運行程序。點擊Connect按鈕,連接OPC UA服務器完成。
分別點擊寫入和讀取按鈕,可以看到OPC UA Simulation Server的Random值在變化。
在OPC UA Simulation Server修改Trigger的值,winform程序會彈窗,顯示修改后的值。
該節展現的內容是通用OPC UA的連接、讀寫、事件訂閱等功能的展示,可以作為需要OPC通訊集成項目的參考。