1fe9e8f319e1a55d8cd7ea0bf7e4eaee4d5b13d3.svn-base 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.NetworkInformation;
  8. using System.Net.Sockets;
  9. using System.Text;
  10. namespace DataGateWayProject
  11. {
  12. class GetData_From_iCos
  13. {
  14. static UdpClient client;
  15. static IPEndPoint ep;
  16. Form1 F1 = new Form1();
  17. LogFileCreate LFC = new LogFileCreate();
  18. System.Timers.Timer timer_GetData = new System.Timers.Timer();
  19. public static ConcurrentDictionary<string, string> Key_Value_Dic = new ConcurrentDictionary<string, string>();
  20. public static ConcurrentDictionary<string, string> TagName_Matching_Dic = new ConcurrentDictionary<string, string>();
  21. public string GetTagValue(string TagKey)
  22. {
  23. string Value_Return = "";
  24. Value_Return = Key_Value_Dic[TagKey];
  25. if(Value_Return=="")
  26. {
  27. Value_Return = "0";
  28. }
  29. return Value_Return; // Example only.
  30. }
  31. public void GetValueTimer()
  32. {
  33. // System.Timers.Timer timer = new System.Timers.Timer();
  34. timer_GetData.Interval = 5000;
  35. timer_GetData.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
  36. timer_GetData.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
  37. timer_GetData.Start();
  38. }
  39. public void SetTagValue(string TagName, float Tagvalue)
  40. {
  41. Readini Ri = new Readini();
  42. Ri.ReadData(); // ini의 설정값을 불러옴.
  43. int Col = 2;
  44. byte[] byteArr1;
  45. byte[] byteArr2;
  46. byte[] TmpByte = new byte[1024];
  47. //var client = new UdpClient();
  48. //IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Ri.IP1), Convert.ToInt32(Ri.Port1)); // endpoint where server is listening
  49. //client.Connect(ep);
  50. string[] tmp = new string[2];
  51. tmp[0] = TagName;
  52. tmp[1] = Convert.ToString(Tagvalue);
  53. byteArr1 = System.Text.Encoding.Default.GetBytes(tmp[1]);
  54. foreach (byte words in byteArr1) // ex)Tag1 -> T a g 1로 ....
  55. {
  56. TmpByte[Col] = words;
  57. Col++;
  58. }
  59. TmpByte[Col] = 0x3D;
  60. Col++;
  61. byteArr2 = System.Text.Encoding.Default.GetBytes(tmp[2]);
  62. foreach (byte words in byteArr2) // ex)Tag1 -> T a g 1로 ....
  63. {
  64. TmpByte[Col] = words;
  65. Col++;
  66. }
  67. TmpByte[Col] = 0x00;
  68. TmpByte[1023] = CheckSum(TmpByte);
  69. client.Send(TmpByte, 1024);
  70. try
  71. {
  72. var receive_WriteTagValue = client.Receive(ref ep);
  73. }
  74. catch(Exception e)
  75. {
  76. LFC.Log("값 설정 실패 = " + e);
  77. }
  78. }
  79. public byte CheckSum(byte[] CheckData)
  80. {
  81. byte Sum = 00;
  82. for (int bytenum = 0; bytenum < 1023; bytenum++)
  83. {
  84. Sum += CheckData[bytenum];
  85. }
  86. Sum = (byte)(Sum & 0xFF);
  87. return Sum;
  88. }
  89. public void ReadTag()
  90. {
  91. Readini Ri = new Readini();
  92. Ri.ReadData(); // ini의 설정값을 불러옴.
  93. //var client = new UdpClient(); //20170116
  94. //IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Ri.IP1), Convert.ToInt32(Ri.Port1)); // endpoint where server is listening //20170116
  95. //client.Connect(ep); //20170116
  96. byte[,] tmp = Read_TagSetFile();
  97. int Num_Row = tmp.Length / 1024;
  98. try
  99. {
  100. for (int RowNum = 0; RowNum < Num_Row; RowNum++)
  101. {
  102. byte[] Send_data = new byte[1024];
  103. for (int InsertData = 0; InsertData < 1023; InsertData++)
  104. {
  105. Send_data[InsertData] = tmp[RowNum, InsertData];
  106. }
  107. byte checksum = CheckSum(Send_data);
  108. Send_data[1023] = checksum;
  109. client.Send(Send_data, 1024);
  110. string tmpsendpacket = "";
  111. //보낸 packet
  112. LFC.Log("보낸 패킷");
  113. foreach (byte tagPacket_send in Send_data)
  114. {
  115. tmpsendpacket += tagPacket_send + " ";
  116. }
  117. LFC.Log(tmpsendpacket);
  118. var receivedData1 = client.Receive(ref ep);
  119. LFC.Log("Tag에 대한 Packet");
  120. string tmppacket = "";
  121. foreach(byte tagPacket in receivedData1)
  122. {
  123. tmppacket += tagPacket + " ";
  124. }
  125. LFC.Log(tmppacket);
  126. }
  127. }
  128. catch (Exception e)
  129. {
  130. LogFileCreate LFC = new LogFileCreate();
  131. LFC.Log("등록에러 = " + e);
  132. }
  133. }
  134. public byte[] Alive_Check()
  135. {
  136. byte[] Send_Alive = new byte[1024];
  137. Send_Alive[0] = 0x03;
  138. Send_Alive[1023] = 0x03;
  139. return Send_Alive;
  140. }
  141. public string iCos3_Conn()
  142. {
  143. Readini Ri = new Readini();
  144. LogFileCreate LFC = new LogFileCreate();
  145. Ri.ReadData(); // ini의 설정값을 불러옴.
  146. bool Re_Conn_Check = false;
  147. client = new UdpClient();
  148. var receivedData = new byte[1024];
  149. string Result_Conn_iCos = "";
  150. // 태그 값 등록_20170123 ..프로그램 시작시에 아에 태그명의 값을 0으로 설정
  151. string[] sArray = File.ReadAllLines("TagSetFile.csv", Encoding.Default);
  152. for (int i = 0; i < sArray.Length; i++) //
  153. {
  154. string[] tmp = sArray[i].Split(','); // tmp[0] = index, tmp[1] = Tag명.
  155. Key_Value_Dic.TryAdd(tmp[1], "0");
  156. }
  157. //IPEndPoint ep = new IPEndPoint(IPAddress.Parse(Ri.IP1), Convert.ToInt32(Ri.Port1)); // endpoint where server is listening
  158. ep = new IPEndPoint(IPAddress.Parse(Ri.IP1), Convert.ToInt32(Ri.Port1)); // endpoint where server is listening
  159. byte[] Send_Alive = Alive_Check(); // 생존 프로토콜 생성
  160. bool Conn_Flag = false;
  161. bool Error_Conn = false;
  162. string tmplogstring = "";
  163. try
  164. {
  165. client.Connect(ep); // 접속
  166. client.Client.SendTimeout = 5000; // send Timeout 5초 설정
  167. client.Client.ReceiveTimeout = 5000; // receive timeout 5초 설정
  168. client.Send(Send_Alive, 1024);
  169. receivedData = client.Receive(ref ep);
  170. foreach (byte tmplog in receivedData)
  171. {
  172. tmplogstring += tmplog;
  173. }
  174. LFC.Log(tmplogstring);
  175. foreach (byte tmp in receivedData)
  176. {
  177. if (tmp == 0x06)
  178. {
  179. //LogTxt.Text += "통신 오류가 발생하였습니다. 다시 시도해주세요." + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;
  180. Conn_Flag = true;
  181. client.Close();
  182. Error_Conn = true;
  183. }
  184. break;
  185. }
  186. }
  187. catch (Exception e1)
  188. {
  189. LFC.Log("접속실패 " + e1 + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  190. Result_Conn_iCos = "FAIL";
  191. Re_Conn_Check = true;
  192. }
  193. if (Re_Conn_Check == true)
  194. {
  195. for (int Re_Conn = 0; Re_Conn < 2; Re_Conn++)
  196. {
  197. try
  198. {
  199. LFC.Log("재접속 시도 중 ...접속 시도 횟수 = " + Re_Conn + " = " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  200. //LogTxt.Text += "재접속 시도 중 ...접속 시도 횟수 = " + Re_Conn + " = " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;
  201. client.Connect(ep); // 접속
  202. client.Send(Send_Alive, 1024);
  203. receivedData = client.Receive(ref ep);
  204. if (receivedData != null)
  205. {
  206. break;
  207. }
  208. }
  209. catch
  210. {
  211. LFC.Log("재접속 실패 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  212. //LogTxt.Text += "재접속 실패 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + Environment.NewLine;
  213. Result_Conn_iCos = "FAIL";
  214. }
  215. }
  216. }
  217. int len = receivedData.Length; // 수신받은데이터 길이 확인
  218. byte sum = CheckSum(receivedData); // 수신받은 데이터 체크썸 확인
  219. byte rec = receivedData[1023];
  220. string packetstring = "";
  221. foreach (byte log in receivedData)
  222. {
  223. packetstring += log + " ";
  224. }
  225. // LogTxt.Text += "수신받은 데이터의 체크섬 = " + rec + Environment.NewLine;
  226. //LogTxt.Text += "합산 = " + sum + Environment.NewLine;
  227. // LogTxt.Text += "길이 = " + len + Environment.NewLine;
  228. if (receivedData[1023] != sum || receivedData[0] == 0 || len != 1024 || Error_Conn == true) // CheckSum 과 길이 체크.
  229. {
  230. LFC.Log("체크섬 = " + Convert.ToString(sum));
  231. LFC.Log("길이 = " + Convert.ToString(len));
  232. LFC.Log("접속 실패 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  233. Result_Conn_iCos = "FAIL";
  234. }
  235. else
  236. {
  237. LFC.Log("접속 성공 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  238. Result_Conn_iCos = "SUCCESS";
  239. }
  240. return Result_Conn_iCos;
  241. }
  242. public byte[,] Read_TagSetFile()
  243. {
  244. UnicodeEncoding enc = new UnicodeEncoding();
  245. string[] TagSum = new string[2];
  246. string[] CSVReadLine = new string[2];
  247. // byte Tmp_Korean_byte = new byte();
  248. int count = 0;
  249. int One_Raw_Count = 0;
  250. int Col = 4;
  251. int Row = 0;
  252. int TotalCount = 0;
  253. int Length_Check = 0;
  254. //StreamReader sr = new StreamReader("TagSetFile.csv", Encoding.GetEncoding("euc-kr")); // 파일 한번만 읽기.
  255. string[] sArray = File.ReadAllLines("TagSetFile.csv", Encoding.Default);
  256. double Rotate = Math.Ceiling(Convert.ToDouble(sArray.Length) / 25); // Tag의 개수는 25개씩 실어서 보낼 것임. 따라서 25로 나눠 프레임을 몇번 보낼지 결정.
  257. double c = sArray.Length / 25;
  258. byte[,] TmpByte = new byte[Convert.ToInt32(Rotate), 1024]; // Row의 개수는 Rotate의 수와 같다.
  259. for (int i = 0; i < sArray.Length; i++) //
  260. {
  261. byte[] byteArr;
  262. string[] tmp = sArray[i].Split(','); // tmp[0] = index, tmp[1] = Tag명.
  263. TagName_Matching_Dic.TryAdd(tmp[0], tmp[1]);
  264. //char[] Tmp_Tag = tmp[1].ToCharArray(); //tmp[1] 의 ASCII코드 하나하나를 Hex로 바꾸기위한 과정
  265. byteArr = System.Text.Encoding.Default.GetBytes(tmp[1]);
  266. foreach (byte words in byteArr) // ex)Tag1 -> T a g 1로 ....
  267. {
  268. TmpByte[Row, Col] = words;
  269. Col++;
  270. }
  271. if (sArray.Length < 25) // TAG가 25개 이하인경우.. ROW는 1개
  272. {
  273. Length_Check++;
  274. if (sArray.Length == 1)
  275. {
  276. TmpByte[Row, Col] = 00; // 01로 Tag명을 구분함.
  277. TmpByte[Row, 0] = 0x08;
  278. byte sum = CheckSum2(TmpByte, Row);
  279. TmpByte[Row, 1023] = sum;
  280. }
  281. else if (One_Raw_Count < sArray.Length - 1)
  282. {
  283. TmpByte[Row, Col] = 01; // 01로 Tag명을 구분함.
  284. Col++;
  285. One_Raw_Count++;
  286. }
  287. else
  288. {
  289. TmpByte[Row, Col] = 00; // 01로 Tag명을 구분함.
  290. TmpByte[Row, 0] = 0x08;
  291. byte sum = CheckSum2(TmpByte, Row);
  292. TmpByte[Row, 1023] = sum;
  293. }
  294. }
  295. else // TAG가 25개 이상인 경우...
  296. {
  297. TmpByte[Row, Col] = 01; // 01로 Tag명을 구분함.
  298. Col++;
  299. }
  300. count++;
  301. if (Length_Check == 0)
  302. {
  303. if (count == 25 || (TotalCount == System.Math.Truncate(c)) && (count == sArray.Length % 25)) // Tag 25개가 쌓였을때.
  304. {
  305. //string Seq_Hex = toHex(Row);
  306. //uint num = uint.Parse(Seq_Hex, System.Globalization.NumberStyles.AllowHexSpecifier);
  307. //byte[] floatVals = BitConverter.GetBytes(num);
  308. TmpByte[Row, 0] = 0x08;
  309. if (Row == 0)
  310. {
  311. TmpByte[Row, 1] = 0x02;
  312. }
  313. else
  314. {
  315. TmpByte[Row, 1] = 0x00;
  316. }
  317. TmpByte[Row, 2] = Convert.ToByte(Row);
  318. TmpByte[Row, 3] = 0x00;
  319. Col--; // 맨 끝의 Col 을 00으로 바꾸기 위해 1칸 줄임.
  320. TmpByte[Row, Col] = 0x00; // TmpByte의 맨끝에 00을 추가함.
  321. byte sum = CheckSum2(TmpByte, Row);
  322. TmpByte[Row, 1023] = sum;
  323. count = 0; // 25번 카운트 후 다시 0으로.
  324. Col = 4; // Column 0으로 초기화
  325. Row++; // Row는 1증가
  326. TotalCount++;
  327. }
  328. }
  329. }
  330. return TmpByte;
  331. }
  332. public byte CheckSum2(byte[,] CheckData, int Row)
  333. {
  334. byte Sum = 00;
  335. for (int bytenum = 0; bytenum < 1023; bytenum++)
  336. {
  337. Sum += CheckData[Row, bytenum];
  338. }
  339. Sum = (byte)(Sum & 0xFF);
  340. return Sum;
  341. }
  342. public byte Error_Check(byte[,] CheckData, int Row)
  343. {
  344. byte Sum = 00;
  345. return Sum;
  346. }
  347. bool mConnecting = false;
  348. // delegate void TimerEventFiredDelegate();
  349. /// <summary>
  350. ///**************************************iCos 통신 타이머************************************/
  351. /// iCos와 통신해서 값을 받아오도록 하는 동작을 관할하는 타이머이다.
  352. /// </summary>
  353. void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  354. {
  355. if (mConnecting == false)
  356. {
  357. mConnecting = true;
  358. LogFileCreate LFC = new LogFileCreate();
  359. //LFC.Log("***타이머 스레드 동작 시작***");
  360. Work();
  361. //timer.Enabled = false;
  362. mConnecting = false;
  363. // LFC.Log("***타이머 스레드 동작 중단***");
  364. }
  365. }
  366. //**************************************************************************************/
  367. private My_TimerThread MTT = new My_TimerThread();
  368. private void Work()
  369. {
  370. try
  371. {
  372. byte[] a = new byte[1024]; //
  373. int tmp_hour = Convert.ToInt32(DateTime.Now.ToString("HH"));
  374. int tmp_min = Convert.ToInt32(DateTime.Now.ToString("mm"));
  375. for (int i = 0; i < 50; i++)
  376. {
  377. byte[] Obtain_Value = new byte[1024];
  378. bool TagCheck = false;
  379. bool Tag_Value_Check = false;
  380. Obtain_Value[0] = 0x02;
  381. Obtain_Value[1023] = 0x02;
  382. client.Send(Obtain_Value, 1024);
  383. var receivedData2 = client.Receive(ref ep);
  384. ////**************************************패킷 확인 부************************************/
  385. //// 통신 패킷을 확인하기 위한 부분이다.
  386. //// 00시 03시 06시 09시 12시 15시 18시 21시에 iCos와 통신하는 패킷을 로그로 남기도록 한다.
  387. //if ((tmp_hour == 0 || tmp_hour == 3 || tmp_hour == 6 || tmp_hour == 9 || tmp_hour == 12 || tmp_hour == 15 || tmp_hour == 18 || tmp_hour == 21) && (tmp_min == 00))
  388. //{
  389. // string tmpsendpacket_t = "";
  390. // foreach (byte tagPacket_send in receivedData2)
  391. // {
  392. // tmpsendpacket_t += tagPacket_send + " ";
  393. // }
  394. // LFC.Log(tmpsendpacket_t);
  395. //}
  396. ////**************************************************************************************/
  397. int Count = 0;
  398. string Tag_Name = "";
  399. string Tag_Value = "";
  400. foreach (byte Raw_Packet in receivedData2)
  401. {
  402. Count++;
  403. if (Count < 8) /// 패킷을 저장할 것인지 버릴지 판단
  404. {
  405. continue;
  406. }
  407. else
  408. {
  409. if (Raw_Packet == 0x3d)
  410. {
  411. Key_Value_Dic.TryAdd(TagName_Matching_Dic[Tag_Name], "0");
  412. TagCheck = true;
  413. Tag_Value_Check = true; // 이때부터 Tag value의 값을 수집
  414. continue;
  415. }
  416. if (Raw_Packet == 0x01)
  417. {
  418. // NULL 데이터가 들어왔을때 처리해주는 부분.
  419. // 일단 값은 0으로 해준다.
  420. if(Tag_Value == "")
  421. {
  422. Tag_Value = "0";
  423. }
  424. Key_Value_Dic.AddOrUpdate(TagName_Matching_Dic[Tag_Name], "0", (Tag_Name2, currentValue2) => Tag_Value);
  425. Tag_Name = "";
  426. Tag_Value = "";
  427. TagCheck = false;
  428. Tag_Value_Check = false;
  429. continue;
  430. }
  431. if (Raw_Packet == 0x00)
  432. {
  433. // NULL 데이터가 들어왔을때 처리해주는 부분.
  434. // 일단 값은 0으로 해준다.
  435. if (Tag_Value == "")
  436. {
  437. Tag_Value = "0";
  438. }
  439. Key_Value_Dic.AddOrUpdate(TagName_Matching_Dic[Tag_Name], "0", (Tag_Name2, currentValue2) => Tag_Value);
  440. break;
  441. }
  442. if (TagCheck == false)
  443. {
  444. // Tag명을 만들기.. Tag명을 만들기 위해서 Hex값을 ASCII코드로 변환해야함.
  445. char Tag_Name_Tmp = Convert.ToChar(Raw_Packet);
  446. Tag_Name += Tag_Name_Tmp.ToString(); // Tag_Name 은 Dictionary에서 Key값이 될 것이다.
  447. }
  448. else if (Tag_Value_Check == true)
  449. {
  450. char Tag_Value_Tmp = Convert.ToChar(Raw_Packet);
  451. Tag_Value += Tag_Value_Tmp.ToString(); // Tag_Value 는 Dictionary에서 Value값이 될 것이다.
  452. }
  453. }
  454. }
  455. Count = 0;
  456. }
  457. }
  458. catch (Exception e)
  459. {
  460. client.Close();
  461. //My_TimerThread MTT = new My_TimerThread();
  462. timer_GetData.Stop();
  463. LFC.Log("데이터 얻는 행위 중단");
  464. //MTT.timer2Stop(); 20170316
  465. //LFC.Log("연산 타이머 중단");
  466. LFC.Log("통신끊김" + e);
  467. LFC.Log("재접속시작" + Convert.ToString(DateTime.Now));
  468. Form1 F1 = new Form1();
  469. while (true)
  470. {
  471. string ReturnValue = iCos3_Conn();
  472. bool check = false;
  473. if (ReturnValue == "SUCCESS" && check == false)
  474. {
  475. check = true;
  476. My_TimerThread.check = false;
  477. LFC.Log("접속완료" + Convert.ToString(DateTime.Now));
  478. GetData_From_iCos GFi = new GetData_From_iCos();
  479. GFi.ReadTag();
  480. LFC.Log("관제점 재등록 완료" + Convert.ToString(DateTime.Now));
  481. timer_GetData.Start();
  482. LFC.Log("데이터 얻는 타이머 동작시작 완료" + Convert.ToString(DateTime.Now));
  483. //GetValueTimer(); 20170316
  484. //MTT.timer2start();
  485. break;
  486. }
  487. }
  488. }
  489. }
  490. }
  491. }