1. 程式人生 > 其它 >C#編寫OPC客戶端讀取OPC伺服器的資料(最高效簡潔版)

C#編寫OPC客戶端讀取OPC伺服器的資料(最高效簡潔版)

編寫OPC客戶端,網上的資料一般是一上來就要求找OPCDAAuto.dll,其實我想說,用VS,那都是多此一舉,當然,如果你是在需要,我也可以提供給您最新版 OPCDAAuto.dll(v2.2.5.30)(https://download.csdn.net/download/wanghuaihu/11057994);

如果沒有積分,無所謂,不要也罷,因為我們的vs中本來就有,為了方便大家理解學習,我新建專案為控制檯程式,連線物件為Kepserver伺服器,針對KepServer伺服器,我已經配置好了,可以匿名登入,具體配置方法,可參看我的博文(https://blog.csdn.net/wanghuaihu/article/details/88903273)。

新建控制檯程式後,引用右鍵選擇新增引用,依次選擇COM/OPC DA Automation Wrapper 2.02選中,確定。這樣就把OPCAutomation 新增到了引用中了。

接著,寫如下程式(所有程式如下,完整版本,稍作修改即可使用。):

using OPCAutomation;//需要手動新增
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;//需要手動新增
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
OPCServer server = new OPCServer();

//此處127.0.0.1字串,為本地IP地址,也可別的電腦IP或者電腦名稱;此處測試,就以本地IP測試;
IPHostEntry host = Dns.GetHostEntry("127.0.0.1");

//獲取此電腦上的所有OPC伺服器的ProgId,有了它,才能連線到OPC伺服器。注意此處為一組OPC伺服器集合,

//而非單個,具體數量根據實際情況而定,當然,也可以是一個,我只是想說它是一個伺服器的集合。
object progIds = server.GetOPCServers(host.HostName);
foreach (string progId in (Array)progIds)
{

//此處是獲得單個progId,方便後面連線。
server.Connect(progId);
}

//此處為常規設定,group中還有許多引數沒有設定,我都採取了它的預設值,我沒有特殊要求,所以不用改。
OPCGroups groups = server.OPCGroups;
OPCGroup group = groups.Add("myGroup");
//此處必須修改,因為預設訂閱功能為false;當然你也可以根據別的方式獲取資料。

group.IsSubscribed = true;
group.DataChange += Group_DataChange;

//此處為設定需要的ItemIds,就是你需要訂閱的哪些資料。

//具體根據需求而來。


List<string> ItemIds= new List<string>()
{
"S7-1200.0-166.BOOL",
"S7-1200.0-166.BYTE",
"S7-1200.0-166.INT",
"S7-1200.0-166.WORD",
"S7-1200.0-166.REAL",
};

//把需要訂閱的項新增到group中。

for (int i = 0; i < ItemIds.Count; i++)
{
OPCItem myItem = group.OPCItems.AddItem(ItemIds[i], i);

}

Console.ReadKey();
}

private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{

//此處注意i是從1開始,因為getvalue沒有0.下面輸出分別為資料的ClientHandles(就是上文AddItem方法的第二個引數。),Itemvalue就是值,Qualities為質量,timestamps為時間。
for (int i = 1; i < NumItems+1; i++)
{
Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" + Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());
}
}
}
}

最終結果輸出如下:


這就是一個OPC客戶端,我想應該是最簡單的了。。。



2019.03.30增補:

想起前兩天群友說,由於網路原因,OPC通訊中斷了,斷了之後重新連線了就不能自動恢復了,如果是這樣,我們只需做小小的修改即可:

private static void Group_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{

//此處注意i是從1開始,因為getvalue沒有0.下面輸出分別為資料的ClientHandles(就是上文AddItem方法的第二個引數。),Itemvalue就是值,Qualities為質量,timestamps為時間。
for (int i = 1; i < NumItems+1; i++)
{
try

{

Console.WriteLine(ClientHandles.GetValue(i).ToString() + "--" + ItemValues.GetValue(i).ToString() + "--" +

Qualities.GetValue(i).ToString() + "--" + TimeStamps.GetValue(i).ToString());

}Catch(exception e)

{

}


}
}