1.OPC相關資源和學習資料
-
OPC軟件
KEPServerEX v6安裝包百度網盤鏈接提取碼:tb27
-
OPC相關教程
C# 讀寫opc ua服務器,瀏覽所有節點,讀寫節點,讀歷史數據,調用方法,訂閱,批量訂閱操作
-
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相關教程
-
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();
}
}
}