Form_MESTest.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. using MainForm.ClassFile.XiaomiAPI;
  2. using Sunny.UI.Win32;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. using static MainForm.ClassFile.XiaomiAPI.XiaomiMqttClient_Extend;
  13. namespace MainForm.FaForm
  14. {
  15. public partial class Form_MESTest : Form
  16. {
  17. #region 变量
  18. public event AlarmMessageHandler MessageEvent;
  19. #endregion 变量
  20. #region 窗体事件
  21. public Form_MESTest()
  22. {
  23. InitializeComponent();
  24. }
  25. private void Form_MESTest_Load(object sender, EventArgs e)
  26. {
  27. cmbSNType.SelectedIndex = 0;
  28. cmbProResult.SelectedIndex = 0;
  29. }
  30. #endregion 窗体事件
  31. #region 进站相关
  32. /// <summary>
  33. /// 进站
  34. /// </summary>
  35. private async void btnStationIn_Click(object sender, EventArgs e)
  36. {
  37. try
  38. {
  39. string sn = txtSN.Text.Trim();
  40. if (string.IsNullOrEmpty(sn))
  41. {
  42. MessageBox.Show("SN号不可为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  43. return;
  44. }
  45. string snType = cmbSNType.Text.Trim();
  46. switch (snType)
  47. {
  48. case "产品SN":
  49. (int, string) result = StationInFunc_ProductSN(sn);
  50. ShowLog(result.Item2);
  51. break;
  52. case "载具SN":
  53. case "弹夹SN":
  54. MessageBox.Show("暂不支持的进站方式");
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. catch (Exception ex)
  61. {
  62. string str = ex.StackTrace;
  63. MessageBox.Show("进站异常!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  64. }
  65. }
  66. /// <summary>
  67. /// 进站 - 产品SN
  68. /// </summary>
  69. /// <param name="sn">产品SN</param>
  70. /// <returns></returns>
  71. private (int, string) StationInFunc_ProductSN(string sn)
  72. {
  73. string stationStr = cmbStationName.Text.Trim();
  74. #region 校验
  75. string vehicleCode = txtVehicleCode.Text.Trim(); // 载具码
  76. string vehicleCodeNum = txtVehicleCodeNum.Text.Trim(); // 载具穴号
  77. string bulletclipCode = txtBulletclipCode.Text.Trim(); // 弹夹码
  78. string bulletclipCodeNum = txtBulletclipCodeNum.Text.Trim(); // 弹夹穴号
  79. List<TestItem> item = new List<TestItem>();
  80. item.Add(new TestItem()
  81. {
  82. Parameter_name = "产品结果",
  83. Parameter_value = cmbProResult.Text.Trim(),
  84. });
  85. if (string.IsNullOrEmpty(vehicleCode))
  86. item.Add(new TestItem()
  87. {
  88. Parameter_name = "载具码",
  89. Parameter_value = vehicleCode,
  90. });
  91. if (string.IsNullOrEmpty(vehicleCodeNum))
  92. item.Add(new TestItem()
  93. {
  94. Parameter_name = "载具穴号",
  95. Parameter_value = vehicleCodeNum,
  96. });
  97. if (string.IsNullOrEmpty(bulletclipCode))
  98. item.Add(new TestItem()
  99. {
  100. Parameter_name = "弹夹码",
  101. Parameter_value = bulletclipCode,
  102. });
  103. if (string.IsNullOrEmpty(bulletclipCodeNum))
  104. item.Add(new TestItem()
  105. {
  106. Parameter_name = "弹夹穴号",
  107. Parameter_value = bulletclipCodeNum,
  108. });
  109. #endregion 校验
  110. int mesResult = Form_Main.formHome.SaveStationInData(stationStr, GlobalContext.WorkOrderCode, GlobalContext.Mtltmrk, sn, item, out string errorMsg);
  111. switch (mesResult)
  112. {
  113. case 1:
  114. return (1, "[1]成功;" + errorMsg);
  115. case 5:
  116. return (5, "[5]MES报警;" + errorMsg);
  117. case 6:
  118. return (6, "[6]上位机报警;" + errorMsg);
  119. default:
  120. return (999, "[999]未知结果;" + errorMsg);
  121. }
  122. }
  123. #endregion 进站相关
  124. #region 出站相关
  125. /// <summary>
  126. /// 出站
  127. /// </summary>
  128. private async void btnStationOut_Click(object sender, EventArgs e)
  129. {
  130. try
  131. {
  132. string sn = txtSN.Text.Trim();
  133. if (string.IsNullOrEmpty(sn))
  134. {
  135. MessageBox.Show("SN号不可为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  136. return;
  137. }
  138. string snType = cmbSNType.Text.Trim();
  139. switch (snType)
  140. {
  141. case "产品SN":
  142. (int, string) result = StationOutFunc_ProductSN(sn);
  143. ShowLog(result.Item2);
  144. break;
  145. case "载具SN":
  146. case "弹夹SN":
  147. MessageBox.Show("暂不支持的出站方式");
  148. break;
  149. default:
  150. break;
  151. }
  152. }
  153. catch (Exception ex)
  154. {
  155. string str = ex.StackTrace;
  156. MessageBox.Show("进站异常!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  157. }
  158. }
  159. /// <summary>
  160. /// 出站 - 产品SN
  161. /// </summary>
  162. /// <param name="sn">产品SN</param>
  163. /// <returns></returns>
  164. private (int, string) StationOutFunc_ProductSN(string sn)
  165. {
  166. string stationStr = cmbStationName.Text.Trim();
  167. #region 校验
  168. string vehicleCode = txtVehicleCode.Text.Trim(); // 载具码
  169. string vehicleCodeNum = txtVehicleCodeNum.Text.Trim(); // 载具穴号
  170. string bulletclipCode = txtBulletclipCode.Text.Trim(); // 弹夹码
  171. string bulletclipCodeNum = txtBulletclipCodeNum.Text.Trim(); // 弹夹穴号
  172. List<TestItem> item = new List<TestItem>();
  173. item.Add(new TestItem()
  174. {
  175. Parameter_name = "产品结果",
  176. Parameter_value = cmbProResult.Text.Trim(),
  177. });
  178. if (string.IsNullOrEmpty(vehicleCode))
  179. item.Add(new TestItem()
  180. {
  181. Parameter_name = "载具码",
  182. Parameter_value = vehicleCode,
  183. });
  184. if (string.IsNullOrEmpty(vehicleCodeNum))
  185. item.Add(new TestItem()
  186. {
  187. Parameter_name = "载具穴号",
  188. Parameter_value = vehicleCodeNum,
  189. });
  190. if (string.IsNullOrEmpty(bulletclipCode))
  191. item.Add(new TestItem()
  192. {
  193. Parameter_name = "弹夹码",
  194. Parameter_value = bulletclipCode,
  195. });
  196. if (string.IsNullOrEmpty(bulletclipCodeNum))
  197. item.Add(new TestItem()
  198. {
  199. Parameter_name = "弹夹穴号",
  200. Parameter_value = bulletclipCodeNum,
  201. });
  202. #endregion 校验
  203. string workorder_code = GlobalContext.WorkOrderCode; // 工单号
  204. string mtltmrk = GlobalContext.Mtltmrk; // 型号
  205. bool pass = cmbProResult.Text == "OK";
  206. string zj = vehicleCode;
  207. string zjxh = vehicleCodeNum;
  208. if (!string.IsNullOrEmpty(bulletclipCode) && !string.IsNullOrEmpty(bulletclipCodeNum))
  209. {
  210. zj = bulletclipCode;
  211. zjxh = bulletclipCodeNum;
  212. }
  213. string equipmentCode = "";
  214. string processItem = "";
  215. //[S1]Tray盘上料装备
  216. //[S2]FCT
  217. //[S3]值板机
  218. //[S4_1]载具下线装备
  219. //[S4_3]提升机1
  220. //[S4_4]提升机2
  221. //[S4_5]载具上线装备
  222. //[S5]Tray盘下料装备
  223. switch (stationStr)
  224. {
  225. case "[S1]Tray盘上料装备":
  226. equipmentCode = GlobalContext.LineCode + "-[S1]";
  227. processItem = "Tray盘上料装备";
  228. break;
  229. case "[S2]FCT":
  230. equipmentCode = GlobalContext.LineCode + "-[S2]";
  231. processItem = "FCT";
  232. break;
  233. case "[S3]值板机":
  234. equipmentCode = GlobalContext.LineCode + "-[S3]";
  235. processItem = "值板机";
  236. break;
  237. case "[S4_1]载具下线装备":
  238. equipmentCode = GlobalContext.LineCode + "-[S4_1]";
  239. processItem = "载具下线装备";
  240. break;
  241. case "[S4_3]提升机1":
  242. equipmentCode = GlobalContext.LineCode + "-[S4_3]";
  243. processItem = "提升机1";
  244. break;
  245. case "[S4_4]提升机2":
  246. equipmentCode = GlobalContext.LineCode + "-[S4_4]";
  247. processItem = "提升机2";
  248. break;
  249. case "[S4_5]载具上线装备":
  250. equipmentCode = GlobalContext.LineCode + "-[S4_5]";
  251. processItem = "载具上线装备";
  252. break;
  253. case "[S5]Tray盘下料装备":
  254. equipmentCode = GlobalContext.LineCode + "-[S5]";
  255. processItem = "Tray盘下料装备";
  256. break;
  257. }
  258. //int mesResult = 0;
  259. int mesResult = Form_Main.formHome.SaveProcessDataByDB(stationStr, item, equipmentCode, processItem
  260. , workorder_code, mtltmrk, sn, pass, zj, zjxh);
  261. switch (mesResult)
  262. {
  263. case 1:
  264. return (1, "[1]成功");
  265. case 5:
  266. return (5, "[5]MES报警");
  267. case 6:
  268. return (6, "[6]上位机报警");
  269. default:
  270. return (999, "[999]未知结果");
  271. }
  272. }
  273. #endregion 出站相关
  274. #region Iot手动上传 Tap
  275. /// <summary>
  276. /// 上传按钮_Iot
  277. /// </summary>
  278. private async void btnSend_Iot_Click(object sender, EventArgs e)
  279. {
  280. try
  281. {
  282. await Task.Run(() =>
  283. {
  284. string stationStr = cmbStationName_Iot.Text.Trim(); // 工站名称
  285. string mesStation = "";
  286. switch (stationStr)
  287. {
  288. //[S1]Tray盘上料装备
  289. //[S2]FCT
  290. //[S3]值板机
  291. //[S4_1]载具下线装备
  292. //[S4_5]载具上线装备
  293. //[S5]Tray盘下料装备
  294. case "[OP10]壳体清洁上料":
  295. mesStation = GlobalContext.S1_station;
  296. break;
  297. case "[OP20]上盖板上料装备":
  298. mesStation = GlobalContext.S2_station;
  299. break;
  300. case "[OP30]点散热胶装备_Left":
  301. mesStation = GlobalContext.s3_1_station;
  302. break;
  303. case "[OP30]点散热胶装备_Right":
  304. mesStation = GlobalContext.s3_2_station;
  305. break;
  306. case "[OP40]胶线检测":
  307. mesStation = GlobalContext.s4_station;
  308. break;
  309. case "[OP50]ADD板上料组装装备":
  310. mesStation = GlobalContext.s5_station;
  311. break;
  312. case "[OP60]组上盖板":
  313. mesStation = GlobalContext.s6_station;
  314. break;
  315. case "[OP70]上盖板锁螺丝_Left":
  316. mesStation = GlobalContext.s7_1_station;
  317. break;
  318. case "[OP70]上盖板锁螺丝_Right":
  319. mesStation = GlobalContext.s7_2_station;
  320. break;
  321. case "[OP80]NG下料":
  322. mesStation = GlobalContext.s8_station;
  323. break;
  324. case "[OP90]半成品下料":
  325. mesStation = GlobalContext.s8_station;
  326. break;
  327. }
  328. string iotSendType = cmbSendType_Iot.Text.Trim();
  329. switch (iotSendType)
  330. {
  331. //设备状态
  332. //故障日志
  333. //节拍日志
  334. //操作记录
  335. case "设备状态":
  336. (int, string) resultDeviceState = SendIotDeviceStateFun(mesStation);
  337. ShowLog_Iot($"[{resultDeviceState.Item1}]" + resultDeviceState.Item2);
  338. break;
  339. case "故障日志":
  340. (int, string) resultFaultLog = SendIotFaultLogFun(mesStation);
  341. ShowLog_Iot($"[{resultFaultLog.Item1}]" + resultFaultLog.Item2);
  342. break;
  343. case "节拍日志":
  344. (int, string) resultInputBegin = SendIotInputBeginFun(mesStation);
  345. ShowLog_Iot($"[{resultInputBegin.Item1}]" + resultInputBegin.Item2);
  346. break;
  347. case "操作记录":
  348. (int, string) resultOperateLog = SendIotOperateLogFun(mesStation);
  349. ShowLog_Iot($"[{resultOperateLog.Item1}]" + resultOperateLog.Item2);
  350. break;
  351. case "过站数据":
  352. (int, string) resultPassStation = SendIotPassStationFun(mesStation);
  353. ShowLog_Iot($"[{resultPassStation.Item1}]" + resultPassStation.Item2);
  354. break;
  355. default:
  356. break;
  357. }
  358. });
  359. }
  360. catch (Exception ex)
  361. {
  362. string str = ex.StackTrace;
  363. MessageBox.Show("进站异常!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  364. }
  365. }
  366. /// <summary>
  367. /// 上传设备状态_Iot
  368. /// </summary>
  369. /// <param name="mesStation">mes工站名称</param>
  370. /// <returns></returns>
  371. private (int, string) SendIotDeviceStateFun(string mesStation)
  372. {
  373. string xmDeviceState = cmbXiaomiDeviceState.Text.Trim(); // 设备状态
  374. if (string.IsNullOrEmpty(xmDeviceState))
  375. return (999, "‘状态类型’不可为空!");
  376. DeviceStateDataRequest request = new DeviceStateDataRequest();
  377. request.station = mesStation; // ⼯位
  378. request.state = xmDeviceState; // 设备状态
  379. request.time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 状态切换时的时间 2022-06-01 14:27:57.283
  380. if (xmDeviceState == "Fault" || xmDeviceState == "Alarm")
  381. {
  382. string faultCode = txtFaultCode.Text.Trim();
  383. if (string.IsNullOrEmpty(faultCode))
  384. return (999, "‘故障编码’不可为空!");
  385. request.fault_code = faultCode; // 对应的故障编码
  386. request.fault_tm = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 故障发⽣时间
  387. }
  388. // 上传
  389. (int, string) iotResult = XiaomiMqttClient_Extend.Write_DeviceStateData(request);
  390. return iotResult;
  391. }
  392. /// <summary>
  393. /// 上传故障日志_Iot
  394. /// </summary>
  395. /// <param name="mesStation">mes工站名称</param>
  396. /// <returns></returns>
  397. private (int, string) SendIotFaultLogFun(string mesStation)
  398. {
  399. string xmFaultName = txtFaultName.Text.Trim(); // 故障名称
  400. string xmFaultCode2 = txtFaultCode2.Text.Trim(); // 故障编码
  401. string xmFaultCmpnt = txtFaultCmpnt.Text.Trim(); // 故障部件
  402. string xmFaultDesc = txtFaultDesc.Text.Trim(); // 故障描述
  403. if (string.IsNullOrEmpty(xmFaultName))
  404. return (999, "‘故障名称’不可为空!");
  405. else if (string.IsNullOrEmpty(xmFaultCode2))
  406. return (999, "‘故障编码’不可为空!");
  407. else if (string.IsNullOrEmpty(xmFaultCmpnt))
  408. return (999, "‘故障部件’不可为空!");
  409. else if (string.IsNullOrEmpty(xmFaultDesc))
  410. return (999, "‘故障描述’不可为空!");
  411. FaultLogRequest request = new FaultLogRequest();
  412. request.station = mesStation; // ⼯位
  413. request.fault_name = xmFaultName; // 故障名称(同数据字典中的事件名称)
  414. request.fault_code = xmFaultCode2; // 故障编码(A,B,C,D,E)
  415. request.fault_cmpnt = xmFaultCmpnt; // 故障部件
  416. request.fault_desc = xmFaultDesc; // 故障描述
  417. request.fault_tm = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 故障发⽣时间 2022-06-01 14:27:57.283
  418. // 上传
  419. //(int, string) iotResult = XiaomiMqttClient_Extend.Write_FaultLog(request);
  420. (int, string) iotResult = (0, "");
  421. return iotResult;
  422. }
  423. /// <summary>
  424. /// 上传节拍日志_Iot
  425. /// </summary>
  426. /// <param name="mesStation">mes工站名称</param>
  427. /// <returns></returns>
  428. private (int, string) SendIotInputBeginFun(string mesStation)
  429. {
  430. string action = cmbAction.Text.Trim(); // 节拍动作
  431. string partSn = txtPartSn.Text.Trim(); // 物料SN
  432. string vSn = txtVSn.Text.Trim(); // 载具SN
  433. string vIndexSn = txtVIndexSn.Text.Trim(); // 载具穴位编号
  434. string extra = txtExtra.Text.Trim(); // 额外信息
  435. string class_level_1 = txtClassLevel1.Text.Trim(); // 分类层级1
  436. string class_level_2 = txtClassLevel2.Text.Trim(); // 分类层级2
  437. string class_level_3 = txtClassLevel3.Text.Trim(); // 分类层级3
  438. if (string.IsNullOrEmpty(action))
  439. return (999, "‘节拍动作’不可为空!");
  440. else if (string.IsNullOrEmpty(partSn))
  441. return (999, "‘物料SN’不可为空!");
  442. else if (string.IsNullOrEmpty(vSn))
  443. return (999, "‘载具SN’不可为空!");
  444. else if (string.IsNullOrEmpty(vIndexSn))
  445. return (999, "‘载具穴位编号’不可为空!");
  446. else if (string.IsNullOrEmpty(class_level_1))
  447. return (999, "‘分类层级1’不可为空!");
  448. else if (string.IsNullOrEmpty(class_level_2))
  449. return (999, "‘分类层级2’不可为空!");
  450. else if (string.IsNullOrEmpty(class_level_3))
  451. return (999, "‘分类层级3’不可为空!");
  452. StationInputBeginRequest request = new StationInputBeginRequest();
  453. switch (action)
  454. {
  455. /// 上料开始:beat_log/business/OEE/station_input_begin
  456. /// 上料结束:beat_log/business/OEE/station_input_end
  457. /// 作业开始:beat_log/business/OEE/station_work_begin
  458. /// 作业结束:beat_log/business/OEE/station_work_end
  459. /// 下料开始:beat_log/business/OEE/station_output_begin
  460. /// 下料结束:beat_log/business/OEE/station_output_end
  461. case "上料开始":
  462. request.action = "beat_log/business/OEE/station_input_begin"; // 节拍动作(XiaomiDeviceOEE)
  463. break;
  464. case "上料结束":
  465. request.action = "beat_log/business/OEE/station_input_end"; // 节拍动作(XiaomiDeviceOEE)
  466. break;
  467. case "作业开始":
  468. request.action = "beat_log/business/OEE/station_work_begin"; // 节拍动作(XiaomiDeviceOEE)
  469. break;
  470. case "作业结束":
  471. request.action = "beat_log/business/OEE/station_work_end"; // 节拍动作(XiaomiDeviceOEE)
  472. break;
  473. case "下料开始":
  474. request.action = "beat_log/business/OEE/station_output_begin"; // 节拍动作(XiaomiDeviceOEE)
  475. break;
  476. case "下料结束":
  477. request.action = "beat_log/business/OEE/station_output_end"; // 节拍动作(XiaomiDeviceOEE)
  478. break;
  479. }
  480. request.beat_tm = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 节拍发⽣时间(2022-06-01 14:27:57.283)
  481. request.action_subject = partSn; // 该动作操作的⽬标对象(SN)
  482. request.action_subject_parent = vSn; // ⼤板SN/载具SN
  483. request.action_location = mesStation; // 该动作的位置信息(⼯位、槽位),如:F06-GSTPLA11_01-SLOT-01
  484. request.action_material = vIndexSn; // 该动作的物料信息
  485. request.extra = extra; // 额外信息
  486. request.class_level_1 = class_level_1; // 分类层级1
  487. request.class_level_2 = class_level_2; // 分类层级2
  488. request.class_level_3 = class_level_3; // 分类层级3
  489. // 上传
  490. (int, string) iotResult = XiaomiMqttClient_Extend.Write_StationInputBegin(request);
  491. return iotResult;
  492. }
  493. /// <summary>
  494. /// 上传操作记录⽇志_Iot
  495. /// </summary>
  496. /// <param name="mesStation">mes工站名称</param>
  497. /// <returns></returns>
  498. private (int, string) SendIotOperateLogFun(string mesStation)
  499. {
  500. string operateAction = cmbOperateAction.Text.Trim(); // 操作动作
  501. string actionParam = txtActionParam.Text.Trim(); // 动作参数
  502. string operateDesc = txtOperateDesc.Text.Trim(); // 操作描述
  503. string operateResult = cmbOperateResult.Text.Trim(); // 操作结果
  504. if (string.IsNullOrEmpty(operateAction))
  505. return (999, "‘操作动作’不可为空!");
  506. else if (string.IsNullOrEmpty(operateDesc))
  507. return (999, "‘操作描述’不可为空!");
  508. else if (string.IsNullOrEmpty(operateResult))
  509. return (999, "‘操作结果’不可为空!");
  510. OperateLogRequest request = new OperateLogRequest();
  511. request.software_version = "V" + Application.ProductVersion; // 软件版本号;如:V1.2.4
  512. request.operate_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 操作时间(2022-06-01 14:27:57.283)
  513. request.operate_action = operateAction; // 操作动作(对应软件开启/关闭/重新加载项⽬;startup、shutdown、reload)
  514. request.action_param = actionParam; // 动作参数;选填,附带额外的信息
  515. request.operate_module = "MES调试模块"; // 操作模块;选填
  516. request.operate_page = "手动调试页面"; // 操作⻚⾯;选填
  517. request.current_process = Process.GetCurrentProcess()?.Id.ToString(); // 当前进程;进程ID
  518. request.operate_desc = operateDesc; // 操作描述;如:供应商软件开启/关闭/重新加载项⽬
  519. request.operate_result = operateResult; // 操作结果
  520. //request.operator_name = GlobalContext.currentRole; // 操作账号名;填当前操作⽤⼾,如⽆则填default
  521. // 上传
  522. //(int, string) iotResult = XiaomiMqttClient_Extend.Write_OperateLog(request);
  523. (int, string) iotResult=(0,"");
  524. return iotResult;
  525. }
  526. /// <summary>
  527. /// 上传过站数据_Iot
  528. /// </summary>
  529. /// <param name="mesStation">mes工站名称</param>
  530. /// <returns></returns>
  531. private (int, string) SendIotPassStationFun(string mesStation)
  532. {
  533. string stationStr = cmbStationName_Iot.Text.Trim(); // 工站名
  534. string slot = txtSlot.Text.Trim(); // 槽位编码
  535. string sn = txtSn_PassStation.Text.Trim(); // 产品SN
  536. string enter_status = cmbEnterStatus.Text.Trim(); // 进站状态
  537. string result = cmbResult.Text.Trim(); // 过站结果
  538. string work_type = cmbWorkType.Text.Trim(); // 作业类型
  539. if (string.IsNullOrEmpty(slot))
  540. return (999, "‘槽位编码’不可为空!");
  541. else if (string.IsNullOrEmpty(sn))
  542. return (999, "‘产品SN’不可为空!");
  543. else if (string.IsNullOrEmpty(enter_status))
  544. return (999, "‘进站状态’不可为空!");
  545. else if (string.IsNullOrEmpty(result))
  546. return (999, "‘过站结果’不可为空!");
  547. else if (string.IsNullOrEmpty(work_type))
  548. return (999, "‘作业类型’不可为空!");
  549. PassStationResultRequest request = new PassStationResultRequest();
  550. request.project_code = GlobalContext.Project_Code; // 项⽬编码
  551. request.factory_code = GlobalContext.Factory_Code; // ⼯⼚Id
  552. request.process_section_code = GlobalContext.Process_Section_Code; // ⼯段编码
  553. request.line_code = GlobalContext.LineCode; // 线体编码
  554. switch (stationStr)
  555. {
  556. case "[S1]Tray盘上料装备":
  557. request.work_station = GlobalContext.S1_work_station; // ⼯站
  558. request.device_code = GlobalContext.S1_device_code; // 装备编码
  559. break;
  560. case "[S2]FCT":
  561. request.work_station = GlobalContext.S2_work_station; // ⼯站
  562. request.device_code = GlobalContext.S2_device_code; // 装备编码
  563. break;
  564. //case "[S3]值板机":
  565. // request.work_station = GlobalContext.S3_work_station; // ⼯站
  566. // request.device_code = GlobalContext.S3_device_code; // 装备编码
  567. // break;
  568. //case "[S4_1]载具下线装备":
  569. // request.work_station = GlobalContext.S4_1_work_station; // ⼯站
  570. // request.device_code = GlobalContext.S4_1_device_code; // 装备编码
  571. // break;
  572. //case "[S4_3]提升机1":
  573. // request.work_station = GlobalContext.S4_3_work_station; // ⼯站
  574. // request.device_code = GlobalContext.S4_3_device_code; // 装备编码
  575. // break;
  576. //case "[S4_4]提升机2":
  577. // request.work_station = GlobalContext.S4_4_work_station; // ⼯站
  578. // request.device_code = GlobalContext.S4_4_device_code; // 装备编码
  579. // break;
  580. //case "[S4_5]载具上线装备":
  581. // request.work_station = GlobalContext.S4_5_work_station; // ⼯站
  582. // request.device_code = GlobalContext.S4_5_device_code; // 装备编码
  583. // break;
  584. //case "[S5]Tray盘下料装备":
  585. // request.work_station = GlobalContext.S5_work_station; // ⼯站
  586. // request.device_code = GlobalContext.S5_device_code; // 装备编码
  587. // break;
  588. }
  589. request.station = mesStation;
  590. request.process_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); // 节拍发⽣时间(2022-06-01 14:27:57.283)
  591. request.slot = slot; // 槽位编码
  592. request.sn = sn; // 产品SN
  593. request.enter_status = enter_status; // 进站状态
  594. request.result = result; // 过站结果
  595. request.work_type = work_type; // 作业类型
  596. // 上传过站结果
  597. //(int, string) iotResult = XiaomiMqttClient_Extend.Write_PassStationResult(request);
  598. (int, string) iotResult = (0, "");
  599. return iotResult;
  600. }
  601. /// <summary>
  602. /// 显示信息
  603. /// </summary>
  604. /// <param name="msg">信息</param>
  605. public void ShowLog_Iot(string msg)
  606. {
  607. txtInfo.Invoke(new Action(() =>
  608. {
  609. txtInfo_Iot.Text = string.Concat("\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), "=> ", msg);
  610. }));
  611. }
  612. // 更改上传类型
  613. private void cmbSendType_Iot_SelectedIndexChanged(object sender, EventArgs e)
  614. {
  615. string iotSendType = cmbSendType_Iot.Text.Trim();
  616. switch (iotSendType)
  617. {
  618. //设备状态
  619. //故障日志
  620. //节拍日志
  621. //操作记录
  622. case "设备状态":
  623. pnlDeviceState.Enabled = true;
  624. pnlFaultLog.Enabled = false;
  625. pnlStationInputBegin.Enabled = false;
  626. pnlOperateLog.Enabled = false;
  627. pnlPassStation.Enabled = false;
  628. pnlDeviceState5.Enabled = false;
  629. pnlDeviceState6.Enabled = false;
  630. pnlDeviceState7.Enabled = false;
  631. pnlDeviceState8.Enabled = false;
  632. pnlDeviceState.BackColor = Color.Yellow;
  633. pnlFaultLog.BackColor = Color.Gray;
  634. pnlStationInputBegin.BackColor = Color.Gray;
  635. pnlOperateLog.BackColor = Color.Gray;
  636. pnlPassStation.BackColor = Color.Gray;
  637. pnlDeviceState5.BackColor = Color.Gray;
  638. pnlDeviceState6.BackColor = Color.Gray;
  639. pnlDeviceState7.BackColor = Color.Gray;
  640. pnlDeviceState8.BackColor = Color.Gray;
  641. break;
  642. case "故障日志":
  643. pnlDeviceState.Enabled = false;
  644. pnlFaultLog.Enabled = true;
  645. pnlStationInputBegin.Enabled = false;
  646. pnlOperateLog.Enabled = false;
  647. pnlPassStation.Enabled = false;
  648. pnlDeviceState5.Enabled = false;
  649. pnlDeviceState6.Enabled = false;
  650. pnlDeviceState7.Enabled = false;
  651. pnlDeviceState8.Enabled = false;
  652. pnlDeviceState.BackColor = Color.Gray;
  653. pnlFaultLog.BackColor = Color.Yellow;
  654. pnlStationInputBegin.BackColor = Color.Gray;
  655. pnlOperateLog.BackColor = Color.Gray;
  656. pnlPassStation.BackColor = Color.Gray;
  657. pnlDeviceState5.BackColor = Color.Gray;
  658. pnlDeviceState6.BackColor = Color.Gray;
  659. pnlDeviceState7.BackColor = Color.Gray;
  660. pnlDeviceState8.BackColor = Color.Gray;
  661. break;
  662. case "节拍日志":
  663. pnlDeviceState.Enabled = false;
  664. pnlFaultLog.Enabled = false;
  665. pnlStationInputBegin.Enabled = true;
  666. pnlOperateLog.Enabled = false;
  667. pnlPassStation.Enabled = false;
  668. pnlDeviceState5.Enabled = false;
  669. pnlDeviceState6.Enabled = false;
  670. pnlDeviceState7.Enabled = false;
  671. pnlDeviceState8.Enabled = false;
  672. pnlDeviceState.BackColor = Color.Gray;
  673. pnlFaultLog.BackColor = Color.Gray;
  674. pnlStationInputBegin.BackColor = Color.Yellow;
  675. pnlOperateLog.BackColor = Color.Gray;
  676. pnlPassStation.BackColor = Color.Gray;
  677. pnlDeviceState5.BackColor = Color.Gray;
  678. pnlDeviceState6.BackColor = Color.Gray;
  679. pnlDeviceState7.BackColor = Color.Gray;
  680. pnlDeviceState8.BackColor = Color.Gray;
  681. break;
  682. case "操作记录":
  683. pnlDeviceState.Enabled = false;
  684. pnlFaultLog.Enabled = false;
  685. pnlStationInputBegin.Enabled = false;
  686. pnlOperateLog.Enabled = true;
  687. pnlPassStation.Enabled = false;
  688. pnlDeviceState5.Enabled = false;
  689. pnlDeviceState6.Enabled = false;
  690. pnlDeviceState7.Enabled = false;
  691. pnlDeviceState8.Enabled = false;
  692. pnlDeviceState.BackColor = Color.Gray;
  693. pnlFaultLog.BackColor = Color.Gray;
  694. pnlStationInputBegin.BackColor = Color.Gray;
  695. pnlOperateLog.BackColor = Color.Yellow;
  696. pnlPassStation.BackColor = Color.Gray;
  697. pnlDeviceState5.BackColor = Color.Gray;
  698. pnlDeviceState6.BackColor = Color.Gray;
  699. pnlDeviceState7.BackColor = Color.Gray;
  700. pnlDeviceState8.BackColor = Color.Gray;
  701. break;
  702. default:
  703. break;
  704. }
  705. }
  706. // 更改状态类型
  707. private void cmbXiaomiDeviceState_SelectedIndexChanged(object sender, EventArgs e)
  708. {
  709. string xmDeviceState = cmbXiaomiDeviceState.Text.Trim();
  710. if (xmDeviceState == "Fault" || xmDeviceState == "Alarm")
  711. {
  712. label23.Enabled = true;
  713. label24.Enabled = true;
  714. txtFaultCode.Enabled = true;
  715. }
  716. else
  717. {
  718. label23.Enabled = false;
  719. label24.Enabled = false;
  720. txtFaultCode.Enabled = false;
  721. }
  722. }
  723. #endregion Iot手动上传 Tap
  724. #region 其他方法
  725. /// <summary>
  726. /// 显示信息
  727. /// </summary>
  728. /// <param name="msg">信息</param>
  729. public void ShowLog(string msg)
  730. {
  731. txtInfo.Invoke(new Action(() =>
  732. {
  733. txtInfo.Text = string.Concat("\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), "=> ", msg);
  734. }));
  735. }
  736. /// <summary>
  737. /// 添加记录
  738. /// </summary>
  739. /// <param name="logType">日志类型</param>
  740. /// <param name="msg">日志信息</param>
  741. private void AddMessage(LogType logType, string msg)
  742. {
  743. MessageEvent?.Invoke(logType, msg);
  744. }
  745. #endregion 其他方法
  746. }
  747. }