溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#編寫OPC客戶端讀取OPC服務(wù)器的數(shù)據(jù)(最高效簡(jiǎn)潔版)

發(fā)布時(shí)間:2020-07-26 04:00:34 來(lái)源:網(wǎng)絡(luò) 閱讀:997 作者:ckllf 欄目:編程語(yǔ)言

  編寫OPC客戶端,網(wǎng)上的資料一般是一上來(lái)就要求找OPCDAAuto.dll,其實(shí)我想說(shuō),用VS,那都是多此一舉,當(dāng)然,如果你是在需要,我也可以提供給您最新版 OPCDAAuto.dll(v2.2.5.30)

  如果沒(méi)有積分,無(wú)所謂,不要也罷,因?yàn)槲覀兊膙s中本來(lái)就有,為了方便大家理解學(xué)習(xí),我新建項(xiàng)目為控制臺(tái)程序,連接對(duì)象為Kepserver服務(wù)器,針對(duì)KepServer服務(wù)器,我已經(jīng)配置好了,可以匿名登錄,

  新建控制臺(tái)程序后,引用右鍵選擇添加引用,依次選擇COM/OPC DA Automation Wrapper 2.02選中,確定。這樣就把OPCAutomation 添加到了引用中了。

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

  using OPCAutomation;//需要手動(dòng)添加

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Net;//需要手動(dòng)添加

  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或者電腦名稱;此處測(cè)試,就以本地IP測(cè)試;

  IPHostEntry host = Dns.GetHostEntry("127.0.0.1");

  //獲取此電腦上的所有OPC服務(wù)器的ProgId,有了它,才能連接到OPC服務(wù)器。注意此處為一組OPC服務(wù)器集合,

  //而非單個(gè),具體數(shù)量根據(jù)實(shí)際情況而定,當(dāng)然,也可以是一個(gè),我只是想說(shuō)它是一個(gè)服務(wù)器的集合。

  object progIds = server.GetOPCServers(host.HostName);

  foreach (string progId in (Array)progIds)

  {

  //此處是獲得單個(gè)progId,方便后面連接。

  server.Connect(progId);

  }

  //此處為常規(guī)設(shè)置,group中還有許多參數(shù)沒(méi)有設(shè)置,我都采取了它的默認(rèn)值,我沒(méi)有特殊要求,所以不用改。

  OPCGroups groups = server.OPCGroups;

  OPCGroup group = groups.Add("myGroup");

  //此處必須修改,因?yàn)槟J(rèn)訂閱功能為false;當(dāng)然你也可以根據(jù)別的方式獲取數(shù)據(jù)。

  group.IsSubscribed = true;

  group.DataChange += Group_DataChange;

  //此處為設(shè)定需要的ItemIds,就是你需要訂閱的哪些數(shù)據(jù)。

  //具體根據(jù)需求而來(lái)。

  List ItemIds= new List()

  {

  "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",

  };

  //把需要訂閱的項(xiàng)添加到group中。@

  //此處由于個(gè)人的疏忽,導(dǎo)致各位同僚們的疑惑,我在此做出更正。謝謝 阿露法的指出。

  //原為 for (int i = 0; i < progids.Count; i++)

  //修改為 for (int i = 0; i < ItemIds.Count; i++)

  //20191024091435

  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開(kāi)始,因?yàn)間etvalue沒(méi)有0.下面輸出分別為數(shù)據(jù)的ClientHandles(就是上文AddItem方法的第二個(gè)參數(shù)。),Itemvalue就是值,Qualities為質(zhì)量,timestamps為時(shí)間。

  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());

  }

  }

  }

  }

  最終結(jié)果輸出如下:

  這就是一個(gè)OPC客戶端,我想應(yīng)該是最簡(jiǎn)單的了。。。

  2019.03.30增補(bǔ):

  想起前兩天群友說(shuō),由于網(wǎng)絡(luò)原因,OPC通訊中斷了,斷了之后重新連接了就不能自動(dòng)恢復(fù)了,如果是這樣,我們只需做小小的修改即可:

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

  {

  //此處注意i是從1開(kāi)始,因?yàn)間etvalue沒(méi)有0.下面輸出分別為數(shù)據(jù)的ClientHandles(就是上文AddItem方法的第二個(gè)參數(shù)。),Itemvalue就是值,Qualities為質(zhì)量,timestamps為時(shí)間。

  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)

  {

  }

  }


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI