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