C#編寫OPC客戶端讀取OPC服務器的數據(最高效簡潔版)

想要了解更多,可以添加扣扣羣143440558,免費交流,免費下載以上文件,免費了解更多

編寫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,就是你需要訂閱的哪些數據。

           //具體根據需求而來。

圖1


            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 < 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開始,因爲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());
            }
        }
    }
}

最終結果輸出如下:

圖2

 

這就是一個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)

                 {

                 }


            }
        }

 

想要了解更多,可以添加扣扣羣143440558,免費交流,免費下載以上文件,免費了解更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章