UcCncMoniter.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. using DevExpress.Utils;
  2. using DevExpress.XtraCharts;
  3. using FocasCncCollect.Core;
  4. using FocasCncCollect.ICore;
  5. using FocasCncCollect.Models;
  6. using FocasCncCollect.Models.Enum;
  7. using SiwiFms.Helper;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Threading;
  12. namespace FocasCncCollect.UControl
  13. {
  14. public partial class UcCncMoniter : DevExpress.XtraEditors.XtraUserControl
  15. {
  16. private ILogEquipmentMsg iLogEquipmentMsg = new LogEquipmentMsg();
  17. private ILogCncWarn iLogCncWarn = new LogCncWarn();
  18. private EQUIPMENT_INFO cnc;
  19. private LOG_EQUIPMENT_MSG_TEMP logTemp = null;
  20. /// <summary>
  21. /// 简单数据刷新
  22. /// </summary>
  23. private Thread SimpleDataRefreshThread;
  24. /// <summary>
  25. /// 图标刷新
  26. /// </summary>
  27. private Thread ChartRefreshThread;
  28. /// <summary>
  29. /// 日志刷新
  30. /// </summary>
  31. private Thread WarnLogRefreshThread;
  32. public UcCncMoniter()
  33. {
  34. InitializeComponent();
  35. }
  36. /// <summary>
  37. /// 加载数据
  38. /// </summary>
  39. /// <param name="cnc"></param>
  40. public UcCncMoniter(EQUIPMENT_INFO cnc)
  41. {
  42. InitializeComponent();
  43. this.cnc = cnc;
  44. logTemp = FrmEquipmentMonitor.tempList.Find(t => t.EQUIPMENT_NO == cnc.EQUIPMENT_NO);
  45. SimpleDataRefreshThread = new Thread(new ThreadStart(RefreshSimpleHandle));
  46. ChartRefreshThread = new Thread(new ThreadStart(ChartRefreshHandle));
  47. WarnLogRefreshThread = new Thread(new ThreadStart(WarnLogRefresh));
  48. }
  49. private void UcCncMoniter_Load(object sender, EventArgs e)
  50. {
  51. SimpleDataRefreshThread.Start();
  52. ChartRefreshThread.Start();
  53. WarnLogRefreshThread.Start();
  54. if (cnc.EQUIPMENT_NO == 1)
  55. {
  56. Console.WriteLine("");
  57. }
  58. RefreshSimpleData();
  59. RefreshChart();
  60. }
  61. /// <summary>
  62. /// 刷新数据
  63. /// </summary>
  64. /// <param name="cnc"></param>
  65. internal void RefreshData(EQUIPMENT_INFO cnc)
  66. {
  67. logTemp = FrmEquipmentMonitor.tempList.Find(t => t.EQUIPMENT_NO == cnc.EQUIPMENT_NO);
  68. this.cnc = cnc;
  69. RefreshSimpleData();
  70. RefreshChart();
  71. }
  72. private void ChartRefreshHandle()
  73. {
  74. while (true)
  75. {
  76. try
  77. {
  78. RefreshChart();
  79. }
  80. catch (Exception ex) { }
  81. Thread.Sleep(10000);
  82. }
  83. }
  84. private void WarnLogRefresh()
  85. {
  86. while (true)
  87. {
  88. try
  89. {
  90. RefreshWarnLog();
  91. }
  92. catch (Exception ex) { }
  93. Thread.Sleep(10000);
  94. }
  95. }
  96. /// <summary>
  97. /// 刷新报警数据
  98. /// </summary>
  99. private void RefreshWarnLog()
  100. {
  101. DateTime startDate = DateTime.Now.AddDays(-7);
  102. List<LOG_CNC_WARN> warnList = iLogCncWarn.GetList(t => t.EQUIPMENT_NO == cnc.EQUIPMENT_NO && t.EQUIPMENT_NAME == cnc.EQUIPMENT_NAME && t.WARN_TIME > startDate).OrderByDescending(t => t.WARN_TIME).ToList();
  103. int focusRow = gv_warnLog.FocusedRowHandle;
  104. if (this.InvokeRequired)
  105. {
  106. bool refreshFlag = false;
  107. this.BeginInvoke(new Action(() =>
  108. {
  109. gc_warnLog.DataSource = warnList;
  110. gv_warnLog.BestFitColumns();
  111. gv_warnLog.FocusedRowHandle = focusRow;
  112. refreshFlag = true;
  113. }));
  114. while (!refreshFlag)
  115. {
  116. Thread.Sleep(1);
  117. }
  118. }
  119. else
  120. {
  121. gc_warnLog.DataSource = warnList;
  122. gv_warnLog.BestFitColumns();
  123. gv_warnLog.FocusedRowHandle = focusRow;
  124. }
  125. }
  126. /// <summary>
  127. /// 刷新图表
  128. /// </summary>
  129. private void RefreshChart()
  130. {
  131. //查询当天采集数据
  132. List<LOG_EQUIPMENT_MSG> logList = new List<LOG_EQUIPMENT_MSG>();
  133. try
  134. {
  135. logList = iLogEquipmentMsg.GetList(t => t.EQUIPMENT_NO == cnc.EQUIPMENT_NO);
  136. logList.ForEach(t =>
  137. {
  138. if (t.WARN_STATUS == WarnStatus.Warn && t.ON_OFF_STATUS == OnOff.On)
  139. {
  140. t.EQUIPMENT_STATUS = EquipmentStatus.Warn;
  141. }
  142. t.STR_EQUIPMENT_STATUS = EnumUtil.GetDescription(t.EQUIPMENT_STATUS);
  143. t.STR_PROC_STATUS = EnumUtil.GetDescription(t.PROC_STATUS);
  144. });
  145. }
  146. catch (Exception ex)
  147. {
  148. }
  149. //var list1 = (from p in logList
  150. // group p by new
  151. // {
  152. // p.STR_EQUIPMENT_STATUS
  153. // } into g
  154. // select new ChartView1()
  155. // {
  156. // count = g.Count(),
  157. // status = g.Max(t => t.STR_EQUIPMENT_STATUS),
  158. // }).ToList();
  159. //Series s1 = new Series("运行状态", ViewType.NestedDoughnut);
  160. //s1.ValueDataMembers[0] = "count";
  161. //s1.DataSource = list1;
  162. //s1.ArgumentDataMember = "status";
  163. //s1.LabelsVisibility = DefaultBoolean.False;
  164. //添加机床运行状态饼状图
  165. var list1 = (from p in logList
  166. group p by new
  167. {
  168. p.STR_EQUIPMENT_STATUS
  169. } into g
  170. select new ChartView1()
  171. {
  172. count = g.Count(),
  173. status = g.Max(t => t.STR_EQUIPMENT_STATUS),
  174. }).ToList();
  175. Series s1 = chart_main.Series.FirstOrDefault(t => t.Name == "运行状态") as Series;
  176. if (s1 == null)
  177. {
  178. s1 = new Series("运行状态", ViewType.Doughnut);
  179. s1.ValueDataMembers[0] = "count";
  180. s1.DataSource = list1;
  181. s1.ArgumentDataMember = "status";
  182. s1.LabelsVisibility = DefaultBoolean.False;
  183. }
  184. //添加饼状图名
  185. //DoughnutSeriesView doughnutSeriesView3 = new DoughnutSeriesView();
  186. //SeriesTitle seriesTitle3 = new SeriesTitle();
  187. //seriesTitle3.Text = "运行状态";
  188. //doughnutSeriesView3.Titles.AddRange(new SeriesTitle[] {
  189. //seriesTitle3});
  190. //s1.View = doughnutSeriesView3;
  191. //添加机床加工状态饼状图
  192. //var list2 = (from p in logList
  193. // group p by new
  194. // {
  195. // p.STR_PROC_STATUS
  196. // } into g
  197. // select new ChartView2()
  198. // {
  199. // count = g.Count(),
  200. // status = g.Max(t => t.STR_PROC_STATUS),
  201. // }).ToList();
  202. //Series s2 = new Series("加工状态", ViewType.Doughnut);
  203. //s2.ValueDataMembers[0] = "count";
  204. //s2.ArgumentDataMember = "status";
  205. //s2.DataSource = list2;
  206. //s2.LabelsVisibility = DefaultBoolean.False;
  207. //添加饼状图名
  208. //DoughnutSeriesView doughnutSeriesView4 = new DoughnutSeriesView();
  209. //SeriesTitle seriesTitle4 = new SeriesTitle();
  210. //seriesTitle4.Text = "加工状态";
  211. //doughnutSeriesView4.Titles.AddRange(new SeriesTitle[] {
  212. //seriesTitle4});
  213. //s2.View = doughnutSeriesView4;
  214. if (this.InvokeRequired)
  215. {
  216. bool refreshFlag = false;
  217. this.BeginInvoke(new Action(() =>
  218. {
  219. try
  220. {
  221. if (chart_main.Series.FirstOrDefault(t => t.Name == "运行状态") == null)
  222. {
  223. chart_main.Series.Add(s1);
  224. chart_main.SeriesTemplate.View = new PieSeriesView();
  225. foreach (Series sr in chart_main.Series)
  226. {
  227. sr.LegendTextPattern = "{A} {VP:0.00%}";
  228. }
  229. }
  230. else
  231. {
  232. s1.DataSource = list1;
  233. }
  234. }
  235. catch { }
  236. finally
  237. {
  238. refreshFlag = true;
  239. }
  240. }));
  241. while (!refreshFlag)
  242. {
  243. Thread.Sleep(1);
  244. }
  245. }
  246. else
  247. {
  248. if (chart_main.Series.FirstOrDefault(t => t.Name == "运行状态") == null)
  249. {
  250. chart_main.Series.Add(s1);
  251. chart_main.SeriesTemplate.View = new PieSeriesView();
  252. foreach (Series sr in chart_main.Series)
  253. {
  254. sr.LegendTextPattern = "{A} {VP:0.00%}";
  255. }
  256. }
  257. else
  258. {
  259. s1.DataSource = list1;
  260. }
  261. }
  262. }
  263. private void RefreshSimpleHandle()
  264. {
  265. while (true)
  266. {
  267. try
  268. {
  269. RefreshSimpleData();
  270. }
  271. catch (Exception ex)
  272. {
  273. }
  274. Thread.Sleep(100);
  275. }
  276. }
  277. /// <summary>
  278. /// 刷新简单数据
  279. /// </summary>
  280. private void RefreshSimpleData()
  281. {
  282. if (this.InvokeRequired)
  283. {
  284. this.Invoke(new Action(() => { try { RefreshSimpleDataTemp(); } catch { } }));
  285. }
  286. else
  287. {
  288. RefreshSimpleDataTemp();
  289. }
  290. }
  291. private void RefreshSimpleDataTemp()
  292. {
  293. groupControl1.Text = string.Format("{0}-{1}", cnc.EQUIPMENT_NO, cnc.EQUIPMENT_NAME);
  294. if (logTemp == null) logTemp = new LOG_EQUIPMENT_MSG_TEMP() { AXLE_LOAD = "0" };
  295. txt_runStatus.Text = EnumUtil.GetDescription(logTemp.EQUIPMENT_STATUS);
  296. this.Enabled = txt_runStatus.Text != "关机";
  297. txt_warnCode.Text = logTemp.ERR_CODE;
  298. txt_EStopStatus.Text = logTemp.ESTOP_STATUS == 1 ? "急停中" : "正常";
  299. if (logTemp.EQUIPMENT_STATUS == EquipmentStatus.Running)//cnc.LAST_START_TIME != null &&
  300. {
  301. //txt_partNo.Text = cnc.CURRENT_PART;
  302. //加工时间 转化为易读的时间格式
  303. // txt_procTime.Text = DateTimeHelper.GetDiffTime(cnc.LAST_START_TIME.Value, DateTime.Now);
  304. }
  305. else
  306. {
  307. txt_partNo.Text = "";
  308. txt_procTime.Text = "";
  309. }
  310. ts_doorStatus.IsOn = logTemp.DOOR_STATUS == OnOff.On;
  311. //主轴转速
  312. dtg_mainSpeed.Text = logTemp.AXLE_SPEED.ToString();
  313. //主轴负载
  314. dtg_mainLoad.Text = logTemp.AXLE_LOAD;
  315. //进给速度
  316. dtg_feedSpeed.Text = logTemp.FEED_SPEED.ToString();
  317. //进给倍率
  318. //dtg_feedPower.Text = cnc.COLLECT_DATA.FEED_QUANTITY.ToString();
  319. dtg_feedPower.Text = cnc.STOP_NUMBER.ToString();
  320. //主轴坐标
  321. if (logTemp.AXLE_COORDINATE != null)
  322. {
  323. List<string> coordinateList = logTemp.AXLE_COORDINATE.Split(';').ToList();
  324. foreach (var item in coordinateList)
  325. {
  326. var temp = item.Split(':');
  327. string nate = temp[0].Trim();
  328. string value = "0";
  329. if (temp.Length > 1)
  330. {
  331. value = temp[1].Trim();
  332. if (value.Length > 6)
  333. {
  334. value = value.Substring(0, 6);
  335. }
  336. }
  337. switch (nate)
  338. {
  339. case "U":
  340. case "X":
  341. {
  342. labelControl9.Text = nate;
  343. dtg_Addr_X.Text = value;
  344. break;
  345. }
  346. case "W":
  347. case "Y":
  348. {
  349. labelControl8.Text = nate;
  350. dtg_Addr_Y.Text = value;
  351. break;
  352. }
  353. case "H":
  354. case "Z":
  355. {
  356. labelControl10.Text = nate;
  357. dtg_Addr_Z.Text = value;
  358. break;
  359. }
  360. //U: 88.808; W: 5.012; H: 0
  361. }
  362. }
  363. }
  364. }
  365. public void CloseThread()
  366. {
  367. try
  368. {
  369. SimpleDataRefreshThread.Abort();
  370. }
  371. catch (Exception ex) { }
  372. try
  373. {
  374. ChartRefreshThread.Abort();
  375. }
  376. catch (Exception ex) { }
  377. try
  378. {
  379. WarnLogRefreshThread.Abort();
  380. }
  381. catch (Exception ex) { }
  382. }
  383. }
  384. /// <summary>
  385. ///
  386. /// </summary>
  387. public class ChartView1
  388. {
  389. public int count { get; set; }
  390. public string status { get; set; }
  391. }
  392. public class ChartView2
  393. {
  394. public int count { get; set; }
  395. public string status { get; set; }
  396. }
  397. }