a868df4e16abe7b592217fa073e4176267a88680.svn-base 51 KB

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