终端一体化运控平台
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

Control_MorkMOC.cs 6.8 KiB

hace 2 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using BPA.Message.Enum;
  2. using BPASmartClient.Device;
  3. using BPASmartClient.EventBus;
  4. using BPASmartClient.Model;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using static BPASmartClient.EventBus.EventBus;
  11. namespace BPASmartClient.MorkMOC
  12. {
  13. public class Control_MorkMOC : BaseDevice
  14. {
  15. GVL_MorkMOC morkMoc = new GVL_MorkMOC();
  16. PolymerBatching polymerBatching = new PolymerBatching();
  17. //放大倍数
  18. const int expand = 10;
  19. public override DeviceClientType DeviceType => throw new NotImplementedException();
  20. public override void DoMain()
  21. {
  22. ServerInit();
  23. DataParse();
  24. }
  25. private void ServerInit()
  26. {
  27. //物料信息
  28. EventBus.EventBus.GetInstance().Subscribe<MaterialDeliveryEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
  29. {
  30. if (@event == null) return;
  31. if (@event is MaterialDeliveryEvent material)
  32. {
  33. orderMaterialDelivery = material.orderMaterialDelivery;
  34. }
  35. });
  36. //配方数据信息
  37. EventBus.EventBus.GetInstance().Subscribe<RecipeBomEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
  38. {
  39. if (@event == null) return;
  40. if (@event is RecipeBomEvent recipe)
  41. {
  42. recipeBoms = recipe.recipeBoms;
  43. }
  44. });
  45. }
  46. private void DataParse()
  47. {
  48. EventBus.EventBus.GetInstance().Subscribe<DoOrderEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
  49. {
  50. if (@event == null) return;
  51. if (@event is DoOrderEvent order)
  52. {
  53. if (order.MorkOrder.GoodBatchings == null) return;
  54. OrderCount++;
  55. morkMoc.doOrderEvents.Add(order);
  56. OrderChange(order.MorkOrder.SuborderId, ORDER_STATUS.WAIT);
  57. DeviceProcessLogShow($"接收到{OrderCount}次订单");
  58. Dictionary<int, int> OrderPushes = new Dictionary<int, int>();
  59. foreach (var item in order.MorkOrder.GoodBatchings)
  60. {
  61. var res = orderMaterialDelivery?.BatchingInfo?.FirstOrDefault(p => p.BatchingId == item.BatchingId);
  62. if (res != null)
  63. {
  64. OrderPushes.TryAdd(int.Parse(res.BatchingLoc), item.BatchingCount);
  65. }
  66. }
  67. morkMoc.morkOrderPushes.Enqueue(new OrderLocInfo()
  68. {
  69. GoodName = order.MorkOrder.GoodsName,
  70. SuborderId = order.MorkOrder.SuborderId,
  71. GoodPushes = OrderPushes
  72. });
  73. }
  74. });
  75. }
  76. /// <summary>
  77. /// 订单改变通知
  78. /// </summary>
  79. /// <param name="subid"></param>
  80. /// <param name="oRDER_STATUS"></param>
  81. private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS)
  82. {
  83. var res = morkMoc.doOrderEvents.FirstOrDefault(p => p.MorkOrder.SuborderId == subid);
  84. string goodName = string.Empty;
  85. string SortNum = string.Empty;
  86. EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent()
  87. {
  88. SortNum = res.MorkOrder.SortNum.ToString(),
  89. GoodName = res.MorkOrder.GoodsName,
  90. Status = oRDER_STATUS,
  91. SubOrderId = res.MorkOrder.SuborderId,
  92. deviceClientType = DeviceType
  93. });
  94. if (oRDER_STATUS == ORDER_STATUS.COMPLETED_COOK) morkMoc.doOrderEvents.Remove(res);
  95. }
  96. public override void MainTask()
  97. {
  98. MakeProcess();
  99. }
  100. /// <summary>
  101. /// 制作流程
  102. /// </summary>
  103. private void MakeProcess()
  104. {
  105. if (morkMoc.morkOrderPushes.Count > 0)
  106. {
  107. if (morkMoc.morkOrderPushes.TryDequeue(out OrderLocInfo orderLoc))
  108. {
  109. // 第一步:设置每个仓的出料量
  110. SetMaterialsWeight(orderLoc.GoodPushes);
  111. DeviceProcessLogShow("设置出料量完成");
  112. //第二步:循环出料
  113. OutMaterials(orderLoc.GoodPushes);
  114. DeviceProcessLogShow($"{orderLoc.GoodName}制作完成");
  115. }
  116. }
  117. }
  118. /// <summary>
  119. /// 设定出料重量
  120. /// </summary>
  121. /// <param name="goodPushes"></param>
  122. private void SetMaterialsWeight(Dictionary<int,int> goodPushes)
  123. {
  124. foreach(var good in goodPushes)
  125. {
  126. WriteControl(polymerBatching.plcData[good.Key - 1].WeightVar, good.Value * expand);
  127. DeviceProcessLogShow($"{good.Key}号通道出料量:{good.Value}g");
  128. Thread.Sleep(300);
  129. }
  130. }
  131. /// <summary>
  132. /// 循环出料
  133. /// </summary>
  134. private void OutMaterials(Dictionary<int, int> goodPushes)
  135. {
  136. foreach (var good in goodPushes)
  137. {
  138. WriteControl(polymerBatching.plcData[good.Key - 1].StartUpVar, true);
  139. Thread.Sleep(3000);//写入PLC开启通道后 PLC会先把完成信号置0,等待出料完成后置1
  140. while(!morkMoc.OutMaterailCompelete)//接收到完成信号后退出循环
  141. {
  142. Thread.Sleep(1000);
  143. //需要加入超时提示或处理
  144. }
  145. DeviceProcessLogShow($"{good.Key}号通道出料完成");
  146. }
  147. }
  148. public override void ReadData()
  149. {
  150. GetStatus("M10.0", new Action<object>((obj) =>
  151. {
  152. if (obj is bool[] bools && bools.Length > 0 )
  153. {
  154. morkMoc.OutMaterailCompelete = bools[0];
  155. }
  156. }));
  157. }
  158. public override void ResetProgram()
  159. {
  160. throw new NotImplementedException();
  161. }
  162. public override void SimOrder()
  163. {
  164. throw new NotImplementedException();
  165. }
  166. public override void Stop()
  167. {
  168. throw new NotImplementedException();
  169. }
  170. private void GetStatus(string key, Action<object> action)
  171. {
  172. if (peripheralStatus.ContainsKey(key))
  173. {
  174. if (peripheralStatus[key] != null)
  175. {
  176. action?.Invoke(peripheralStatus[key]);
  177. }
  178. }
  179. }
  180. }
  181. }