192d383488a366ab247c4cd5a9c21dbdca12369d.svn-base 56 KB

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