终端一体化运控平台
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 

2571 Zeilen
129 KiB

  1. using BPASmartClient.AGV;
  2. using BPASmartClient.AGV.Enums;
  3. using BPASmartClient.AGV.Feedback;
  4. using BPASmartClient.CustomResource.Pages.Model;
  5. using BPASmartClient.Helper;
  6. using BPASmartClient.HubHelper;
  7. using FryPot_DosingSystem.Model;
  8. using FryPot_DosingSystem.ViewModel;
  9. using Newtonsoft.Json;
  10. using System;
  11. using System.Collections.Concurrent;
  12. using System.Collections.Generic;
  13. using System.Collections.ObjectModel;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using System.Windows.Media;
  19. using System.Windows;
  20. using FryPot_DosingSystem.AGV;
  21. namespace FryPot_DosingSystem.Control
  22. {
  23. internal class DosingLogicControl
  24. {
  25. public static DosingLogicControl _instance;
  26. public static DosingLogicControl GetInstance => _instance ??= new DosingLogicControl();
  27. public ConcurrentDictionary<string, object> PlcReadData = new ConcurrentDictionary<string, object>();
  28. /// <summary>
  29. /// 线体1配方队列
  30. /// </summary>
  31. public ConcurrentQueue<NewRecipeModel> RecipeQuene = new ConcurrentQueue<NewRecipeModel>();
  32. /// <summary>
  33. /// 线体2配方队列
  34. /// </summary>
  35. public ConcurrentQueue<NewRecipeModel> LTwoRecipeQuene = new ConcurrentQueue<NewRecipeModel>();
  36. /// <summary>
  37. /// 线体3配方队列
  38. /// </summary>
  39. public ConcurrentQueue<NewRecipeModel> LThreeRecipeQuene = new ConcurrentQueue<NewRecipeModel>();
  40. /// <summary>
  41. /// 线体1进料原料队列
  42. /// </summary>
  43. public ConcurrentQueue<MaterialInfo> InputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  44. /// <summary>
  45. /// 线体2进料原料队列
  46. /// </summary>
  47. public ConcurrentQueue<MaterialInfo> LTwoInputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  48. /// <summary>
  49. /// 线体3进料原料队列
  50. /// </summary>
  51. public ConcurrentQueue<MaterialInfo> LThreeInputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  52. /// <summary>
  53. /// 线体1出料原料队列
  54. /// </summary>
  55. public ConcurrentQueue<MaterialInfo> OutputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  56. /// <summary>
  57. /// 线体2出料原料队列
  58. /// </summary>
  59. public ConcurrentQueue<MaterialInfo> LTwoOutputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  60. /// <summary>
  61. /// 线体3出料原料队列
  62. /// </summary>
  63. public ConcurrentQueue<MaterialInfo> LThreeOutputMaterialQuene = new ConcurrentQueue<MaterialInfo>();
  64. /// <summary>
  65. /// 全局变量对象声明
  66. /// </summary>
  67. GlobalVariable globalVar;
  68. /// <summary>
  69. /// 线体状态对象声明
  70. /// </summary>
  71. HardWareStatusViewModel hardWareStatusModel;
  72. /// <summary>
  73. /// 报警信息对象声明
  74. /// </summary>
  75. #region 上位机内部变量
  76. int FryPotAlarm = 0;//炒锅1滚筒故障信号 1:无故障 -1:故障
  77. int FryPotTwoAlarm = 0;//炒锅2滚筒故障信号 1:无故障 -1:故障
  78. int FryPotThreeAlarm = 0;//炒锅3滚筒故障信号 1:无故障 -1:故障
  79. int FryPotFourAlarm = 0;//炒锅4滚筒故障信号 1:无故障 -1:故障
  80. int FryPotFiveAlarm = 0;//炒锅5滚筒故障信号 1:无故障 -1:故障
  81. int ReicpeNum = 0;//记录接收到的配方数
  82. bool ErrorRecipe;//线体1错误配方标识
  83. bool LTwoErrorRecipe;//线体2错误配方标识
  84. bool LThreeErrorRecipe;//线体3错误配方标识
  85. #endregion
  86. #region agv临时变量
  87. //bool agvArriveUpLoad = false;//agv是否到达线体1上料位置
  88. //bool agvArriveLTwoUpLoad = false;//agv是否到达线体2上料位置
  89. //bool agvArriveLThreeUpLoad = false;//agv是否到达线体3上料位置
  90. //bool agvArriveUnLoad = false;//线体1 agv是否到达炒锅送料位置
  91. //bool LTwoagvArriveUnLoad = false;//线体2 agv是否到达炒锅送料位置
  92. //bool LThreeagvArriveUnLoad = false;//线体3 agv是否到达炒锅送料位置
  93. //bool agvFryPotEmptyRollerArrive = false;// 线体1的agv是否拿到炒锅空桶
  94. //bool LTwoagvFryPotEmptyRollerArrive = false; //线体2的agv是否拿到炒锅空桶
  95. //bool LThreeagvFryPotEmptyRollerArrive = false;//线体3的agv是否拿到炒锅空桶
  96. string LOnerobotJobId = String.Empty;//线体1当前上游系统任务号,全局唯一
  97. string LTworobotJobId = String.Empty;//线体2当前上游系统任务号,全局唯一
  98. string LThreerobotJobId = String.Empty;//线体3当前上游系统任务号,全局唯一
  99. string LFourrobotJobId = String.Empty;//线体4当前上游系统任务号,全局唯一
  100. //bool loadInteractive = false;// fasle:不需要上料交互 true:需要上料交互
  101. #endregion
  102. /// <summary>
  103. /// 调试命令注册
  104. /// </summary>
  105. public void CommandRegist()
  106. {
  107. ActionManage.GetInstance.Register(new Action(() =>
  108. {
  109. globalVar.rollerLineOne.OutMaterialingSingle = 1;
  110. }), "RollerLineRunning");
  111. ActionManage.GetInstance.Register(new Action<object>((obj) =>
  112. {
  113. globalVar.rollerLineOne.StationEight = (ushort)obj;
  114. }), "EightWorkLoc");
  115. ActionManage.GetInstance.Register(new Action(() =>
  116. {
  117. globalVar.fryPotOne.InputMaterialArrivedSingle = 1;
  118. globalVar.fryPotFour.InputMaterialArrivedSingle = 1;
  119. }), "FryPotInputArrive");
  120. ActionManage.GetInstance.Register(new Action(() =>
  121. {
  122. globalVar.fryPotOne.EmptyBarrelArrivedSingle = 1;
  123. globalVar.fryPotFour.EmptyBarrelArrivedSingle = 1;
  124. }), "FryPotEmptyRollerArrive");
  125. ActionManage.GetInstance.Register(new Action(() =>
  126. {
  127. globalVar.agvArriveUpLoad = true;
  128. }), "AGVLOneArrive");
  129. ActionManage.GetInstance.Register(new Action(() =>
  130. {
  131. globalVar.agvArriveUnLoad = true;
  132. }), "AGVFryPotDownArrive");
  133. ActionManage.GetInstance.Register(new Action(() =>
  134. {
  135. globalVar.agvArriveUpLoad = true;
  136. }), "AGVFryPotUpArrive");
  137. ActionManage.GetInstance.Register(new Action(() =>
  138. {
  139. globalVar.agvFryPotEmptyRollerArrive = true;
  140. }), "AGVFryPotGetEmptyRoller");
  141. //滚筒线2
  142. ActionManage.GetInstance.Register(new Action(() =>
  143. {
  144. globalVar.rollerLineTwo.OutMaterialingSingle = 1;
  145. }), "RollerLineTwoRunning");
  146. ActionManage.GetInstance.Register(new Action<object>((obj) =>
  147. {
  148. globalVar.rollerLineTwo.StationEight = (ushort)obj;
  149. }), "TwoEightWorkLoc");
  150. ActionManage.GetInstance.Register(new Action(() =>
  151. {
  152. globalVar.fryPotTwo.InputMaterialArrivedSingle = 1;
  153. globalVar.fryPotFive.InputMaterialArrivedSingle = 1;
  154. }), "FryPotTwoInputArrive");
  155. ActionManage.GetInstance.Register(new Action(() =>
  156. {
  157. globalVar.fryPotTwo.EmptyBarrelArrivedSingle = 1;
  158. globalVar.fryPotFive.EmptyBarrelArrivedSingle = 1;
  159. }), "FryPotTwoEmptyRollerArrive");
  160. ActionManage.GetInstance.Register(new Action(() =>
  161. {
  162. globalVar.agvArriveLTwoUpLoad = true;
  163. }), "AGVLTwoArrive");
  164. ActionManage.GetInstance.Register(new Action(() =>
  165. {
  166. globalVar.LTwoagvArriveUnLoad = true;
  167. }), "AGVFryPotTwoDownArrive");
  168. ActionManage.GetInstance.Register(new Action(() =>
  169. {
  170. globalVar.agvArriveLTwoUpLoad = true;
  171. }), "AGVFryPotTwoUpArrive");
  172. ActionManage.GetInstance.Register(new Action(() =>
  173. {
  174. globalVar.LTwoagvFryPotEmptyRollerArrive = true;
  175. }), "AGVFryPotTwoGetEmptyRoller");
  176. //滚筒线3
  177. ActionManage.GetInstance.Register(new Action(() =>
  178. {
  179. globalVar.rollerLineThree.OutMaterialingSingle = 1;
  180. }), "RollerLineThreeRunning");
  181. ActionManage.GetInstance.Register(new Action<object>((obj) =>
  182. {
  183. globalVar.rollerLineThree.StationEight = (ushort)obj;
  184. }), "ThreeEightWorkLoc");
  185. ActionManage.GetInstance.Register(new Action(() =>
  186. {
  187. globalVar.fryPotThree.InputMaterialArrivedSingle = 1;
  188. }), "FryPotThreeInputArrive");
  189. ActionManage.GetInstance.Register(new Action(() =>
  190. {
  191. globalVar.fryPotThree.EmptyBarrelArrivedSingle = 1;
  192. }), "FryPotThreeEmptyRollerArrive");
  193. ActionManage.GetInstance.Register(new Action(() =>
  194. {
  195. globalVar.agvArriveLThreeUpLoad = true;
  196. }), "AGVLThreeArrive");
  197. ActionManage.GetInstance.Register(new Action(() =>
  198. {
  199. globalVar.LThreeagvArriveUnLoad = true;
  200. }), "AGVFryPotThreeDownArrive");
  201. ActionManage.GetInstance.Register(new Action(() =>
  202. {
  203. globalVar.agvArriveLThreeUpLoad = true;
  204. }), "AGVFryPotThreeUpArrive");
  205. ActionManage.GetInstance.Register(new Action(() =>
  206. {
  207. globalVar.LThreeagvFryPotEmptyRollerArrive = true;
  208. }), "AGVFryPotThreeGetEmptyRoller");
  209. }
  210. public DosingLogicControl()
  211. {
  212. globalVar = new GlobalVariable();
  213. hardWareStatusModel = HardWareStatusViewModel.GetInstance;
  214. ActionManage.GetInstance.Register(new Action<object[]>(RecipeDataParse), "RecipeSetDown");
  215. ActionManage.GetInstance.Register(new Action(() => { RecipeQuene.Clear(); InputMaterialQuene.Clear(); OutputMaterialQuene.Clear(); LTwoInputMaterialQuene.Clear(); LTwoOutputMaterialQuene.Clear(); LThreeInputMaterialQuene.Clear(); LThreeOutputMaterialQuene.Clear(); }), "ClearRecipes");
  216. ActionManage.GetInstance.Register(new Action(() => { globalVar.PlcInite = 1; }), "StartPlcInite");
  217. ActionManage.GetInstance.Register(new Action(() => { globalVar.PlcInite = 0; }), "EndPlcInite");
  218. ActionManage.GetInstance.Register(new Action(() => { globalVar.ExitMainTask = true; }), "FryPotDosingMainTaskExit");
  219. HubHelper.GetInstance.Report = new Action<object>(AgvTaskUpReportDataAnalysis);
  220. HubHelper.GetInstance.Upstreamrequest = new Action<object>(AgvFeedBackUpReportDataAnalysis);
  221. // ResetProgram();
  222. ReadPlcData();
  223. MainTask();
  224. CommandRegist();
  225. }
  226. /// <summary>
  227. /// AGV上下料上报数据解析
  228. /// </summary>
  229. /// <param name="obj"></param>
  230. private void AgvFeedBackUpReportDataAnalysis(object obj)
  231. {
  232. //if (obj != null && obj is byte[] datas)
  233. //{
  234. //string strData = Encoding.UTF8.GetString(datas);
  235. Upstreamrequest objData = JsonConvert.DeserializeObject<Upstreamrequest>(obj.ToString());
  236. if (objData != null)
  237. {
  238. //线体1请求上下料
  239. if (objData.robotJobId == LOnerobotJobId && objData.command == "LOAD")//同一任务号且处于上料阶段,AGV请求上料
  240. {
  241. globalVar.agvArriveUpLoad = true;//AGV到达上料位置
  242. }
  243. if (objData.robotJobId == LOnerobotJobId && objData.command == "UNLOAD")//同一任务号且处于下料阶段
  244. {
  245. globalVar.agvArriveUnLoad = true;//AGV到达下料位置
  246. }
  247. //线体2请求上下料
  248. if (objData.robotJobId == LTworobotJobId && objData.command == "LOAD")
  249. {
  250. globalVar.agvArriveLTwoUpLoad = true;//AGV到达上料位置
  251. }
  252. if (objData.robotJobId == LTworobotJobId && objData.command == "UNLOAD")//同一任务号且处于下料阶段
  253. {
  254. globalVar.LTwoagvArriveUnLoad = true;//AGV到达下料位置
  255. }
  256. //线体3请求上下料
  257. if (objData.robotJobId == LThreerobotJobId && objData.command == "LOAD")
  258. {
  259. globalVar.agvArriveLThreeUpLoad = true;//AGV到达上料位置
  260. }
  261. if (objData.robotJobId == LThreerobotJobId && objData.command == "UNLOAD")//同一任务号且处于下料阶段
  262. {
  263. globalVar.LThreeagvArriveUnLoad = true;//AGV到达下料位置
  264. }
  265. }
  266. }
  267. /// <summary>
  268. /// AGV搬运任务上报数据解析
  269. /// </summary>
  270. /// <param name="obj"></param>
  271. private void AgvTaskUpReportDataAnalysis(object obj)
  272. {
  273. //if (obj != null && obj is byte[] datas)
  274. //{
  275. // string strData = Encoding.UTF8.GetString(datas);
  276. AGVToUpSystem objData = JsonConvert.DeserializeObject<AGVToUpSystem>(obj.ToString());
  277. if (objData != null)
  278. {
  279. #region 线体上下料任务信息回报
  280. //线体1任务上报
  281. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LOnerobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指线体上料
  282. {
  283. }
  284. //线体2任务上报
  285. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LTworobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指线体上料
  286. {
  287. //日志
  288. }
  289. //线体3任务上报
  290. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LThreerobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指线体上料
  291. {
  292. //日志
  293. }
  294. //线体1任务上报
  295. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LOnerobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指线体上料
  296. {
  297. AgvViewModel.GetInstance().Set滚筒线上数量(1, (globalVar.LOneMaterialNum - 1).ToString());
  298. AgvViewModel.GetInstance().Set小车是否承载物品(1, IsBool.Yes);
  299. if (globalVar.LOneFryPotSerial == 1)
  300. {
  301. AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.yc_1_1);
  302. }
  303. else if (globalVar.LOneFryPotSerial == 4)
  304. {
  305. AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.yc_1_4);
  306. }
  307. }
  308. //线体2任务上报
  309. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LTworobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指线体上料
  310. {
  311. AgvViewModel.GetInstance().Set滚筒线上数量(2, (globalVar.LTwoMaterialNum - 1).ToString());
  312. AgvViewModel.GetInstance().Set小车是否承载物品(2, IsBool.Yes);
  313. if (globalVar.LTwoFryPotSerial == 2)
  314. {
  315. AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.yc_2_2);
  316. }
  317. else if (globalVar.LTwoFryPotSerial == 5)
  318. {
  319. AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.yc_2_5);
  320. }
  321. }
  322. //线体3任务上报
  323. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LThreerobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指线体上料
  324. {
  325. AgvViewModel.GetInstance().Set滚筒线上数量(3, (globalVar.LThreeMaterialNum - 1).ToString());
  326. AgvViewModel.GetInstance().Set小车是否承载物品(3, IsBool.Yes);
  327. AgvViewModel.GetInstance().Set小车运动(3, CartMotionTrajectory.yc_3_3);
  328. }
  329. //线体1任务上报
  330. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LOnerobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指线体下料
  331. {
  332. }
  333. //线体2任务上报
  334. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LTworobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指线体下料
  335. {
  336. }
  337. //线体3任务上报
  338. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LThreerobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指线体下料
  339. {
  340. }
  341. //线体1任务上报
  342. if (objData.state == "DONE" && objData.robotJobId == LOnerobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指线体下料
  343. {
  344. }
  345. //线体2任务上报
  346. if (objData.state == "DONE" && objData.robotJobId == LTworobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指线体下料
  347. {
  348. }
  349. //线体3任务上报
  350. if (objData.state == "DONE" && objData.robotJobId == LThreerobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指线体下料
  351. {
  352. }
  353. #endregion
  354. #region 空桶上下料任务信息回报
  355. //线体1任务上报
  356. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LOnerobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指空桶上料
  357. {
  358. //日志
  359. }
  360. //线体2任务上报
  361. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LTworobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指空桶上料
  362. {
  363. //日志
  364. }
  365. //线体3任务上报
  366. if (objData.state == "ROLLER_LOAD_DOING" && objData.robotJobId == LThreerobotJobId && objData.jobData.startPointCode == "")// AGV正在上料,指空桶上料
  367. {
  368. //日志
  369. }
  370. //线体1任务上报
  371. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LOnerobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指空桶上料
  372. {
  373. globalVar.agvFryPotEmptyRollerArrive = true;
  374. AgvViewModel.GetInstance().Set小车是否承载物品(1, IsBool.OnllYes);
  375. if (globalVar.LOneFryPotSerial == 1)
  376. {
  377. AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.hs_1);
  378. }
  379. else if (globalVar.LOneFryPotSerial == 4)
  380. {
  381. AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.hs_4);
  382. }
  383. }
  384. //线体2任务上报
  385. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LTworobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指空桶上料
  386. {
  387. globalVar.LTwoagvFryPotEmptyRollerArrive = true;
  388. AgvViewModel.GetInstance().Set小车是否承载物品(2, IsBool.OnllYes);
  389. if (globalVar.LTwoFryPotSerial == 2)
  390. {
  391. AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.hs_2);
  392. }
  393. else if (globalVar.LTwoFryPotSerial == 5)
  394. {
  395. AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.hs_5);
  396. }
  397. }
  398. //线体3任务上报
  399. if (objData.state == "ROLLER_LOAD_FINISH" && objData.robotJobId == LThreerobotJobId && objData.jobData.startPointCode == "")//指定上料点上料完成,这里指空桶上料
  400. {
  401. globalVar.LThreeagvFryPotEmptyRollerArrive = true;
  402. AgvViewModel.GetInstance().Set小车是否承载物品(3, IsBool.OnllYes);
  403. AgvViewModel.GetInstance().Set小车运动(3, CartMotionTrajectory.hs_3);
  404. }
  405. //线体1任务上报
  406. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LOnerobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指空桶下料
  407. {
  408. AgvViewModel.GetInstance().Set滚筒线状态(1, IsRun.Start);
  409. AgvViewModel.GetInstance().Set小车是否承载物品(1, IsBool.No);
  410. if (globalVar.LFourRollerNum >= 8)
  411. {
  412. AgvViewModel.GetInstance().Set滚筒线上数量(4, "8");
  413. }
  414. else
  415. {
  416. AgvViewModel.GetInstance().Set滚筒线上数量(4, (globalVar.LFourRollerNum + 1).ToString());
  417. }
  418. }
  419. //线体2任务上报
  420. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LTworobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指空桶下料
  421. {
  422. AgvViewModel.GetInstance().Set滚筒线状态(2, IsRun.Start);
  423. AgvViewModel.GetInstance().Set小车是否承载物品(2, IsBool.No);
  424. if (globalVar.LFourRollerNum >= 8)
  425. {
  426. AgvViewModel.GetInstance().Set滚筒线上数量(4, "8");
  427. }
  428. else
  429. {
  430. AgvViewModel.GetInstance().Set滚筒线上数量(4, (globalVar.LFourRollerNum + 1).ToString());
  431. }
  432. }
  433. //线体3任务上报
  434. if (objData.state == "ROLLER_UNLOAD_DOING" && objData.robotJobId == LThreerobotJobId && objData.jobData.targetPointCode == "")//指定下料点正在下料,指空桶下料
  435. {
  436. AgvViewModel.GetInstance().Set滚筒线状态(3, IsRun.Start);
  437. AgvViewModel.GetInstance().Set小车是否承载物品(3, IsBool.No);
  438. if (globalVar.LFourRollerNum >= 8)
  439. {
  440. AgvViewModel.GetInstance().Set滚筒线上数量(4, "8");
  441. }
  442. else
  443. {
  444. AgvViewModel.GetInstance().Set滚筒线上数量(4, (globalVar.LFourRollerNum + 1).ToString());
  445. }
  446. }
  447. //线体1任务上报
  448. if (objData.state == "DONE" && objData.robotJobId == LOnerobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指空桶下料
  449. {
  450. globalVar.EmptyRollerUnLoadcCom = true;
  451. AgvViewModel.GetInstance().Set小车运动(1, AgvViewModel.GetInstance().GetCommandValue("hj"));
  452. AgvViewModel.GetInstance().Set小车停止(1);
  453. AgvViewModel.GetInstance().Set停车桩(1, IsBool.Yes);
  454. }
  455. //线体2任务上报
  456. if (objData.state == "DONE" && objData.robotJobId == LTworobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指空桶下料
  457. {
  458. globalVar.LTwoEmptyRollerUnLoadcCom = true;
  459. AgvViewModel.GetInstance().Set小车运动(2, AgvViewModel.GetInstance().GetCommandValue("hj"));
  460. AgvViewModel.GetInstance().Set小车停止(2);
  461. AgvViewModel.GetInstance().Set停车桩(2, IsBool.Yes);
  462. }
  463. //线体3任务上报
  464. if (objData.state == "DONE" && objData.robotJobId == LThreerobotJobId && objData.jobData.targetPointCode == "")//指定下料位置下料完成,指空桶下料
  465. {
  466. globalVar.LThreeEmptyRollerUnLoadcCom = true;
  467. AgvViewModel.GetInstance().Set小车运动(3, AgvViewModel.GetInstance().GetCommandValue("hj"));
  468. AgvViewModel.GetInstance().Set小车停止(3);
  469. AgvViewModel.GetInstance().Set停车桩(3, IsBool.Yes);
  470. }
  471. #endregion
  472. }
  473. }
  474. /// <summary>
  475. /// 主任务重启
  476. /// </summary>
  477. private void ResetProgram()
  478. {
  479. ThreadManage.GetInstance().StartLong(new Action(() =>
  480. {
  481. if (RTrig.GetInstance("ResetProgram").Start(globalVar.PlcInite == 1))//判断是否初始化 一初始化就重启主任务
  482. {
  483. MessageLog.GetInstance.ShowUserLog("主任务正在重启");
  484. ThreadManage.GetInstance().StopTask("MainViewReadPlcData", new Action(() =>
  485. {
  486. ActionManage.GetInstance.CancelRegister("RecipeSetDown");
  487. ActionManage.GetInstance.Register(new Action<object>(RecipeDataParse), "RecipeSetDown");
  488. ActionManage.GetInstance.Send("ClearRecipes");
  489. ThreadManage.GetInstance().StopTask("滚筒线1任务线程", new Action(() =>
  490. {
  491. ThreadManage.GetInstance().StopTask("滚筒线2任务线程", new Action(() =>
  492. {
  493. ThreadManage.GetInstance().StopTask("滚筒线3任务线程", new Action(() =>
  494. {
  495. globalVar = null;
  496. globalVar = new GlobalVariable();
  497. ReicpeNum = 0;
  498. ReadPlcData();
  499. MainTask();
  500. MessageLog.GetInstance.ShowUserLog("主任务重启完成");
  501. }));
  502. }));
  503. }));
  504. }));
  505. }
  506. Thread.Sleep(10);
  507. }), "ResetProgram");
  508. }
  509. /// <summary>
  510. /// 实时获取plc数据
  511. /// </summary>
  512. public void ReadPlcData()
  513. {
  514. ThreadManage.GetInstance().StartLong(new Action(() =>
  515. {
  516. GetAddressData("D2001", new Action<ushort[]>((data) =>
  517. {
  518. globalVar.rollerLineOne.StationOne = data[0];
  519. globalVar.rollerLineOne.StationTwo = data[1];
  520. globalVar.rollerLineOne.StationThree = data[2];
  521. globalVar.rollerLineOne.StationFour = data[3];
  522. globalVar.rollerLineOne.StationFive = data[4];
  523. globalVar.rollerLineOne.StationSix = data[5];
  524. globalVar.rollerLineOne.StationSeven = data[6];
  525. globalVar.rollerLineOne.StationEight = data[7];
  526. }));
  527. GetAddressData("D2011", new Action<ushort[]>((data) =>
  528. {
  529. globalVar.rollerLineTwo.StationOne = data[0];
  530. globalVar.rollerLineTwo.StationTwo = data[1];
  531. globalVar.rollerLineTwo.StationThree = data[2];
  532. globalVar.rollerLineTwo.StationFour = data[3];
  533. globalVar.rollerLineTwo.StationFive = data[4];
  534. globalVar.rollerLineTwo.StationSix = data[5];
  535. globalVar.rollerLineTwo.StationSeven = data[6];
  536. globalVar.rollerLineTwo.StationEight = data[7];
  537. }));
  538. GetAddressData("D2021", new Action<ushort[]>((data) =>
  539. {
  540. globalVar.rollerLineThree.StationOne = data[0];
  541. globalVar.rollerLineThree.StationTwo = data[1];
  542. globalVar.rollerLineThree.StationThree = data[2];
  543. globalVar.rollerLineThree.StationFour = data[3];
  544. globalVar.rollerLineThree.StationFive = data[4];
  545. globalVar.rollerLineThree.StationSix = data[5];
  546. globalVar.rollerLineThree.StationSeven = data[6];
  547. globalVar.rollerLineThree.StationEight = data[7];
  548. }));
  549. GetAddressData("D2031", new Action<ushort[]>((data) =>
  550. {
  551. globalVar.rollerLineOne.OutMaterialingSingle = data[3];
  552. globalVar.rollerLineTwo.OutMaterialingSingle = data[4];
  553. globalVar.rollerLineThree.OutMaterialingSingle = data[5];
  554. //globalVar.rollerLineOne.OutMaterialingTroubleSingle = data[6];
  555. //globalVar.rollerLineTwo.OutMaterialingTroubleSingle = data[7];
  556. //globalVar.rollerLineThree.OutMaterialingTroubleSingle = data[8];
  557. AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble = data[6];
  558. AlarmHelper<AlarmInfo>.Alarm.LTwoRollerTrouble = data[7];
  559. AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble = data[8];
  560. }));
  561. GetAddressData("D2040", new Action<ushort[]>((data) =>
  562. {
  563. globalVar.fryPotOne.InputMaterialRollerRunningSingle = data[0];
  564. globalVar.fryPotTwo.InputMaterialRollerRunningSingle = data[1];
  565. globalVar.fryPotThree.InputMaterialRollerRunningSingle = data[2];
  566. globalVar.fryPotFour.InputMaterialRollerRunningSingle = data[3];
  567. globalVar.fryPotFive.InputMaterialRollerRunningSingle = data[4];
  568. }));
  569. GetAddressData("D2045", new Action<ushort[]>((data) =>
  570. {
  571. globalVar.fryPotOne.InputMaterialArrivedSingle = data[0];
  572. globalVar.fryPotTwo.InputMaterialArrivedSingle = data[1];
  573. globalVar.fryPotThree.InputMaterialArrivedSingle = data[2];
  574. globalVar.fryPotFour.InputMaterialArrivedSingle = data[3];
  575. globalVar.fryPotFive.InputMaterialArrivedSingle = data[4];
  576. }));
  577. GetAddressData("D2050", new Action<ushort[]>((data) =>
  578. {
  579. globalVar.fryPotOne.EmptyBarrelArrivedSingle = data[0];
  580. globalVar.fryPotTwo.EmptyBarrelArrivedSingle = data[1];
  581. globalVar.fryPotThree.EmptyBarrelArrivedSingle = data[2];
  582. globalVar.fryPotFour.EmptyBarrelArrivedSingle = data[3];
  583. globalVar.fryPotFive.EmptyBarrelArrivedSingle = data[4];
  584. }));
  585. GetAddressData("D2065", new Action<ushort[]>((data) =>
  586. {
  587. globalVar.fryPotOne.EmptyBarrelRollerRunningSingle = data[0];
  588. globalVar.fryPotTwo.EmptyBarrelRollerRunningSingle = data[1];
  589. globalVar.fryPotThree.EmptyBarrelRollerRunningSingle = data[2];
  590. globalVar.fryPotFour.EmptyBarrelRollerRunningSingle = data[3];
  591. globalVar.fryPotFive.EmptyBarrelRollerRunningSingle = data[4];
  592. }));
  593. GetAddressData("D2070", new Action<ushort[]>((data) =>
  594. {
  595. //globalVar.fryPotOne.RollerTroubleSingle = data[0];
  596. //globalVar.fryPotTwo.RollerTroubleSingle = data[1];
  597. //globalVar.fryPotThree.RollerTroubleSingle = data[2];
  598. //globalVar.fryPotFour.RollerTroubleSingle = data[3];
  599. //globalVar.fryPotFive.RollerTroubleSingle = data[4];
  600. AlarmHelper<AlarmInfo>.Alarm.FryPotOneRollerTrouble = data[0];
  601. AlarmHelper<AlarmInfo>.Alarm.FryPotTwoRollerTrouble = data[1];
  602. AlarmHelper<AlarmInfo>.Alarm.FryPotThreeRollerTrouble = data[2];
  603. AlarmHelper<AlarmInfo>.Alarm.FryPotFourRollerTrouble = data[3];
  604. AlarmHelper<AlarmInfo>.Alarm.FryPotFiveRollerTrouble = data[4];
  605. }));
  606. GetAddressData("D2078", new Action<ushort[]>(data =>
  607. {
  608. globalVar.rollerLineOne.RecipeCompleteSingle = data[0];
  609. globalVar.rollerLineTwo.RecipeCompleteSingle = data[1];
  610. globalVar.rollerLineThree.RecipeCompleteSingle = data[2];
  611. }));
  612. GetAddressData("D2075", new Action<ushort[]>(data =>
  613. {
  614. globalVar.CleadBarrelEnterSingle = data[0];
  615. }));
  616. GetAddressData("D2077", new Action<ushort[]>(data =>
  617. {
  618. globalVar.CleadBarrelExitSingle = data[0];
  619. }));
  620. //globalVar.rollerLineOne.OutMaterialingSingle = 0;
  621. //globalVar.rollerLineOne.StationOne = 401;
  622. //globalVar.rollerLineOne.StationTwo = 402;
  623. //globalVar.rollerLineOne.OutMaterialingTroubleSingle = 1;
  624. // AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble =1;
  625. RollerLineStatusDisplay();
  626. Thread.Sleep(10);
  627. }), "MainViewReadPlcData");
  628. }
  629. /// <summary>
  630. /// 滚筒线运行状态显示
  631. /// </summary>
  632. private void RollerLineStatusDisplay()
  633. {
  634. hardWareStatusModel.RollerOneModel.LocOneRollerSerial = globalVar.rollerLineOne.StationOne;
  635. hardWareStatusModel.RollerOneModel.LocTwoRollerSerial = globalVar.rollerLineOne.StationTwo;
  636. hardWareStatusModel.RollerOneModel.LocThreeRollerSerial = globalVar.rollerLineOne.StationThree;
  637. hardWareStatusModel.RollerOneModel.LocFourRollerSerial = globalVar.rollerLineOne.StationFour;
  638. hardWareStatusModel.RollerOneModel.LocFiveRollerSerial = globalVar.rollerLineOne.StationFive;
  639. hardWareStatusModel.RollerOneModel.LocSixRollerSerial = globalVar.rollerLineOne.StationSix;
  640. hardWareStatusModel.RollerOneModel.LocSevenRollerSerial = globalVar.rollerLineOne.StationSeven;
  641. hardWareStatusModel.RollerOneModel.LocEightRollerSerial = globalVar.rollerLineOne.StationEight;
  642. if (AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble == 0)
  643. {
  644. hardWareStatusModel.RollerOneModel.RollerAlarmState = Color.FromRgb(130, 232, 139);//无故障
  645. }
  646. else
  647. {
  648. hardWareStatusModel.RollerOneModel.RollerAlarmState = Color.FromRgb(255, 51, 153);//有故障
  649. }
  650. if (globalVar.rollerLineOne.OutMaterialingSingle == 1)//运行中
  651. {
  652. hardWareStatusModel.RollerOneModel.RollerRunState = Color.FromRgb(130, 232, 139);//运行中
  653. }
  654. else
  655. {
  656. hardWareStatusModel.RollerOneModel.RollerRunState = Color.FromRgb(84, 84, 84);//未运行
  657. }
  658. hardWareStatusModel.RollerTwoModel.LocOneRollerSerial = globalVar.rollerLineTwo.StationOne;
  659. hardWareStatusModel.RollerTwoModel.LocTwoRollerSerial = globalVar.rollerLineTwo.StationTwo;
  660. hardWareStatusModel.RollerTwoModel.LocThreeRollerSerial = globalVar.rollerLineTwo.StationThree;
  661. hardWareStatusModel.RollerTwoModel.LocFourRollerSerial = globalVar.rollerLineTwo.StationFour;
  662. hardWareStatusModel.RollerTwoModel.LocFiveRollerSerial = globalVar.rollerLineTwo.StationFive;
  663. hardWareStatusModel.RollerTwoModel.LocSixRollerSerial = globalVar.rollerLineTwo.StationSix;
  664. hardWareStatusModel.RollerTwoModel.LocSevenRollerSerial = globalVar.rollerLineTwo.StationSeven;
  665. hardWareStatusModel.RollerTwoModel.LocEightRollerSerial = globalVar.rollerLineTwo.StationEight;
  666. if (AlarmHelper<AlarmInfo>.Alarm.LTwoRollerTrouble == 0)
  667. {
  668. hardWareStatusModel.RollerTwoModel.RollerAlarmState = Color.FromRgb(130, 232, 139);//无故障
  669. }
  670. else
  671. {
  672. hardWareStatusModel.RollerTwoModel.RollerAlarmState = Color.FromRgb(255, 51, 153);//有故障
  673. }
  674. if (globalVar.rollerLineTwo.OutMaterialingSingle == 1)//运行中
  675. {
  676. hardWareStatusModel.RollerTwoModel.RollerRunState = Color.FromRgb(130, 232, 139);//运行中
  677. }
  678. else
  679. {
  680. hardWareStatusModel.RollerTwoModel.RollerRunState = Color.FromRgb(84, 84, 84);//未运行
  681. }
  682. hardWareStatusModel.RollerThreeModel.LocOneRollerSerial = globalVar.rollerLineThree.StationOne;
  683. hardWareStatusModel.RollerThreeModel.LocTwoRollerSerial = globalVar.rollerLineThree.StationTwo;
  684. hardWareStatusModel.RollerThreeModel.LocThreeRollerSerial = globalVar.rollerLineThree.StationThree;
  685. hardWareStatusModel.RollerThreeModel.LocFourRollerSerial = globalVar.rollerLineThree.StationFour;
  686. hardWareStatusModel.RollerThreeModel.LocFiveRollerSerial = globalVar.rollerLineThree.StationFive;
  687. hardWareStatusModel.RollerThreeModel.LocSixRollerSerial = globalVar.rollerLineThree.StationSix;
  688. hardWareStatusModel.RollerThreeModel.LocSevenRollerSerial = globalVar.rollerLineThree.StationSeven;
  689. hardWareStatusModel.RollerThreeModel.LocEightRollerSerial = globalVar.rollerLineThree.StationEight;
  690. if (AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble == 0)
  691. {
  692. hardWareStatusModel.RollerThreeModel.RollerAlarmState = Color.FromRgb(130, 232, 139);//无故障
  693. }
  694. else
  695. {
  696. hardWareStatusModel.RollerThreeModel.RollerAlarmState = Color.FromRgb(255, 51, 153);//有故障
  697. }
  698. if (globalVar.rollerLineThree.OutMaterialingSingle == 1)//运行中
  699. {
  700. hardWareStatusModel.RollerThreeModel.RollerRunState = Color.FromRgb(130, 232, 139);//运行中
  701. }
  702. else
  703. {
  704. hardWareStatusModel.RollerThreeModel.RollerRunState = Color.FromRgb(84, 84, 84);//未运行
  705. }
  706. //滚筒线4
  707. }
  708. /// <summary>
  709. /// 返回指定地址指定长度的数据
  710. /// </summary>
  711. /// <param name="address"></param>
  712. /// <returns></returns>
  713. public void GetAddressData(string address, Action<ushort[]> action)
  714. {
  715. PlcReadData = DeviceOperate.GetInstance.GetAllData();
  716. if (PlcReadData.ContainsKey(address))
  717. {
  718. action((ushort[])(PlcReadData[address]));
  719. }
  720. }
  721. /// <summary>
  722. /// 写Plc数据
  723. /// </summary>
  724. /// <param name="address"></param>
  725. /// <param name="Value"></param>
  726. public void WritePlcData(string address, ushort Value)
  727. {
  728. DeviceOperate.GetInstance.WritePlcData(address, Value);
  729. }
  730. /// <summary>
  731. /// 初始化任务
  732. /// </summary>
  733. //public void IniteTask()
  734. //{
  735. // ThreadManage.GetInstance().StartLong(new Action(() =>
  736. // {
  737. // MainTask();
  738. // }), "MainTask");
  739. //}
  740. /// <summary>
  741. /// 配方数据接收
  742. /// </summary>
  743. public void RecipeDataParse(object obj)
  744. {
  745. Task.Run(new Action(() =>
  746. {
  747. if (obj != null && obj is NewRecipeModel[] recipes)
  748. {
  749. ReicpeNum = ReicpeNum + recipes.Length;
  750. MessageLog.GetInstance.ShowUserLog($"新接收到{recipes.Length}个配方,总共{ReicpeNum}个配方");
  751. for (int i = 0; i < recipes.Length; i++)
  752. {
  753. int? res = recipes[i].materialCollection.ElementAt(0).MaterialLoc / 100;
  754. if (res != null)
  755. {
  756. switch (res)
  757. {
  758. case 1:
  759. case 4: RecipeQuene.Enqueue(recipes[i]); break;
  760. case 3: LThreeRecipeQuene.Enqueue(recipes[i]); break;
  761. case 2:
  762. case 5: LTwoRecipeQuene.Enqueue(recipes[i]); break;
  763. }
  764. }
  765. }
  766. }
  767. }));
  768. }
  769. /// <summary>
  770. /// 开启主任务
  771. /// </summary>
  772. public void MainTask()
  773. {
  774. ////RecipeDataToPlc();
  775. //LOneRecipeDataToPlc();
  776. //LTwoRecipeDataToPlc();
  777. //LThreeRecipeDataToPlc();
  778. ////AgvLoadRoller();
  779. //LOneLoadRoller();
  780. //LTwoAgvLoadRoller();
  781. //LThreeAgvLoadRoller();
  782. //// FryPotInputMaterial();
  783. //LOneFryPotInputMaterial();
  784. //LTwoFryPotInputMaterial();
  785. //LThreeFryPotInputMaterial();
  786. ////FryPotOutputMaterial();
  787. //LOneFryPotOutputMaterial();
  788. //LTwoFryPotOutputMaterial();
  789. //LThreeFryPotOutputMaterial();
  790. ThreadManage.GetInstance().StartLong(new Action(() => { LineOneProcessExecute(); Thread.Sleep(10); }), "滚筒线1任务线程");
  791. ThreadManage.GetInstance().StartLong(new Action(() => { LineTwoProcessExecute(); Thread.Sleep(10); }), "滚筒线2任务线程");
  792. ThreadManage.GetInstance().StartLong(new Action(() => { LineThreeProcessExecute(); Thread.Sleep(10); }), "滚筒线3任务线程");
  793. }
  794. /// <summary>
  795. /// 线体1的执行流程
  796. /// </summary>
  797. public void LineOneProcessExecute()
  798. {
  799. //if (!globalVar.LOneTaskLock)
  800. //{
  801. // globalVar.LOneTaskLock = true;
  802. LOneRecipeDataToPlc();
  803. LOneLoadRoller();
  804. LOneFryPotInputMaterial();
  805. LOneFallMaterial();
  806. LOneFryPotOutputMaterial();
  807. LOneEmptyOperate();
  808. // globalVar.LOneTaskLock = false;
  809. //}
  810. }
  811. /// <summary>
  812. /// 线体2的执行流程
  813. /// </summary>
  814. public void LineTwoProcessExecute()
  815. {
  816. //if (!globalVar.LTwoTaskLock)
  817. //{
  818. // globalVar.LTwoTaskLock = true;
  819. LTwoRecipeDataToPlc();
  820. LTwoAgvLoadRoller();
  821. LTwoFryPotInputMaterial();
  822. LTwoFallMaterial();
  823. LTwoFryPotOutputMaterial();
  824. LTwoEmptyOperate();
  825. // globalVar.LTwoTaskLock = false;
  826. //}
  827. }
  828. /// <summary>
  829. /// 线体3的执行流程
  830. /// </summary>
  831. public void LineThreeProcessExecute()
  832. {
  833. //if (!globalVar.LThreeTaskLock)
  834. //{
  835. // globalVar.LThreeTaskLock = true;
  836. LThreeRecipeDataToPlc();
  837. LThreeAgvLoadRoller();
  838. LThreeFryPotInputMaterial();
  839. LThreeFallMaterial();
  840. LThreeFryPotOutputMaterial();
  841. LThreeEmptyOperate();
  842. // globalVar.LThreeTaskLock = false;
  843. //}
  844. }
  845. /// <summary>
  846. /// 3号滚筒线数据下发 2022/7/4 新增
  847. /// </summary>
  848. /// <exception cref="NotImplementedException"></exception>
  849. private void LThreeRecipeDataToPlc()
  850. {
  851. if (LThreeOutputMaterialQuene.Count == 0 && LThreeInputMaterialQuene.Count == 0 && !LThreeErrorRecipe)
  852. {
  853. if (globalVar.LThreeCurrentRecipeName != string.Empty)
  854. {
  855. MessageLog.GetInstance.ShowUserLog($"【3】号滚筒线【{globalVar.LThreeCurrentRecipeName}】 配方制作完成");
  856. globalVar.LThreeCurrentRecipeName = string.Empty;
  857. }
  858. }
  859. if (LThreeRecipeQuene.Count > 0 && LThreeOutputMaterialQuene.Count == 0 && LThreeInputMaterialQuene.Count == 0)//后续添加其它限制条件
  860. {
  861. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_3.goodsName = string.Empty; }));
  862. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_3.workflows = new ObservableCollection<WorkflowModel>(); }));
  863. AgvViewModel.GetInstance().Set启动或停止炒锅(3, IsRun.Stop);
  864. if (globalVar.LThreeCurrentRecipeName != string.Empty)
  865. MessageLog.GetInstance.ShowUserLog($"【3】号滚筒线【{globalVar.LThreeCurrentRecipeName}】 配方制作完成");
  866. if (LThreeRecipeQuene.TryDequeue(out NewRecipeModel result))
  867. {
  868. LThreeErrorRecipe = false;
  869. int headNum = result.materialCollection[0].MaterialLoc / 100;
  870. globalVar.LThreeMaterialNum = result.materialCollection.Count;
  871. globalVar.LThreeFryPotSerial = headNum;
  872. globalVar.LThreeCurrentRecipeName = result.RecipeName;
  873. AgvViewModel.GetInstance().Set滚筒线上数量(3, globalVar.LThreeMaterialNum.ToString());
  874. MessageLog.GetInstance.ShowUserLog($"【3】号滚筒线开始制作【{result.RecipeName}】 配方");
  875. for (int i = 0; i < result.materialCollection.Count; i++) //遍历单个配方中所有物料
  876. {
  877. if (result.materialCollection[i].MaterialLoc % 100 == i + 1 && result.materialCollection[i].MaterialLoc / 100 == headNum && headNum == 3)
  878. {
  879. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_3.goodsName = result.RecipeName; }));
  880. //将配方中原料加入新的队列
  881. LThreeInputMaterialQuene.Enqueue(new MaterialInfo()
  882. {
  883. materialType = result.materialCollection[i],
  884. materialId = result.RecipeId
  885. });
  886. RollerThreeDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight);//3号滚筒线桶号以及重量数据下发
  887. }
  888. else
  889. {
  890. MessageLog.GetInstance.ShowUserLog($"【3】号滚筒线配方桶号配置错误,取消【{result.RecipeName}】配方制作");
  891. LThreeInputMaterialQuene.Clear();
  892. LThreeErrorRecipe = true;
  893. return;
  894. }
  895. }
  896. DeviceOperate.GetInstance.WritePlcData("D1043", (ushort)result.materialCollection.Count);//发送3号滚筒线工序数据
  897. //AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LThreeFryPotSerial, IsRun.Stop);
  898. }
  899. }
  900. }
  901. /// <summary>
  902. /// 2号滚筒线数据下发 2022/7/4 新增
  903. /// </summary>
  904. /// <exception cref="NotImplementedException"></exception>
  905. private void LTwoRecipeDataToPlc()
  906. {
  907. if (LTwoOutputMaterialQuene.Count == 0 && LTwoInputMaterialQuene.Count == 0 && !LTwoErrorRecipe)
  908. {
  909. if (globalVar.LTwoCurrentRecipeName != string.Empty)
  910. {
  911. MessageLog.GetInstance.ShowUserLog($"【2】号滚筒线【{globalVar.LTwoCurrentRecipeName}】 配方制作完成");
  912. globalVar.LTwoCurrentRecipeName = string.Empty;
  913. }
  914. }
  915. if (LTwoRecipeQuene.Count > 0 && LTwoOutputMaterialQuene.Count == 0 && LTwoInputMaterialQuene.Count == 0)//后续添加其它限制条件
  916. {
  917. if (globalVar.LTwoFryPotSerial == 2)
  918. {
  919. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_2.goodsName = string.Empty; }));
  920. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_2.workflows = new ObservableCollection<WorkflowModel>(); }));
  921. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LTwoFryPotSerial, IsRun.Stop);
  922. }
  923. if (globalVar.LTwoFryPotSerial == 5)
  924. {
  925. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_5.goodsName = string.Empty; }));
  926. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_5.workflows = new ObservableCollection<WorkflowModel>(); }));
  927. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LTwoFryPotSerial, IsRun.Stop);
  928. }
  929. if (globalVar.LTwoCurrentRecipeName != string.Empty)
  930. MessageLog.GetInstance.ShowUserLog($"【2】号滚筒线【{globalVar.LTwoCurrentRecipeName}】 配方制作完成");
  931. if (LTwoRecipeQuene.TryDequeue(out NewRecipeModel result))
  932. {
  933. LTwoErrorRecipe = false;
  934. int headNum = result.materialCollection[0].MaterialLoc / 100;
  935. globalVar.LTwoMaterialNum = result.materialCollection.Count;
  936. globalVar.LTwoFryPotSerial = headNum;
  937. globalVar.LTwoCurrentRecipeName = result.RecipeName;
  938. AgvViewModel.GetInstance().Set滚筒线上数量(2, globalVar.LTwoMaterialNum.ToString());
  939. MessageLog.GetInstance.ShowUserLog($"【2】号滚筒线开始制作【{result.RecipeName}】 配方");
  940. for (int i = 0; i < result.materialCollection.Count; i++) //遍历单个配方中所有物料
  941. {
  942. if (result.materialCollection[i].MaterialLoc % 100 == i + 1 && result.materialCollection[i].MaterialLoc / 100 == headNum && (headNum == 2 || headNum == 5))
  943. {
  944. if (headNum == 1)//炒锅2
  945. {
  946. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_2.goodsName = result.RecipeName; }));
  947. }
  948. else//炒锅5
  949. {
  950. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_5.goodsName = result.RecipeName; }));
  951. }
  952. //将配方中原料加入新的队列
  953. LTwoInputMaterialQuene.Enqueue(new MaterialInfo()
  954. {
  955. materialType = result.materialCollection[i],
  956. materialId = result.RecipeId
  957. });
  958. RollerTwoDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight);//2号滚筒线桶号以及重量数据下发
  959. }
  960. else
  961. {
  962. MessageLog.GetInstance.ShowUserLog($"【2】号滚筒线配方桶号配置错误,取消【{result.RecipeName}】配方制作");
  963. LTwoInputMaterialQuene.Clear();
  964. LTwoErrorRecipe = true;
  965. return;
  966. }
  967. }
  968. DeviceOperate.GetInstance.WritePlcData("D1026", (ushort)result.materialCollection.Count);//发送2号滚筒线工序数据
  969. }
  970. }
  971. }
  972. /// <summary>
  973. /// 1号滚筒线数据下发 2022/7/4 新增
  974. /// </summary>
  975. private void LOneRecipeDataToPlc()
  976. {
  977. if (OutputMaterialQuene.Count == 0 && InputMaterialQuene.Count == 0 && !ErrorRecipe)
  978. {
  979. if (globalVar.LOneCurrentRecipeName != string.Empty)
  980. {
  981. MessageLog.GetInstance.ShowUserLog($"【1】号滚筒线【{globalVar.LOneCurrentRecipeName}】 配方制作完成");
  982. globalVar.LOneCurrentRecipeName = string.Empty;
  983. }
  984. }
  985. if (RecipeQuene.Count > 0 && OutputMaterialQuene.Count == 0 && InputMaterialQuene.Count == 0)//后续添加其它限制条件
  986. {
  987. if (globalVar.LOneFryPotSerial == 1)
  988. {
  989. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_1.goodsName = string.Empty; }));
  990. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_1.workflows = new ObservableCollection<WorkflowModel>(); }));
  991. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LOneFryPotSerial, IsRun.Stop);
  992. }
  993. if (globalVar.LOneFryPotSerial == 4)
  994. {
  995. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_4.goodsName = string.Empty; }));
  996. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_4.workflows = new ObservableCollection<WorkflowModel>(); }));
  997. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LOneFryPotSerial, IsRun.Stop);
  998. }
  999. if (RecipeQuene.TryDequeue(out NewRecipeModel result))
  1000. {
  1001. ErrorRecipe = false;
  1002. int headNum = result.materialCollection[0].MaterialLoc / 100;
  1003. globalVar.LOneMaterialNum = result.materialCollection.Count;
  1004. globalVar.LOneFryPotSerial = headNum;
  1005. globalVar.LOneCurrentRecipeName = result.RecipeName;
  1006. AgvViewModel.GetInstance().Set滚筒线上数量(1, globalVar.LOneMaterialNum.ToString());
  1007. MessageLog.GetInstance.ShowUserLog($"【1】号滚筒线开始制作【{result.RecipeName}】 配方");
  1008. for (int i = 0; i < result.materialCollection.Count; i++) //遍历单个配方中所有物料
  1009. {
  1010. if (result.materialCollection.Count <= 8 && result.materialCollection[i].MaterialLoc % 100 == i + 1 && result.materialCollection[i].MaterialLoc / 100 == headNum && (headNum == 1 || headNum == 4))
  1011. {
  1012. if (headNum == 1)//炒锅1
  1013. {
  1014. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_1.goodsName = result.RecipeName; }));
  1015. }
  1016. else//炒锅4
  1017. {
  1018. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_4.goodsName = result.RecipeName; }));
  1019. }
  1020. //将配方中原料加入新的队列
  1021. InputMaterialQuene.Enqueue(new MaterialInfo()
  1022. {
  1023. materialType = result.materialCollection[i],
  1024. materialId = result.RecipeId
  1025. });
  1026. RollerOneDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight);//1号滚筒线桶号以及重量数据下发
  1027. }
  1028. else
  1029. {
  1030. MessageLog.GetInstance.ShowUserLog($"【1】号滚筒线配方桶号配置错误,取消【{result.RecipeName}】配方制作");
  1031. InputMaterialQuene.Clear();
  1032. ErrorRecipe = true;
  1033. return;
  1034. }
  1035. }
  1036. DeviceOperate.GetInstance.WritePlcData("D1009", (ushort)result.materialCollection.Count);//发送1号滚筒线工序数据
  1037. }
  1038. }
  1039. }
  1040. /// <summary>
  1041. /// 数据下发PLC
  1042. /// </summary>
  1043. //public void RecipeDataToPlc()
  1044. //{
  1045. // if (RecipeQuene.Count > 0 && OutputMaterialQuene.Count == 0 && InputMaterialQuene.Count == 0)//后续添加其它限制条件
  1046. // {
  1047. // //NewRecipeModel newRecipe = new NewRecipeModel();
  1048. // //MaterialType material = new MaterialType();
  1049. // if (RecipeQuene.TryDequeue(out NewRecipeModel result))
  1050. // {
  1051. // //newRecipe = result;
  1052. // MessageLog.GetInstance.ShowRunLog($"开始制作【{result.RecipeName}】 配方");
  1053. // //for (int k = 0; k < newRecipe.materialCollection.Count - 1; k++)
  1054. // //{
  1055. // // for (int j = 0; j < newRecipe.materialCollection.Count - 1 - k; j++)
  1056. // // {
  1057. // // if (newRecipe.materialCollection[j].MaterialLoc > newRecipe.materialCollection[j + 1].MaterialLoc)
  1058. // // {
  1059. // // material = newRecipe.materialCollection[j];
  1060. // // // newRecipe.materialCollection[j] = null;
  1061. // // newRecipe.materialCollection[j] = newRecipe.materialCollection[j + 1];
  1062. // // // newRecipe.materialCollection[j + 1] = null;
  1063. // // newRecipe.materialCollection[j + 1] = material;
  1064. // // }
  1065. // // }
  1066. // //}
  1067. // for (int i = 0; i < result.materialCollection.Count; i++) //遍历单个配方中所有物料
  1068. // {
  1069. // //将配方中原料加入新的队列
  1070. // InputMaterialQuene.Enqueue(new MaterialInfo()
  1071. // {
  1072. // materialType = result.materialCollection[i],
  1073. // materialId = result.RecipeId
  1074. // });
  1075. // ushort n = result.materialCollection[i].MaterialLoc;
  1076. // switch (n / 100)
  1077. // {
  1078. // case 1:
  1079. // case 4: RollerOneDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight); break;//1号滚筒线桶号以及重量数据下发
  1080. // case 2:
  1081. // case 5: RollerTwoDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight); break;//2号滚筒线桶号以及重量数据下发
  1082. // case 3: RollerThreeDataWrite(i, result.materialCollection[i].MaterialLoc, result.materialCollection[i].MaterialWeight); break;//3号滚筒线桶号以及重量数据下发
  1083. // }
  1084. // }
  1085. // switch (result.materialCollection[0].MaterialLoc / 100)
  1086. // {
  1087. // case 1:
  1088. // DeviceOperate.GetInstance.WritePlcData("D1009", (ushort)result.materialCollection.Count); break;//发送1号滚筒线工序数据
  1089. // case 2:
  1090. // DeviceOperate.GetInstance.WritePlcData("D1026", (ushort)result.materialCollection.Count); break;//发送2号滚筒线工序数据
  1091. // case 3:
  1092. // DeviceOperate.GetInstance.WritePlcData("D1043", (ushort)result.materialCollection.Count); break;//发送3号滚筒线工序数据
  1093. // }
  1094. // }
  1095. // }
  1096. //}
  1097. /// <summary>
  1098. /// AGV到配方线体1装桶以及出料到炒锅
  1099. /// </summary>
  1100. //public void AgvLoadRoller()
  1101. //{
  1102. // //lineAlarm = 0;
  1103. // if (InputMaterialQuene.Count > 0)
  1104. // {
  1105. // switch (InputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1106. // {
  1107. // case 1:
  1108. // case 4: AgvToLineOneLoadRoller(); AgvFromLineOneToFryPot(); break;//AGV到1号线体装桶
  1109. // case 2:
  1110. // case 5: AgvToLineTwoLoadRoller(); AgvFromLineTwoToFryPot(); break;//AGV到2号线体装桶
  1111. // case 3: AgvToLineThreeLoadRoller(); AgvFromLineThreeToFryPot(); break;//AGV到3号线体装桶
  1112. // }
  1113. // }
  1114. //}
  1115. /// <summary>
  1116. /// AGV到配方线体1装桶以及出料到炒锅
  1117. /// </summary>
  1118. public void LOneLoadRoller()
  1119. {
  1120. if (InputMaterialQuene.Count > 0)
  1121. {
  1122. AgvToLineOneLoadRoller();
  1123. AgvFromLineOneToFryPot();//AGV到1号线体装桶
  1124. }
  1125. }
  1126. /// <summary>
  1127. /// AGV到配方线体2装桶以及出料到炒锅
  1128. /// </summary>
  1129. public void LTwoAgvLoadRoller()
  1130. {
  1131. if (LTwoInputMaterialQuene.Count > 0)
  1132. {
  1133. AgvToLineTwoLoadRoller();
  1134. AgvFromLineTwoToFryPot();//AGV到2号线体装桶
  1135. }
  1136. }
  1137. /// <summary>
  1138. /// AGV到配方线体3装桶以及出料到炒锅
  1139. /// </summary>
  1140. public void LThreeAgvLoadRoller()
  1141. {
  1142. if (LThreeInputMaterialQuene.Count > 0)
  1143. {
  1144. AgvToLineThreeLoadRoller();
  1145. AgvFromLineThreeToFryPot();//AGV到2号线体装桶
  1146. }
  1147. }
  1148. /// <summary>
  1149. /// AGV从炒锅送料位置到倒料过程处理
  1150. /// </summary>
  1151. //public void FryPotInputMaterial()
  1152. //{
  1153. // if (OutputMaterialQuene.Count > 0 && !globalVar.InOrOutputLock)
  1154. // {
  1155. // while (!agvArriveUnLoad)//等待agv到达炒锅位置
  1156. // {
  1157. // Thread.Sleep(5);
  1158. // if (globalVar.ExitMainTask)
  1159. // return;
  1160. // }
  1161. // AgvArriveFryPotSingleSetDown();
  1162. // FryPotRollerTroubleCheck();
  1163. // if (FryPotAlarm == 1)//炒锅滚筒无故障
  1164. // {
  1165. // //炒锅滚筒进料运行到位处理
  1166. // FryPotInputMaterialRollerOperate();
  1167. // globalVar.InOrOutputLock = true;
  1168. // }
  1169. // }
  1170. //}
  1171. /// <summary>
  1172. /// 线体1的AGV从炒锅送料位置到倒料过程处理
  1173. /// </summary>
  1174. public void LOneFryPotInputMaterial()
  1175. {
  1176. if (OutputMaterialQuene.Count > 0 && globalVar.agvArriveUnLoad && globalVar.AgvToFryPot && !globalVar.PotOneInputMaterialArrive)
  1177. {
  1178. //if (globalVar.LOneFryPotSerial == 1)
  1179. //{
  1180. // AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.yc_1_1);
  1181. //}
  1182. //else if (globalVar.LOneFryPotSerial == 4)
  1183. //{
  1184. // AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.yc_1_4);
  1185. //}
  1186. MessageLog.GetInstance.ShowRunLog($"AGV到达【{globalVar.LOneFryPotSerial}】号炒锅下料位置");
  1187. AgvArriveFryPotOneOrFourSingleSetDown();
  1188. globalVar.agvArriveUnLoad = false;
  1189. globalVar.PotOneInputMaterialArrive = true;
  1190. }
  1191. }
  1192. public void LOneFallMaterial()
  1193. {
  1194. if (!globalVar.InOrOutputLock && (globalVar.fryPotOne.InputMaterialArrivedSingle == 1 || globalVar.fryPotFour.InputMaterialArrivedSingle == 1) && globalVar.PotOneInputMaterialArrive && OutputMaterialQuene.Count > 0 && !globalVar.PotOneOutputRollerArrive)
  1195. {
  1196. FryPotOneRollerTroubleCheck();
  1197. if (FryPotAlarm == 1 || FryPotFourAlarm == 1)//炒锅滚筒无故障
  1198. {
  1199. if (globalVar.LOneFryPotSerial == 1)
  1200. {
  1201. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_1.workflows.Add(new WorkflowModel { id = globalVar.LOneCurrentCookingStep, Name = OutputMaterialQuene.ElementAt(0).materialType.MaterialName, isBool = IsBool.Yes }); }));
  1202. }
  1203. else
  1204. {
  1205. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_4.workflows.Add(new WorkflowModel { id = globalVar.LOneCurrentCookingStep, Name = OutputMaterialQuene.ElementAt(0).materialType.MaterialName, isBool = IsBool.Yes }); }));
  1206. }
  1207. AgvViewModel.GetInstance().Set小车是否承载物品(1, IsBool.No);
  1208. //炒锅滚筒进料运行到位处理
  1209. FryPotOneOrFourInputMaterialRollerOperate();
  1210. AgvFromFryPotOneOrFourToClean();//上游下发搬运任务给AGV
  1211. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LOneFryPotSerial, IsRun.Start);
  1212. globalVar.InOrOutputLock = true;
  1213. globalVar.PotOneOutputRollerArrive = true;
  1214. }
  1215. }
  1216. }
  1217. /// <summary>
  1218. /// 线体2的AGV从炒锅送料位置到倒料过程处理
  1219. /// </summary>
  1220. public void LTwoFryPotInputMaterial()
  1221. {
  1222. if (LTwoOutputMaterialQuene.Count > 0 && globalVar.LTwoagvArriveUnLoad && globalVar.LTwoAgvToFryPot && !globalVar.LTwoPotInputMaterialArrive)
  1223. {
  1224. //if (globalVar.LTwoFryPotSerial == 2)
  1225. //{
  1226. // AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.yc_2_2);
  1227. //}
  1228. //else if (globalVar.LTwoFryPotSerial == 5)
  1229. //{
  1230. // AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.yc_2_5);
  1231. //}
  1232. MessageLog.GetInstance.ShowRunLog($"AGV到达【{globalVar.LTwoFryPotSerial}】号炒锅下料位置");
  1233. AgvArriveFryPotTwoOrFiveSingleSetDown();
  1234. globalVar.LTwoagvArriveUnLoad = false;
  1235. globalVar.LTwoPotInputMaterialArrive = true;
  1236. }
  1237. }
  1238. public void LTwoFallMaterial()
  1239. {
  1240. if (!globalVar.LTwoInOrOutputLock && (globalVar.fryPotTwo.InputMaterialArrivedSingle == 1 || globalVar.fryPotFive.InputMaterialArrivedSingle == 1) && globalVar.LTwoPotInputMaterialArrive && LTwoOutputMaterialQuene.Count > 0 && !globalVar.LTwoPotOutputRollerArrive)
  1241. {
  1242. FryPotTwoRollerTroubleCheck();
  1243. if (FryPotTwoAlarm == 1 || FryPotFiveAlarm == 1)//炒锅滚筒无故障
  1244. {
  1245. if (globalVar.LTwoFryPotSerial == 2)
  1246. {
  1247. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_2.workflows.Add(new WorkflowModel { id = globalVar.LTwoCurrentCookingStep, Name = LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName, isBool = IsBool.Yes }); }));
  1248. }
  1249. else
  1250. {
  1251. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_5.workflows.Add(new WorkflowModel { id = globalVar.LTwoCurrentCookingStep, Name = LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName, isBool = IsBool.Yes }); }));
  1252. }
  1253. AgvViewModel.GetInstance().Set小车是否承载物品(2, IsBool.No);
  1254. //炒锅滚筒进料运行到位处理
  1255. FryPotTwoOrFiveInputMaterialRollerOperate();
  1256. AgvFromFryPotTwoOrFiveToClean();//上游下发搬运任务给AGV
  1257. AgvViewModel.GetInstance().Set启动或停止炒锅(globalVar.LTwoFryPotSerial, IsRun.Start);
  1258. globalVar.LTwoInOrOutputLock = true;
  1259. globalVar.LTwoPotOutputRollerArrive = true;
  1260. }
  1261. }
  1262. }
  1263. /// <summary>
  1264. /// 线体3的AGV从炒锅送料位置到倒料过程处理
  1265. /// </summary>
  1266. public void LThreeFryPotInputMaterial()
  1267. {
  1268. if (LThreeOutputMaterialQuene.Count > 0 && globalVar.LThreeagvArriveUnLoad && globalVar.LThreeAgvToFryPot && !globalVar.LThreePotInputMaterialArrive)
  1269. {
  1270. // AgvViewModel.GetInstance().Set小车运动(3, CartMotionTrajectory.yc_3_3);
  1271. MessageLog.GetInstance.ShowRunLog("AGV到达【3】号炒锅下料位置");
  1272. AgvArriveFryPotThreeSingleSetDown();
  1273. globalVar.LThreeagvArriveUnLoad = false;
  1274. globalVar.LThreePotInputMaterialArrive = true;
  1275. }
  1276. }
  1277. public void LThreeFallMaterial()
  1278. {
  1279. if (!globalVar.LThreeInOrOutputLock && globalVar.fryPotThree.InputMaterialArrivedSingle == 1 && globalVar.LThreePotInputMaterialArrive && LThreeOutputMaterialQuene.Count > 0 && !globalVar.LThreePotOutputRollerArrive)
  1280. {
  1281. FryPotThreeRollerTroubleCheck();
  1282. if (FryPotThreeAlarm == 1)//炒锅滚筒无故障
  1283. {
  1284. Application.Current.Dispatcher.Invoke(new Action(() => { AgvViewModel.GetInstance().wokModel_3.workflows.Add(new WorkflowModel { id = globalVar.LThreeCurrentCookingStep, Name = LThreeOutputMaterialQuene.ElementAt(0).materialType.MaterialName, isBool = IsBool.Yes }); }));
  1285. AgvViewModel.GetInstance().Set小车是否承载物品(3, IsBool.No);
  1286. //炒锅滚筒进料运行到位处理
  1287. FryPotThreeInputMaterialRollerOperate();
  1288. AgvFromFryPotThreeToClean();//上游下发搬运任务给AGV
  1289. AgvViewModel.GetInstance().Set启动或停止炒锅(3, IsRun.Start);
  1290. globalVar.LThreeInOrOutputLock = true;
  1291. globalVar.LThreePotOutputRollerArrive = true;
  1292. }
  1293. }
  1294. }
  1295. /// <summary>
  1296. /// 炒锅出桶
  1297. /// </summary>
  1298. //public void FryPotOutputMaterial()
  1299. //{
  1300. // if (OutputMaterialQuene.Count > 0 && globalVar.InOrOutputLock)
  1301. // {
  1302. // AgvFromFryPotToClean();//上游下发搬运任务给AGV
  1303. // while (!agvArriveUpLoad)//等待agv到达炒锅位置
  1304. // {
  1305. // Thread.Sleep(5);
  1306. // if (globalVar.ExitMainTask)
  1307. // return;
  1308. // }
  1309. // agvArriveUpLoad = false;
  1310. // AgvArriveFryPotOutEmptyRollerSingleSetDown();//暂时考虑agv送完料后原地等待,不加条件,直接发送到位信号
  1311. // FryPotRollerTroubleCheck();
  1312. // if (FryPotAlarm == 1)//无故障
  1313. // {
  1314. // FryPotOutEmpetyRollerOperate();
  1315. // if (OutputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))//空桶出桶后,出料原料队列移除对应原料
  1316. // {
  1317. // while (!agvFryPotEmptyRollerArrive)//等待AGV拿到出桶空桶
  1318. // {
  1319. // Thread.Sleep(5);
  1320. // if (globalVar.ExitMainTask)
  1321. // return;
  1322. // }
  1323. // //AGV拿到空桶,让AGV运桶到指定位置,同时可以让下一个AGV从线体装料运到炒锅
  1324. // globalVar.AllowAgvToLineLoadRoller = true;
  1325. // globalVar.InOrOutputLock = false;
  1326. // }
  1327. // }
  1328. // }
  1329. //}
  1330. /// <summary>
  1331. /// 线体1对应炒锅出桶
  1332. /// </summary>
  1333. public void LOneFryPotOutputMaterial()
  1334. {
  1335. if (OutputMaterialQuene.Count > 0 && globalVar.InOrOutputLock && globalVar.agvArriveUpLoad && globalVar.PotOneOutputRollerArrive && !globalVar.AgvArrivePot)
  1336. {
  1337. MessageLog.GetInstance.ShowRunLog($"AGV到达【{globalVar.LOneFryPotSerial}】号炒锅空桶上料位置");
  1338. AgvArriveFryPotOneOrFourOutEmptyRollerSingleSetDown();//暂时考虑agv送完料后原地等待,不加条件,直接发送到位信号
  1339. globalVar.agvArriveUpLoad = false;
  1340. globalVar.AgvArrivePot = true;
  1341. }
  1342. }
  1343. public void LOneEmptyOperate()
  1344. {
  1345. if ((globalVar.fryPotOne.EmptyBarrelArrivedSingle == 1 || globalVar.fryPotFour.EmptyBarrelArrivedSingle == 1) && OutputMaterialQuene.Count > 0 && globalVar.AgvArrivePot)
  1346. {
  1347. FryPotOneRollerTroubleCheck();
  1348. if (FryPotAlarm == 1 || FryPotFourAlarm == 1)//无故障
  1349. {
  1350. if (globalVar.agvFryPotEmptyRollerArrive)
  1351. {
  1352. FryPotOneOrFourOutEmpetyRollerOperate();
  1353. if (OutputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))//空桶出桶后,出料原料队列移除对应原料
  1354. {
  1355. //AgvViewModel.GetInstance().Set小车是否承载物品(1, IsBool.OnllYes);
  1356. //if (globalVar.LOneFryPotSerial == 1)
  1357. //{
  1358. // AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.hs_1);
  1359. //}
  1360. //else if (globalVar.LOneFryPotSerial == 4)
  1361. //{
  1362. // AgvViewModel.GetInstance().Set小车运动(1, CartMotionTrajectory.hs_4);
  1363. //}
  1364. globalVar.agvFryPotEmptyRollerArrive = false;
  1365. globalVar.InOrOutputLock = false;
  1366. globalVar.LOneMaterialNum--;
  1367. MessageLog.GetInstance.ShowRunLog($"AGV在【{globalVar.LOneFryPotSerial}】号炒锅将空桶回收到4号滚筒线");
  1368. //AGV拿到空桶,让AGV运桶到指定位置,同时可以让下一个AGV从线体装料运到炒锅
  1369. globalVar.AllowAgvToLineLoadRoller = true;
  1370. globalVar.LoadRoller = false;
  1371. globalVar.AgvToFryPot = false;
  1372. globalVar.PotOneInputMaterialArrive = false;
  1373. globalVar.PotOneOutputRollerArrive = false;
  1374. globalVar.AgvArrivePot = false;
  1375. }
  1376. }
  1377. }
  1378. }
  1379. }
  1380. /// <summary>
  1381. /// 线体2对应炒锅出桶
  1382. /// </summary>
  1383. public void LTwoFryPotOutputMaterial()
  1384. {
  1385. if (LTwoOutputMaterialQuene.Count > 0 && globalVar.LTwoInOrOutputLock && globalVar.agvArriveLTwoUpLoad && globalVar.LTwoPotOutputRollerArrive && !globalVar.LTwoAgvArrivePot)
  1386. {
  1387. MessageLog.GetInstance.ShowRunLog($"AGV到达【{globalVar.LTwoFryPotSerial}】号炒锅空桶上料位置");
  1388. AgvArriveFryPotTwoOrFiveOutEmptyRollerSingleSetDown();//暂时考虑agv送完料后原地等待,不加条件,直接发送到位信号
  1389. globalVar.agvArriveLTwoUpLoad = false;
  1390. globalVar.LTwoAgvArrivePot = true;
  1391. }
  1392. }
  1393. public void LTwoEmptyOperate()
  1394. {
  1395. if ((globalVar.fryPotTwo.EmptyBarrelArrivedSingle == 1 || globalVar.fryPotFive.EmptyBarrelArrivedSingle == 1) && LTwoOutputMaterialQuene.Count > 0 && globalVar.LTwoAgvArrivePot)
  1396. {
  1397. FryPotTwoRollerTroubleCheck();
  1398. if (FryPotTwoAlarm == 1 || FryPotFiveAlarm == 1)//无故障
  1399. {
  1400. if (globalVar.LTwoagvFryPotEmptyRollerArrive)
  1401. {
  1402. FryPotTwoOrFiveOutEmpetyRollerOperate();
  1403. if (LTwoOutputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))//空桶出桶后,出料原料队列移除对应原料
  1404. {
  1405. //AgvViewModel.GetInstance().Set小车是否承载物品(2, IsBool.OnllYes);
  1406. //if (globalVar.LTwoFryPotSerial == 2)
  1407. //{
  1408. // AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.hs_2);
  1409. //}
  1410. //else if (globalVar.LTwoFryPotSerial == 5)
  1411. //{
  1412. // AgvViewModel.GetInstance().Set小车运动(2, CartMotionTrajectory.hs_5);
  1413. //}
  1414. globalVar.LTwoagvFryPotEmptyRollerArrive = false;
  1415. globalVar.LTwoInOrOutputLock = false;
  1416. globalVar.LTwoMaterialNum--;
  1417. MessageLog.GetInstance.ShowRunLog($"AGV在【{globalVar.LTwoFryPotSerial}】号炒锅将空桶回收到4号滚筒线");
  1418. //AGV拿到空桶,让AGV运桶到指定位置,同时可以让下一个AGV从线体装料运到炒锅
  1419. globalVar.AllowAgvToLineTwoLoadRoller = true;
  1420. globalVar.LTwoLoadRoller = false;
  1421. globalVar.LTwoAgvToFryPot = false;
  1422. globalVar.LTwoPotInputMaterialArrive = false;
  1423. globalVar.LTwoPotOutputRollerArrive = false;
  1424. globalVar.LTwoAgvArrivePot = false;
  1425. }
  1426. }
  1427. }
  1428. }
  1429. }
  1430. /// <summary>
  1431. /// 线体3对应炒锅出桶
  1432. /// </summary>
  1433. public void LThreeFryPotOutputMaterial()
  1434. {
  1435. if (LThreeOutputMaterialQuene.Count > 0 && globalVar.LThreeInOrOutputLock && globalVar.agvArriveLThreeUpLoad && globalVar.LThreePotOutputRollerArrive && !globalVar.LThreeAgvArrivePot)
  1436. {
  1437. MessageLog.GetInstance.ShowRunLog($"AGV到达【{globalVar.LThreeFryPotSerial}】号炒锅空桶上料位置");
  1438. AgvArriveFryPotThreeOutEmptyRollerSingleSetDown();//暂时考虑agv送完料后原地等待,不加条件,直接发送到位信号
  1439. globalVar.agvArriveLThreeUpLoad = false;
  1440. globalVar.LThreeAgvArrivePot = true;
  1441. }
  1442. }
  1443. public void LThreeEmptyOperate()
  1444. {
  1445. if (globalVar.fryPotThree.EmptyBarrelArrivedSingle == 1 && LThreeOutputMaterialQuene.Count > 0 && globalVar.LThreeAgvArrivePot)
  1446. {
  1447. FryPotThreeRollerTroubleCheck();
  1448. if (FryPotThreeAlarm == 1)//无故障
  1449. {
  1450. if (globalVar.LThreeagvFryPotEmptyRollerArrive)
  1451. {
  1452. FryPotThreeOutEmpetyRollerOperate();
  1453. if (LThreeOutputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))//空桶出桶后,出料原料队列移除对应原料
  1454. {
  1455. //AgvViewModel.GetInstance().Set小车是否承载物品(3, IsBool.OnllYes);
  1456. //AgvViewModel.GetInstance().Set小车运动(3, CartMotionTrajectory.hs_3);
  1457. globalVar.LThreeagvFryPotEmptyRollerArrive = false;
  1458. globalVar.LThreeInOrOutputLock = false;
  1459. globalVar.LThreeMaterialNum--;
  1460. MessageLog.GetInstance.ShowRunLog($"AGV在【{globalVar.LThreeFryPotSerial}】号炒锅将空桶回收到4号滚筒线");
  1461. //AGV拿到空桶,让AGV运桶到指定位置,同时可以让下一个AGV从线体装料运到炒锅
  1462. globalVar.AllowAgvToLineThreeLoadRoller = true;
  1463. globalVar.LThreeLoadRoller = false;
  1464. globalVar.LThreeAgvToFryPot = false;
  1465. globalVar.LThreePotInputMaterialArrive = false;
  1466. globalVar.LThreePotOutputRollerArrive = false;
  1467. globalVar.LThreeAgvArrivePot = false;
  1468. }
  1469. }
  1470. }
  1471. }
  1472. }
  1473. /// <summary>
  1474. /// 1号线体对应空桶清洗
  1475. /// </summary>
  1476. public void LOneEmptyRollerToClean()
  1477. {
  1478. if (globalVar.EmptyRollerUnLoadcCom)//agv在4号线体下料完成
  1479. {
  1480. erp: string id = Guid.NewGuid().ToString("N");//上游唯一ID
  1481. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  1482. {
  1483. goto erp;
  1484. }
  1485. string info = AGVHelper.GetInstance.AgvLeaveFryPotOne(id);
  1486. LOnerobotJobId = id;
  1487. FryCarryTaskErrorCodeAnalysis(info, 1);
  1488. globalVar.AllowAgvToLineLoadRoller = true;
  1489. globalVar.LoadRoller = false;
  1490. globalVar.AgvToFryPot = false;
  1491. globalVar.PotOneInputMaterialArrive = false;
  1492. globalVar.PotOneOutputRollerArrive = false;
  1493. globalVar.AgvArrivePot = false;
  1494. }
  1495. }
  1496. /// <summary>
  1497. /// 2号线体对应空桶清洗
  1498. /// </summary>
  1499. public void LTwoEmptyRollerToClean()
  1500. {
  1501. if (globalVar.LTwoEmptyRollerUnLoadcCom)//agv在4号线体下料完成
  1502. {
  1503. globalVar.AllowAgvToLineTwoLoadRoller = true;
  1504. globalVar.LTwoLoadRoller = false;
  1505. globalVar.LTwoAgvToFryPot = false;
  1506. globalVar.LTwoPotInputMaterialArrive = false;
  1507. globalVar.LTwoPotOutputRollerArrive = false;
  1508. globalVar.LTwoAgvArrivePot = false;
  1509. }
  1510. }
  1511. /// <summary>
  1512. /// 3号线体对应空桶清洗
  1513. /// </summary>
  1514. public void LThreeEmptyRollerToClean()
  1515. {
  1516. if (globalVar.LThreeEmptyRollerUnLoadcCom)//agv在4号线体下料完成
  1517. {
  1518. globalVar.AllowAgvToLineThreeLoadRoller = true;
  1519. globalVar.LThreeLoadRoller = false;
  1520. globalVar.LThreeAgvToFryPot = false;
  1521. globalVar.LThreePotInputMaterialArrive = false;
  1522. globalVar.LThreePotOutputRollerArrive = false;
  1523. globalVar.LThreeAgvArrivePot = false;
  1524. }
  1525. }
  1526. /// <summary>
  1527. /// 炒锅滚筒进料运行到位处理
  1528. /// </summary>
  1529. public void FryPotInputMaterialRollerOperate(ConcurrentQueue<MaterialInfo> queue)
  1530. {
  1531. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  1532. {
  1533. case 1:
  1534. while (globalVar.fryPotOne.InputMaterialArrivedSingle == 0)
  1535. {
  1536. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1537. return;
  1538. }
  1539. MessageLog.GetInstance.ShowRunLog($"炒锅【1】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1540. case 2:
  1541. while (globalVar.fryPotTwo.InputMaterialArrivedSingle == 0)
  1542. {
  1543. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1544. return;
  1545. }
  1546. MessageLog.GetInstance.ShowRunLog($"炒锅【2】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1547. case 3:
  1548. while (globalVar.fryPotThree.InputMaterialArrivedSingle == 0)
  1549. {
  1550. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1551. return;
  1552. }
  1553. MessageLog.GetInstance.ShowRunLog($"炒锅【3】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1554. case 4:
  1555. while (globalVar.fryPotFour.InputMaterialArrivedSingle == 0)
  1556. {
  1557. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1558. return;
  1559. }
  1560. MessageLog.GetInstance.ShowRunLog($"炒锅【4】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1561. case 5:
  1562. while (globalVar.fryPotFive.InputMaterialArrivedSingle == 0)
  1563. {
  1564. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1565. return;
  1566. }
  1567. MessageLog.GetInstance.ShowRunLog($"炒锅【5】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1568. }
  1569. }
  1570. /// <summary>
  1571. /// 炒锅1,4滚筒进料运行到位处理
  1572. /// </summary>
  1573. public void FryPotOneOrFourInputMaterialRollerOperate()
  1574. {
  1575. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1576. {
  1577. case 1:
  1578. //while (globalVar.fryPotOne.InputMaterialArrivedSingle == 0)
  1579. //{
  1580. // Thread.Sleep(5); if (globalVar.ExitMainTask)
  1581. // return;
  1582. //}
  1583. MessageLog.GetInstance.ShowRunLog($"炒锅【1】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1584. case 4:
  1585. //while (globalVar.fryPotFour.InputMaterialArrivedSingle == 0)
  1586. //{
  1587. // Thread.Sleep(5); if (globalVar.ExitMainTask)
  1588. // return;
  1589. //}
  1590. MessageLog.GetInstance.ShowRunLog($"炒锅【4】原料:{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1591. }
  1592. }
  1593. /// <summary>
  1594. /// 炒锅2,5滚筒进料运行到位处理
  1595. /// </summary>
  1596. public void FryPotTwoOrFiveInputMaterialRollerOperate()
  1597. {
  1598. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1599. {
  1600. case 2:
  1601. while (globalVar.fryPotTwo.InputMaterialArrivedSingle == 0)
  1602. {
  1603. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1604. return;
  1605. }
  1606. MessageLog.GetInstance.ShowRunLog($"炒锅【2】原料:{LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1607. case 5:
  1608. while (globalVar.fryPotFive.InputMaterialArrivedSingle == 0)
  1609. {
  1610. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1611. return;
  1612. }
  1613. MessageLog.GetInstance.ShowRunLog($"炒锅【5】原料:{LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料"); break;
  1614. }
  1615. }
  1616. public void FryPotThreeInputMaterialRollerOperate()
  1617. {
  1618. while (globalVar.fryPotThree.InputMaterialArrivedSingle == 0)
  1619. {
  1620. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1621. return;
  1622. }
  1623. MessageLog.GetInstance.ShowRunLog($"炒锅【3】原料:{LThreeOutputMaterialQuene.ElementAt(0).materialType.MaterialName}已到进料位置,准备倒料");
  1624. }
  1625. /// <summary>
  1626. /// 炒锅滚筒空桶出桶处理
  1627. /// </summary>
  1628. public void FryPotOutEmpetyRollerOperate(ConcurrentQueue<MaterialInfo> queue)
  1629. {
  1630. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  1631. {
  1632. case 1:
  1633. while (globalVar.fryPotOne.EmptyBarrelArrivedSingle == 0)
  1634. {
  1635. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1636. return;
  1637. }
  1638. MessageLog.GetInstance.ShowRunLog($"炒锅【1】原料:【{queue.ElementAt(0).materialType.MaterialName}】空桶到达出桶位置,正在出桶"); break;
  1639. case 2:
  1640. while (globalVar.fryPotTwo.EmptyBarrelArrivedSingle == 0)
  1641. {
  1642. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1643. return;
  1644. }
  1645. MessageLog.GetInstance.ShowRunLog($"炒锅【2】原料:【{queue.ElementAt(0).materialType.MaterialName}】空桶到达出桶位置,正在出桶"); break;
  1646. case 3:
  1647. while (globalVar.fryPotThree.EmptyBarrelArrivedSingle == 0)
  1648. {
  1649. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1650. return;
  1651. }
  1652. MessageLog.GetInstance.ShowRunLog($"炒锅【3】原料:【{queue.ElementAt(0).materialType.MaterialName}】空桶到达出桶位置,正在出桶"); break;
  1653. case 4:
  1654. while (globalVar.fryPotFour.EmptyBarrelArrivedSingle == 0)
  1655. {
  1656. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1657. return;
  1658. }
  1659. MessageLog.GetInstance.ShowRunLog($"炒锅【4】原料:【{queue.ElementAt(0).materialType.MaterialName}】空桶到达出桶位置,正在出桶"); break;
  1660. case 5:
  1661. while (globalVar.fryPotFive.EmptyBarrelArrivedSingle == 0)
  1662. {
  1663. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1664. return;
  1665. }
  1666. MessageLog.GetInstance.ShowRunLog($"炒锅【5】原料:【{queue.ElementAt(0).materialType.MaterialName}】空桶到达出桶位置,正在出桶"); break;
  1667. }
  1668. }
  1669. /// <summary>
  1670. /// 炒锅1,4滚筒空桶出桶处理
  1671. /// </summary>
  1672. public void FryPotOneOrFourOutEmpetyRollerOperate()
  1673. {
  1674. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1675. {
  1676. case 1:
  1677. //while (globalVar.fryPotOne.EmptyBarrelArrivedSingle == 0)
  1678. //{
  1679. // Thread.Sleep(5); if (globalVar.ExitMainTask)
  1680. // return;
  1681. //}
  1682. MessageLog.GetInstance.ShowRunLog($"炒锅【1】原料:【{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}】空桶上料完成"); break;
  1683. case 4:
  1684. //while (globalVar.fryPotFour.EmptyBarrelArrivedSingle == 0)
  1685. //{
  1686. // Thread.Sleep(5); if (globalVar.ExitMainTask)
  1687. // return;
  1688. //}
  1689. MessageLog.GetInstance.ShowRunLog($"炒锅【4】原料:【{OutputMaterialQuene.ElementAt(0).materialType.MaterialName}】空桶上料完成"); break;
  1690. }
  1691. }
  1692. /// <summary>
  1693. /// 炒锅2,5滚筒空桶出桶处理
  1694. /// </summary>
  1695. public void FryPotTwoOrFiveOutEmpetyRollerOperate()
  1696. {
  1697. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1698. {
  1699. case 2:
  1700. while (globalVar.fryPotTwo.EmptyBarrelArrivedSingle == 0)
  1701. {
  1702. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1703. return;
  1704. }
  1705. MessageLog.GetInstance.ShowRunLog($"炒锅【2】原料:【{LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName}】空桶上料完成"); break;
  1706. case 5:
  1707. while (globalVar.fryPotFive.EmptyBarrelArrivedSingle == 0)
  1708. {
  1709. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1710. return;
  1711. }
  1712. MessageLog.GetInstance.ShowRunLog($"炒锅【5】原料:【{LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialName}】空桶上料完成"); break;
  1713. }
  1714. }
  1715. /// <summary>
  1716. /// 炒锅3滚筒空桶出桶处理
  1717. /// </summary>
  1718. public void FryPotThreeOutEmpetyRollerOperate()
  1719. {
  1720. while (globalVar.fryPotThree.EmptyBarrelArrivedSingle == 0)
  1721. {
  1722. Thread.Sleep(5); if (globalVar.ExitMainTask)
  1723. return;
  1724. }
  1725. MessageLog.GetInstance.ShowRunLog($"炒锅【3】原料:【{LThreeOutputMaterialQuene.ElementAt(0).materialType.MaterialName}】空桶上料完成");
  1726. }
  1727. /// <summary>
  1728. /// 发送agv送料就位信号至PLC(线体到炒锅)
  1729. /// </summary>
  1730. public void AgvArriveFryPotSingleSetDown(ConcurrentQueue<MaterialInfo> queue)
  1731. {
  1732. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  1733. {
  1734. case 1: DeviceOperate.GetInstance.WritePlcData("D1055", 1); break;//agv到炒锅1送料就位信号
  1735. case 2: DeviceOperate.GetInstance.WritePlcData("D1056", 1); break;//agv到炒锅2送料就位信号
  1736. case 3: DeviceOperate.GetInstance.WritePlcData("D1057", 1); break;//agv到炒锅3送料就位信号
  1737. case 4: DeviceOperate.GetInstance.WritePlcData("D1058", 1); break;//agv到炒锅4送料就位信号
  1738. case 5: DeviceOperate.GetInstance.WritePlcData("D1059", 1); break;//agv到炒锅5送料就位信号
  1739. }
  1740. }
  1741. /// <summary>
  1742. /// 发送agv送料就位信号至PLC(线体1到炒锅)
  1743. /// </summary>
  1744. public void AgvArriveFryPotOneOrFourSingleSetDown()
  1745. {
  1746. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1747. {
  1748. case 1: DeviceOperate.GetInstance.WritePlcData("D1055", 1); break;//agv到炒锅1送料就位信号
  1749. case 4: DeviceOperate.GetInstance.WritePlcData("D1058", 1); break;//agv到炒锅4送料就位信号
  1750. }
  1751. }
  1752. /// <summary>
  1753. /// 发送agv送料就位信号至PLC(线体2到炒锅)
  1754. /// </summary>
  1755. public void AgvArriveFryPotTwoOrFiveSingleSetDown()
  1756. {
  1757. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1758. {
  1759. case 2: DeviceOperate.GetInstance.WritePlcData("D1056", 1); break;//agv到炒锅2送料就位信号
  1760. case 5: DeviceOperate.GetInstance.WritePlcData("D1059", 1); break;//agv到炒锅5送料就位信号
  1761. }
  1762. }
  1763. /// <summary>
  1764. /// 发送agv送料就位信号至PLC(线体3到炒锅)
  1765. /// </summary>
  1766. public void AgvArriveFryPotThreeSingleSetDown()
  1767. {
  1768. DeviceOperate.GetInstance.WritePlcData("D1057", 1); //agv到炒锅3送料就位信号
  1769. }
  1770. /// <summary>
  1771. /// 发送agv回桶就位信号至PLC
  1772. /// </summary>
  1773. public void AgvArriveFryPotOutEmptyRollerSingleSetDown(ConcurrentQueue<MaterialInfo> queue)
  1774. {
  1775. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  1776. {
  1777. case 1: DeviceOperate.GetInstance.WritePlcData("D1060", 1); break;//agv到炒锅1送料就位信号
  1778. case 2: DeviceOperate.GetInstance.WritePlcData("D1061", 1); break;//agv到炒锅2送料就位信号
  1779. case 3: DeviceOperate.GetInstance.WritePlcData("D1062", 1); break;//agv到炒锅3送料就位信号
  1780. case 4: DeviceOperate.GetInstance.WritePlcData("D1063", 1); break;//agv到炒锅4送料就位信号
  1781. case 5: DeviceOperate.GetInstance.WritePlcData("D1064", 1); break;//agv到炒锅5送料就位信号
  1782. }
  1783. }
  1784. public void AgvArriveFryPotOneOrFourOutEmptyRollerSingleSetDown()
  1785. {
  1786. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1787. {
  1788. case 1: DeviceOperate.GetInstance.WritePlcData("D1060", 1); break;//agv到炒锅1送料就位信号
  1789. case 4: DeviceOperate.GetInstance.WritePlcData("D1063", 1); break;//agv到炒锅4送料就位信号
  1790. }
  1791. }
  1792. public void AgvArriveFryPotTwoOrFiveOutEmptyRollerSingleSetDown()
  1793. {
  1794. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1795. {
  1796. case 2: DeviceOperate.GetInstance.WritePlcData("D1061", 1); break;//agv到炒锅2送料就位信号
  1797. case 5: DeviceOperate.GetInstance.WritePlcData("D1064", 1); break;//agv到炒锅5送料就位信号
  1798. }
  1799. }
  1800. public void AgvArriveFryPotThreeOutEmptyRollerSingleSetDown()
  1801. {
  1802. DeviceOperate.GetInstance.WritePlcData("D1062", 1);//agv到炒锅3送料就位信号
  1803. }
  1804. /// <summary>
  1805. /// AGV离开炒锅运送空桶任务
  1806. /// </summary>
  1807. public void AgvFromFryPotToClean(ConcurrentQueue<MaterialInfo> queue)
  1808. {
  1809. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  1810. {
  1811. case 1:
  1812. erp: string id = Guid.NewGuid().ToString("N");//上游唯一ID
  1813. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  1814. {
  1815. goto erp;
  1816. }
  1817. string info = AGVHelper.GetInstance.AgvLeaveFryPotOne(id);
  1818. LOnerobotJobId = id;
  1819. FryCarryTaskErrorCodeAnalysis(info, 1); break;
  1820. case 2:
  1821. erp1: string id1 = Guid.NewGuid().ToString("N");//上游唯一ID
  1822. if (id1 == LTworobotJobId)
  1823. {
  1824. goto erp1;
  1825. }
  1826. string info1 = AGVHelper.GetInstance.AgvLeaveFryPotTwo(id1);
  1827. LTworobotJobId = id1;
  1828. FryCarryTaskErrorCodeAnalysis(info1, 2); break;
  1829. case 3:
  1830. erp2: string id2 = Guid.NewGuid().ToString("N");//上游唯一ID
  1831. if (id2 == LThreerobotJobId)
  1832. {
  1833. goto erp2;
  1834. }
  1835. string info2 = AGVHelper.GetInstance.AgvLeaveFryPotThree(id2);
  1836. LThreerobotJobId = id2;
  1837. FryCarryTaskErrorCodeAnalysis(info2, 3); break;
  1838. case 4:
  1839. erp3: string id3 = Guid.NewGuid().ToString("N");//上游唯一ID
  1840. if (id3 == LOnerobotJobId)
  1841. {
  1842. goto erp3;
  1843. }
  1844. string info3 = AGVHelper.GetInstance.AgvLeaveFryPotFour(id3);
  1845. LOnerobotJobId = id3;
  1846. FryCarryTaskErrorCodeAnalysis(info3, 4); break;
  1847. case 5:
  1848. erp4: string id4 = Guid.NewGuid().ToString("N");//上游唯一ID
  1849. if (id4 == LTworobotJobId)
  1850. {
  1851. goto erp4;
  1852. }
  1853. string info4 = AGVHelper.GetInstance.AgvLeaveFryPotFive(id4);
  1854. LTworobotJobId = id4;
  1855. FryCarryTaskErrorCodeAnalysis(info4, 5); break;
  1856. }
  1857. }
  1858. /// <summary>
  1859. /// AGV离开炒锅1,4运送空桶任务
  1860. /// </summary>
  1861. public void AgvFromFryPotOneOrFourToClean()
  1862. {
  1863. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1864. {
  1865. case 1:
  1866. erp: string id = Guid.NewGuid().ToString("N");//上游唯一ID
  1867. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  1868. {
  1869. goto erp;
  1870. }
  1871. MessageLog.GetInstance.ShowRunLog("AGV执行【1】号炒锅空桶回收任务");
  1872. string info = AGVHelper.GetInstance.AgvLeaveFryPotOne(id);
  1873. LOnerobotJobId = id;
  1874. FryCarryTaskErrorCodeAnalysis(info, 1); break;
  1875. case 4:
  1876. erp3: string id3 = Guid.NewGuid().ToString("N");//上游唯一ID
  1877. if (id3 == LOnerobotJobId || id3 == LTworobotJobId || id3 == LThreerobotJobId || id3 == LFourrobotJobId)
  1878. {
  1879. goto erp3;
  1880. }
  1881. MessageLog.GetInstance.ShowRunLog("AGV执行【4】号炒锅空桶回收任务");
  1882. string info3 = AGVHelper.GetInstance.AgvLeaveFryPotFour(id3);
  1883. LOnerobotJobId = id3;
  1884. FryCarryTaskErrorCodeAnalysis(info3, 4); break;
  1885. }
  1886. }
  1887. /// <summary>
  1888. /// AGV离开炒锅2,5运送空桶任务
  1889. /// </summary>
  1890. public void AgvFromFryPotTwoOrFiveToClean()
  1891. {
  1892. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  1893. {
  1894. case 2:
  1895. erp1: string id1 = Guid.NewGuid().ToString("N");//上游唯一ID
  1896. if (id1 == LOnerobotJobId || id1 == LTworobotJobId || id1 == LThreerobotJobId || id1 == LFourrobotJobId)
  1897. {
  1898. goto erp1;
  1899. }
  1900. MessageLog.GetInstance.ShowRunLog("AGV执行【2】号炒锅空桶回收任务");
  1901. string info1 = AGVHelper.GetInstance.AgvLeaveFryPotTwo(id1);
  1902. LTworobotJobId = id1;
  1903. FryCarryTaskErrorCodeAnalysis(info1, 2); break;
  1904. case 5:
  1905. erp4: string id4 = Guid.NewGuid().ToString("N");//上游唯一ID
  1906. if (id4 == LOnerobotJobId || id4 == LTworobotJobId || id4 == LThreerobotJobId || id4 == LFourrobotJobId)
  1907. {
  1908. goto erp4;
  1909. }
  1910. MessageLog.GetInstance.ShowRunLog("AGV执行【5】号炒锅空桶回收任务");
  1911. string info4 = AGVHelper.GetInstance.AgvLeaveFryPotFive(id4);
  1912. LTworobotJobId = id4;
  1913. FryCarryTaskErrorCodeAnalysis(info4, 5); break;
  1914. }
  1915. }
  1916. /// <summary>
  1917. /// AGV离开炒锅3运送空桶任务
  1918. /// </summary>
  1919. public void AgvFromFryPotThreeToClean()
  1920. {
  1921. erp2: string id2 = Guid.NewGuid().ToString("N");//上游唯一ID
  1922. if (id2 == LOnerobotJobId || id2 == LTworobotJobId || id2 == LThreerobotJobId || id2 == LFourrobotJobId)
  1923. {
  1924. goto erp2;
  1925. }
  1926. MessageLog.GetInstance.ShowRunLog("AGV执行【3】号炒锅空桶回收任务");
  1927. string info2 = AGVHelper.GetInstance.AgvLeaveFryPotThree(id2);
  1928. LThreerobotJobId = id2;
  1929. FryCarryTaskErrorCodeAnalysis(info2, 3);
  1930. }
  1931. /// <summary>
  1932. /// 处理agv从线体1到送料到炒锅的条件
  1933. /// </summary>
  1934. /// <param name="lineAlarm"></param>
  1935. public void AgvFromLineOneToFryPot()
  1936. {
  1937. erp: if (AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble == 0)
  1938. {
  1939. if (globalVar.agvArriveUpLoad && globalVar.LoadRoller && globalVar.rollerLineOne.StationEight == InputMaterialQuene.ElementAt(0).materialType.MaterialLoc && !globalVar.AgvToFryPot)//无故障
  1940. {
  1941. MessageLog.GetInstance.ShowRunLog("AGV到达【1】号滚筒线装桶位置");
  1942. AgvArriveLineSingelSetDown(InputMaterialQuene);
  1943. if (InputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))
  1944. {
  1945. MessageLog.GetInstance.ShowRunLog($"AGV正在装载{materialInfo.materialType.MaterialLoc}号料桶");
  1946. AgvViewModel.GetInstance().Set滚筒线状态(1, IsRun.Start);
  1947. globalVar.LOneCurrentCookingStep++;
  1948. OutputMaterialQuene.Enqueue(materialInfo);
  1949. globalVar.agvArriveUpLoad = false;
  1950. globalVar.AgvToFryPot = true;
  1951. //原料到位,agv到位,agv自行运料到炒锅
  1952. }
  1953. }
  1954. }
  1955. else//有故障
  1956. {
  1957. while (AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble == 1)
  1958. {
  1959. Thread.Sleep(5);
  1960. if (globalVar.ExitMainTask)
  1961. return;
  1962. }
  1963. MessageLog.GetInstance.ShowRunLog("线体【1】滚筒故障解除,继续运行");
  1964. //lineAlarm = 1;
  1965. goto erp;
  1966. }
  1967. }
  1968. /// <summary>
  1969. /// 处理agv从线体2到送料到炒锅的条件
  1970. /// </summary>
  1971. /// <param name="lineAlarm"></param>
  1972. public void AgvFromLineTwoToFryPot()
  1973. {
  1974. erp: if (AlarmHelper<AlarmInfo>.Alarm.LTwoRollerTrouble == 0)//无故障
  1975. {
  1976. if (globalVar.agvArriveLTwoUpLoad && globalVar.LTwoLoadRoller && globalVar.rollerLineTwo.StationEight == LTwoInputMaterialQuene.ElementAt(0).materialType.MaterialLoc && !globalVar.LTwoAgvToFryPot)//无故障
  1977. {
  1978. MessageLog.GetInstance.ShowRunLog("AGV到达【2】号滚筒线装桶位置");
  1979. AgvArriveLineSingelSetDown(LTwoInputMaterialQuene);
  1980. if (LTwoInputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))
  1981. {
  1982. MessageLog.GetInstance.ShowRunLog($"AGV正在装载{materialInfo.materialType.MaterialLoc}号料桶");
  1983. AgvViewModel.GetInstance().Set滚筒线状态(2, IsRun.Start);
  1984. globalVar.LTwoCurrentCookingStep++;
  1985. LTwoOutputMaterialQuene.Enqueue(materialInfo);
  1986. globalVar.agvArriveLTwoUpLoad = false;
  1987. globalVar.LTwoAgvToFryPot = true;
  1988. //原料到位,agv到位,agv自行运料到炒锅
  1989. }
  1990. }
  1991. }
  1992. else//有故障
  1993. {
  1994. while (AlarmHelper<AlarmInfo>.Alarm.LTwoRollerTrouble == 1)
  1995. {
  1996. Thread.Sleep(5);
  1997. if (globalVar.ExitMainTask)
  1998. return;
  1999. }
  2000. MessageLog.GetInstance.ShowRunLog("线体【2】滚筒故障解除,继续运行");
  2001. // lineAlarm = 1;
  2002. goto erp;
  2003. }
  2004. }
  2005. /// <summary>
  2006. /// 处理agv从线体3到送料到炒锅的条件
  2007. /// </summary>
  2008. /// <param name="lineAlarm"></param>
  2009. public void AgvFromLineThreeToFryPot()
  2010. {
  2011. erp: if (AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble == 0)//无故障
  2012. {
  2013. if (globalVar.agvArriveLThreeUpLoad && globalVar.LThreeLoadRoller && globalVar.rollerLineThree.StationEight == LThreeInputMaterialQuene.ElementAt(0).materialType.MaterialLoc && !globalVar.LThreeAgvToFryPot)//无故障
  2014. {
  2015. MessageLog.GetInstance.ShowRunLog("AGV到达【3】号滚筒线装桶位置");
  2016. AgvArriveLineSingelSetDown(LThreeInputMaterialQuene);
  2017. if (LThreeInputMaterialQuene.TryDequeue(out MaterialInfo materialInfo))
  2018. {
  2019. MessageLog.GetInstance.ShowRunLog($"AGV正在装载{materialInfo.materialType.MaterialLoc}号料桶");
  2020. AgvViewModel.GetInstance().Set滚筒线状态(3, IsRun.Start);
  2021. globalVar.LThreeCurrentCookingStep++;
  2022. LThreeOutputMaterialQuene.Enqueue(materialInfo);
  2023. globalVar.agvArriveLThreeUpLoad = false;
  2024. globalVar.LThreeAgvToFryPot = true;
  2025. //原料到位,agv到位,agv自行运料到炒锅
  2026. }
  2027. }
  2028. }
  2029. else //有故障
  2030. {
  2031. while (AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble == 1)
  2032. {
  2033. Thread.Sleep(5);
  2034. if (globalVar.ExitMainTask)
  2035. return;
  2036. }
  2037. MessageLog.GetInstance.ShowRunLog("线体【3】滚筒故障解除,继续运行");
  2038. // lineAlarm = 1;
  2039. goto erp;
  2040. }
  2041. }
  2042. /// <summary>
  2043. /// 线体搬运任务错误码分析
  2044. /// </summary>
  2045. /// <param name="errorCode"></param>
  2046. /// <param name="num"></param>
  2047. public void LineCarryTaskErrorCodeAnalysis(string errorCode, int num)
  2048. {
  2049. if (errorCode == "SUCCESS")
  2050. {
  2051. AgvViewModel.GetInstance().Set停车桩(num, IsBool.No);
  2052. AgvViewModel.GetInstance().Set小车是否承载物品(num, IsBool.No);
  2053. AgvViewModel.GetInstance().Set小车运动(num, AgvViewModel.GetInstance().GetCommandValue($"qc_{num}"));
  2054. MessageLog.GetInstance.ShowRunLog($"AGV去{num}号滚筒线装桶");
  2055. globalVar.AllowAgvToLineLoadRoller = false;
  2056. }
  2057. else if (errorCode == "Analysis Error")
  2058. {
  2059. MessageLog.GetInstance.ShowRunLog($"提示:AGV去{num}号滚筒线API调用失败,请检查");
  2060. }
  2061. else
  2062. {
  2063. MessageLog.GetInstance.ShowRunLog($"提示:AGV去{num}号滚筒线失败,错误码:{errorCode}");
  2064. }
  2065. }
  2066. /// <summary>
  2067. /// 炒锅搬运任务错误码分析
  2068. /// </summary>
  2069. /// <param name="errorCode"></param>
  2070. /// <param name="num"></param>
  2071. public void FryCarryTaskErrorCodeAnalysis(string errorCode, int num)
  2072. {
  2073. if (errorCode == "SUCCESS")
  2074. {
  2075. MessageLog.GetInstance.ShowRunLog($"AGV离开{num}号炒锅");
  2076. }
  2077. else if (errorCode == "Analysis Error")
  2078. {
  2079. MessageLog.GetInstance.ShowRunLog($"提示:AGV离开{num}号炒锅接口调用失败,请检查");
  2080. }
  2081. else
  2082. {
  2083. MessageLog.GetInstance.ShowRunLog($"提示:AGV离开{num}号炒锅失败,错误码:{errorCode}");
  2084. }
  2085. }
  2086. public void AgvToLineOneLoadRoller()
  2087. {
  2088. if (AlarmHelper<AlarmInfo>.Alarm.LOneRollerTrouble == 0)//输送线无故障
  2089. {
  2090. if (InputMaterialQuene.Count > 0 && globalVar.AllowAgvToLineLoadRoller && globalVar.rollerLineOne.OutMaterialingSingle == 1 && !globalVar.LoadRoller)
  2091. {
  2092. e: string id = Guid.NewGuid().ToString("N");
  2093. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  2094. goto e;
  2095. string info = AGVHelper.GetInstance.AgvToLineOneLoadRoller(id);
  2096. LOnerobotJobId = id;
  2097. Thread.Sleep(500);
  2098. LineCarryTaskErrorCodeAnalysis(info, 1);
  2099. globalVar.LoadRoller = true;
  2100. }
  2101. }
  2102. //else
  2103. //{
  2104. // MessageLog.GetInstance.ShowRunLog("警告:滚筒输送线体【1】故障!!!");
  2105. // // lineAlarm = -1;
  2106. //}
  2107. //// lineAlarm = 1;
  2108. }
  2109. public void AgvToLineTwoLoadRoller()
  2110. {
  2111. if (AlarmHelper<AlarmInfo>.Alarm.LTwoRollerTrouble == 0)//输送线无故障
  2112. {
  2113. if (LTwoInputMaterialQuene.Count > 0 && globalVar.AllowAgvToLineTwoLoadRoller && globalVar.rollerLineTwo.OutMaterialingSingle == 1 && !globalVar.LTwoLoadRoller)
  2114. {
  2115. e: string id = Guid.NewGuid().ToString("N");
  2116. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  2117. goto e;
  2118. string info = AGVHelper.GetInstance.AgvToLineTwoLoadRoller(id);
  2119. LTworobotJobId = id;
  2120. Thread.Sleep(500);
  2121. LineCarryTaskErrorCodeAnalysis(info, 2);
  2122. globalVar.LTwoLoadRoller = true;
  2123. }
  2124. }
  2125. }
  2126. public void AgvToLineThreeLoadRoller()
  2127. {
  2128. if (AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble == 0)//输送线无故障
  2129. {
  2130. if (LThreeInputMaterialQuene.Count > 0 && globalVar.AllowAgvToLineThreeLoadRoller && globalVar.rollerLineThree.OutMaterialingSingle == 1 && !globalVar.LThreeLoadRoller)
  2131. {
  2132. e: string id = Guid.NewGuid().ToString("N");
  2133. if (id == LOnerobotJobId || id == LTworobotJobId || id == LThreerobotJobId || id == LFourrobotJobId)
  2134. goto e;
  2135. string info = AGVHelper.GetInstance.AgvToLineThreeLoadRoller(id);
  2136. LThreerobotJobId = id;
  2137. Thread.Sleep(500);
  2138. LineCarryTaskErrorCodeAnalysis(info, 3);
  2139. globalVar.LThreeLoadRoller = true;
  2140. }
  2141. }
  2142. //if (AlarmHelper<AlarmInfo>.Alarm.LThreeRollerTrouble == 0)//输送线无故障
  2143. //{
  2144. // if (LThreeInputMaterialQuene.Count > 0)
  2145. // {
  2146. // while (!globalVar.AllowAgvToLineThreeLoadRoller || globalVar.rollerLineThree.OutMaterialingSingle == 0) //后续考虑是否用while
  2147. // {
  2148. // Thread.Sleep(5);
  2149. // if (globalVar.ExitMainTask)
  2150. // return;
  2151. // }
  2152. // g: string id = Guid.NewGuid().ToString();
  2153. // if (id == LThreerobotJobId)
  2154. // goto g;
  2155. // string info = AGVHelper.GetInstance.AgvToLineThreeLoadRoller(id);
  2156. // // MessageLog.GetInstance.ShowRunLog("AGV去【3】号滚筒线装桶");
  2157. // LThreerobotJobId = id;
  2158. // Thread.Sleep(500);
  2159. // LineCarryTaskErrorCodeAnalysis(info, 3);
  2160. // }
  2161. //}
  2162. //else
  2163. //{
  2164. // MessageLog.GetInstance.ShowRunLog("警告:滚筒输送线体【3】故障!!!");
  2165. // // lineAlarm = -1;
  2166. //}
  2167. }
  2168. /// <summary>
  2169. /// 1号线体数据下发
  2170. /// </summary>
  2171. /// <param name="count"></param>
  2172. /// <param name="materialLoc"></param>
  2173. /// <param name="materialWeight"></param>
  2174. public void RollerOneDataWrite(int count, ushort materialLoc, ushort materialWeight)
  2175. {
  2176. switch (count)
  2177. {
  2178. case 0:
  2179. DeviceOperate.GetInstance.WritePlcData("D1001", materialLoc);//桶1位置
  2180. DeviceOperate.GetInstance.WritePlcData("D1010", materialWeight);//桶2重量
  2181. break;
  2182. case 1:
  2183. DeviceOperate.GetInstance.WritePlcData("D1002", materialLoc);//桶2位置
  2184. DeviceOperate.GetInstance.WritePlcData("D1011", materialWeight);//桶2重量
  2185. break;
  2186. case 2:
  2187. DeviceOperate.GetInstance.WritePlcData("D1003", materialLoc);//桶3位置
  2188. DeviceOperate.GetInstance.WritePlcData("D1012", materialWeight);//桶3重量
  2189. break;
  2190. case 3:
  2191. DeviceOperate.GetInstance.WritePlcData("D1004", materialLoc);//桶4位置
  2192. DeviceOperate.GetInstance.WritePlcData("D1013", materialWeight);//桶4重量
  2193. break;
  2194. case 4:
  2195. DeviceOperate.GetInstance.WritePlcData("D1005", materialLoc);//桶5位置
  2196. DeviceOperate.GetInstance.WritePlcData("D1014", materialWeight);//桶5重量
  2197. break;
  2198. case 5:
  2199. DeviceOperate.GetInstance.WritePlcData("D1006", materialLoc);//桶6位置
  2200. DeviceOperate.GetInstance.WritePlcData("D1015", materialWeight);//桶6重量
  2201. break;
  2202. case 6:
  2203. DeviceOperate.GetInstance.WritePlcData("D1007", materialLoc);//桶7位置
  2204. DeviceOperate.GetInstance.WritePlcData("D1016", materialWeight);//桶7重量
  2205. break;
  2206. case 7:
  2207. DeviceOperate.GetInstance.WritePlcData("D1008", materialLoc);//桶8位置
  2208. DeviceOperate.GetInstance.WritePlcData("D1017", materialWeight);//桶8重量
  2209. break;
  2210. }
  2211. }
  2212. /// <summary>
  2213. /// 2号线体数据下发
  2214. /// </summary>
  2215. /// <param name="count"></param>
  2216. /// <param name="materialLoc"></param>
  2217. /// <param name="materialWeight"></param>
  2218. public void RollerTwoDataWrite(int count, ushort materialLoc, ushort materialWeight)
  2219. {
  2220. switch (count)
  2221. {
  2222. case 0:
  2223. DeviceOperate.GetInstance.WritePlcData("D1018", materialLoc);//桶1位置
  2224. DeviceOperate.GetInstance.WritePlcData("D1027", materialWeight);//桶2重量
  2225. break;
  2226. case 1:
  2227. DeviceOperate.GetInstance.WritePlcData("D1019", materialLoc);//桶2位置
  2228. DeviceOperate.GetInstance.WritePlcData("D1028", materialWeight);//桶2重量
  2229. break;
  2230. case 2:
  2231. DeviceOperate.GetInstance.WritePlcData("D1020", materialLoc);//桶3位置
  2232. DeviceOperate.GetInstance.WritePlcData("D1029", materialWeight);//桶3重量
  2233. break;
  2234. case 3:
  2235. DeviceOperate.GetInstance.WritePlcData("D1021", materialLoc);//桶4位置
  2236. DeviceOperate.GetInstance.WritePlcData("D1030", materialWeight);//桶4重量
  2237. break;
  2238. case 4:
  2239. DeviceOperate.GetInstance.WritePlcData("D1022", materialLoc);//桶5位置
  2240. DeviceOperate.GetInstance.WritePlcData("D1031", materialWeight);//桶5重量
  2241. break;
  2242. case 5:
  2243. DeviceOperate.GetInstance.WritePlcData("D1023", materialLoc);//桶6位置
  2244. DeviceOperate.GetInstance.WritePlcData("D1032", materialWeight);//桶6重量
  2245. break;
  2246. case 6:
  2247. DeviceOperate.GetInstance.WritePlcData("D1024", materialLoc);//桶7位置
  2248. DeviceOperate.GetInstance.WritePlcData("D1033", materialWeight);//桶7重量
  2249. break;
  2250. case 7:
  2251. DeviceOperate.GetInstance.WritePlcData("D1025", materialLoc);//桶8位置
  2252. DeviceOperate.GetInstance.WritePlcData("D1034", materialWeight);//桶8重量
  2253. break;
  2254. }
  2255. }
  2256. /// <summary>
  2257. /// 3号线体数据下发
  2258. /// </summary>
  2259. /// <param name="count"></param>
  2260. /// <param name="materialLoc"></param>
  2261. /// <param name="materialWeight"></param>
  2262. public void RollerThreeDataWrite(int count, ushort materialLoc, ushort materialWeight)
  2263. {
  2264. switch (count)
  2265. {
  2266. case 0:
  2267. DeviceOperate.GetInstance.WritePlcData("D1035", materialLoc);//桶1位置
  2268. DeviceOperate.GetInstance.WritePlcData("D1044", materialWeight);//桶2重量
  2269. break;
  2270. case 1:
  2271. DeviceOperate.GetInstance.WritePlcData("D1036", materialLoc);//桶2位置
  2272. DeviceOperate.GetInstance.WritePlcData("D1045", materialWeight);//桶2重量
  2273. break;
  2274. case 2:
  2275. DeviceOperate.GetInstance.WritePlcData("D1037", materialLoc);//桶3位置
  2276. DeviceOperate.GetInstance.WritePlcData("D1046", materialWeight);//桶3重量
  2277. break;
  2278. case 3:
  2279. DeviceOperate.GetInstance.WritePlcData("D1038", materialLoc);//桶4位置
  2280. DeviceOperate.GetInstance.WritePlcData("D1047", materialWeight);//桶4重量
  2281. break;
  2282. case 4:
  2283. DeviceOperate.GetInstance.WritePlcData("D1039", materialLoc);//桶5位置
  2284. DeviceOperate.GetInstance.WritePlcData("D1048", materialWeight);//桶5重量
  2285. break;
  2286. case 5:
  2287. DeviceOperate.GetInstance.WritePlcData("D1040", materialLoc);//桶6位置
  2288. DeviceOperate.GetInstance.WritePlcData("D1049", materialWeight);//桶6重量
  2289. break;
  2290. case 6:
  2291. DeviceOperate.GetInstance.WritePlcData("D1041", materialLoc);//桶7位置
  2292. DeviceOperate.GetInstance.WritePlcData("D1050", materialWeight);//桶7重量
  2293. break;
  2294. case 7:
  2295. DeviceOperate.GetInstance.WritePlcData("D1042", materialLoc);//桶8位置
  2296. DeviceOperate.GetInstance.WritePlcData("D1051", materialWeight);//桶8重量
  2297. break;
  2298. }
  2299. }
  2300. /// <summary>
  2301. /// AGV线体进料就位信号下发至PLC
  2302. /// </summary>
  2303. public void AgvArriveLineSingelSetDown(ConcurrentQueue<MaterialInfo> queue)
  2304. {
  2305. switch (queue.ElementAt(0).materialType.MaterialLoc / 100)
  2306. {
  2307. case 1:
  2308. case 4: DeviceOperate.GetInstance.WritePlcData("D1052", 1); break;//AGV进料就位信号1
  2309. case 2:
  2310. case 5: DeviceOperate.GetInstance.WritePlcData("D1053", 1); break;//AGV进料就位信号2
  2311. case 3: DeviceOperate.GetInstance.WritePlcData("D1054", 1); break;//AGV进料就位信号3
  2312. }
  2313. }
  2314. /// <summary>
  2315. /// 炒锅滚筒信号检测
  2316. /// </summary>
  2317. public void FryPotRollerTroubleCheck()
  2318. {
  2319. FryPotAlarm = 0;
  2320. FryPotTwoAlarm = 0;
  2321. FryPotThreeAlarm = 0;
  2322. FryPotFourAlarm = 0;
  2323. FryPotFiveAlarm = 0;
  2324. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  2325. {
  2326. case 1:
  2327. if (AlarmHelper<AlarmInfo>.Alarm.FryPotOneRollerTrouble == 1) { FryPotAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【1】输送滚筒发生故障"); } else { FryPotAlarm = 1; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotOneRollerTrouble == 1)
  2328. {
  2329. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2330. return;
  2331. }
  2332. MessageLog.GetInstance.ShowRunLog("炒锅【1】输送滚筒故障解除,继续运行");
  2333. FryPotAlarm = 1; break;
  2334. case 2:
  2335. if (AlarmHelper<AlarmInfo>.Alarm.FryPotTwoRollerTrouble == 1) { FryPotTwoAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【2】输送滚筒发生故障"); } else { FryPotTwoAlarm = 1; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotTwoRollerTrouble == 1)
  2336. {
  2337. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2338. return;
  2339. }
  2340. MessageLog.GetInstance.ShowRunLog("炒锅【2】输送滚筒故障解除,继续运行");
  2341. FryPotTwoAlarm = 1; break;
  2342. case 3:
  2343. if (AlarmHelper<AlarmInfo>.Alarm.FryPotThreeRollerTrouble == 1) { FryPotThreeAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【3】输送滚筒发生故障"); } else { FryPotThreeAlarm = 1; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotThreeRollerTrouble == 1)
  2344. {
  2345. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2346. return;
  2347. }
  2348. MessageLog.GetInstance.ShowRunLog("炒锅【3】输送滚筒故障解除,继续运行");
  2349. FryPotThreeAlarm = 1; break;
  2350. case 4:
  2351. if (AlarmHelper<AlarmInfo>.Alarm.FryPotFourRollerTrouble == 1) { FryPotFourAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【4】输送滚筒发生故障"); } else { FryPotFourAlarm = 1; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotFourRollerTrouble == 1)
  2352. {
  2353. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2354. return;
  2355. }
  2356. MessageLog.GetInstance.ShowRunLog("炒锅【4】输送滚筒故障解除,继续运行");
  2357. FryPotFourAlarm = 1; break;
  2358. case 5:
  2359. if (AlarmHelper<AlarmInfo>.Alarm.FryPotFiveRollerTrouble == 1) { FryPotFiveAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【5】输送滚筒发生故障"); } else { FryPotFiveAlarm = 1; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotFiveRollerTrouble == 1)
  2360. {
  2361. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2362. return;
  2363. }
  2364. MessageLog.GetInstance.ShowRunLog("炒锅【5】输送滚筒故障解除,继续运行");
  2365. FryPotFiveAlarm = 1; break;
  2366. }
  2367. }
  2368. /// <summary>
  2369. /// 炒锅1,4滚筒信号检测
  2370. /// </summary>
  2371. public void FryPotOneRollerTroubleCheck()
  2372. {
  2373. FryPotAlarm = 0;
  2374. FryPotFourAlarm = 0;
  2375. switch (OutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  2376. {
  2377. case 1:
  2378. if (AlarmHelper<AlarmInfo>.Alarm.FryPotOneRollerTrouble == 1) { FryPotAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【1】输送滚筒发生故障"); } else { FryPotAlarm = 1; return; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotOneRollerTrouble == 1)
  2379. {
  2380. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2381. return;
  2382. }
  2383. MessageLog.GetInstance.ShowRunLog("炒锅【1】输送滚筒故障解除,继续运行");
  2384. FryPotAlarm = 1; break;
  2385. case 4:
  2386. if (AlarmHelper<AlarmInfo>.Alarm.FryPotFourRollerTrouble == 1) { FryPotFourAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【4】输送滚筒发生故障"); } else { FryPotFourAlarm = 1; return; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotFourRollerTrouble == 1)
  2387. {
  2388. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2389. return;
  2390. }
  2391. MessageLog.GetInstance.ShowRunLog("炒锅【4】输送滚筒故障解除,继续运行");
  2392. FryPotFourAlarm = 1; break;
  2393. }
  2394. }
  2395. /// <summary>
  2396. /// 炒锅2,5滚筒信号检测
  2397. /// </summary>
  2398. public void FryPotTwoRollerTroubleCheck()
  2399. {
  2400. FryPotTwoAlarm = 0;
  2401. FryPotFiveAlarm = 0;
  2402. switch (LTwoOutputMaterialQuene.ElementAt(0).materialType.MaterialLoc / 100)
  2403. {
  2404. case 2:
  2405. if (AlarmHelper<AlarmInfo>.Alarm.FryPotTwoRollerTrouble == 1) { FryPotTwoAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【1】输送滚筒发生故障"); } else { FryPotTwoAlarm = 1; return; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotTwoRollerTrouble == 1)
  2406. {
  2407. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2408. return;
  2409. }
  2410. MessageLog.GetInstance.ShowRunLog("炒锅【1】输送滚筒故障解除,继续运行");
  2411. FryPotTwoAlarm = 1; break;
  2412. case 5:
  2413. if (AlarmHelper<AlarmInfo>.Alarm.FryPotFiveRollerTrouble == 1) { FryPotFiveAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【4】输送滚筒发生故障"); } else { FryPotFiveAlarm = 1; return; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotFiveRollerTrouble == 1)
  2414. {
  2415. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2416. return;
  2417. }
  2418. MessageLog.GetInstance.ShowRunLog("炒锅【4】输送滚筒故障解除,继续运行");
  2419. FryPotFiveAlarm = 1; break;
  2420. }
  2421. }
  2422. /// <summary>
  2423. /// 炒锅3滚筒信号检测
  2424. /// </summary>
  2425. public void FryPotThreeRollerTroubleCheck()
  2426. {
  2427. FryPotThreeAlarm = 0;
  2428. if (AlarmHelper<AlarmInfo>.Alarm.FryPotThreeRollerTrouble == 1) { FryPotThreeAlarm = -1; MessageLog.GetInstance.ShowRunLog("警告:炒锅【3】输送滚筒发生故障"); } else { FryPotThreeAlarm = 1; return; } while (AlarmHelper<AlarmInfo>.Alarm.FryPotThreeRollerTrouble == 1)
  2429. {
  2430. Thread.Sleep(5); if (globalVar.ExitMainTask)
  2431. return;
  2432. }
  2433. MessageLog.GetInstance.ShowRunLog("炒锅【3】输送滚筒故障解除,继续运行");
  2434. FryPotThreeAlarm = 1;
  2435. }
  2436. }
  2437. }