Parsing.cs 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Diagnostics;
  7. using System.Windows.Forms;
  8. using System.Collections.Concurrent;
  9. using System.Runtime.InteropServices;
  10. using System.Timers;
  11. using System.Threading;
  12. using System.Data.SqlClient;
  13. using System.Data;
  14. using System.Text.RegularExpressions;
  15. namespace DataGateWayProject
  16. {
  17. class Parsing
  18. {
  19. //System.Timers.Timer timer3 = new System.Timers.Timer();
  20. Thread _thread;
  21. ConcurrentDictionary<string, float[]> RawData = new ConcurrentDictionary<string, float[]>();
  22. ConcurrentDictionary<string, float[]> NowData = new ConcurrentDictionary<string, float[]>();
  23. ConcurrentDictionary<string, float[]> AverageData = new ConcurrentDictionary<string, float[]>();
  24. ConcurrentDictionary<string, float[]> AddData = new ConcurrentDictionary<string, float[]>();
  25. ConcurrentDictionary<string, float[]> OnData = new ConcurrentDictionary<string, float[]>();
  26. ConcurrentDictionary<string, float[]> Add2Data = new ConcurrentDictionary<string, float[]>();
  27. ConcurrentDictionary<string, float[]> Now2Data = new ConcurrentDictionary<string, float[]>();
  28. ConcurrentDictionary<string, float[]> TmpAverageData = new ConcurrentDictionary<string, float[]>();
  29. ConcurrentDictionary<string, float[]> TmpAddData = new ConcurrentDictionary<string, float[]>();
  30. ConcurrentDictionary<string, float[]> TmpNowData = new ConcurrentDictionary<string, float[]>();
  31. ConcurrentDictionary<string, float[]> TmpOnData = new ConcurrentDictionary<string, float[]>();
  32. ConcurrentDictionary<string, float[]> TmpNow2Data = new ConcurrentDictionary<string, float[]>();
  33. ConcurrentDictionary<string, float[]> TmpAdd2Data = new ConcurrentDictionary<string, float[]>();
  34. ConcurrentDictionary<string, float[]> TmpRawData = new ConcurrentDictionary<string, float[]>();
  35. ConcurrentDictionary<string, float[]> Exp_Raw_Data = new ConcurrentDictionary<string, float[]>();
  36. ConcurrentDictionary<string, float[]> Exp_Fifteen_Data = new ConcurrentDictionary<string, float[]>();
  37. ConcurrentDictionary<string, float[]> Exp_Hour_Data = new ConcurrentDictionary<string, float[]>();
  38. ConcurrentDictionary<string, string> Matching_Tag = new ConcurrentDictionary<string, string>();
  39. ConcurrentDictionary<string, string> Value_Modify = new ConcurrentDictionary<string, string>();
  40. ConcurrentDictionary<string, float[]> COV_Dic = new ConcurrentDictionary<string, float[]>();
  41. /// <summary>
  42. /// 엔탈피 계산하는 부분
  43. /// </summary>
  44. /// <param name="curtTemp"></param>
  45. /// <param name="relatvHum"></param>
  46. /// <returns></returns>
  47. static double enthalpy_proc(double curtTemp, double relatvHum) //현재온도, 상대습도
  48. {
  49. double retValue = 0.0;
  50. double tmpValue1, tmpValue2;
  51. tmpValue1 = (Math.Exp(((((6.18145E-12 * curtTemp - 0.000000003429809) * curtTemp + 0.000001113417) * curtTemp - 0.0002986334) *
  52. curtTemp + 0.07265429) * curtTemp - 5.111336) * 760) * (relatvHum / 100);
  53. tmpValue2 = (Math.Exp(((((6.18145E-12 * curtTemp - 0.000000003429809) * curtTemp + 0.000001113417) * curtTemp - 0.0002986334) * 39 + 0.07265429) *
  54. curtTemp - 5.111336) * 760) * (relatvHum / 100);
  55. retValue = ((0.288 * curtTemp + 727.344 * (0.622 * tmpValue1 / (760 - tmpValue2))) / 1.2) * 4.186;
  56. return retValue;
  57. }
  58. /// <summary>
  59. /// 절대 습도 계산하는 부분
  60. /// </summary>
  61. /// <param name="curtTemp"></param>
  62. /// <param name="relatvHum"></param>
  63. /// <returns></returns>
  64. static double absoluteHumidity_proc(double curtTemp, double relatvHum)
  65. {
  66. double retValue = 0.0;
  67. double enthalpyValue;
  68. enthalpyValue = enthalpy_proc(curtTemp, relatvHum);
  69. retValue = (enthalpyValue - 1.006 * curtTemp) / (1.805 * curtTemp + 2501);
  70. return retValue;
  71. }
  72. private string[] temp;
  73. public string SettingFileParsing()
  74. {
  75. Stopwatch SW = new Stopwatch();
  76. string sTemp1;
  77. SW.Reset();
  78. SW.Start();
  79. LogFileCreate LFC = new LogFileCreate();
  80. int count_modify_value = 0;
  81. StreamReader MatchingDic = new StreamReader("SettingFile.csv", Encoding.GetEncoding("euc-kr")); // 파일 한번만 읽기.
  82. string[] Matching_Key_Value;
  83. while (!MatchingDic.EndOfStream) // Stream의 끝이 올때까지 반복
  84. {
  85. string s = MatchingDic.ReadLine(); // 한줄을 읽음.
  86. if (!(s.Length > 0))
  87. {
  88. continue;
  89. }
  90. Matching_Key_Value = s.Split(','); // Split() 메서드를 이용하여 ',' 구분하여 잘라냄
  91. Matching_Tag.TryAdd(Matching_Key_Value[3], Matching_Key_Value[0]); // [Key] = TagXXX [Value] = 1.1.4478.xxx
  92. }
  93. MatchingDic.Close();
  94. MatchingDic.Dispose();
  95. StreamReader Modify_Value = new StreamReader("Modify_Value.csv", Encoding.GetEncoding("euc-kr")); //Modify_Value 의 형식 -> 3, ch.ctrl.tag3,Tag3+2,1.1.4478.3
  96. string[] temp_Modify_Value;
  97. while (!Modify_Value.EndOfStream) // Stream의 끝이 올때까지 반복
  98. {
  99. string s = Modify_Value.ReadLine(); // 한줄을 읽음.
  100. if (!(s.Length > 0))
  101. {
  102. continue;
  103. }
  104. temp_Modify_Value = s.Split(','); // Split() 메서드를 이용하여 ',' 구분하여 잘라냄 [0]은 serial num, [1]은 Tag명, [2]는 식 , [3] bems포인트
  105. Value_Modify.TryAdd(temp_Modify_Value[3].Trim(), temp_Modify_Value[2].Trim()); // Value_modifty Dic의 형식은 [1.1.4478.1] [Tag3+2]와 같은형식.
  106. count_modify_value++; // count를 한개늘림.
  107. }
  108. Modify_Value.Close();
  109. Modify_Value.Dispose();
  110. LFC.Log("[Parsing] 동작시작");
  111. float value = 0;
  112. for (int TypeSelect = 0; TypeSelect < 9; TypeSelect++)
  113. {
  114. try
  115. {
  116. LFC.Log("[Parsing] 연산시작 Type : " + TypeSelect);
  117. StreamReader sr = new StreamReader("SettingFile.csv", Encoding.GetEncoding("euc-kr")); // 파일 한번만 읽기.
  118. while (!sr.EndOfStream) // Stream의 끝이 올때까지 반복
  119. {
  120. string s = sr.ReadLine(); // 한줄을 읽음.
  121. if (!(s.Length > 0))
  122. {
  123. continue;
  124. }
  125. temp = s.Split(','); // Split() 메서드를 이용하여 ',' 구분하여 잘라냄
  126. temp[0] = temp[0].Trim();
  127. temp[1] = temp[1].Trim();
  128. temp[2] = temp[2].Trim();
  129. temp[4] = temp[4].Trim();
  130. /// temp[0] => SiteId, FacilityId, FacilityCode, PropertyId 나누기.
  131. if (temp[4] == "1") //여름시즌
  132. {
  133. Readini Ri_cool = new Readini();
  134. Ri_cool.ReadData();
  135. if ((DateTime.Now > DateTime.Parse(Ri_cool.CoolDayFromgs.Trim())) || (DateTime.Now < DateTime.Parse(Ri_cool.CoolDayTogs.Trim())))
  136. {
  137. continue;
  138. }
  139. }
  140. else if (temp[4] == "2") // 겨울시즌
  141. {
  142. Readini Ri_heat = new Readini();
  143. Ri_heat.ReadData();
  144. if ((DateTime.Now > DateTime.Parse(Ri_heat.HeatDayFromgs.Trim())) && (DateTime.Now < DateTime.Parse(Ri_heat.HeatDayTogs.Trim())))
  145. {
  146. continue;
  147. }
  148. }
  149. string[] PointDivid = temp[0].Split('.');
  150. string TmpValue = "";
  151. string TmpTemp = "";
  152. string TmpHumidity = "";
  153. if (temp[0] == "#")
  154. {
  155. continue;
  156. }
  157. //////////////////////////////////////////////////////////////////////////////////////////////
  158. //--------------------------------습구온도 받아오는 로직------------------------------------//
  159. // 2017-02-14 추가.. //
  160. //////////////////////////////////////////////////////////////////////////////////////////////
  161. if (temp[1] == "HumidityTemp")
  162. {
  163. Readini HT_Point = new Readini();
  164. HT_Point.ReadData();
  165. double tmpWetBulb = 0;
  166. if (!GetData_From_iCos.Key_Value_Dic.ContainsKey(HT_Point.TempPoint))
  167. {
  168. TmpTemp = "0";
  169. }
  170. else
  171. {
  172. TmpTemp = GetData_From_iCos.Key_Value_Dic[HT_Point.TempPoint];
  173. }
  174. if (!GetData_From_iCos.Key_Value_Dic.ContainsKey(HT_Point.HumidityPoint))
  175. {
  176. TmpHumidity = "0";
  177. }
  178. else
  179. {
  180. TmpHumidity = GetData_From_iCos.Key_Value_Dic[HT_Point.HumidityPoint];
  181. }
  182. double enthalpyValue = enthalpy_proc(Convert.ToDouble(TmpTemp), Convert.ToDouble(TmpHumidity));
  183. double ah_trhValue = absoluteHumidity_proc(Convert.ToDouble(TmpTemp), Convert.ToDouble(TmpHumidity));
  184. double tmpCurtTemp = Convert.ToDouble(TmpTemp);
  185. double tempCal = 0;
  186. for (int cal = 0; cal < 100; cal++)
  187. {
  188. tempCal = (4.2 * (ah_trhValue - absoluteHumidity_proc(tmpCurtTemp, 100)));
  189. if (tempCal == 0)
  190. {
  191. break;
  192. }
  193. tmpWetBulb = (enthalpyValue - enthalpy_proc(tmpCurtTemp, 100)) / tempCal;
  194. if (tmpWetBulb < 0.1) break;
  195. tmpCurtTemp = tmpCurtTemp - 0.1;
  196. }
  197. value = (float)(tmpCurtTemp);
  198. if (value.GetType() == typeof(DBNull))
  199. {
  200. value = 0;
  201. LFC.Log("[Parsging] Null 값 들어옴 : " + temp[0] + temp[1] + temp[2] + value);
  202. }
  203. value = (float)Math.Round(value, 4, MidpointRounding.AwayFromZero);
  204. }
  205. //---------------------------------일반값 받아오는 로직-------------------------------------//
  206. else
  207. {
  208. if (!GetData_From_iCos.Key_Value_Dic.ContainsKey(temp[1]))
  209. {
  210. TmpValue = "0";
  211. }
  212. else
  213. {
  214. TmpValue = GetData_From_iCos.Key_Value_Dic[temp[1]];
  215. }
  216. value = (float)Convert.ToDouble(TmpValue);
  217. if (value.GetType() == typeof(DBNull))
  218. {
  219. value = 0;
  220. LFC.Log(temp[0] + temp[1] + temp[2] + "Null 값이 들어왔습니다." + value);
  221. }
  222. value = (float)Math.Round(value, 4, MidpointRounding.AwayFromZero);
  223. }
  224. if (count_modify_value > 0 && (Value_Modify.ContainsKey(temp[0]) == true)) // csv파일에 목록이 1개 라도 있고 && Value_Modfiy에 1.1.4478.1과 같은 키를 포함하고 있다면...
  225. {
  226. MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl(); // Script를 사용할 수 있게 만드는 스크립트 컨트롤을 객체 선언
  227. sc.Language = "VBScript"; // 사용할 스크립트 언어는 Visaul Basic Script
  228. string Pattern = "Tag" + @"\d{1,5}"; //태그 형식
  229. Regex regex = new Regex(Pattern);
  230. string Exp = Value_Modify[temp[0]]; //키값에 대한 값(식)을 불러옴.
  231. foreach (Match match in regex.Matches(Exp)) // 불러들인 수식에서 포인트 명을 값으로...
  232. {
  233. string Tag_Name = Convert.ToString(match); //Matching 된 값을 string형식으로 변환.
  234. //int Point_Number = Convert.ToInt32(Regex.Replace(Tag_Name, @"\D", "")); // 10진수만 뽑아냄.
  235. Exp = Exp.Replace(Tag_Name, value.ToString()); //태그값을 값으로 바꿈 ch.ctrl.tag1 -> value로..
  236. }
  237. value = (float)Convert.ToDouble(sc.Eval(Exp)); // value 값이 변경된 결과.
  238. }
  239. float[] values = new float[14]; // 20161209 기존 13에서 ->14로 늘림.
  240. values[0] = value; // 값
  241. values[1] = 1; // 카운트
  242. values[2] = float.Parse(PointDivid[0]); // SiteId
  243. values[3] = float.Parse(PointDivid[1]); // FacilityTypeId
  244. values[4] = float.Parse(PointDivid[2]); // FacilityCode
  245. values[5] = float.Parse(PointDivid[3]); // PropertyId
  246. // values[7] = (float)Convert.ToDouble(temp[2]);
  247. values[13] = value; // 현재값
  248. if (RawData.ContainsKey(temp[0]) == false) // Tag가 없다면
  249. {
  250. RawData.TryAdd(temp[0], values);
  251. }
  252. else // Tag가 있다면
  253. {
  254. float[] Tmp1ValueRaw = RawData[temp[0]]; // Tag의 값을 가져옴
  255. Tmp1ValueRaw[0] = values[0];
  256. Tmp1ValueRaw[7] = TypeSelect;
  257. RawData.TryUpdate(temp[0], Tmp1ValueRaw, values); // 새로운 값을 업데이트 Key의값과 Values의 값이 같다면 Tmp1ValueRaw를 업데이트.
  258. }
  259. if (temp[2].Equals(Convert.ToString(TypeSelect)))
  260. {
  261. switch (TypeSelect)
  262. {
  263. case 1:
  264. /// TypeSelect 1 : 평균값
  265. if (AverageData.ContainsKey(temp[0]) == false) // Tag가 없다면 ,, 참고로 temp[0]는 키값 = 1.1.4478.xxx와 같은...
  266. {
  267. AverageData.TryAdd(temp[0], values);
  268. }
  269. else // Tag가 있다면
  270. {
  271. float[] Tmp1Value = AverageData[temp[0]]; // Tag의 값을 가져옴
  272. Tmp1Value[0] = Tmp1Value[0] + values[0]; // 이전 태그의 값에 새로운 값을 더함
  273. Tmp1Value[1] = Tmp1Value[1] + values[1]; // 카운트 ++
  274. Tmp1Value[7] = TypeSelect;
  275. Tmp1Value[13] = values[13];
  276. AverageData.TryUpdate(temp[0], Tmp1Value, values); // 새로운 값을 업데이트
  277. }
  278. break;
  279. case 2:
  280. /// TypeSelect 2 : 적산값
  281. ///
  282. if (value < 0)
  283. value = 0;
  284. if (AddData.ContainsKey(temp[0]) == false) // Tag가 없다면
  285. {
  286. AddData.TryAdd(temp[0], values);
  287. }
  288. else
  289. {
  290. float[] Tmp1Value2 = AddData[temp[0]]; // Tag의 값을 가져옴
  291. //Tmp1Value2[0] = Tag에서 가져온 값 : 예)1030
  292. //Tmp1Value2[1] = 카운트
  293. //Tmp1Value2[2] = 두 값의 차이 : 예)1040-1030 = 10
  294. //Tmp1Value2[0] = values[0];
  295. //if (value < Tmp1Value2[0]) // 안전장치 20170308
  296. //{
  297. // Tmp1Value2[0] = value;
  298. // LFC.Log("[Parsing] 안전장치에 걸림 value : " + value);
  299. // LFC.Log("[Parsing] 안전장치에 걸림 Tmp1Value2[0] : " + Tmp1Value2[0]);
  300. //}
  301. //*******************************************************************************//
  302. /******************튀값 처리 부분 ******************/
  303. // 수정 시간: 2017 - 11 - 13 주석처리
  304. // 메인전력의 경우...
  305. //if (values[4] == 1035 && values[5] == 1)
  306. //{
  307. // if (value - Tmp1Value2[0] > 4000)
  308. // {
  309. // LFC.Log("[Parsing] 메인 전력 튄값 : " + Convert.ToString(value));
  310. // Tmp1Value2[6] += 0;
  311. // }
  312. // else
  313. // {
  314. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  315. // }
  316. //}
  317. //// 가스가 튀는 경우 대처
  318. //else if (values[4] == 1154 && values[5] == 15)
  319. //{
  320. // LFC.Log("1154/15 : " + Convert.ToString(value));
  321. // if (value - Tmp1Value2[0] > 10)
  322. // {
  323. // LFC.Log("[Parsing] 가스 튄값 1154/15 : " + Convert.ToString(value));
  324. // Tmp1Value2[6] += 0;
  325. // }
  326. // else
  327. // {
  328. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  329. // LFC.Log("[Parsing] 1154/15 계산 결과 : " + Tmp1Value2[6] + " += " + value + "-" + Tmp1Value2[0]);
  330. // }
  331. //}
  332. //else if (values[4] == 1155 && values[5] == 15)
  333. //{
  334. // LFC.Log("[Parsing] 검색1155/15 : " + Convert.ToString(value));
  335. // if (value - Tmp1Value2[0] > 10)
  336. // {
  337. // LFC.Log("[Parsing] 가스 튄값 1155/15 : " + Convert.ToString(value));
  338. // Tmp1Value2[6] += 0;
  339. // }
  340. // else
  341. // {
  342. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  343. // LFC.Log("[Parsing] 1155/15 계산 결과 : " + Tmp1Value2[6] + " += " + value + "-" + Tmp1Value2[0]);
  344. // }
  345. //}
  346. //else if (values[4] == 1156 && values[5] == 15)
  347. //{
  348. // LFC.Log("[Parsing] 1156/15 : " + Convert.ToString(value));
  349. // if (value - Tmp1Value2[0] > 10)
  350. // {
  351. // LFC.Log("[Parsing] 가스 튄값 1156/15 : " + Convert.ToString(value));
  352. // Tmp1Value2[6] += 0;
  353. // }
  354. // else
  355. // {
  356. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  357. // LFC.Log("[Parsing] 1156/15 계산 결과 : " + Tmp1Value2[6] + " += " + value + "-" + Tmp1Value2[0]);
  358. // LFC.Log("[Parsing] 현재 Tmp1Value2[6]의 값 : " + Tmp1Value2[6]);
  359. // }
  360. //}
  361. //else if (values[4] == 1157 && values[5] == 15)
  362. //{
  363. // if (value - Tmp1Value2[0] > 10)
  364. // {
  365. // LFC.Log("[Parsing] 가스 튄값 1157/15 : " + Convert.ToString(value));
  366. // Tmp1Value2[6] += 0;
  367. // }
  368. // else
  369. // {
  370. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  371. // LFC.Log("[Parsing] 1157/15 계산 결과 : " + Tmp1Value2[6] + " += " + value + "-" + Tmp1Value2[0]);
  372. // }
  373. //}
  374. //else if (values[4] == 1164 && values[5] == 13)
  375. //{
  376. // if (value - Tmp1Value2[0] > 10)
  377. // {
  378. // LFC.Log("[Parsing] 가스 튄값 1164/13 : " + Convert.ToString(value));
  379. // Tmp1Value2[6] += 0;
  380. // }
  381. // else
  382. // {
  383. // Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  384. // }
  385. //}
  386. //else // 그렇지않은경우.. (메인전력을 제외한...)
  387. //{
  388. // if (value - Tmp1Value2[0] > 500)
  389. // {
  390. // LFC.Log("[Parsing] 튄값 : " + Convert.ToString(value));
  391. // Tmp1Value2[6] += 0;
  392. // }
  393. // else
  394. // {
  395. Tmp1Value2[6] += value - Tmp1Value2[0]; // 이전 태그의 값에 새로운 값을 더함 예) 1030 - 1020 = 10
  396. // }
  397. //}
  398. Tmp1Value2[0] = value;
  399. Tmp1Value2[1] = Tmp1Value2[1] + values[1]; // 카운트 ++
  400. Tmp1Value2[7] = TypeSelect;
  401. Tmp1Value2[13] = values[13];
  402. //20170316 addorupdate로 변경
  403. AddData.AddOrUpdate(temp[0], Tmp1Value2, (k, v) => Tmp1Value2); // 새로운 값을 업데이트
  404. }
  405. break;
  406. //현재값 같은 경우엔 값 변경이 필요없음.
  407. case 3:
  408. /// TypeSelect 3 : 현재값
  409. if (NowData.ContainsKey(temp[0]) == false) // Tag가 없다면
  410. {
  411. NowData.TryAdd(temp[0], values);
  412. }
  413. else
  414. {
  415. float[] Tmp1Value5 = NowData[temp[0]]; // Tag의 값을 가져옴
  416. Tmp1Value5[0] = value;
  417. Tmp1Value5[7] = TypeSelect;
  418. NowData.TryUpdate(temp[0], Tmp1Value5, values);
  419. }
  420. break;
  421. case 4:
  422. /// TypeSelect 4 : 가동시간값
  423. if (value < 0)
  424. value = 0;
  425. if (OnData.ContainsKey(temp[0]) == false) // Tag가 없다면
  426. {
  427. OnData.TryAdd(temp[0], values);
  428. }
  429. else
  430. {
  431. float[] Tmp1Value3 = OnData[temp[0]]; // Tag의 값을 가져옴
  432. Tmp1Value3[0] = Tmp1Value3[0] + values[0]; // 이전 태그의 값에 새로운 값을 더함
  433. Tmp1Value3[1] = Tmp1Value3[1] + values[1]; // 카운트 ++
  434. Tmp1Value3[7] = TypeSelect;
  435. Tmp1Value3[13] = values[13];
  436. OnData.TryUpdate(temp[0], Tmp1Value3, values); // 새로운 값을 업데이트
  437. }
  438. break;
  439. case 5:
  440. /// TypeSelect 5 : 적산값2
  441. if (value < 0)
  442. value = 0;
  443. if (Add2Data.ContainsKey(temp[0]) == false) // Tag가 없다면
  444. {
  445. Add2Data.TryAdd(temp[0], values);
  446. }
  447. else // Tag가 있다면
  448. {
  449. float[] Tmp6Value = Add2Data[temp[0]]; // Tag의 값을 가져옴
  450. Tmp6Value[0] = Tmp6Value[0] + values[0]; // 이전 태그의 값에 새로운 값을 더함
  451. Tmp6Value[1] = Tmp6Value[1] + values[1]; // 카운트 ++
  452. Tmp6Value[7] = TypeSelect;
  453. Tmp6Value[13] = values[13];
  454. Add2Data.TryUpdate(temp[0], Tmp6Value, values); // 새로운 값을 업데이트
  455. }
  456. break;
  457. case 6:
  458. /// TypeSelect 6 : 현재값2
  459. if (value < 0)
  460. value = 0;
  461. if (Now2Data.ContainsKey(temp[0]) == false) // Tag가 없다면
  462. {
  463. Now2Data.TryAdd(temp[0], values);
  464. }
  465. else
  466. {
  467. float[] Tmp1Value4 = Now2Data[temp[0]]; // Tag의 값을 가져옴
  468. Tmp1Value4[0] = Tmp1Value4[0] + values[0]; // 이전 태그의 값에 새로운 값을 더함
  469. Tmp1Value4[1] = Tmp1Value4[1] + values[1]; // 카운트 ++
  470. Tmp1Value4[7] = TypeSelect;
  471. Tmp1Value4[13] = values[13];
  472. Now2Data.TryUpdate(temp[0], Tmp1Value4, values); // 새로운 값을 업데이트
  473. }
  474. //Now2Data.TryAdd(temp[0], value); //
  475. break;
  476. case 7: //1분 단위 Insert..Peak전력 등등..
  477. OneMinute_Insert OMI = new OneMinute_Insert();
  478. OMI.OneMin_Insert(values[2], values[0]);
  479. OMI.PeakCheck(values[0]);
  480. break;
  481. case 8:
  482. break;
  483. }
  484. }
  485. }
  486. sr.Close();
  487. sr.Dispose();
  488. }
  489. catch (Exception e)
  490. {
  491. LFC.Log("[Parsing] 에러발생 : " + e);
  492. }
  493. }
  494. /// Set Value (DGW -> iCos)
  495. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  496. sTemp1 = SW.Elapsed.ToString();
  497. LFC.Log("[Parsing] 연산시간 : " + sTemp1 + Environment.NewLine);
  498. //MessageBox.Show(sTemp1);
  499. int TmpMinNow = Convert.ToInt32(DateTime.Now.Minute.ToString());
  500. if ((TmpMinNow % 15) == 0)
  501. {
  502. _thread = new Thread(new ThreadStart(Thread_Test1));
  503. _thread.Start();
  504. }
  505. string CompleteTime = DateTime.Now.Minute.ToString();
  506. return CompleteTime;
  507. }
  508. public void Thread_Test1() // 1분마다 실행되는 데이터 수집 로직
  509. {
  510. try
  511. {
  512. DateTime TmpDate = DateTime.Now;
  513. int TmpMinNow = Convert.ToInt32(TmpDate.Minute.ToString());
  514. string Hour = (TmpDate).ToString("yyyy-MM-dd HH:00:00.000");
  515. LogFileCreate LFC = new LogFileCreate();
  516. Expression_Process EP = new Expression_Process();
  517. ///시간 측정//////////////////
  518. Stopwatch SW = new Stopwatch();
  519. string sTemp1;
  520. SW.Reset();
  521. SW.Start();
  522. /// *************데이터 복사*************** ///
  523. #region CopyData
  524. TmpAverageData = new ConcurrentDictionary<string, float[]>(AverageData);
  525. TmpAddData = new ConcurrentDictionary<string, float[]>(AddData);
  526. TmpNowData = new ConcurrentDictionary<string, float[]>(NowData);
  527. TmpOnData = new ConcurrentDictionary<string, float[]>(OnData);
  528. TmpAdd2Data = new ConcurrentDictionary<string, float[]>(Add2Data);
  529. TmpNow2Data = new ConcurrentDictionary<string, float[]>(Now2Data);
  530. TmpRawData = new ConcurrentDictionary<string, float[]>(RawData);
  531. #endregion
  532. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  533. sTemp1 = SW.Elapsed.ToString();
  534. LFC.Log("[Parsing] 데이터 복사한 시간 : "+ sTemp1);
  535. /// *************데이터 연산*************** ///
  536. ///
  537. string sTemp2;
  538. SW.Reset();
  539. SW.Start();
  540. #region Data_Calculate
  541. AverageCal_Min(TmpAverageData, TmpMinNow);
  542. AddCal_Min(TmpAddData, TmpMinNow);
  543. NowCal_Min(TmpNowData, TmpMinNow);
  544. OnCal_Min(TmpOnData, TmpMinNow);
  545. Add2Cal_Min(TmpAdd2Data, TmpMinNow);
  546. Now2Cal_Min(TmpNow2Data, TmpMinNow);
  547. #endregion
  548. var Tmp_Expression_result_FifMin = TmpAverageData.Union(TmpAddData).Union(TmpNowData).Union(TmpOnData).Union(TmpAdd2Data).Union(TmpNow2Data).ToDictionary(k => k.Key, v => v.Value);
  549. EP.ReadCSV_Passing_Expression(RawData, TmpMinNow, "Raw", Matching_Tag);
  550. EP.ReadCSV_Passing_Expression(Tmp_Expression_result_FifMin, TmpMinNow, "FiftMin", Matching_Tag);
  551. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  552. sTemp2 = SW.Elapsed.ToString();
  553. LFC.Log("[Parsing] 15분 데이터 계산한 시간 : " +sTemp2);
  554. /// 15분에 대한 성능분석식 + Raw 에 대한 성능분석식
  555. My_DB_DML DBI = new My_DB_DML();
  556. string sTemp_delete;
  557. SW.Reset();
  558. SW.Start();
  559. /// *************15분 삭제***************** ///
  560. DBI.DB_Min_Delete(TmpAverageData, TmpMinNow);
  561. DBI.DB_Min_Delete(TmpAddData, TmpMinNow);
  562. DBI.DB_Min_Delete(TmpOnData, TmpMinNow);
  563. DBI.DB_Min_Delete(TmpAdd2Data, TmpMinNow);
  564. DBI.DB_Min_Delete(TmpNow2Data, TmpMinNow);
  565. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  566. sTemp_delete = SW.Elapsed.ToString();
  567. LFC.Log("[Parsing] 15분 데이터 삭제한 시간 : " + sTemp_delete);
  568. string sTemp3;
  569. SW.Reset();
  570. SW.Start();
  571. /// *************15분 삽입***************** ///
  572. #region 15분삽입
  573. DBI.DB_Min_Insert(TmpAverageData, TmpMinNow);
  574. DBI.DB_Min_Insert(TmpAddData, TmpMinNow);
  575. DBI.DB_Min_Insert(TmpNowData, TmpMinNow);
  576. DBI.DB_Min_Insert(TmpOnData, TmpMinNow);
  577. DBI.DB_Min_Insert(TmpAdd2Data, TmpMinNow);
  578. DBI.DB_Min_Insert(TmpNow2Data, TmpMinNow);
  579. RawCal(TmpMinNow);
  580. #endregion
  581. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  582. sTemp3 = SW.Elapsed.ToString();
  583. LFC.Log("[Parsing] 15분 데이터 삽입한 시간 : "+ sTemp3);
  584. string sTemp_Now;
  585. SW.Reset();
  586. SW.Start();
  587. /// *************15분 현재값 삽입***************** ///
  588. DBI.DB_Min_Insert_Now(TmpAverageData, TmpMinNow);
  589. DBI.DB_Min_Insert_Now(TmpAddData, TmpMinNow);
  590. DBI.DB_Min_Insert_Now(TmpOnData, TmpMinNow);
  591. DBI.DB_Min_Insert_Now(TmpAdd2Data, TmpMinNow);
  592. DBI.DB_Min_Insert_Now(TmpNow2Data, TmpMinNow);
  593. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  594. sTemp_Now = SW.Elapsed.ToString();
  595. LFC.Log("[Parsing] 15분 현재값 삽입한 시간 : " + sTemp_Now);
  596. string sTemp4;
  597. SW.Reset();
  598. SW.Start();
  599. /// ************한시간 데이터 연산********** ///
  600. #region Hour_Data_Calculate
  601. HourCalCulate_Average(TmpAverageData, TmpMinNow);
  602. HourCalCulate_Add(TmpAddData, TmpMinNow);
  603. HourCalCulate_Now(TmpNowData, TmpMinNow);
  604. HourCalCulate_On(TmpOnData, TmpMinNow);
  605. HourCalCulate_Add2(TmpAdd2Data, TmpMinNow);
  606. HourCalCulate_Now2(TmpNow2Data, TmpMinNow);
  607. #endregion
  608. ///////////////////////////////////////////////
  609. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  610. sTemp4 = SW.Elapsed.ToString();
  611. LFC.Log("[Parsing] 시간 데이터 연산한 시간 : " + sTemp4);
  612. var Tmp_Expression_result_Hour = TmpAverageData.Union(TmpAddData).Union(TmpNowData).Union(TmpOnData).Union(TmpAdd2Data).Union(TmpNow2Data).ToDictionary(k => k.Key, v => v.Value);
  613. EP.ReadCSV_Passing_Expression(Tmp_Expression_result_Hour, TmpMinNow, "Hour", Matching_Tag);
  614. /// 한시간에 대한 성능분석식
  615. string sTemp5;
  616. SW.Reset(); //
  617. SW.Start();
  618. /// *************한시간 삽입***************** ///
  619. DBI.DB_Hour_Update(TmpAverageData, TmpMinNow, Hour);
  620. DBI.DB_Hour_Update(TmpAddData, TmpMinNow, Hour);
  621. if (TmpMinNow == 00)
  622. {
  623. DBI.DB_Hour_Update(TmpNowData, TmpMinNow, Hour);
  624. }
  625. DBI.DB_Hour_Update(TmpOnData, TmpMinNow, Hour);
  626. DBI.DB_Hour_Update(TmpAdd2Data, TmpMinNow, Hour);
  627. DBI.DB_Hour_Update(TmpNow2Data, TmpMinNow, Hour);
  628. //////////////////////////////////////////////////
  629. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  630. sTemp5 = SW.Elapsed.ToString();
  631. LFC.Log("[Parsing] 시간 데이터 삽입한 시간 : " + sTemp5);
  632. string sTemp6;
  633. SW.Reset();
  634. SW.Start();
  635. #region Daily_Update
  636. DBI.DB_Day_Update(TmpAverageData, TmpMinNow, Hour);
  637. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  638. sTemp6 = SW.Elapsed.ToString();
  639. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(평균) : "+ sTemp6);
  640. string sTemp7;
  641. SW.Reset();
  642. SW.Start();
  643. DBI.DB_Day_Update(TmpAddData, TmpMinNow, Hour);
  644. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  645. sTemp7 = SW.Elapsed.ToString();
  646. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(적산) : " + sTemp7);
  647. string sTemp8;
  648. SW.Reset();
  649. SW.Start();
  650. DBI.DB_Day_Update(TmpNowData, TmpMinNow, Hour);
  651. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  652. sTemp8 = SW.Elapsed.ToString();
  653. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(현재) : " + sTemp8);
  654. string sTemp10;
  655. SW.Reset();
  656. SW.Start();
  657. DBI.DB_Day_Update(TmpAdd2Data, TmpMinNow, Hour);
  658. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  659. sTemp10 = SW.Elapsed.ToString();
  660. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(적산2) : " + sTemp10);
  661. string sTemp11;
  662. SW.Reset();
  663. SW.Start();
  664. DBI.DB_Day_Update(TmpNow2Data, TmpMinNow, Hour);
  665. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  666. sTemp11 = SW.Elapsed.ToString();
  667. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(현재2) : " + sTemp11);
  668. string sTemp9;
  669. SW.Reset();
  670. SW.Start();
  671. DBI.DB_Day_Update(TmpOnData, TmpMinNow, Hour);
  672. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  673. sTemp9 = SW.Elapsed.ToString();
  674. LFC.Log("[Parsing] 하루 데이터 삽입한 시간(가동시간) : " + sTemp9);
  675. #endregion
  676. ////////// Dictionary 초기화//////////////////////
  677. #region Dic_Clear
  678. TmpAverageData.Clear();
  679. TmpAddData.Clear();
  680. TmpNowData.Clear();
  681. TmpOnData.Clear();
  682. TmpNow2Data.Clear();
  683. TmpAdd2Data.Clear();
  684. TmpRawData.Clear();
  685. #endregion
  686. //////////////////시간 측정 완료////////////////=
  687. SW.Stop(); // 현재 인스턴스가 측정한 총 경과 시간을 가져옵니다.
  688. sTemp1 = SW.Elapsed.ToString();
  689. LFC.Log("[Parsing] 스레드 연산 시간 : "+ sTemp1 + Environment.NewLine);
  690. _thread.Abort(); // 스레드 종료
  691. LFC.Log("[Parsing] 스레드 종료");
  692. }
  693. catch (Exception e)
  694. {
  695. LogFileCreate LFC = new LogFileCreate();
  696. LFC.Log("[Parsing] 에러 발생 :" + e);
  697. }
  698. finally
  699. {
  700. ////////// Dictionary 초기화//////////////////////
  701. #region Dic_Clear
  702. TmpAverageData.Clear();
  703. TmpAddData.Clear();
  704. TmpNowData.Clear();
  705. TmpOnData.Clear();
  706. TmpNow2Data.Clear();
  707. TmpAdd2Data.Clear();
  708. TmpRawData.Clear();
  709. #endregion
  710. }
  711. }
  712. /// <summary>
  713. /// 평균 데이터 처리하는 메서드
  714. /// </summary>
  715. /// <param name="Min"></param>
  716. public void AverageCal_Min(IDictionary<string, float[]> AvrDic, int Min)
  717. {
  718. //float[] Average_Tmp2Value;
  719. foreach (KeyValuePair<string, float[]> kv in AvrDic)
  720. {
  721. //복사한 평균 Dic의 값을 업데이트
  722. float[] TmpValue = kv.Value;
  723. TmpValue[0] = TmpValue[0] / TmpValue[1]; // 일반적인 상황이라면 15개 값의 합과 Count15를 나눔
  724. int CheckData = Select_MinTime_Data(Min);
  725. TmpValue[CheckData] = TmpValue[0];
  726. TmpAverageData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  727. //원본 평균 Dic의 값을 업데이트
  728. TmpValue[0] = 0; // 값을 0으로 초기화
  729. TmpValue[1] = 0; // 카운트를 0으로 초기화
  730. AverageData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  731. }
  732. }
  733. /// <summary>
  734. /// 적산 데이터 처리하고 INSERT하는 메서드
  735. /// </summary>
  736. /// <param name="Min"></param>
  737. public void AddCal_Min(IDictionary<string, float[]> AddDic, int Min)
  738. {
  739. foreach (KeyValuePair<string, float[]> kv in AddDic)
  740. {
  741. float[] TmpValue = kv.Value;
  742. int CheckData = Select_MinTime_Data(Min);
  743. TmpValue[CheckData] = TmpValue[6];
  744. TmpAddData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  745. TmpValue[6] = 0; // 적산값을 0으로 초기화
  746. TmpValue[1] = 0; // 카운트를 0으로 초기화
  747. AddData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  748. }
  749. }
  750. /// <summary>
  751. /// 현재 데이터 처리하고 INSERT하는 메서드
  752. /// </summary>
  753. /// <param name="Min"></param>
  754. public void NowCal_Min(IDictionary<string, float[]> NowDic, int Min)
  755. {
  756. foreach (KeyValuePair<string, float[]> kv in NowDic)
  757. {
  758. float[] TmpValue = kv.Value;
  759. int CheckData = Select_MinTime_Data(Min);
  760. TmpValue[CheckData] = TmpValue[0];
  761. TmpNowData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  762. TmpValue[0] = 0; // 값을 0으로 초기화
  763. TmpValue[1] = 0; // 카운트를 0으로 초기화
  764. NowData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  765. }
  766. }
  767. /// <summary>
  768. /// 가동시간 데이터 연산하고 INSERT하는 메서드
  769. /// </summary>
  770. /// <param name="Min"></param>
  771. public void OnCal_Min(IDictionary<string, float[]> OnDic, int Min)
  772. {
  773. foreach (KeyValuePair<string, float[]> kv in OnDic)
  774. {
  775. float[] TmpValue = kv.Value;
  776. int CheckData = Select_MinTime_Data(Min);
  777. TmpValue[CheckData] = TmpValue[0];
  778. TmpOnData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  779. TmpValue[0] = 0; // 값을 0으로 초기화
  780. TmpValue[1] = 0; // 카운트를 0으로 초기화
  781. OnData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  782. }
  783. }
  784. /// <summary>
  785. /// 현재값2 데이터 연산하고 INSERT하는 메서드
  786. /// </summary>
  787. /// <param name="Min"></param>
  788. public void Add2Cal_Min(IDictionary<string, float[]> Add2Dic, int Min)
  789. {
  790. //float[] Average_Tmp2Value;
  791. foreach (KeyValuePair<string, float[]> kv in Add2Dic)
  792. {
  793. //복사한 평균 Dic의 값을 업데이트
  794. float[] TmpValue = kv.Value;
  795. TmpValue[0] = (TmpValue[0] / TmpValue[1]) / 4; // 일반적인 상황이라면 15개 값의 합과 Count15를 나누고 4로또 나눔.
  796. int CheckData = Select_MinTime_Data(Min);
  797. TmpValue[CheckData] = TmpValue[0];
  798. TmpAdd2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  799. //원본 평균 Dic의 값을 업데이트
  800. TmpValue[0] = 0; // 값을 0으로 초기화
  801. TmpValue[1] = 0; // 카운트를 0으로 초기화
  802. Add2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  803. }
  804. }
  805. public void Now2Cal_Min(IDictionary<string, float[]> Now2Dic, int Min)
  806. {
  807. foreach (KeyValuePair<string, float[]> kv in Now2Dic)
  808. {
  809. float[] TmpValue = kv.Value;
  810. if (TmpValue[0] > 0)
  811. {
  812. TmpValue[0] = 1; // 일반적인 상황이라면 15개 값의 합과 Count15를 나눔
  813. }
  814. else
  815. {
  816. TmpValue[0] = 0;
  817. }
  818. int CheckData = Select_MinTime_Data(Min);
  819. TmpValue[CheckData] = TmpValue[0];
  820. TmpNow2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 복사 현재값2 Dic에 새로운 값을 업데이트
  821. TmpValue[0] = 0;
  822. TmpValue[1] = 0;
  823. Now2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 원본 현재값2 Dic에 새로운 값을 업데이트
  824. }
  825. }
  826. private StringBuilder RawCal_sb = new StringBuilder();
  827. public void RawCal(int Min)
  828. {
  829. /// BemsMonitoringPointHourly Insert&Update
  830. if ((Min % 15) == 0) //15분인 경우엔 insert
  831. {
  832. My_DB_DML MDD = new My_DB_DML();
  833. string strcon = MDD.ConnDBInfo();
  834. string query = "";
  835. string InsertDate = DateTime.Now.ToString("yyyy-MM-dd HH:" + Min + ":00.000");
  836. using (SqlConnection conn = new SqlConnection(strcon))
  837. {
  838. conn.Open();
  839. foreach (KeyValuePair<string, float[]> kv in TmpRawData)
  840. {
  841. float[] TmpValue = kv.Value;
  842. RawCal_sb.Append("INSERT INTO BemsMonitoringPointHistory15minRawData(SiteId,FacilityTypeId,FacilityCode,PropertyId,CreatedDateTime,CurrentValue) ");
  843. RawCal_sb.Append("VALUES(" + TmpValue[2] + "," + TmpValue[3] + "," + TmpValue[4] + "," + TmpValue[5] + ",'" + InsertDate + "'," + Math.Round(TmpValue[0], 4, MidpointRounding.AwayFromZero) + ")");
  844. query = RawCal_sb.ToString();
  845. //LogFileCreate LFC = new LogFileCreate();
  846. //LFC.Log("INSERT RAW 값 : " + TmpValue[2] + "." + TmpValue[3] + "." + TmpValue[4] + "." + TmpValue[5] + "." + InsertDate + "." + Math.Round(TmpValue[0], 4, MidpointRounding.AwayFromZero) + ".");
  847. SqlCommand cmd = new SqlCommand(query, conn);
  848. cmd.ExecuteNonQuery();
  849. cmd.Dispose();
  850. RawCal_sb.Clear();
  851. }
  852. conn.Close();
  853. conn.Dispose();
  854. }
  855. }
  856. }
  857. //15분인경우 [8] 에 데이터 업데이트
  858. //30분인경우 [9] 에 데이터 업데이트
  859. //45분인경우 [10] 에 데이터 업데이트
  860. //00분인경우 [11] 에 데이터 업데이트
  861. public int Select_MinTime_Data(int Min)
  862. {
  863. int Check = 0;
  864. switch (Min)
  865. {
  866. case 00:
  867. Check = 11;
  868. break;
  869. case 15:
  870. Check = 8;
  871. break;
  872. case 30:
  873. Check = 9;
  874. break;
  875. case 45:
  876. Check = 10;
  877. break;
  878. }
  879. return Check;
  880. }
  881. public void HourCalCulate_Average(IDictionary<string, float[]> AvDic, int Min)
  882. {
  883. foreach (KeyValuePair<string, float[]> kv in AvDic)
  884. {
  885. float[] TmpValue = kv.Value;
  886. switch (Min)
  887. {
  888. case 00:
  889. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10] + TmpValue[11]) / 4; break;
  890. case 15:
  891. TmpValue[12] = TmpValue[8]; break;
  892. case 30:
  893. TmpValue[12] = (TmpValue[8] + TmpValue[9]) / 2; break;
  894. case 45:
  895. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10]) / 3; break;
  896. }
  897. TmpAverageData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  898. }
  899. }
  900. public void HourCalCulate_Add(IDictionary<string, float[]> AddDic, int Min)
  901. {
  902. foreach (KeyValuePair<string, float[]> kv in AddDic)
  903. {
  904. float[] TmpValue = kv.Value;
  905. switch (Min)
  906. {
  907. case 00:
  908. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10] + TmpValue[11]); break;
  909. case 15:
  910. TmpValue[12] = TmpValue[8]; break;
  911. case 30:
  912. TmpValue[12] = (TmpValue[8] + TmpValue[9]); break;
  913. case 45:
  914. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10]); break;
  915. }
  916. TmpAddData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  917. }
  918. }
  919. public void HourCalCulate_Now(IDictionary<string, float[]> NowDic, int Min)
  920. {
  921. foreach (KeyValuePair<string, float[]> kv in NowDic)
  922. {
  923. float[] TmpValue = kv.Value;
  924. switch (Min)
  925. {
  926. case 00:
  927. TmpValue[12] = (TmpValue[11]); break;
  928. case 15:
  929. TmpValue[12] = TmpValue[8]; break;
  930. case 30:
  931. TmpValue[12] = (TmpValue[9]); break;
  932. case 45:
  933. TmpValue[12] = (TmpValue[10]); break;
  934. }
  935. TmpNowData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  936. }
  937. }
  938. public void HourCalCulate_On(IDictionary<string, float[]> OnDic, int Min)
  939. {
  940. foreach (KeyValuePair<string, float[]> kv in OnDic)
  941. {
  942. float[] TmpValue = kv.Value;
  943. switch (Min)
  944. {
  945. case 00:
  946. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10] + TmpValue[11]); break;
  947. case 15:
  948. TmpValue[12] = TmpValue[8]; break;
  949. case 30:
  950. TmpValue[12] = (TmpValue[8] + TmpValue[9]); break;
  951. case 45:
  952. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10]); break;
  953. }
  954. TmpOnData.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  955. }
  956. }
  957. public void HourCalCulate_Add2(IDictionary<string, float[]> Add2Dic, int Min)
  958. {
  959. foreach (KeyValuePair<string, float[]> kv in Add2Dic)
  960. {
  961. float[] TmpValue = kv.Value;
  962. switch (Min)
  963. {
  964. case 00:
  965. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10] + TmpValue[11]); break;
  966. case 15:
  967. TmpValue[12] = TmpValue[8]; break;
  968. case 30:
  969. TmpValue[12] = (TmpValue[8] + TmpValue[9]); break;
  970. case 45:
  971. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10]); break;
  972. }
  973. TmpAdd2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  974. }
  975. }
  976. public void HourCalCulate_Now2(IDictionary<string, float[]> Now2Dic, int Min)
  977. {
  978. foreach (KeyValuePair<string, float[]> kv in Now2Dic)
  979. {
  980. float[] TmpValue = kv.Value;
  981. switch (Min)
  982. {
  983. case 00:
  984. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10] + TmpValue[11]);
  985. break;
  986. case 15:
  987. TmpValue[12] = TmpValue[8]; break;
  988. case 30:
  989. TmpValue[12] = (TmpValue[8] + TmpValue[9]); break;
  990. case 45:
  991. TmpValue[12] = (TmpValue[8] + TmpValue[9] + TmpValue[10]); break;
  992. }
  993. if (TmpValue[12] > 1)
  994. {
  995. TmpValue[12] = 1;
  996. }
  997. else
  998. {
  999. TmpValue[12] = 0;
  1000. }
  1001. TmpNow2Data.TryUpdate(kv.Key, TmpValue, kv.Value); // 새로운 값을 업데이트
  1002. }
  1003. }
  1004. public string[] TagParsing()
  1005. {
  1006. string[] TagSum = new string[2];
  1007. string[] CSVReadLine = new string[2];
  1008. int count = 0;
  1009. StringBuilder Sb = new StringBuilder();
  1010. StreamReader sr = new StreamReader("TagSetFile.csv", Encoding.GetEncoding("euc-kr"));
  1011. while (!sr.EndOfStream) // Stream의 끝이 올때까지 반복
  1012. {
  1013. //TagSum[0] += sr.ReadLine() + ","; // 한줄을 읽음.
  1014. string temp = sr.ReadLine(); // 한줄을 읽음.
  1015. if (!(temp.Length > 0))
  1016. {
  1017. continue;
  1018. }
  1019. CSVReadLine = temp.Split(',');
  1020. CSVReadLine[1] = CSVReadLine[1].Trim();
  1021. Sb.Append(CSVReadLine[1] + ",");
  1022. count++;
  1023. }
  1024. sr.Close();
  1025. sr.Dispose();
  1026. TagSum[0] = Sb.ToString();
  1027. TagSum[0] = TagSum[0].Substring(0, TagSum[0].Length - 1); //맨 마지막의 콤마 제거.
  1028. TagSum[1] = Convert.ToString(count);
  1029. Sb.Clear();
  1030. return TagSum;
  1031. }
  1032. }
  1033. }