车间出入口.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using DBHelper;
  2. using System;
  3. using System.Linq;
  4. using WCS.Core;
  5. using WCS.Entity;
  6. using WCS.Entity.Protocol;
  7. using WCS.Service.Helpers;
  8. namespace WCS.Service.Works.Stations
  9. {
  10. //[WorkTitle(typeof(ProductHandler), "车间扫码",true)]
  11. internal class 车间扫码 : DeviceWork<Device<IStation521, IStation520>>
  12. {
  13. protected override bool SelectDevice(WCS_DEVICE dev)
  14. {
  15. return false;// dev.CODE=="2122";
  16. }
  17. protected override void Do(Device<IStation521, IStation520> dev)
  18. {
  19. ScannIn(dev);
  20. }
  21. private void ScannIn(Device<IStation521, IStation520> dev)
  22. {
  23. Ltc.Log("扫码入库");
  24. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  25. {
  26. return;
  27. }
  28. if (Ltc.Do(dev, v => !v.Data.REQUEST))
  29. return;
  30. var bcr = dev.Entity.BCR();
  31. var barcode = bcr.CONTENT.Trim('\r');
  32. if (barcode == "")
  33. {
  34. throw new Exception("扫码失败");
  35. }
  36. var addr = barcode == "" ? 2161 : 2153;
  37. var next = dev.Entity.GetNext(addr.ToString());
  38. if (next == null)
  39. return;
  40. //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(10000, "车间扫码")))
  41. // return;
  42. var workShop = dev.Entity.WorkShop();
  43. var info = WMS.GetProductInfo(barcode, dev.Entity.CODE);
  44. if (workShop > 0 && workShop < 4)
  45. {
  46. addr = info.IsLeft == 1 ? 2161 : 2153;
  47. }
  48. var station = dev.Entity.CODE;
  49. var height = (short)(info.Height > 1.4m ? 2 : 1);
  50. DB.Do(db =>
  51. {
  52. var arr = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status == AGVTaskStatus.完成)
  53. .Where(v => v.Station == station).ToArray();
  54. foreach (var t in arr)
  55. {
  56. t.Status = AGVTaskStatus.完成扫码;
  57. t.UpdateTime = DateTime.Now;
  58. }
  59. db.Default.SaveChanges();
  60. var task = new WCS_TASK();
  61. task.BARCODE = info.BarCode;
  62. task.TYPE = TaskType.组盘;
  63. task.STATUS = info.IsLeft == 1 ? WCS.Entity.TaskStatus.已完成 : WCS.Entity.TaskStatus.执行中;
  64. task.ADDRFROM = dev.Entity.CODE;
  65. task.ADDRTO = addr.ToString();
  66. task.STARTTIME = DateTime.Now;
  67. task.PALLETTYPE = info.ChildContainerType;
  68. task.UPDATEUSER = "WCS";
  69. task.UPDATETIME = DateTime.Now;
  70. task.PRODLINE = info.ProLine;
  71. task.FULLQTY = info.LoadCount;
  72. task.FLOOR = 2;
  73. task.HEIGHT = height;
  74. task.DOCID = info.DocId;
  75. //task.ADDRCURRENT = dev.Entity.CODE;
  76. task.ADDRNEXT = next.CODE;
  77. db.Default.Set<WCS_TASK>().Add(task);
  78. db.Default.SaveChanges();
  79. dev.Data2.TASKNUM = task.ID;
  80. dev.Data2.GOODSEND = next.Code();
  81. dev.Data2.CONFIRM = true;
  82. });
  83. }
  84. }
  85. [WorkTitle(typeof(ProductHandler), "原膜自动扫码", true)]
  86. internal class 原膜自动扫码 : DeviceWork<Device<IStation521, IStation520>>
  87. {
  88. protected override bool SelectDevice(WCS_DEVICE dev)
  89. {
  90. return new string[] { "2088" }.Contains(dev.CODE);
  91. }
  92. protected override void Do(Device<IStation521, IStation520> dev)
  93. {
  94. if (!SystemConfigHelpers.GetDeviceConfig(dev.Entity.CODE)) throw new Exception($"已禁止[{dev.Entity.CODE}]入库,请联系机修确认");
  95. Ltc.Log("扫码入库");
  96. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) throw new Exception($"设备[{dev.Entity.CODE}]确认信号未清除,请检查PLC中上一个任务是否完成状态异常");
  97. if (Ltc.Do(dev, v => !v.Data.REQUEST)) return;
  98. var bcr = dev.Entity.BCR();
  99. var barcode = bcr.CONTENT.Trim('\r');
  100. if (barcode == "")
  101. {
  102. throw new Exception("扫码失败");
  103. }
  104. var addr = 2017;
  105. var next = dev.Entity.GetNext(addr.ToString());
  106. if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置");
  107. var workShop = dev.Entity.WorkShop();
  108. var info = WMS.InBound(barcode, dev.Entity.CODE);
  109. var station = dev.Entity.CODE;
  110. DB.Do(db =>
  111. {
  112. var rgv = Device.Find("RGV5").Device<IRGV521, IRGV520>();
  113. if (rgv.Data2.Trigger == 1) throw new Exception($"等待WCS与RGV5交互完成,[{dev.Entity.CODE}]");
  114. var outqty = (rgv.Data.DestPosition == 2081 && rgv.Data.SystemStatus != RGVRunStatus.空闲) ? 1 : 0;
  115. outqty += Device.Where(v => "2325,2081,2083".Split(',').Contains(v.CODE)).Select(v => v.Device<IStation521, IStation520>())
  116. .Where(v => v.Data.GOODSEND == 2086 || (v.Data2.GOODSEND == 2086 && v.Data2.CONFIRM))
  117. .Count();
  118. if (outqty > 0) throw new Exception($"交通管制,正在执行出库,[{dev.Entity.CODE}]");
  119. var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库).Where(v => v.Station == station)
  120. .Where(v => (v.Status == AGVTaskStatus.取放完成 && v.AGVStatus == AGVTaskStatus.请求_允许2) || v.Status == AGVTaskStatus.完成).Any();
  121. if (!flag && !dev.Data.RES1) throw new Exception($"[{dev.Entity.CODE}]已扫码等待AGV交互完成");
  122. var arr = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status == AGVTaskStatus.完成)
  123. .Where(v => v.Station == station).ToArray();
  124. foreach (var t1 in arr)
  125. {
  126. t1.Status = AGVTaskStatus.完成扫码;
  127. t1.UpdateTime = DateTime.Now;
  128. }
  129. db.Default.SaveChanges();
  130. var task = new WCS_TASK();
  131. task.BARCODE = info.ContainerCode;
  132. task.TYPE = TaskType.入库;
  133. task.STATUS = WCS.Entity.TaskStatus.执行中;
  134. task.ADDRFROM = dev.Entity.CODE;
  135. task.ADDRTO = addr.ToString();
  136. task.STARTTIME = DateTime.Now;
  137. task.UPDATEUSER = "WCS";
  138. task.UPDATETIME = DateTime.Now;
  139. task.WMSTASK = int.Parse(info.WMSTaskNum);
  140. task.ADDRNEXT = next.CODE;
  141. db.Default.Set<WCS_TASK>().Add(task);
  142. db.Default.SaveChanges();
  143. dev.Data2.TASKNUM = task.ID;
  144. dev.Data2.GOODSEND = next.Code();
  145. dev.Data2.CONFIRM = true;
  146. });
  147. }
  148. }
  149. [WorkTitle(typeof(ProductHandler), "原膜人工扫码", true)]
  150. internal class 原膜人工扫码 : DeviceWork<Device<IStation521, IStation520>>
  151. {
  152. protected override bool SelectDevice(WCS_DEVICE dev)
  153. {
  154. return new string[] { "2008", "2012", "2305" }.Contains(dev.CODE);
  155. }
  156. protected override void Do(Device<IStation521, IStation520> dev)
  157. {
  158. if (!SystemConfigHelpers.GetDeviceConfig(dev.Entity.CODE)) throw new Exception($"已禁止[{dev.Entity.CODE}]入库,请联系机修确认");
  159. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) throw new Exception($"设备[{dev.Entity.CODE}]确认信号未清除,请检查PLC中上一个任务是否完成状态异常");
  160. if (Ltc.Do(dev, v => !v.Data.REQUEST)) return;
  161. var addr = 2017;
  162. var next = dev.Entity.GetNext(addr.ToString());
  163. if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置");
  164. var workShop = dev.Entity.WorkShop();
  165. //var info = WMS.GetProductInfo(barcode);
  166. DB.Do(db =>
  167. {
  168. var task = db.Default.Set<WCS_TASK>().Where(v => v.ADDRFROM == dev.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.新建 && v.TYPE == TaskType.入库).FirstOrDefault();
  169. if (task == null) throw new Exception($"设备[{dev.Entity.CODE}]上产品无任务信息");
  170. task.STATUS = WCS.Entity.TaskStatus.执行中;
  171. task.ADDRTO = addr.ToString();
  172. task.STARTTIME = DateTime.Now;
  173. //task.ADDRCURRENT = dev.Entity.CODE;
  174. task.UPDATETIME = DateTime.Now;
  175. task.UPDATEUSER = "WCS";
  176. task.ADDRNEXT = next.CODE;
  177. db.Default.SaveChanges();
  178. if (dev.Entity.CODE == "2305") WMS.GetWeight(task.WMSTASK, dev.Data.GOODSCODE / 10, dev.Entity.CODE);
  179. dev.Data2.TASKNUM = task.ID;
  180. dev.Data2.GOODSEND = next.Code();
  181. dev.Data2.CONFIRM = true;
  182. });
  183. }
  184. }
  185. [WorkTitle(typeof(ProductHandler), "直径检测", true)]
  186. internal class 直径检测 : DeviceWork<Device<IStation521, IStation520>>
  187. {
  188. protected override bool SelectDevice(WCS_DEVICE dev)
  189. {
  190. return new string[] { "2083", "2014", "2010", "2003" }.Contains(dev.CODE);
  191. }
  192. protected override void Do(Device<IStation521, IStation520> dev)
  193. {
  194. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  195. {
  196. return;
  197. }
  198. if (Ltc.Do(dev, v => v.Data.TASKNUM == 0))
  199. return;
  200. if (Ltc.Do(dev, v => !v.Data.REQUEST))
  201. return;
  202. var taskid = dev.Data.TASKNUM;
  203. var addr = 2017;
  204. var next = dev.Entity.GetNext(addr.ToString());
  205. if (next == null)
  206. return;
  207. var workShop = dev.Entity.WorkShop();
  208. //var info = WMS.GetProductInfo(barcode);
  209. DB.Do(db =>
  210. {
  211. var task = db.Default.Set<WCS_TASK>().Find(taskid);
  212. if (task == null)
  213. {
  214. throw new Exception("未创建入库任务");
  215. }
  216. WMS.UpdateTask(task.WMSTASK, (int)task.STATUS, task.ADDRNEXT, dev.Data.HEIGHT);
  217. var end = dev.Data.GOODSEND;
  218. if (dev.Data.HEIGHT == 4 || dev.Data.HEIGHT == 8)
  219. {
  220. if (dev.Entity.CODE == "2083")
  221. end = 2086;
  222. else if (dev.Entity.CODE == "2003")
  223. end = 2308;
  224. else
  225. end = short.Parse(task.ADDRFROM);
  226. task.STATUS = WCS.Entity.TaskStatus.已取消;
  227. task.UPDATETIME = DateTime.Now;
  228. db.Default.SaveChanges();
  229. }
  230. dev.Data2.TASKNUM = task.ID;
  231. dev.Data2.GOODSEND = end;
  232. dev.Data2.CONFIRM = true;
  233. });
  234. }
  235. }
  236. }