//異步讀完成 運作時,Array數組從下标1開始而非0!
void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)
{
try
{
//C# Dictionary 字典
Dictionary<string, string> tagValueMap = new Dictionary<string, string>();
for (int i = 1; i <= NumItems; i++)
{
string clientHandle = ClientHandles.GetValue(i).ToString();
string tag = MAP_CLIENTHANDLE_TAG[clientHandle];
string val = ItemValues.GetValue(i).ToString();
//C# Dictionary 字典 添加資料
tagValueMap.Add(tag, val);
}
//建構json
string json = ParseOPCData(tagValueMap);
}
catch (Exception ex)
{
}
}
為全局變量OPCGroup添加items,在OPC中,每個opcltem會被配置設定一個用戶端句柄值,同時會被配置上伺服器句柄。幾乎所有有關擷取指定Opcltem對象的方法均要求指定用戶端句柄值。
上圖中有一C# Dictionary 字典,暫不做贅述,待下回分解。
關于C# dictionary字典
//goup添加items
string[] sensorIdArray;
void AddGroupItems()
{
List<string> l_str = new List<string>();
//讀取配置檔案,擷取需要的傳感器ID
string sensorIdList = getSensorId();
sensorIdArray = sensorIdList.Replace("\r\n","").Split(',');
foreach (string sensorId in sensorIdArray){
l_str.Add(sensorId+"_COS");
l_str.Add(sensorId+"_DL1");
l_str.Add(sensorId+"_DL2");
l_str.Add(sensorId+"_DL3");
l_str.Add(sensorId+"_DL4");
l_str.Add(sensorId+"_IA");
l_str.Add(sensorId+"_IB");
l_str.Add(sensorId+"_IC");
l_str.Add(sensorId+"_P");
l_str.Add(sensorId+"_Q");
l_str.Add(sensorId+"_UAB");
l_str.Add(sensorId+"_UBC");
l_str.Add(sensorId+"_UCA");
}
List<OPCItem> ItemsAdded = new List<OPCItem>();
int n = 0;
MAP_CLIENTHANDLE_TAG = new Dictionary<string, string>();
foreach (string tag in l_str){
ItemsAdded.Add(KepItems.AddItem(tag + ".PV", n));
//clientHandle tag關系
MAP_CLIENTHANDLE_TAG.Add(n + "", tag);
n++;
}
OPC_ITEMS_ADDED = ItemsAdded.ToArray();
}
OPCServer服務端資料源item

這段代碼設計為了擷取到全部的OPCltem所添加到所建立的OPCGroup對象的opcitem集合中,得到添加到goup中的item(OPC_ITEMS_ADDED)。
通過OPC_ITEMS_ADDED采集opc資料
//采集opc資料
private void GetOPCData()
{
try
{
//異步讀opc資料
int[] temp = new int[OPC_ITEMS_ADDED.Length + 1];
temp[0] = 0;
for (int i = 1; i <= OPC_ITEMS_ADDED.Length; i++)
{
temp[i] = OPC_ITEMS_ADDED[i - 1].ServerHandle;
}
Array serverHandles = (Array)temp;
Array Errors;
int cancelID;
Random rd = new Random();
int TransactionID = rd.Next(1, 10);
KepGroup.AsyncRead(serverHandles.Length - 1, ref serverHandles, out Errors, TransactionID, out cancelID);//第一參數為item數量
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
解析OPC資料并以json格式存儲在本地
//解析opc資料
private string ParseOPCData(Dictionary<string, string> tagValueMap)
{
string filename = "E:\\mine\\下峪口\\data\\electric_data.txt";
StringBuilder builder = new StringBuilder();
string rowStr = "";
string time = ConvertDateTimeToInt(DateTime.Now).ToString();
rowStr += "[";
foreach (string sensorId in sensorIdArray){
rowStr += "{\r\n\"id\":"+ "\"" + sensorId + "\",\r\n";
rowStr += "\"substation\":"+"\"假變電所\""+",\r\n";
rowStr += "\"timestamp\":"+time+",\r\n";
foreach (var item in tagValueMap)
{
string key = item.Key;
string[] data = item.Key.Split('_');
string title = data[0];
string word = data[1];
if(title.Equals(sensorId)){
rowStr += "\""+ word + "\""+ ":" + item.Value + ",\r\n";
}
}
rowStr += "},";
}
rowStr += "]";
rowStr = rowStr.Replace(",\r\n}","\r\n}").Replace(",]","]");
builder.Append(rowStr);
File.WriteAllText(@filename, builder.ToString(), Encoding.GetEncoding("gb2312"));
# **Java高頻面試專題合集解析:**

當然在這還有更多整理總結的Java進階學習筆記和面試題未展示,在這也是免費分享給那些有需要的朋友,其中囊括了**Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構資料和完整的Java架構學習進階導圖!**
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】](https://codechina.csdn.net/m0_60958482/java-p7)**
**更多Java架構進階資料展示**


d、分布式、高并發等架構資料和完整的Java架構學習進階導圖!**
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】](https://codechina.csdn.net/m0_60958482/java-p7)**[外鍊圖檔轉存中...(img-7OeChKCZ-1630931682611)]
**更多Java架構進階資料展示**
[外鍊圖檔轉存中...(img-YGmftmhf-1630931682612)]
[外鍊圖檔轉存中...(img-7FPKryBC-1630931682614)]
