Parsing.cs 57 KB

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