RGVWork.cs 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  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.Extensions;
  8. using WCS.Service.Helpers;
  9. namespace WCS.Service.Works
  10. {
  11. [WorkTitle(typeof(ProductHandler), "穿梭车", true)]
  12. public class RGVWork : DeviceWork<Device<IRGV521, IRGV520, IRGV523>>
  13. {
  14. protected override void Do(Device<IRGV521, IRGV520, IRGV523> dev)
  15. {
  16. if (dev.Data3.Fault != 0)
  17. {
  18. if (dev.Entity.WakeupOn(5000))
  19. {
  20. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  21. }
  22. }
  23. if (Ltc.Do(dev, v => v.Data2.Trigger != 0))
  24. return;
  25. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动))
  26. return;
  27. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲))
  28. return;
  29. var startStations = Device.Where(v => v.ROUTES.Any(d => d.NEXT.CODE == dev.Entity.CODE))//.Where(v => v.CODE != "2323")
  30. .Select(v => v.Device<IStation521, IStation520>()).ToArray();
  31. startStations = Ltc.Do(startStations, (arr) => arr.Where(v => v.Data.GOODSEND > 0 && v.Data.PH_STATUS).ToArray());
  32. if (dev.Entity.CODE == "RGV1")
  33. startStations = Ltc.Do(startStations, (arr) => arr.Where(v => v.Data.GOODSEND > 0 && v.Data.PH_STATUS && !v.Data.REQUEST).ToArray());
  34. if (startStations.Length == 0)
  35. return;
  36. //startStations = Ltc.Do(startStations, dev, (arr, dev) => arr.Where(v => dev.Entity.ROUTES.Any(d => d.NEXT.CODE == v.Data.GOODSEND.ToString())).ToArray());
  37. //if (startStations.Length == 0)
  38. // return;
  39. startStations = Ltc.Do(startStations, arr => arr.Where(v => v.Data.GOODSEND.ToString() != v.Entity.CODE).ToArray());
  40. if (startStations.Length == 0)
  41. return;
  42. var endEmptys = startStations.Where(v =>
  43. {
  44. var end = Device.Find(v.Data.GOODSEND.ToString());
  45. var next = dev.Entity.GetNext(end.CODE).Device<IStation521>();
  46. var res = next.Data.TASKNUM == 0 && next.Data.PH_STATUS == false;
  47. if (res && end.CODE == "2324")
  48. {
  49. res = Device.Find("2071", "2072", "2073", "2074", "2075", "2076", "2077", "2078", "2079", "2017", "2019", "2022", "2024", "2029").Select(v => v.Device<IStation521>())
  50. .Count(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0) > 3;
  51. if (!res)
  52. {
  53. Configs.UploadException(end.CODE, "库前拥堵,RGV暂停入库");
  54. }
  55. }
  56. return res;
  57. }).ToArray();
  58. short taskType = 1;
  59. var st = Ltc.Do(endEmptys, arr => arr.OrderBy(v => v.Entity.CODE == "2182" || v.Entity.CODE == "2181" || v.Entity.CODE == "2081" || v.Entity.CODE == "2325" ? 1 : 2)
  60. .ThenBy(v => v.Data.GetUpdateTime())
  61. .FirstOrDefault());
  62. if (st == null)
  63. {
  64. st = startStations.OrderBy(v => v.Entity.CODE == "2182" || v.Entity.CODE == "2181" || v.Entity.CODE == "2081" || v.Entity.CODE == "2325" ? 1 : 2)
  65. .ThenBy(v => v.Data.GetUpdateTime())
  66. .FirstOrDefault();
  67. taskType = 3;
  68. }
  69. if (taskType == 3)
  70. {
  71. var target = st.Entity.Code();
  72. if (dev.Data.DestPosition != target)
  73. {
  74. dev.Data2.TaskType = taskType;
  75. dev.Data2.TaskID = 1;
  76. dev.Data2.StartPosition = 0;
  77. dev.Data2.DestPosition = short.Parse(st.Entity.CODE);
  78. dev.Data2.Trigger = 1;
  79. }
  80. }
  81. else
  82. {
  83. var next = dev.Entity.GetNext(st.Data.GOODSEND.ToString());
  84. if (next == null)
  85. return;
  86. DB.Do(db =>
  87. {
  88. var task = db.Default.Set<WCS_TASK>().Find(st.Data.TASKNUM);
  89. if (task != null)
  90. {
  91. if (next.CODE == task.ADDRTO)
  92. {
  93. //task.ADDRCURRENT = dev.Entity.CODE;
  94. task.UPDATETIME = DateTime.Now;
  95. db.Default.SaveChanges();
  96. }
  97. }
  98. dev.Data2.TaskType = taskType;
  99. dev.Data2.TaskID = st.Data.TASKNUM;
  100. dev.Data2.StartPosition = short.Parse(st.Entity.CODE);
  101. dev.Data2.DestPosition = next.Code();
  102. dev.Data2.Trigger = 1;
  103. task.CreateStatusLog(db, $"任务下发[{dev.Entity.CODE}]执行,起始地址[{st.Entity.CODE}],目标地址[{next.CODE}]");
  104. });
  105. }
  106. }
  107. protected override bool SelectDevice(WCS_DEVICE dev)
  108. {
  109. return dev.CODE is "RGV1" or "RGV2" or "RGV3" or "RGV5";
  110. }
  111. }
  112. [WorkTitle(typeof(ProductHandler), "双工位RGV", true)]
  113. public class 双工位RGV : DeviceWork<Device<IDRGV521, IDRGV520, IDRGV523>>
  114. {
  115. protected override void Do(Device<IDRGV521, IDRGV520, IDRGV523> dev)
  116. {
  117. if (dev.Entity.CODE == "RGV4")
  118. {
  119. if (dev.Data3.Fault != 0)
  120. {
  121. if (dev.Entity.WakeupOn(5000))
  122. {
  123. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  124. }
  125. }
  126. if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
  127. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  128. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  129. #region 放货任务
  130. //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
  131. if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
  132. {
  133. if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
  134. {
  135. if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
  136. //获取任务
  137. DB.Do(db =>
  138. {
  139. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
  140. });
  141. //TODO:放货站点有货检查
  142. dev.Data2.TaskID_1 = dev.Data.TaskID_1;
  143. dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
  144. dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
  145. dev.Data.RES = dev.Data2.StartPosition_1;
  146. dev.Data2.Trigger_1 = 1;
  147. }
  148. else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
  149. {
  150. if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
  151. //获取任务
  152. DB.Do(db =>
  153. {
  154. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
  155. });
  156. //TODO:放货站点有货检查
  157. dev.Data2.TaskID_2 = dev.Data.TaskID_2;
  158. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
  159. dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
  160. dev.Data.RES = dev.Data2.StartPosition_2;
  161. dev.Data2.Trigger_2 = 1;
  162. }
  163. }
  164. #endregion 放货任务
  165. var station_3046 = Device.Find("3046").Device<IStation521, IStation520>();
  166. if (station_3046.Data.PH_STATUS && station_3046.Data.GOODSEND == 3046 && station_3046.Data.TASKNUM > 10000)
  167. {
  168. var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
  169. var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  170. int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
  171. if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
  172. {
  173. DB.Do(db =>
  174. {
  175. var task = db.Default.Set<WCS_TASK>().Find(station_3046.Data.TASKNUM);
  176. if (task == null)
  177. throw new Exception($"任务号{station_3046.Data.TASKNUM}不存在");
  178. task.ADDRNEXT = station_2390.Entity.CODE;
  179. task.UPDATETIME = DateTime.Now;
  180. db.Default.SaveChanges();
  181. //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
  182. station_3046.Data2.GOODSEND = 2390;
  183. station_3046.Data2.CONFIRM = true;
  184. });
  185. }
  186. }
  187. #region 取货任务
  188. //获取所有需要取货的站台
  189. //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
  190. var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
  191. .Select(v => v.Device<IStation521, IStation520, IStation523>())
  192. .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
  193. .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
  194. {
  195. var code = v.Data.GOODSEND.ToString();
  196. switch (v.Data.GOODSEND)
  197. {
  198. case 2366: code = "2359"; break; //二车间
  199. case 2328: code = "2114"; break; //一车间
  200. case 2385: code = "2359"; break; //三车间
  201. };
  202. var end = Device.Find(code).Device<IStation521>();
  203. var res = true;
  204. if (end.Data.TASKNUM != 0) res = false;
  205. else if (end.Data.PH_STATUS) res = false;
  206. // RGV可以到达放货地址,此处判断取反
  207. else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
  208. else if (dev.Data.PH_Status_1) res = false;
  209. return res;
  210. });
  211. if (!validPickupPoints.Any()) return;//不需要取货
  212. Device<IStation521, IStation520, IStation523> validPickupPoint = null;
  213. //是否包含小车当前所在站点,写死,如有变动必须改代码
  214. //这一块的作用主要是用于解决小车就近取货问题
  215. #region RGV4
  216. if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
  217. else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
  218. else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
  219. else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
  220. #endregion RGV4
  221. //当前站点没有需要取货的
  222. if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
  223. var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
  224. if (validPickupPoint.Entity.CODE is "2108" or "2114" or "3040" or "3034") //一工位取货点
  225. {
  226. dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
  227. dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
  228. dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
  229. dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
  230. dev.Data2.Trigger_1 = 1;
  231. DB.Do(db =>
  232. {
  233. var task = db.Default.Set<WCS_TASK>().Find(validPickupPoint.Data.TASKNUM);
  234. if (task != null)
  235. task.CreateStatusLog(db,$"任务下发给[{dev.Entity.CODE}]执行,起始地址[{validPickupPoint.Entity.CODE}],目标地址[{next1.CODE}]");
  236. });
  237. }
  238. else if (validPickupPoint.Entity.CODE is "3046" or "3041" or "3033") //二工位取货点
  239. {
  240. dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
  241. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  242. dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
  243. dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
  244. dev.Data2.Trigger_2 = 1;
  245. DB.Do(db =>
  246. {
  247. var task = db.Default.Set<WCS_TASK>().Find(validPickupPoint.Data.TASKNUM);
  248. if (task != null)
  249. task.CreateStatusLog(db, $"任务下发给[{dev.Entity.CODE}]执行,起始地址[{validPickupPoint.Entity.CODE}],目标地址[{next1.CODE}]");
  250. });
  251. }
  252. #endregion 取货任务
  253. }
  254. else if(dev.Entity.CODE == "RGV6")
  255. {
  256. //正常与之前一样逻辑
  257. if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
  258. {
  259. if (dev.Data3.Fault != 0)
  260. {
  261. if (dev.Entity.WakeupOn(5000))
  262. {
  263. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  264. }
  265. }
  266. if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
  267. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  268. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  269. #region 放货任务
  270. //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
  271. if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
  272. {
  273. if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
  274. {
  275. if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
  276. string next = "";
  277. //获取任务
  278. DB.Do(db =>
  279. {
  280. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
  281. //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
  282. });
  283. //TODO:放货站点有货检查
  284. dev.Data2.TaskID_1 = dev.Data.TaskID_1;
  285. dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
  286. dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
  287. dev.Data.RES = dev.Data2.StartPosition_1;
  288. dev.Data2.Trigger_1 = 1;
  289. }
  290. else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
  291. {
  292. if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
  293. string next = "";
  294. //获取任务
  295. DB.Do(db =>
  296. {
  297. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
  298. //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
  299. });
  300. //TODO:放货站点有货检查
  301. dev.Data2.TaskID_2 = dev.Data.TaskID_2;
  302. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
  303. dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
  304. //dev.Data2.StartPosition_2 = Convert.ToInt16(next);
  305. dev.Data.RES = dev.Data2.StartPosition_2;
  306. dev.Data2.Trigger_2 = 1;
  307. }
  308. }
  309. #endregion 放货任务
  310. var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
  311. if (station_3033.Data.PH_STATUS && station_3033.Data.GOODSEND == 3033 && station_3033.Data.TASKNUM > 10000)
  312. {
  313. var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
  314. if (!station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0)
  315. {
  316. DB.Do(db =>
  317. {
  318. var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
  319. if (task == null)
  320. throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
  321. task.ADDRNEXT = station_3041.Entity.CODE;
  322. task.UPDATETIME = DateTime.Now;
  323. db.Default.SaveChanges();
  324. //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
  325. station_3033.Data2.GOODSEND = 3041;
  326. station_3033.Data2.CONFIRM = true;
  327. });
  328. }
  329. }
  330. var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
  331. if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
  332. {
  333. var station_3034 = Device.Find("3034").Device<IStation521, IStation520>();
  334. if (!station_3034.Data.PH_STATUS && station_3034.Data.TASKNUM == 0)
  335. {
  336. DB.Do(db =>
  337. {
  338. var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
  339. if (task == null)
  340. throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
  341. task.ADDRNEXT = station_3034.Entity.CODE;
  342. task.UPDATETIME = DateTime.Now;
  343. db.Default.SaveChanges();
  344. //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
  345. station_3040.Data2.GOODSEND = 3034;
  346. station_3040.Data2.CONFIRM = true;
  347. });
  348. }
  349. }
  350. #region 取货任务
  351. //获取所有需要取货的站台
  352. //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
  353. var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
  354. .Select(v => v.Device<IStation521, IStation520, IStation523>())
  355. .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
  356. .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
  357. {
  358. var code = v.Data.GOODSEND.ToString();
  359. var end = Device.Find(code).Device<IStation521>();
  360. var res = true;
  361. if (end.Data.TASKNUM != 0) res = false;
  362. else if (end.Data.PH_STATUS) res = false;
  363. // RGV可以到达放货地址,此处判断取反
  364. else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
  365. else if (dev.Data.PH_Status_1) res = false;
  366. return res;
  367. });
  368. if (!validPickupPoints.Any()) return;//不需要取货
  369. Device<IStation521, IStation520, IStation523> validPickupPoint = null;
  370. //是否包含小车当前所在站点,写死,如有变动必须改代码
  371. //这一块的作用主要是用于解决小车就近取货问题
  372. #region RGV4
  373. if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
  374. else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
  375. else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
  376. else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
  377. #endregion RGV4
  378. #region RGV6
  379. else if (dev.Data.RES is 3033 or 3034) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3033" or "3034");
  380. else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
  381. #endregion RGV6
  382. //当前站点没有需要取货的
  383. if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
  384. var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
  385. if (validPickupPoint.Entity.CODE is "3040" or "3034") //一工位取货点
  386. {
  387. dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
  388. dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
  389. dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
  390. dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
  391. dev.Data2.Trigger_1 = 1;
  392. DB.Do(db =>
  393. {
  394. var task = db.Default.Set<WCS_TASK>().Find(validPickupPoint.Data.TASKNUM);
  395. if (task != null)
  396. task.CreateStatusLog(db, $"任务下发给[{dev.Entity.CODE}]执行,起始地址[{validPickupPoint.Entity.CODE}],目标地址[{next1.CODE}]");
  397. });
  398. }
  399. else if (validPickupPoint.Entity.CODE is "3041" or "3033") //二工位取货点
  400. {
  401. dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
  402. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  403. dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
  404. dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
  405. dev.Data2.Trigger_2 = 1;
  406. DB.Do(db =>
  407. {
  408. var task = db.Default.Set<WCS_TASK>().Find(validPickupPoint.Data.TASKNUM);
  409. if (task != null)
  410. task.CreateStatusLog(db, $"任务下发给[{dev.Entity.CODE}]执行,起始地址[{validPickupPoint.Entity.CODE}],目标地址[{next1.CODE}]");
  411. });
  412. }
  413. #endregion 取货任务
  414. }
  415. else if(SystemConfigHelpers.GetDeviceIsUsed("RGV6"))
  416. {
  417. if (dev.Data3.Fault != 0)
  418. {
  419. if (dev.Entity.WakeupOn(5000))
  420. {
  421. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  422. }
  423. }
  424. if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
  425. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  426. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  427. if (Ltc.Do(dev, v => v.Data2.Trigger_2 != 0)) return;
  428. //执行任务之前优先处理缓存位上的任务 出:3028、3012 入:3019、3033
  429. //有入库的先执行入库,做出库要判断是否有入库
  430. var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
  431. var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
  432. var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
  433. var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
  434. var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
  435. var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
  436. var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
  437. var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
  438. var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
  439. //是否可以执行缓存位的出库任务
  440. bool doOut = true;
  441. DB.Do(db =>
  442. {
  443. var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  444. if (flag)
  445. {
  446. doOut = false;
  447. }
  448. var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
  449. if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
  450. });
  451. bool noPhstatus = Ltc.Do(dev, v => v.Data.PH_Status_2 == false);
  452. if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
  453. {
  454. if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0 && noPhstatus)
  455. {
  456. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  457. DB.Do(db =>
  458. {
  459. var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
  460. if (task == null)
  461. throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
  462. task.ADDRNEXT = "3041";
  463. task.UPDATETIME = DateTime.Now;
  464. db.Default.SaveChanges();
  465. });
  466. station_3033.Data2.GOODSEND = 3041;
  467. station_3033.Data2.CONFIRM = true;
  468. dev.Data2.TaskID_2 = station_3033.Data.TASKNUM;
  469. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  470. dev.Data2.StartPosition_2 = 3041;
  471. dev.Data2.DestPosition_2 = 3033;
  472. dev.Data2.Trigger_2 = 1;
  473. }
  474. else if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0 && noPhstatus)
  475. {
  476. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  477. DB.Do(db =>
  478. {
  479. var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
  480. if (task == null)
  481. throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
  482. task.ADDRNEXT = "3041";
  483. task.UPDATETIME = DateTime.Now;
  484. db.Default.SaveChanges();
  485. });
  486. station_3019.Data2.GOODSEND = 3041;
  487. station_3019.Data2.CONFIRM = true;
  488. dev.Data2.TaskID_2 = station_3019.Data.TASKNUM;
  489. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  490. dev.Data2.StartPosition_2 = 3041;
  491. dev.Data2.DestPosition_2 = 3019;
  492. dev.Data2.Trigger_2 = 1;
  493. }
  494. }
  495. else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
  496. {
  497. if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0 && noPhstatus)
  498. {
  499. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  500. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  501. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  502. {
  503. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  504. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  505. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  506. DB.Do(db =>
  507. {
  508. var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
  509. if (task == null)
  510. throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
  511. task.ADDRNEXT = "3060";
  512. task.UPDATETIME = DateTime.Now;
  513. db.Default.SaveChanges();
  514. //station.Data2.TASKNUM = station.Data.TASKNUM;
  515. station_3012.Data2.GOODSEND = 3060;
  516. station_3012.Data2.GOODSTYPE = 2;
  517. station_3012.Data2.CONFIRM = true;
  518. });
  519. }
  520. dev.Data2.TaskID_2 = station_3012.Data.TASKNUM;
  521. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  522. dev.Data2.StartPosition_2 = 3060;
  523. dev.Data2.DestPosition_2 = 3012;
  524. dev.Data2.Trigger_2 = 1;
  525. }
  526. else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0 && noPhstatus)
  527. {
  528. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  529. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  530. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  531. {
  532. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  533. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  534. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  535. DB.Do(db =>
  536. {
  537. var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
  538. if (task == null)
  539. throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
  540. task.ADDRNEXT = "3060";
  541. task.UPDATETIME = DateTime.Now;
  542. db.Default.SaveChanges();
  543. //station.Data2.TASKNUM = station.Data.TASKNUM;
  544. station_3028.Data2.GOODSEND = 3060;
  545. station_3028.Data2.GOODSTYPE = 2;
  546. station_3028.Data2.CONFIRM = true;
  547. });
  548. }
  549. dev.Data2.TaskID_2 = station_3028.Data.TASKNUM;
  550. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  551. dev.Data2.StartPosition_2 = 3060;
  552. dev.Data2.DestPosition_2 = 3028;
  553. dev.Data2.Trigger_2 = 1;
  554. }
  555. }
  556. #region 放货任务
  557. //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
  558. if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
  559. {
  560. if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
  561. {
  562. if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
  563. //获取任务
  564. DB.Do(db =>
  565. {
  566. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
  567. });
  568. //TODO:放货站点有货检查
  569. dev.Data2.TaskID_1 = dev.Data.TaskID_1;
  570. dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
  571. dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
  572. dev.Data.RES = dev.Data2.DestPosition_1;
  573. dev.Data2.Trigger_1 = 1;
  574. }
  575. else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
  576. {
  577. if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
  578. //获取任务
  579. DB.Do(db =>
  580. {
  581. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
  582. });
  583. //TODO:放货站点有货检查
  584. dev.Data2.TaskID_2 = dev.Data.TaskID_2;
  585. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
  586. dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
  587. dev.Data.RES = dev.Data2.DestPosition_2;
  588. dev.Data2.Trigger_2 = 1;
  589. }
  590. }
  591. #endregion 放货任务
  592. bool isOK = true;
  593. DB.Do(db =>
  594. {
  595. //判断是否可以分配RGV出库任务
  596. isOK = !db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status > AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  597. var inArr = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
  598. if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) isOK = false;
  599. });
  600. #region 取货任务
  601. if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSTYPE==1 && station_3060.Data.TASKNUM > 10000 && noPhstatus)
  602. {
  603. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  604. DB.Do(db =>
  605. {
  606. var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
  607. if (task == null)
  608. throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
  609. task.ADDRNEXT = "3041";
  610. task.ADDRTO = "2017";
  611. task.UPDATETIME = DateTime.Now;
  612. db.Default.SaveChanges();
  613. station_3060.Data2.GOODSEND = 3041;
  614. station_3060.Data2.GOODSTYPE = 1;
  615. station_3060.Data2.CONFIRM = true;
  616. });
  617. dev.Data2.TaskID_2 = station_3060.Data.TASKNUM;
  618. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  619. dev.Data2.StartPosition_2 = 3041;
  620. dev.Data2.DestPosition_2 = 3060;
  621. dev.Data2.Trigger_2 = 1;
  622. }
  623. else if (station_3040.Data.PH_STATUS && station_3040.Data.TASKNUM > 10000 && isOK && noPhstatus)
  624. {
  625. short outTemp = 3060;
  626. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  627. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  628. {
  629. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  630. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  631. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  632. DB.Do(db =>
  633. {
  634. var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
  635. if (task == null)
  636. throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
  637. task.ADDRNEXT = outTemp.ToString();
  638. task.UPDATETIME = DateTime.Now;
  639. db.Default.SaveChanges();
  640. station_3040.Data2.GOODSEND = outTemp;
  641. station_3040.Data2.GOODSTYPE = 2;
  642. station_3040.Data2.CONFIRM = true;
  643. });
  644. dev.Data2.TaskID_2 = station_3040.Data.TASKNUM;
  645. dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
  646. dev.Data2.StartPosition_2 = 3060;
  647. dev.Data2.DestPosition_2 = 3040;
  648. dev.Data2.Trigger_2 = 1;
  649. }
  650. }
  651. #endregion
  652. }
  653. }
  654. }
  655. protected override bool SelectDevice(WCS_DEVICE dev)
  656. {
  657. return dev.CODE is "RGV4" or "RGV6";
  658. }
  659. }
  660. [WorkTitle(typeof(ProductHandler), "连廊单工位RGV", true)]
  661. public class 连廊RGV : DeviceWork<Device<IRGV521, IRGV520, IRGV523>>
  662. {
  663. protected override void Do(Device<IRGV521, IRGV520, IRGV523> dev)
  664. {
  665. //没有RGV故障
  666. if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
  667. {
  668. if (dev.Data3.Fault != 0)
  669. {
  670. if (dev.Entity.WakeupOn(5000))
  671. {
  672. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  673. }
  674. }
  675. if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
  676. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  677. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  678. //分配目标地址
  679. var station = Device.Find("3012").Device<IStation521, IStation520>();
  680. var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
  681. var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
  682. var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
  683. if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
  684. {
  685. var station_3013 = Device.Find("3013").Device<IStation521, IStation520>();
  686. if (!station_3013.Data.PH_STATUS && station_3013.Data.TASKNUM == 0)
  687. {
  688. DB.Do(db =>
  689. {
  690. var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
  691. if (task == null)
  692. throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
  693. if (task.TYPE == TaskType.出库) return;
  694. task.ADDRNEXT = station_3060.Entity.CODE;
  695. task.ADDRTO = "2017";
  696. task.UPDATETIME = DateTime.Now;
  697. db.Default.SaveChanges();
  698. station_3060.Data2.GOODSEND = 3013;
  699. station_3060.Data2.CONFIRM = true;
  700. });
  701. }
  702. }
  703. if (station.Data.PH_STATUS && station.Data.GOODSEND == 3012 && station.Data.TASKNUM > 10000)
  704. {
  705. short outTemp = 3060;
  706. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  707. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  708. {
  709. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  710. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  711. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  712. DB.Do(db =>
  713. {
  714. var task = db.Default.Set<WCS_TASK>().Find(station.Data.TASKNUM);
  715. if (task == null)
  716. throw new Exception($"任务号{station.Data.TASKNUM}不存在");
  717. task.ADDRNEXT = outTemp.ToString();
  718. task.UPDATETIME = DateTime.Now;
  719. db.Default.SaveChanges();
  720. //station.Data2.TASKNUM = station.Data.TASKNUM;
  721. station.Data2.GOODSEND = outTemp;
  722. station.Data2.GOODSTYPE = 2;
  723. station.Data2.CONFIRM = true;
  724. });
  725. }
  726. }
  727. if (station_3028.Data.PH_STATUS && station_3028.Data.GOODSEND == 3028 && station_3028.Data.TASKNUM > 10000)
  728. {
  729. var station_3020 = Device.Find("3020").Device<IStation521, IStation520>();
  730. if (!station_3020.Data.PH_STATUS && station_3020.Data.TASKNUM == 0)
  731. {
  732. DB.Do(db =>
  733. {
  734. var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
  735. if (task == null)
  736. throw new Exception($"任务号{station.Data.TASKNUM}不存在");
  737. task.ADDRNEXT = station_3020.Entity.CODE;
  738. task.UPDATETIME = DateTime.Now;
  739. db.Default.SaveChanges();
  740. //station_3028.Data2.TASKNUM = station.Data.TASKNUM;
  741. station_3028.Data2.GOODSEND = 3020;
  742. station_3028.Data2.CONFIRM = true;
  743. });
  744. }
  745. }
  746. if (station_3019.Data.PH_STATUS && station_3019.Data.GOODSEND == 3019 && station_3019.Data.TASKNUM > 10000)
  747. {
  748. var station_3029 = Device.Find("3029").Device<IStation521, IStation520>();
  749. if (!station_3029.Data.PH_STATUS && station_3029.Data.TASKNUM == 0)
  750. {
  751. DB.Do(db =>
  752. {
  753. var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
  754. if (task == null)
  755. throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
  756. task.ADDRNEXT = station_3029.Entity.CODE;
  757. task.UPDATETIME = DateTime.Now;
  758. db.Default.SaveChanges();
  759. //station_3019.Data2.TASKNUM = station.Data.TASKNUM;
  760. station_3019.Data2.GOODSEND = 3029;
  761. station_3019.Data2.CONFIRM = true;
  762. });
  763. }
  764. }
  765. bool agvTaks = false;
  766. if (dev.Entity.CODE == "RGV8")
  767. {
  768. DB.Do(db =>
  769. {
  770. agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  771. var station_3060 = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
  772. if (station_3060.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) agvTaks = false;
  773. });
  774. };
  775. //获取所有需要取货的站台
  776. //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
  777. var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
  778. .Select(v => v.Device<IStation521, IStation520, IStation523>())
  779. .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
  780. .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
  781. {
  782. var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
  783. var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
  784. if (v.Entity.CODE == "3012")
  785. {
  786. if (agvTaks) res = false;
  787. }
  788. return res;
  789. });
  790. if (!validPickupPoints.Any()) return;//不需要取货
  791. var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
  792. if (validPickupPoint.Data.GOODSEND != 3005)
  793. {
  794. dev.Data2.TaskID = validPickupPoint.Data.TASKNUM;
  795. dev.Data2.StartPosition = Convert.ToInt16(validPickupPoint.Entity.CODE);
  796. dev.Data2.DestPosition = validPickupPoint.Data.GOODSEND;
  797. dev.Data2.Trigger = 1;
  798. DB.Do(db =>
  799. {
  800. var task = db.Default.Set<WCS_TASK>().Find(validPickupPoint.Data.TASKNUM);
  801. if (task != null)
  802. task.CreateStatusLog(db, $"任务下发给[{dev.Entity.CODE}]执行,起始地址[{validPickupPoint.Entity.CODE}],目标地址[{validPickupPoint.Data.GOODSEND}]");
  803. });
  804. }
  805. }
  806. else if (SystemConfigHelpers.GetDeviceIsUsed("RGV7") && dev.Entity.CODE == "RGV7")
  807. {
  808. if (dev.Data3.Fault != 0)
  809. {
  810. if (dev.Entity.WakeupOn(5000))
  811. {
  812. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  813. }
  814. }
  815. if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
  816. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  817. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  818. //执行任务之前优先处理缓存位上的任务 出:3028、3012 入:3019、3033
  819. //有入库的先执行入库,做出库要判断是否有入库
  820. var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
  821. var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
  822. var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
  823. var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
  824. var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
  825. var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
  826. var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
  827. var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
  828. var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
  829. //是否可以执行缓存位的出库任务
  830. bool doOut = true;
  831. DB.Do(db =>
  832. {
  833. var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  834. if (flag)
  835. {
  836. doOut = false;
  837. }
  838. var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
  839. if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
  840. });
  841. bool noPhstatus = Ltc.Do(dev, v => v.Data.PH_Status == false);
  842. if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
  843. {
  844. if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0 && noPhstatus)
  845. {
  846. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  847. DB.Do(db =>
  848. {
  849. var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
  850. if (task == null)
  851. throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
  852. task.ADDRNEXT = "3041";
  853. task.UPDATETIME = DateTime.Now;
  854. db.Default.SaveChanges();
  855. });
  856. station_3019.Data2.GOODSEND = 3041;
  857. station_3019.Data2.CONFIRM = true;
  858. dev.Data2.TaskID = station_3019.Data.TASKNUM;
  859. dev.Data2.StartPosition = 3019;
  860. dev.Data2.DestPosition = 3041;
  861. dev.Data2.Trigger = 1;
  862. }
  863. else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0 && noPhstatus)
  864. {
  865. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  866. DB.Do(db =>
  867. {
  868. var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
  869. if (task == null)
  870. throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
  871. task.ADDRNEXT = "3041";
  872. task.UPDATETIME = DateTime.Now;
  873. db.Default.SaveChanges();
  874. });
  875. station_3033.Data2.GOODSEND = 3041;
  876. station_3033.Data2.CONFIRM = true;
  877. dev.Data2.TaskID = station_3033.Data.TASKNUM;
  878. dev.Data2.StartPosition = 3033;
  879. dev.Data2.DestPosition = 3041;
  880. dev.Data2.Trigger = 1;
  881. }
  882. }
  883. else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
  884. {
  885. if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0 && noPhstatus)
  886. {
  887. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  888. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  889. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  890. {
  891. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  892. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  893. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  894. DB.Do(db =>
  895. {
  896. var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
  897. if (task == null)
  898. throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
  899. task.ADDRNEXT = "3060";
  900. task.UPDATETIME = DateTime.Now;
  901. db.Default.SaveChanges();
  902. //station.Data2.TASKNUM = station.Data.TASKNUM;
  903. station_3012.Data2.GOODSEND = 3060;
  904. station_3012.Data2.GOODSTYPE = 2;
  905. station_3012.Data2.CONFIRM = true;
  906. });
  907. }
  908. dev.Data2.TaskID = station_3012.Data.TASKNUM;
  909. dev.Data2.StartPosition = 3012;
  910. dev.Data2.DestPosition = 3060;
  911. dev.Data2.Trigger = 1;
  912. }
  913. else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0 && noPhstatus)
  914. {
  915. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  916. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  917. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  918. {
  919. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  920. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  921. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  922. DB.Do(db =>
  923. {
  924. var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
  925. if (task == null)
  926. throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
  927. task.ADDRNEXT = "3060";
  928. task.UPDATETIME = DateTime.Now;
  929. db.Default.SaveChanges();
  930. //station.Data2.TASKNUM = station.Data.TASKNUM;
  931. station_3028.Data2.GOODSEND = 3060;
  932. station_3028.Data2.GOODSTYPE = 2;
  933. station_3028.Data2.CONFIRM = true;
  934. });
  935. }
  936. dev.Data2.TaskID = station_3028.Data.TASKNUM;
  937. dev.Data2.StartPosition = 3028;
  938. dev.Data2.DestPosition = 3060;
  939. dev.Data2.Trigger = 1;
  940. }
  941. }
  942. bool isOK = false;
  943. DB.Do(db =>
  944. {
  945. //判断是否可以分配RGV出库任务
  946. var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
  947. bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  948. if (falg)
  949. {
  950. isOK = false;
  951. }
  952. else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
  953. {
  954. isOK = false;
  955. }
  956. else
  957. {
  958. isOK = true;
  959. }
  960. });
  961. if (station_3060.Data.PH_STATUS && (station_3060.Data.GOODSEND == 3060 || station_3060.Data.GOODSEND == 3013)&& station_3060.Data.TASKNUM > 10000 && noPhstatus)
  962. {
  963. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  964. DB.Do(db =>
  965. {
  966. var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
  967. if (task == null)
  968. throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
  969. else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
  970. task.ADDRNEXT = "3041";
  971. task.ADDRTO = "2017";
  972. task.UPDATETIME = DateTime.Now;
  973. db.Default.SaveChanges();
  974. station_3060.Data2.GOODSEND = 3041;
  975. station_3060.Data2.GOODSTYPE = 1;
  976. station_3060.Data2.CONFIRM = true;
  977. });
  978. dev.Data2.TaskID = station_3060.Data.TASKNUM;
  979. dev.Data2.StartPosition = 3060;
  980. dev.Data2.DestPosition = 3041;
  981. dev.Data2.Trigger = 1;
  982. }
  983. else if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.TASKNUM > 10000 && noPhstatus)
  984. {
  985. short outTemp = 3060;
  986. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  987. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  988. {
  989. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  990. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  991. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  992. DB.Do(db =>
  993. {
  994. var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
  995. if (task == null)
  996. throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
  997. task.ADDRNEXT = outTemp.ToString();
  998. task.UPDATETIME = DateTime.Now;
  999. db.Default.SaveChanges();
  1000. station_3040.Data2.GOODSEND = outTemp;
  1001. station_3040.Data2.GOODSTYPE = 2;
  1002. station_3040.Data2.CONFIRM = true;
  1003. });
  1004. dev.Data2.TaskID = station_3040.Data.TASKNUM;
  1005. dev.Data2.StartPosition = 3040;
  1006. dev.Data2.DestPosition = 3060;
  1007. dev.Data2.Trigger = 1;
  1008. }
  1009. }
  1010. }
  1011. else if (SystemConfigHelpers.GetDeviceIsUsed("RGV8") && dev.Entity.CODE == "RGV8")
  1012. {
  1013. if (dev.Data3.Fault != 0)
  1014. {
  1015. if (dev.Entity.WakeupOn(5000))
  1016. {
  1017. WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
  1018. }
  1019. }
  1020. if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
  1021. if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
  1022. if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
  1023. //执行任务之前先处理缓存位上的任务 出:3028、3012 入:3019、3033
  1024. //有入库的先执行入库,做出库要判断是否有入库
  1025. var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
  1026. var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
  1027. var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
  1028. var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
  1029. var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
  1030. var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
  1031. var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
  1032. var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
  1033. var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
  1034. //是否可以执行缓存位的出库任务
  1035. bool doOut = true;
  1036. DB.Do(db =>
  1037. {
  1038. var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  1039. if (flag)
  1040. {
  1041. doOut = false;
  1042. }
  1043. var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
  1044. if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
  1045. });
  1046. bool noPhstatus = Ltc.Do(dev, v => v.Data.PH_Status == false);
  1047. if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
  1048. {
  1049. if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0 && noPhstatus)
  1050. {
  1051. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  1052. DB.Do(db =>
  1053. {
  1054. var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
  1055. if (task == null)
  1056. throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
  1057. task.ADDRNEXT = "3041";
  1058. task.UPDATETIME = DateTime.Now;
  1059. db.Default.SaveChanges();
  1060. });
  1061. station_3019.Data2.GOODSEND = 3041;
  1062. station_3019.Data2.CONFIRM = true;
  1063. dev.Data2.TaskID = station_3019.Data.TASKNUM;
  1064. dev.Data2.StartPosition = 3019;
  1065. dev.Data2.DestPosition = 3041;
  1066. dev.Data2.Trigger = 1;
  1067. }
  1068. else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0 && noPhstatus)
  1069. {
  1070. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  1071. DB.Do(db =>
  1072. {
  1073. var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
  1074. if (task == null)
  1075. throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
  1076. task.ADDRNEXT = "3041";
  1077. task.UPDATETIME = DateTime.Now;
  1078. db.Default.SaveChanges();
  1079. });
  1080. station_3033.Data2.GOODSEND = 3041;
  1081. station_3033.Data2.CONFIRM = true;
  1082. dev.Data2.TaskID = station_3033.Data.TASKNUM;
  1083. dev.Data2.StartPosition = 3033;
  1084. dev.Data2.DestPosition = 3041;
  1085. dev.Data2.Trigger = 1;
  1086. }
  1087. }
  1088. else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 ) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
  1089. {
  1090. if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0 && noPhstatus)
  1091. {
  1092. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  1093. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  1094. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  1095. {
  1096. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  1097. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  1098. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  1099. DB.Do(db =>
  1100. {
  1101. var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
  1102. if (task == null)
  1103. throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
  1104. task.ADDRNEXT = "3060";
  1105. task.UPDATETIME = DateTime.Now;
  1106. db.Default.SaveChanges();
  1107. //station.Data2.TASKNUM = station.Data.TASKNUM;
  1108. station_3012.Data2.GOODSEND = 3060;
  1109. station_3012.Data2.GOODSTYPE = 2;
  1110. station_3012.Data2.CONFIRM = true;
  1111. });
  1112. }
  1113. dev.Data2.TaskID = station_3012.Data.TASKNUM;
  1114. dev.Data2.StartPosition = 3012;
  1115. dev.Data2.DestPosition = 3060;
  1116. dev.Data2.Trigger = 1;
  1117. }
  1118. else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0 && noPhstatus)
  1119. {
  1120. if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
  1121. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  1122. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  1123. {
  1124. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  1125. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  1126. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  1127. DB.Do(db =>
  1128. {
  1129. var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
  1130. if (task == null)
  1131. throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
  1132. task.ADDRNEXT = "3060";
  1133. task.UPDATETIME = DateTime.Now;
  1134. db.Default.SaveChanges();
  1135. //station.Data2.TASKNUM = station.Data.TASKNUM;
  1136. station_3028.Data2.GOODSEND = 3060;
  1137. station_3028.Data2.GOODSTYPE = 2;
  1138. station_3028.Data2.CONFIRM = true;
  1139. });
  1140. }
  1141. dev.Data2.TaskID = station_3028.Data.TASKNUM;
  1142. dev.Data2.StartPosition = 3028;
  1143. dev.Data2.DestPosition = 3060;
  1144. dev.Data2.Trigger = 1;
  1145. }
  1146. }
  1147. bool isOK = false;
  1148. DB.Do(db =>
  1149. {
  1150. //判断是否可以分配RGV出库任务
  1151. var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
  1152. bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
  1153. if (falg)
  1154. {
  1155. isOK = false;
  1156. }
  1157. else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
  1158. {
  1159. isOK = false;
  1160. }
  1161. else
  1162. {
  1163. isOK = true;
  1164. }
  1165. });
  1166. if (station_3060.Data.PH_STATUS && (station_3060.Data.GOODSEND == 3060 || station_3060.Data.GOODSEND == 3013) && station_3060.Data.TASKNUM > 10000 && noPhstatus)
  1167. {
  1168. if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
  1169. DB.Do(db =>
  1170. {
  1171. var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
  1172. if (task == null)
  1173. throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
  1174. else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
  1175. task.ADDRNEXT = "3041";
  1176. task.ADDRTO = "2017";
  1177. task.UPDATETIME = DateTime.Now;
  1178. db.Default.SaveChanges();
  1179. });
  1180. station_3060.Data2.GOODSEND = 3041;
  1181. station_3060.Data2.GOODSTYPE = 1;
  1182. station_3060.Data2.CONFIRM = true;
  1183. dev.Data2.TaskID = station_3060.Data.TASKNUM;
  1184. dev.Data2.StartPosition = 3060;
  1185. dev.Data2.DestPosition = 3041;
  1186. dev.Data2.Trigger = 1;
  1187. }
  1188. else if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.TASKNUM > 10000 && noPhstatus)
  1189. {
  1190. short outTemp = 3060;
  1191. var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
  1192. if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
  1193. {
  1194. if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
  1195. if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
  1196. if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
  1197. DB.Do(db =>
  1198. {
  1199. var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
  1200. if (task == null)
  1201. throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
  1202. task.ADDRNEXT = outTemp.ToString();
  1203. task.UPDATETIME = DateTime.Now;
  1204. db.Default.SaveChanges();
  1205. station_3040.Data2.GOODSEND = outTemp;
  1206. station_3040.Data2.GOODSTYPE = 2;
  1207. station_3040.Data2.CONFIRM = true;
  1208. });
  1209. dev.Data2.TaskID = station_3040.Data.TASKNUM;
  1210. dev.Data2.StartPosition = 3040;
  1211. dev.Data2.DestPosition = 3060;
  1212. dev.Data2.Trigger = 1;
  1213. }
  1214. }
  1215. }
  1216. }
  1217. protected override bool SelectDevice(WCS_DEVICE dev)
  1218. {
  1219. return dev.CODE is "RGV7" or "RGV8";
  1220. }
  1221. }
  1222. }