Form_PLCDB.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. using StandardLibrary;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace MainForm.FaForm
  12. {
  13. public partial class Form_PLCDB : Form
  14. {
  15. #region 变量
  16. /// <summary>
  17. /// 日志
  18. /// </summary>
  19. public event AlarmMessageHandler MessageEvent;
  20. // string stationName = "[S0]壳体上料";
  21. // [S1]装胶圈
  22. // [S2]电性能测试
  23. // [S3]导通性测试
  24. // [S4]气密测试
  25. // [S5]激光标记
  26. // [S6]CCD检测
  27. // 192, 255, 192绿色
  28. #endregion 变量
  29. public Form_PLCDB()
  30. {
  31. InitializeComponent();
  32. }
  33. private void Form_PLCDB_Load(object sender, EventArgs e)
  34. {
  35. try
  36. {
  37. #region 页面样式
  38. cmb_SimpleStationName.SelectedIndex = 0;
  39. // dgv_S0
  40. dgv_S0.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  41. dgv_S0.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  42. dgv_S0.RectColor = Color.Gainsboro;
  43. dgv_S0.GridColor = Color.Gainsboro;
  44. dgv_S0.BackgroundColor = Color.White;
  45. // dgv_S1
  46. dgv_S1.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  47. dgv_S1.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  48. dgv_S1.RectColor = Color.Gainsboro;
  49. dgv_S1.GridColor = Color.Gainsboro;
  50. dgv_S1.BackgroundColor = Color.White;
  51. // dgv_S2
  52. dgv_S2.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  53. dgv_S2.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  54. dgv_S2.RectColor = Color.Gainsboro;
  55. dgv_S2.GridColor = Color.Gainsboro;
  56. dgv_S2.BackgroundColor = Color.White;
  57. // dgv_S3
  58. dgv_S3.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  59. dgv_S3.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  60. dgv_S3.RectColor = Color.Gainsboro;
  61. dgv_S3.GridColor = Color.Gainsboro;
  62. dgv_S3.BackgroundColor = Color.White;
  63. // dgv_S4
  64. dgv_S4.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  65. dgv_S4.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  66. dgv_S4.RectColor = Color.Gainsboro;
  67. dgv_S4.GridColor = Color.Gainsboro;
  68. dgv_S4.BackgroundColor = Color.White;
  69. // dgv_S5
  70. dgv_S5.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  71. dgv_S5.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  72. dgv_S5.RectColor = Color.Gainsboro;
  73. dgv_S5.GridColor = Color.Gainsboro;
  74. dgv_S5.BackgroundColor = Color.White;
  75. // dgv_S6
  76. dgv_S6.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  77. dgv_S6.ColumnHeadersDefaultCellStyle.ForeColor = Color.Black;
  78. dgv_S6.RectColor = Color.Gainsboro;
  79. dgv_S6.GridColor = Color.Gainsboro;
  80. dgv_S6.BackgroundColor = Color.White;
  81. #endregion 页面样式
  82. }
  83. catch (Exception ex)
  84. {
  85. string str = ex.StackTrace;
  86. MessageBox.Show("PLC交互页面初始化出错!异常信息:" + ex.Message);
  87. AddMessage(LogType.Error, "PLC交互页面初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  88. }
  89. }
  90. #region 单工位操作
  91. /// <summary>
  92. /// 连接
  93. /// </summary>
  94. private void Btn_SimpleStationConnect_Click(object sender, EventArgs e)
  95. {
  96. string plcControl = cmb_SimpleStationName.Text.Trim();
  97. switch (plcControl)
  98. {
  99. case "[S1]壳体上料":
  100. GlobalContext._IsCon_Funs1 = true;
  101. break;
  102. case "[S2]装胶圈":
  103. GlobalContext._IsCon_Funs2 = true;
  104. break;
  105. case "[S3]电性能测试":
  106. GlobalContext._IsCon_Funs3 = true;
  107. break;
  108. case "[S4]导通性测试":
  109. GlobalContext._IsCon_Funs4 = true;
  110. break;
  111. case "[S5]气密测试":
  112. GlobalContext._IsCon_Funs5 = true;
  113. break;
  114. case "独立线程-上位机心跳":
  115. GlobalContext._IsCon_plc1Heat = true;
  116. break;
  117. case "独立线程-采集设备状态与报警":
  118. GlobalContext._IsCon_plc1Alarm = true;
  119. break;
  120. default:
  121. break;
  122. }
  123. AddMessage(LogType.Info, $"用户【{currentRole}】启用了工位【{plcControl}】的运行!本次有效!");
  124. }
  125. /// <summary>
  126. /// 断开连接
  127. /// </summary>
  128. private void Btn_SimpleStationDisconnect_Click(object sender, EventArgs e)
  129. {
  130. string plcControl = cmb_SimpleStationName.Text.Trim();
  131. switch (plcControl)
  132. {
  133. case "[S1]壳体上料":
  134. GlobalContext._IsCon_Funs1 = false;
  135. break;
  136. case "[S2]装胶圈":
  137. GlobalContext._IsCon_Funs2 = false;
  138. break;
  139. case "[S3]电性能测试":
  140. GlobalContext._IsCon_Funs3 = false;
  141. break;
  142. case "[S4]导通性测试":
  143. GlobalContext._IsCon_Funs4 = false;
  144. break;
  145. case "[S5]气密测试":
  146. GlobalContext._IsCon_Funs5 = false;
  147. break;
  148. case "独立线程-上位机心跳":
  149. GlobalContext._IsCon_plc1Heat = false;
  150. break;
  151. case "独立线程-采集设备状态与报警":
  152. GlobalContext._IsCon_plc1Alarm = false;
  153. break;
  154. default:
  155. break;
  156. }
  157. AddMessage(LogType.Info, $"用户【{currentRole}】屏蔽了工位【{plcControl}】的运行!本次有效!");
  158. }
  159. /// <summary>
  160. /// 查看实时数据
  161. /// </summary>
  162. private void Btn_SimpleStationDBView_Click(object sender, EventArgs e)
  163. {
  164. try
  165. {
  166. string stationName = cmb_SimpleStationName.Text.Trim();
  167. Form_PLCDB_ShowInfo plcDB_ShowInfo = Form_PLCDB_ShowInfo.Singleton(stationName,this);
  168. AddMessage(LogType.Info, $"用户【{currentRole}】查看了各工位的实时数据!");
  169. plcDB_ShowInfo.ShowDialog();
  170. }
  171. catch (Exception ex)
  172. {
  173. string str = ex.StackTrace;
  174. MessageBox.Show("PLC交互页面初始化出错!异常信息:" + ex.Message);
  175. AddMessage(LogType.Error, "PLC交互页面初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  176. }
  177. }
  178. #endregion 单工位操作
  179. #region 整线工位操作
  180. /// <summary>
  181. /// 连接
  182. /// </summary>
  183. private void Btn_WholeLineConnect_Click(object sender, EventArgs e)
  184. {
  185. GlobalContext._IsCon_Funs1 = true;
  186. GlobalContext._IsCon_Funs2 = true;
  187. GlobalContext._IsCon_Funs3 = true;
  188. GlobalContext._IsCon_Funs4 = true;
  189. GlobalContext._IsCon_Funs5 = true;
  190. GlobalContext._IsCon_plc1Heat = true;
  191. GlobalContext._IsCon_plc1Alarm = true;
  192. AddMessage(LogType.Info, $"用户【{currentRole}】启用了所有工位的运行!本次有效!");
  193. }
  194. /// <summary>
  195. /// 断开连接
  196. /// </summary>
  197. private void Btn_WholeLineDisconnect_Click(object sender, EventArgs e)
  198. {
  199. GlobalContext._IsCon_Funs1 = false;
  200. GlobalContext._IsCon_Funs2 = false;
  201. GlobalContext._IsCon_Funs3 = false;
  202. GlobalContext._IsCon_Funs4 = false;
  203. GlobalContext._IsCon_Funs5 = false;
  204. GlobalContext._IsCon_plc1Heat = false;
  205. GlobalContext._IsCon_plc1Alarm = false;
  206. AddMessage(LogType.Info, $"用户【{currentRole}】屏蔽了所有工位的运行!本次有效!");
  207. }
  208. /// <summary>
  209. /// 重新连接
  210. /// </summary>
  211. private void Btn_WholeLineRConnect_Click(object sender, EventArgs e)
  212. {
  213. GlobalContext._IsCon_Funs1 = true;
  214. GlobalContext._IsCon_Funs2 = true;
  215. GlobalContext._IsCon_Funs3 = true;
  216. GlobalContext._IsCon_Funs4 = true;
  217. GlobalContext._IsCon_Funs5 = true;
  218. GlobalContext._IsCon_plc1Heat = true;
  219. GlobalContext._IsCon_plc1Alarm = true;
  220. AddMessage(LogType.Info, $"用户【{currentRole}】重新启用了所有工位的运行!本次有效!");
  221. }
  222. #endregion 整线工位操作
  223. /// <summary>
  224. /// 更新PLC方法运行状态的UI
  225. /// </summary>
  226. /// <param name="no">PLC编号</param>
  227. /// <param name="status">状态</param>
  228. public void UpdatePLCFunMonitor(int no, int status)
  229. {
  230. try
  231. {
  232. if (this.InvokeRequired) // 当前线程不是控件UI线程时为true
  233. {
  234. this.Invoke(new Action<int, int>(UpdatePLCFunMonitor), no, status);
  235. return;
  236. }
  237. // 255, 192, 192红色
  238. // 192, 255, 192绿色
  239. switch (no)
  240. {
  241. case -1: // plc1Heat 独立线程-上位机心跳
  242. LedB_Heat.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  243. break;
  244. case -2: // plc1Alarm 独立线程-采集设备状态与报警
  245. LedB_Alarm.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  246. break;
  247. case 1: // [S0]壳体上料
  248. LedB_S0.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  249. break;
  250. case 2: // [S1]装胶圈
  251. LedB_S1.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  252. break;
  253. case 3: // [S2]电性能测试
  254. LedB_S2.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  255. break;
  256. case 4: // [S3]导通性测试
  257. LedB_S3.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  258. break;
  259. case 5: // [S4]气密测试
  260. LedB_S4.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  261. break;
  262. case 6: // [S5]激光标记
  263. LedB_S5.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  264. break;
  265. case 7: // [S6]CCD检测
  266. LedB_S6.Color = status == 1 ? Color.FromArgb(192, 255, 192) : Color.FromArgb(255, 192, 192);
  267. break;
  268. default:
  269. break;
  270. }
  271. }
  272. catch (Exception ex)
  273. {
  274. string str = ex.StackTrace;
  275. AddMessage(LogType.Error, "更新PLC交互页_PLC运行状态UI出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  276. }
  277. }
  278. /// <summary>
  279. /// 测试“展示事件记录”
  280. /// </summary>
  281. private void button1_Click(object sender, EventArgs e)
  282. {
  283. UpdateMessage(new PLCDBFormMessage()
  284. {
  285. StationName= "[S0]壳体上料",
  286. SnNumber="SN00",
  287. Message= "[S0]壳体上料-测试信息",
  288. CreateTime=DateTime.Now
  289. });
  290. UpdateMessage(new PLCDBFormMessage()
  291. {
  292. StationName = "[S1]装胶圈",
  293. SnNumber = "SN01",
  294. Message = "[S1]装胶圈-测试信息",
  295. CreateTime = DateTime.Now
  296. });
  297. UpdateMessage(new PLCDBFormMessage()
  298. {
  299. StationName = "[S2]电性能测试",
  300. SnNumber = "SN02",
  301. Message = "[S2]电性能测试-测试信息",
  302. CreateTime = DateTime.Now
  303. });
  304. UpdateMessage(new PLCDBFormMessage()
  305. {
  306. StationName = "[S3]导通性测试",
  307. SnNumber = "SN03",
  308. Message = "[S3]导通性测试-测试信息",
  309. CreateTime = DateTime.Now
  310. });
  311. UpdateMessage(new PLCDBFormMessage()
  312. {
  313. StationName = "[S4]气密测试",
  314. SnNumber = "SN04",
  315. Message = "[S4]气密测试-测试信息",
  316. CreateTime = DateTime.Now
  317. });
  318. UpdateMessage(new PLCDBFormMessage()
  319. {
  320. StationName = "[S5]激光标记",
  321. SnNumber = "SN05",
  322. Message = "[S5]激光标记-测试信息",
  323. CreateTime = DateTime.Now
  324. });
  325. UpdateMessage(new PLCDBFormMessage()
  326. {
  327. StationName = "[S6]CCD检测",
  328. SnNumber = "SN06",
  329. Message = "[S6]CCD检测-测试信息",
  330. CreateTime = DateTime.Now
  331. });
  332. }
  333. /// <summary>
  334. /// 展示事件记录
  335. /// </summary>
  336. /// <param name="stationName">工站</param>
  337. /// <param name="snNumber">产品数字SN</param>
  338. /// <param name="message"></param>
  339. public void UpdateMessage(PLCDBFormMessage plCMessage)
  340. {
  341. try
  342. {
  343. if (this.InvokeRequired) // 当前线程不是控件UI线程时为true
  344. {
  345. this.Invoke(new Action<PLCDBFormMessage>(UpdateMessage), plCMessage);
  346. return;
  347. }
  348. switch (plCMessage.StationName)
  349. {
  350. /// [S0]壳体上料
  351. /// [S1]装胶圈
  352. /// [S2]电性能测试
  353. /// [S3]导通性测试
  354. /// [S4]气密测试
  355. /// [S5]激光标记
  356. /// [S6]CCD检测
  357. /// 上位机心跳
  358. /// 获取设备报警数据与状态信息
  359. case "[S0]壳体上料":
  360. dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  361. if (dgv_S0.Rows.Count >= 100)
  362. dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
  363. break;
  364. case "[S1]装胶圈":
  365. dgv_S1.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  366. if (dgv_S1.Rows.Count >= 100)
  367. dgv_S1.Rows.RemoveAt(dgv_S1.Rows.Count - 1);
  368. break;
  369. case "[S2]电性能测试":
  370. dgv_S2.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  371. if (dgv_S2.Rows.Count >= 100)
  372. dgv_S2.Rows.RemoveAt(dgv_S2.Rows.Count - 1);
  373. break;
  374. case "[S3]导通性测试":
  375. dgv_S3.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  376. if (dgv_S3.Rows.Count >= 100)
  377. dgv_S3.Rows.RemoveAt(dgv_S3.Rows.Count - 1);
  378. break;
  379. case "[S4]气密测试":
  380. dgv_S4.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  381. if (dgv_S4.Rows.Count >= 100)
  382. dgv_S4.Rows.RemoveAt(dgv_S4.Rows.Count - 1);
  383. break;
  384. case "[S5]激光标记":
  385. dgv_S5.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  386. if (dgv_S5.Rows.Count >= 100)
  387. dgv_S5.Rows.RemoveAt(dgv_S5.Rows.Count - 1);
  388. break;
  389. case "[S6]CCD检测":
  390. dgv_S6.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  391. if (dgv_S6.Rows.Count >= 100)
  392. dgv_S6.Rows.RemoveAt(dgv_S6.Rows.Count - 1);
  393. break;
  394. //case "上位机心跳":
  395. // dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  396. // if (dgv_S0.Rows.Count >= 100)
  397. // dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
  398. // break;
  399. //case "获取设备报警数据与状态信息":
  400. // dgv_S0.Rows.Insert(0, plCMessage.SnNumber, plCMessage.Message, plCMessage.CreateTime.ToString("yyyy/MM/dd HH:mm:ss:fff"));
  401. // if (dgv_S0.Rows.Count >= 100)
  402. // dgv_S0.Rows.RemoveAt(dgv_S0.Rows.Count - 1);
  403. // break;
  404. default:
  405. break;
  406. }
  407. }
  408. catch (Exception ex)
  409. {
  410. string str = ex.StackTrace;
  411. AddMessage(LogType.Error, "更新PLC交互页_事件记录UI出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  412. }
  413. }
  414. #region 记录
  415. public void AddMessage(LogType logType, string msg)
  416. {
  417. MessageEvent?.Invoke(logType, msg);
  418. }
  419. /// <summary>
  420. /// 当前用户的角色
  421. /// </summary>
  422. public string currentRole = "";
  423. /// <summary>
  424. /// 改变用户时更新页面
  425. /// </summary>
  426. /// <param name="user">用户信息</param>
  427. public void ForUserChangeToUpdate(User user)
  428. {
  429. currentRole = user.ToString();
  430. }
  431. #endregion 记录
  432. }
  433. /// <summary>
  434. /// PLC交互页-事件记录展示实体
  435. /// </summary>
  436. public class PLCDBFormMessage
  437. {
  438. /// <summary>
  439. /// 工位名称
  440. /// [S0]壳体上料
  441. /// [S1]装胶圈
  442. /// [S2]电性能测试
  443. /// [S3]导通性测试
  444. /// [S4]气密测试
  445. /// [S5]激光标记
  446. /// [S6]CCD检测
  447. /// 上位机心跳
  448. /// 获取设备报警数据与状态信息
  449. /// </summary>
  450. public string StationName{get;set;}
  451. /// <summary>
  452. /// 产品数字SN
  453. /// </summary>
  454. public string SnNumber { get; set; }
  455. /// <summary>
  456. /// 信息
  457. /// </summary>
  458. public string Message { get; set; }
  459. /// <summary>
  460. /// 发生时间
  461. /// </summary>
  462. public DateTime CreateTime { get; set; }
  463. }
  464. }