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

        }
    }
}

 

發佈了28 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章