天天看點

基于OPC和TCP/IP的資料采集處理學習

1.OPC相關資源和學習資料

  • OPC軟體

KEPServerEX v6安裝包百度網盤連結提取碼:tb27 

KEPServerEX v6安裝教程

  • OPC相關教程

KEPServer EX6的配置

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

KepServer 6.5模拟

C# 讀寫opc ua伺服器,浏覽所有節點,讀寫節點,讀曆史資料,調用方法,訂閱,批量訂閱操作

Java OPC client開發踩坑記

  • OPC學習

OPC用戶端通路OPC伺服器的3步:明确連接配接哪個OPC伺服器,添加需要通路的資料标簽,設定處理資料變化的函數。

DLL針對這3個步驟,提供了3個函數:Connect,AddTag和SetDataChangeEvent。

如何使用DLL:

1、在工程的解決方案中“引用”,“浏覽”,找到DLL,再引用它。

2、通過DLL提供的類,執行個體化一個管理器。

3、按照OPC用戶端的工作步驟,通過調用這個類提供的對應函數進行OPC操作。

using OPCAutomation;
using System;
using System.Collections.Generic;
using System.Net;


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>(){
                "simulator.Test.k0",
                "simulator.Test.k0",
                
            };
            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.TCP相關

  • TCP相關教程

C#網絡程式設計

C#程式設計 socket程式設計之tcp伺服器端和用戶端

  • TCP學習

伺服器端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.建立socket
            //使用指定的尋址位址族、套接字類型和協定初始化Socket類的新執行個體,實作套接字接口
            Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //2.綁定ip跟端口号
            //用指定為byte數組的位址初始化IPAddress的新執行個體,提供ip位址
            IPAddress ipaddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
            //用指定的位址和端口号初始化EndPoint的新執行個體,對ip+端口做了一層封裝構成辨別網絡位址
            EndPoint point = new IPEndPoint(ipaddress, 6666);
            //使Socket與本地一個網絡位址相連,用來做通信
            tcpServer.Bind(point);
            //3.利用Listen()方法開始監聽(等待用戶端連接配接)
            //将socket置于監聽狀态,挂起連接配接隊列的最大長度是100
            tcpServer.Listen(100);
            //将指定字元串寫入标準輸入流
            Console.WriteLine("開始監聽");
            //4.利用Accept()方法嘗試與用戶端建立一個連接配接
            //如果新的連接配接建立,Accept()傳回,建立新的Socket
            Socket clienSocket = tcpServer.Accept();
            Console.WriteLine("一個用戶端連接配接過來了");
            string msg = "Connected";
            //将指定字元串中的字元編碼為一個位元組序列
            byte[] data = Encoding.UTF8.GetBytes(msg);
            //5.使用Send()在套接字上寫資料
            //将資料發送到連接配接的Socket
            clienSocket.Send(data);
            Console.WriteLine("向用戶端發送了一條資料");
            //建立一個位元組數組用來當作容器,存儲用戶端發送過來的資料
            byte[] data2 = new byte[1024];
            //6.使用Receive()在套接字上讀資料
            //從綁定的套接字接收資料,存入資料緩沖區
            int length = clienSocket.Receive(data2);
            //将指定位元組數組的一個位元組序列解碼為一個字元串
            string msg2 = Encoding.UTF8.GetString(data2,0,length);
            Console.WriteLine("接收到了一個用戶端發送過來的消息:" + msg2);
            //擷取使用者按下的下一個字元或功能鍵
            Console.ReadKey();
        }
    }
}
           

用戶端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.建立Socket tcpClient
            Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //2.通過ip和端口号定位一個要連接配接的伺服器端
            IPAddress ipaddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
            EndPoint point = new IPEndPoint(ipaddress, 6666);
            //3.建立與遠端主機的聯系
            tcpClient.Connect(point);
            byte[] data = new byte[1024];
            int length = tcpClient.Receive(data);
            string msg = Encoding.UTF8.GetString(data, 0, length);
            Console.WriteLine(msg);
            string msg2 = Console.ReadLine();
            tcpClient.Send(Encoding.UTF8.GetBytes(msg2));
            Console.ReadKey();

        }
    }
}