f2021ceb555850e5154e3cafc0f1a1749793a935.svn-base 64 KB

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