Base_Srm3.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using WCS.Data;
  8. using WCS.Data.Models;
  9. using WCS.Data.Utils;
  10. using WCS.PLC.Model.Equipment;
  11. namespace WCS.PLC
  12. {
  13. public class Base_Srm3 : Base_EquPlc
  14. {
  15. private int task_no_Last = 0;//上一次的任务号
  16. private readonly string SrmOutInInfo_in = "in";
  17. private readonly string SrmOutInInfo_out = "out";
  18. private readonly string SrmOutInInfo_outIn = "outIn";
  19. private readonly string WriteSrmSignalException = "520写入取放货信号失败";
  20. private readonly string WriteSrmTriggerException = "520写入触发信号失败";
  21. #region Properties
  22. /// <summary>
  23. /// 任务要执行的当前路由信息
  24. /// </summary>
  25. //protected WCS_EQUIPMENTROUTE CurrentRoute { get; set; }
  26. /// <summary>
  27. /// 堆垛机信号
  28. /// </summary>
  29. protected SrmSignal EquSignal
  30. {
  31. get
  32. {
  33. return WCS_PLCItem.WCS_EquipmentInfoSet[0].EquSignal_Srm;
  34. }
  35. }
  36. /// <summary>
  37. /// 写入DB名称
  38. /// </summary>
  39. protected int WriteDbName
  40. {
  41. get
  42. {
  43. return WCS_PLCItem.WCS_DBSet[0].DB_NAME;
  44. }
  45. }
  46. /// <summary>
  47. /// 堆垛机出入库口设置列表
  48. /// </summary>
  49. protected List<WCS_SrmOutInInfo> SrmOutInInfoSet = new List<WCS_SrmOutInInfo>();
  50. #endregion;
  51. #region Constructor
  52. public Base_Srm3() : base()
  53. {
  54. }
  55. #endregion;
  56. #region Method
  57. private int _locExecute = 0;
  58. public override void Run()
  59. {
  60. if (Interlocked.Exchange(ref _locExecute, 1) == 0)
  61. {
  62. try
  63. {
  64. //加载刷新堆垛机执行需要的最新参数设置
  65. Init_Refresh();
  66. //分配入库货位
  67. ThreadHelper.TaskThread(AssignInWareCell);
  68. if (WCS_PLCItem.IsConnSuccess == false) return;
  69. if (string.IsNullOrWhiteSpace(PlcName)) return;
  70. //完成任务
  71. SRMCompleteTask();
  72. //执行任务
  73. SRMStartExecuteTask();
  74. }
  75. catch (Exception ex)
  76. {
  77. string errormsg = string.Format("堆垛机[{0}]执行异常,消息:{1}", PlcName, ex.ToString());
  78. LogMessageHelper.RecordLogMessage(errormsg, ex);
  79. }
  80. finally
  81. {
  82. Interlocked.Exchange(ref _locExecute, 0);
  83. }
  84. }
  85. }
  86. /// <summary>
  87. /// 堆垛机任务完成
  88. /// </summary>
  89. protected virtual void SRMCompleteTask()
  90. {
  91. try
  92. {
  93. //当前任务完成
  94. if (EquSignal.DB521_Task_Finishi == false) return;
  95. //查询任务
  96. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_NO == EquSignal.DB521_Taskfinishi_ID);
  97. if (task == null) return;
  98. if (task.TASK_WKSTATUS >= 99) return;
  99. if ((task.TASK_COMTYPE == (int)ComTypeEnum.入库 && task.TASK_POSIDTO.Length > 5) || task.TASK_COMTYPE == (int)ComTypeEnum.移库)
  100. {
  101. //完成任务
  102. string result = TryCachHelper.TryTranExecute((db) =>
  103. {
  104. //修改任务的状态
  105. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  106. .Where(it => it.TASK_NO == task.TASK_NO)
  107. .ExecuteCommand();
  108. //添加修改明细
  109. string msg = string.Format("任务[{0}]完成", task.TASK_NO);
  110. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
  111. });
  112. if (string.IsNullOrWhiteSpace(result))
  113. {
  114. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库)
  115. {
  116. SrmConvNoMoveToLast(task.TASK_POSIDCUR);
  117. }
  118. }
  119. }
  120. else if (task.TASK_COMTYPE == (int)ComTypeEnum.出库 || task.TASK_COMTYPE == (int)ComTypeEnum.搬运)
  121. {
  122. if (task.TASK_WKSTATUS == (int)WkStatus.堆垛机执行)
  123. {
  124. //var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  125. //var routes = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_SRMNO).ToList();
  126. //var route = QueryOutEquRouteItem(task, routes);
  127. int wksstatus = 6;
  128. //if (route.ISEND)
  129. //{
  130. // wksstatus = 99;
  131. //}
  132. string result = TryCachHelper.TryTranExecute((db) =>
  133. {
  134. //修改任务的状态
  135. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = wksstatus, TASK_POSIDCUR = task.TASK_POSIDNEXT, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  136. .Where(it => it.TASK_NO == task.TASK_NO)
  137. .ExecuteCommand();
  138. //添加修改明细
  139. string msg = string.Format("任务[{0}]堆垛机完成,修改当前地址为[{1}]", task.TASK_NO, task.TASK_POSIDNEXT);
  140. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDNEXT, task.TASK_POSIDNEXT, msg);
  141. });
  142. if (string.IsNullOrWhiteSpace(result))
  143. {
  144. SrmConvNoMoveToLast(task.TASK_POSIDNEXT);
  145. }
  146. }
  147. }
  148. //TaskComplete(task.TASK_SRMNO, task.TASK_ID, task.TASK_COMTYPE);
  149. }
  150. catch (Exception ex)
  151. {
  152. LogMessageHelper.RecordLogMessage(ex);
  153. }
  154. }
  155. private void SRMStartExecuteTask()
  156. {
  157. //检测堆垛机模式
  158. if (EquSignal.DB521_Auto_status != (int)SrmModeEnum.远程) return;
  159. //检测堆垛机报警
  160. if (EquSignal.SrmDB541_Alarm) return;
  161. //检测堆垛机状态
  162. if (EquSignal.DB521_Srm_Status != (int)SrmStateFork1Enum.空闲) return;
  163. if (EquSignal.DB520_Task_trigger != 0) return;
  164. //检测堆垛机禁用
  165. //if (Current.SysSets.FirstOrDefault(v => v.SET_ID == SrmNo).SET_VALUE.Trim() == "1") return;
  166. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_SRMNO == PlcName && v.TASK_WKSTATUS == (int)WkStatus.堆垛机执行);
  167. if (task == null)
  168. {
  169. var taskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName &&
  170. ((v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage && v.TASK_WKSTATUS <= 1) ||
  171. (v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_InStorage && SrmOutInInfoSet.Any(t => v.TASK_POSIDCUR == t.SRMOUTIN_CONVNO)) ||
  172. (v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_StockTransfer && v.TASK_WKSTATUS <= 1) ||
  173. (v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_Carry && SrmOutInInfoSet.Any(t => v.TASK_POSIDCUR == t.SRMOUTIN_CONVNO)))).ToList();
  174. taskSet = taskSet.Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_StockTransfer && v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == PlcName).ToList();
  175. if (taskSet.Count() > 0)
  176. {
  177. //移库
  178. MoveStock(taskSet.First());
  179. }
  180. else
  181. {
  182. OutInStock(taskSet);
  183. //taskSet = taskSet.Where(v => v.TASK_WKSTATUS <= 2).ToList();
  184. //if (taskSet.Count > 0)
  185. //{
  186. // OutInStock(taskSet);
  187. //}
  188. }
  189. }
  190. else
  191. {
  192. Log4netHelper.Logger_Error.ErrorFormat(string.Format("堆垛机[{0}]状态正常,但是存在执行中的任务[{1}]", PlcName, task.TASK_NO));
  193. }
  194. }
  195. private void OutInStock(List<WCS_TASK> tasks)
  196. {
  197. var tasktemp = tasks.FirstOrDefault(v => v.TASK_NO == task_no_Last);
  198. if (tasktemp == null)
  199. {
  200. tasktemp = SugarBase.DB.Queryable<WCS_TASK>()
  201. .First(v => !SqlFunc.IsNullOrEmpty(v.TASK_POSIDMOVE) &&
  202. v.TASK_COMTYPE == 2 &&
  203. v.TASK_WKSTATUS <= 1 &&
  204. v.TASK_WMSNO == PlcName);
  205. if (tasktemp != null)
  206. {
  207. if (ExecuteTask(tasktemp)) return;
  208. }
  209. }
  210. else
  211. {
  212. if ((tasktemp.TASK_COMTYPE == 1 && tasktemp.TASK_WKSTATUS == 2) ||
  213. (tasktemp.TASK_COMTYPE == 2 && tasktemp.TASK_WKSTATUS <= 1) ||
  214. (tasktemp.TASK_COMTYPE == 3 && tasktemp.TASK_WKSTATUS <= 1) ||
  215. (tasktemp.TASK_COMTYPE == 4 && tasktemp.TASK_WKSTATUS == 2))
  216. {
  217. if (ExecuteTask(tasktemp)) return;
  218. }
  219. }
  220. int taskMaxPriority = tasks.Max(v => v.TASK_PRIORITY);
  221. for (int index = taskMaxPriority; index >= 0; index--)
  222. {
  223. var tasks_Temp = tasks.Where(v => v.TASK_PRIORITY == index).ToList();
  224. if (tasks_Temp.Count > 0)
  225. {
  226. //查询硬件条件满足的可用出入库任务
  227. var taskSet = QueryTask(tasks_Temp);
  228. //调用扩展函数返回可用出入库任务
  229. var taskList = QueryOutTasks(taskSet);
  230. //克隆集合
  231. List<WCS_SrmOutInInfo> outininfoSet = SrmOutInInfoSet.GetRange(0, SrmOutInInfoSet.Count);
  232. bool isEixt = false;
  233. foreach (var outininfo in outininfoSet)
  234. {
  235. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_in || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  236. {
  237. var taskitem = taskList.SingleOrDefault(v => v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  238. if (taskitem != null)
  239. {
  240. if (taskitem.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_InStorage)
  241. {
  242. if (InStock(taskitem))
  243. {
  244. task_no_Last = taskitem.TASK_NO;
  245. isEixt = true;
  246. break;
  247. }
  248. }
  249. else if (taskitem.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_Carry)
  250. {
  251. if (Carry(taskitem))
  252. {
  253. task_no_Last = taskitem.TASK_NO;
  254. isEixt = true;
  255. break;
  256. }
  257. }
  258. }
  259. }
  260. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_out || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  261. {
  262. var tasktempList = taskList.Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage).ToList();
  263. bool iscreateSuccess = false;
  264. foreach (var item in tasktempList)
  265. {
  266. //检测是否允许出库
  267. if (QueryOutTask(item))
  268. {
  269. if (OutStock(item))
  270. {
  271. task_no_Last = item.TASK_NO;
  272. iscreateSuccess = true;
  273. break;
  274. }
  275. }
  276. }
  277. if (iscreateSuccess)
  278. {
  279. isEixt = true;
  280. break;
  281. }
  282. }
  283. }
  284. if (isEixt)
  285. {
  286. break;
  287. }
  288. }
  289. }
  290. }
  291. protected virtual bool QueryOutTask(WCS_TASK task) { return true; }
  292. private bool ExecuteTask(WCS_TASK task)
  293. {
  294. bool isExecuteFinish = false;
  295. if (task.TASK_COMTYPE == (int)ComTypeEnum.入库)
  296. {
  297. if (InStock(task)) isExecuteFinish = true;
  298. }
  299. else if (task.TASK_COMTYPE == (int)ComTypeEnum.出库)
  300. {
  301. if (OutStock(task)) isExecuteFinish = true;
  302. }
  303. else if (task.TASK_COMTYPE == (int)ComTypeEnum.搬运)
  304. {
  305. if (Carry(task)) isExecuteFinish = true;
  306. }
  307. return isExecuteFinish;
  308. }
  309. protected virtual List<WCS_TASK> QueryOutTasks(List<WCS_TASK> taskSet) { return taskSet.OrderBy(n => n.TASK_ADDDATETIME).ToList(); }
  310. private List<WCS_TASK> QueryTask(List<WCS_TASK> tasks)
  311. {
  312. List<WCS_TASK> wcs_taskSet = new List<WCS_TASK>();
  313. //克隆集合
  314. List<WCS_SrmOutInInfo> outininfoSet = SrmOutInInfoSet.GetRange(0, SrmOutInInfoSet.Count);
  315. foreach (var outininfo in outininfoSet)
  316. {
  317. if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_in || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  318. {
  319. var intask = tasks.SingleOrDefault(v => v.TASK_WKSTATUS != (int)WkStatus.堆垛机执行 && v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  320. if (intask != null)
  321. {
  322. if ((intask.TASK_COMTYPE == 1 && intask.TASK_POSIDTO != PlcName && intask.TASK_POSIDTO != srm) || //入库任务已分配货位
  323. intask.TASK_COMTYPE == 4) //搬运任务
  324. {
  325. var temptask = QueryInConvTask(outininfo, intask);
  326. if (temptask != null)
  327. {
  328. wcs_taskSet.Add(temptask);
  329. }
  330. }
  331. }
  332. }
  333. else if (outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_out || outininfo.SRMOUTIN_OUTINTYPE == SrmOutInInfo_outIn)
  334. {
  335. //检测出口状态
  336. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  337. if (convSignal.DB521_Request == false && convSignal.DB521_Tasknum <= 0 && convSignal.CvDB51_PH_Status == false)
  338. {
  339. var outTask = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_POSIDCUR == outininfo.SRMOUTIN_CONVNO);
  340. if (outTask == null ||
  341. ((outTask.TASK_WKSTATUS != (int)WkStatus.输送机执行) && (outTask.TASK_WKSTATUS != (int)WkStatus.堆垛机完成)))
  342. {
  343. //检测是否存在该出口的任务列表
  344. List<WCS_TASK> list = new List<WCS_TASK>();
  345. var taskList = tasks.Where(v => v.TASK_COMTYPE == 2 && v.TASK_WKSTATUS <= 1).ToList();
  346. foreach (var task in taskList)
  347. {
  348. var routes = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO).Where(v => v.ROUTE_STARTPOS == PlcName).ToList();
  349. var routeitem = routes.FirstOrDefault(v => v.ROUTE_SONPOS == outininfo.SRMOUTIN_CONVNO);
  350. if (routeitem != null && CheckAreaOutAddress(task, routeitem))
  351. {
  352. if (wcs_taskSet.Any(v => v.TASK_NO == task.TASK_NO) == false)
  353. {
  354. list.Add(task);
  355. }
  356. }
  357. }
  358. if (list.Count() > 0) wcs_taskSet.AddRange(list);
  359. }
  360. }
  361. }
  362. }
  363. return wcs_taskSet;
  364. }
  365. /// <summary>
  366. /// 检测区域出口地址(弯轨堆垛机,多项道转换堆垛机)
  367. /// </summary>
  368. protected virtual bool CheckAreaOutAddress(WCS_TASK task, WCS_EQUIPMENTROUTE route)
  369. {
  370. return true;
  371. }
  372. protected virtual WCS_EQUIPMENTROUTE QueryOutEquRouteItem(WCS_TASK task, List<WCS_EQUIPMENTROUTE> routeSet)
  373. {
  374. return routeSet.Single();
  375. }
  376. /// <summary>
  377. /// 查询堆垛机入库口任务
  378. /// </summary>
  379. protected virtual WCS_TASK QueryInConvTask(WCS_SrmOutInInfo outininfo, WCS_TASK task)
  380. {
  381. WCS_TASK wcs_task = null;
  382. var convSignal = ConveyorHelper.GetConveyorSignal(outininfo.SRMOUTIN_CONVPLCNAME, outininfo.SRMOUTIN_CONVNO);
  383. if (convSignal.DB521_Tasknum == task.TASK_NO && convSignal.CvDB51_PH_Status
  384. //&& convSignal.DB521_Goodsend.ToString() == outininfo.SRMOUTIN_CONVNO
  385. )
  386. {
  387. if (task.TASK_COMTYPE == 1)
  388. {
  389. wcs_task = task;
  390. }
  391. else if (task.TASK_COMTYPE == 4)
  392. {
  393. var route = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO).FirstOrDefault(v => v.ROUTE_STARTPOS == PlcName);
  394. var srmoutin = SrmOutInInfoSet.SingleOrDefault(v => v.SRMOUTIN_CONVNO == route.ROUTE_NEXTPOS && v.SRMOUTIN_SRMNO == PlcName);
  395. //检测出口状态
  396. var outConv = ConveyorHelper.GetConveyorSignal(srmoutin.SRMOUTIN_CONVPLCNAME, srmoutin.SRMOUTIN_CONVNO);
  397. if (outConv.DB521_Tasknum == 0 && outConv.CvDB51_PH_Status == false)
  398. {
  399. wcs_task = task;
  400. }
  401. }
  402. }
  403. return wcs_task;
  404. }
  405. protected bool InStock(WCS_TASK task)
  406. {
  407. bool result = true;
  408. try
  409. {
  410. var writeSignal = new WCSWriteToSrmSignal();
  411. writeSignal.Start_number = 0;
  412. writeSignal.Goodtype = 0;
  413. writeSignal.TaskID = task.TASK_NO;
  414. if (task.TASK_COMTYPE == 4)//移动
  415. {
  416. //var startCvToEnd = ConveyorHelper.SrmMoveCvSet.FirstOrDefault(v => v.StartConveyor == task.TASK_POSIDCUR);
  417. //writeSignal.RowPos1 = startCvToEnd.SrmStartRow;
  418. //writeSignal.Travelpos1 = startCvToEnd.SrmStartColumn;
  419. //writeSignal.Liftpos1 = startCvToEnd.SrmStartLayer;
  420. //writeSignal.Fork_start_pos1 = startCvToEnd.SrmStartDepth;
  421. //writeSignal.RowPos2 = startCvToEnd.SrmEndRow;
  422. //writeSignal.Travelpos2 = startCvToEnd.SrmEndColumn;
  423. //writeSignal.Liftpos2 = startCvToEnd.SrmEndLayer;
  424. //writeSignal.Fork_dest_pos2 = startCvToEnd.SrmEndDepth;
  425. }
  426. else
  427. {
  428. var route = Current.EquRouteSet.FirstOrDefault(v => v.ROUTE_STARTPOS == task.TASK_POSIDCUR);
  429. writeSignal.RowPos1 = (int)route.SRMROW;
  430. writeSignal.Travelpos1 = (int)route.SRMCOLUMN;
  431. writeSignal.Liftpos1 = (int)route.SRMLAYER;
  432. //writeSignal.Fork_start_pos1 = (int)route.DEPTH;
  433. //查询货位表巷道,深度
  434. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == task.TASK_POSIDTO);
  435. writeSignal.RowPos2 = task.ToRow;// location.Loc_Tunnel;
  436. writeSignal.Travelpos2 = task.ToCol;
  437. writeSignal.Liftpos2 = task.ToLayer;
  438. //writeSignal.Fork_dest_pos2 = task.ToDepth; //location.Loc_Depth;
  439. }
  440. //执行任务
  441. SrmOutIn(writeSignal, task.TASK_POSIDCUR, task.TASK_POSIDTO);
  442. }
  443. catch (Exception ex)
  444. {
  445. if (ex.Message.Contains(WriteSrmSignalException) == false &&
  446. ex.Message.Contains(WriteSrmTriggerException) == false)
  447. {
  448. result = false;
  449. }
  450. }
  451. return result;
  452. }
  453. protected bool OutStock(WCS_TASK task)
  454. {
  455. bool result = true;
  456. try
  457. {
  458. var writeSignal = new WCSWriteToSrmSignal();
  459. writeSignal.Start_number = 0;
  460. writeSignal.End_number = 0;
  461. writeSignal.Goodtype = 0;
  462. writeSignal.TaskID = task.TASK_NO;
  463. //查询货位表巷道,深度
  464. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == outtask.TASK_POSIDFROM);
  465. //堆垛机出库
  466. writeSignal.RowPos1 = task.FromRow;//location.Loc_Tunnel;
  467. writeSignal.Travelpos1 = task.FromCol;//outtask.ToCol;
  468. writeSignal.Liftpos1 = task.FromLayer;//outtask.ToLayer;
  469. if (task.TASK_COMTYPE == 2)
  470. {
  471. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  472. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_SRMNO).ToList();
  473. var route = QueryOutEquRouteItem(task, routes);
  474. writeSignal.RowPos2 = (int)route.SRMROW;
  475. writeSignal.Travelpos2 = (int)route.SRMCOLUMN;
  476. writeSignal.Liftpos2 = (int)route.SRMLAYER;
  477. //writeSignal.Fork_dest_pos2 = (int)route.DEPTH;
  478. //执行任务
  479. SrmOutIn(writeSignal, task.TASK_POSIDFROM, route.ROUTE_SONPOS);
  480. }
  481. else if (task.TASK_COMTYPE == 3)
  482. {
  483. writeSignal.RowPos2 = task.ToRow;
  484. writeSignal.Travelpos2 = task.ToCol;
  485. writeSignal.Liftpos2 = task.ToLayer;
  486. //writeSignal.Fork_dest_pos2 = outtask.ToDepth;
  487. writeSignal.TaskID = task.TASK_NO;
  488. //执行任务
  489. SrmOutIn(writeSignal, task.TASK_POSIDFROM, task.TASK_POSIDTO);
  490. }
  491. }
  492. catch (Exception ex)
  493. {
  494. LogMessageHelper.RecordLogMessage(ex);
  495. if (ex.Message.Contains(WriteSrmSignalException) == false &&
  496. ex.Message.Contains(WriteSrmTriggerException) == false)
  497. {
  498. result = false;
  499. }
  500. }
  501. return result;
  502. }
  503. protected bool Carry(WCS_TASK task)
  504. {
  505. bool result = true;
  506. try
  507. {
  508. var writeSignal = new WCSWriteToSrmSignal();
  509. writeSignal.Start_number = 0;
  510. writeSignal.End_number = 0;
  511. writeSignal.Goodtype = 0;
  512. var routeItem = Current.EquRouteSet.SingleOrDefault(v => v.ROUTE_STARTPOS == task.TASK_POSIDNEXT && v.ROUTE_SONPOS == PlcName);
  513. //查询货位表巷道,深度
  514. //var location = db.Queryable<Base_Location>().First(v => v.Loc_No == outtask.TASK_POSIDFROM);
  515. writeSignal.RowPos1 = (int)routeItem.SRMROW;//task.FromRow;//location.Loc_Tunnel;
  516. writeSignal.Travelpos1 = (int)routeItem.SRMCOLUMN; //task.FromCol;//outtask.ToCol;
  517. writeSignal.Liftpos1 = (int)routeItem.SRMLAYER;//task.FromLayer;//outtask.ToLayer;
  518. //writeSignal.Fork_start_pos1 = outtask.FromDepth;// location.Loc_Depth; location.Loc_EquimentNo
  519. var routeSet = EquRouteHelper.QueryRoute(task.TASK_SRMNO, task.TASK_POSIDTO);
  520. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == task.TASK_SRMNO).ToList();
  521. var route = QueryOutEquRouteItem(task, routes);
  522. writeSignal.RowPos2 = (int)route.SRMROW;
  523. writeSignal.Travelpos2 = (int)route.SRMCOLUMN;
  524. writeSignal.Liftpos2 = (int)route.SRMLAYER;
  525. //writeSignal.Fork_dest_pos2 = (int)route.DEPTH;
  526. writeSignal.TaskID = task.TASK_NO;
  527. //执行任务
  528. SrmOutIn(writeSignal, task.TASK_POSIDNEXT, route.ROUTE_SONPOS);
  529. }
  530. catch (Exception ex)
  531. {
  532. LogMessageHelper.RecordLogMessage(ex);
  533. if (ex.Message.Contains(WriteSrmSignalException) == false &&
  534. ex.Message.Contains(WriteSrmTriggerException) == false)
  535. {
  536. result = false;
  537. }
  538. }
  539. return result;
  540. }
  541. protected void MoveStock(WCS_TASK task)
  542. {
  543. var writeSignal = new WCSWriteToSrmSignal();
  544. writeSignal.Start_number = 0;
  545. writeSignal.End_number = 0;
  546. writeSignal.Goodtype = 0;
  547. //查询货位表巷道,深度
  548. //var location1 = db.Queryable<BASE_WARECELL>().First(v => v.F_NO == task.TASK_POSIDFROM);
  549. writeSignal.RowPos1 = task.FromRow; // location1.F_LINE;
  550. writeSignal.Travelpos1 = task.FromCol;
  551. writeSignal.Liftpos1 = task.FromLayer;
  552. //writeSignal.Fork_start_pos1 = location1.F_DEPTH;
  553. writeSignal.End_number = 0;
  554. //查询货位表巷道,深度
  555. //var location2 = db.Queryable<BASE_WARECELL>().First(v => v.F_NO == task.TASK_POSIDTO);
  556. writeSignal.RowPos2 = task.ToRow;//location2.F_LINE;
  557. writeSignal.Travelpos2 = task.ToCol;
  558. writeSignal.Liftpos2 = task.ToLayer;
  559. //writeSignal.Fork_dest_pos2 = location2.F_DEPTH;
  560. writeSignal.TaskID = task.TASK_NO;
  561. writeSignal.End_number = 0;
  562. //执行任务
  563. SrmOutIn(writeSignal, task.TASK_POSIDFROM, task.TASK_POSIDTO);
  564. }
  565. private void SrmOutIn(WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext)
  566. {
  567. var task = Current.TaskSet.First(v => v.TASK_NO == srmSignal.TaskID);
  568. WCS_CacheInfo cahcheinfo = Current.WCS_CacheInfoSet.FirstOrDefault(v => v.Cache_TrafficControlEquSet.Contains(PlcName) && (task.TASK_POSIDTO.Contains(v.Cache_ConvNo) || task.TASK_POSIDTO.Contains(v.Cache_AreaName)));
  569. string cacheAreaName = cahcheinfo == null ? srmSignal.TaskID.ToString() : cahcheinfo.Cache_AreaName;
  570. //string errorMsg = ThreadLockHelper.SrmOutIn(EquSignal, srmSignal, WCS_PLCItem.Plc, WriteDbName, startPos, posIdnext, cacheAreaName, PlcName);
  571. string errorMsg = SrmOutIn(EquSignal, srmSignal, startPos, posIdnext, cacheAreaName);
  572. if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg);
  573. }
  574. public string SrmOutIn(SrmSignal equSignal, WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext, string cacheAreaName)
  575. {
  576. using (var mutex = new Mutex(false, cacheAreaName))
  577. {
  578. string resultMsg = string.Empty;
  579. try
  580. {
  581. if (mutex.WaitOne(-1, false))
  582. {
  583. SrmTaskRun(equSignal, srmSignal, startPos, posIdnext, cacheAreaName);
  584. }
  585. }
  586. catch (Exception ex)
  587. {
  588. resultMsg = ex.Message;
  589. }
  590. finally
  591. {
  592. mutex.ReleaseMutex();
  593. }
  594. return resultMsg;
  595. }
  596. }
  597. private void SrmTaskRun(SrmSignal equSignal, WCSWriteToSrmSignal srmSignal, string startPos, string posIdnext, string cacheAreaName)
  598. {
  599. //检测并生成移库任务
  600. CheckCreateMoveTask(srmSignal, ref startPos, ref posIdnext);
  601. bool isExecute = CheckIsExecuteTask(cacheAreaName);
  602. if (isExecute)
  603. {
  604. if (equSignal.DB520_Start_number == srmSignal.Start_number &&
  605. equSignal.DB520_End_number == srmSignal.End_number &&
  606. equSignal.DB520_Goodtype == srmSignal.Goodtype &&
  607. equSignal.DB520_Runmode == srmSignal.Runmode &&
  608. equSignal.DB520_FromRowPos == srmSignal.RowPos1 &&
  609. equSignal.DB520_FromColumnPos == srmSignal.Travelpos1 &&
  610. equSignal.DB520_FromLayerPos == srmSignal.Liftpos1 &&
  611. equSignal.DB520_Fork_start_pos1 == srmSignal.Fork_start_pos1 &&
  612. equSignal.DB520_ToRowPos == srmSignal.RowPos2 &&
  613. equSignal.DB520_ToColumnPos == srmSignal.Travelpos2 &&
  614. equSignal.DB520_ToLayerPos == srmSignal.Liftpos2 &&
  615. equSignal.DB520_Fork_dest_pos2 == srmSignal.Fork_dest_pos2 &&
  616. equSignal.DB520_TaskID == srmSignal.TaskID)
  617. {
  618. string convNo = string.Empty;
  619. string result = TryCachHelper.TryTranExecute((db) =>
  620. {
  621. var task = db.Queryable<WCS_TASK>().First(t => t.TASK_NO == srmSignal.TaskID);
  622. if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage)
  623. {
  624. convNo = posIdnext;
  625. }
  626. else if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_InStorage ||
  627. task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_Carry)
  628. {
  629. convNo = task.TASK_POSIDCUR;
  630. }
  631. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = (int)WkStatus.堆垛机执行, TASK_POSIDNEXT = posIdnext, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  632. .Where(it => it.TASK_NO == srmSignal.TaskID).ExecuteCommand();
  633. string msg = string.Format("任务[{0}]已下发给堆垛机执行,起点位置[{1}]目标地址[{2}]", task.TASK_NO, startPos, posIdnext);
  634. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, posIdnext, msg);
  635. if (equSignal.DB520_Task_trigger != 1)
  636. {
  637. //string mes = string.Format("读取plc信息:任务号[{0}]起始行[{1}]起始列[{2}]起始层[{3}]目标行[{4}]目标列[{5}]目标层[{6}]",
  638. //equSignal.DB520_TaskID, equSignal.DB520_FromRowPos, equSignal.DB520_FromColumnPos, equSignal.DB520_FromLayerPos,
  639. //equSignal.DB520_ToRowPos, equSignal.DB520_ToColumnPos, equSignal.DB520_ToLayerPos);
  640. //Log4netHelper.Logger_Info.InfoFormat(mes);
  641. if (WCS_PLCItem.Plc.WriteSignal((ushort)WriteDbName, 30, 2, 1))
  642. {
  643. Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入触发信号成功。", srmSignal.TaskID));
  644. }
  645. else
  646. {
  647. throw new Exception(string.Format("任务[{0}]520写入触发信号失败。", srmSignal.TaskID));
  648. }
  649. }
  650. });
  651. if (string.IsNullOrWhiteSpace(result))
  652. {
  653. task_no_Last = 0;
  654. //移动到最后
  655. SrmConvNoMoveToLast(convNo);
  656. }
  657. else
  658. {
  659. throw new Exception(string.Format("任务[{0}]堆垛机执行失败,原因:[{1}]", srmSignal.TaskID, result));
  660. }
  661. }
  662. else
  663. {
  664. WriteTaskToSrm(srmSignal);
  665. }
  666. }
  667. else
  668. {
  669. throw new Exception(string.Format("目标地址[{0}]交通管制,暂无法执行出库任务,将优先执行其它任务。", cacheAreaName));
  670. }
  671. }
  672. private void CheckCreateMoveTask(WCSWriteToSrmSignal srmSignal, ref string startPos, ref string posIdnext)
  673. {
  674. var task = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_NO == srmSignal.TaskID);
  675. if (task == null)
  676. {
  677. throw new Exception(string.Format("堆垛机[{0}]执行的任务[{1}]不存在", PlcName, srmSignal.TaskID));
  678. }
  679. if (task.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage &&
  680. task.FromDepth == 2 &&
  681. task.TASK_POSIDCUR == task.TASK_POSIDFROM &&
  682. string.IsNullOrWhiteSpace(task.TASK_POSIDMOVE))
  683. {
  684. var tasktemps = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName).ToList();
  685. var task_DepthOne = tasktemps.FirstOrDefault(v => v.FromNo == task.FromNo &&
  686. v.FromCol == task.FromCol &&
  687. v.FromLayer == task.FromLayer &&
  688. v.FromDepth == 1 &&
  689. v.TASK_WKSTATUS <= 1 &&
  690. (v.TASK_COMTYPE == 2 || v.TASK_COMTYPE == 3));
  691. if (task_DepthOne == null)
  692. {
  693. //调用生成移库任务接口
  694. var moveTaskresult = Current.WmsInterface.I_WCS_GetMoveTask(new GetMoveTaskParam() { WMSTaskNum = task.TASK_WMSNO });
  695. if (moveTaskresult.ResType == 0)
  696. {
  697. throw new Exception(string.Format("任务[{0}]调用移库接口报错:[{1}]", task.TASK_NO, moveTaskresult.ResMessage));
  698. }
  699. else if (moveTaskresult.ResType == 2)
  700. {
  701. //创建移库任务并执行
  702. var moveTask = new WCS_TASK()
  703. {
  704. TASK_WMSNO = moveTaskresult.WMSTaskNum,
  705. TASK_COMTYPE = 3,
  706. TASK_SYSTYPE = "wcs",
  707. TASK_POSIDFROM = moveTaskresult.MoveStartWareCell,
  708. TASK_POSIDCUR = moveTaskresult.MoveStartWareCell,
  709. TASK_POSIDNEXT = moveTaskresult.MoveStartWareCell,
  710. TASK_POSIDTO = moveTaskresult.MoveEndWareCell,
  711. TASK_POSIDMOVE = moveTaskresult.MoveEndWareCell,
  712. TASK_PRIORITY = 0,
  713. TASK_WKSTATUS = 0,
  714. TASK_WHID = moveTaskresult.WareHouseName,
  715. TASK_ADDUSERNO = "wcs",
  716. TASK_ADDDATETIME = SugarBase.DB.GetDate(),
  717. TASK_EDITUSERNO = "wcs",
  718. TASK_EDITDATETIME = SugarBase.DB.GetDate(),
  719. TASK_NOTES = string.Empty,
  720. TASK_SRMNO = PlcName,
  721. TASK_BOXBARCODE = moveTaskresult.ContainerBarCode,
  722. TASK_FromTunnelNum = moveTaskresult.FromTunnelNum,
  723. TASK_EndTunnelNum = moveTaskresult.EndTunnelNum
  724. };
  725. string result = TryCachHelper.TryTranExecute((db) =>
  726. {
  727. int inserttask = db.Insertable(moveTask).ExecuteCommand();
  728. if (inserttask <= 0)
  729. {
  730. throw new Exception(string.Format("任务[{0}]生成移库添加移库任务失败.", task.TASK_NO));
  731. }
  732. //修改任务的移库字段
  733. int updatetask = db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_POSIDMOVE = moveTask.TASK_POSIDMOVE, TASK_PRIORITY = 111, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  734. .Where(it => it.TASK_NO == task.TASK_NO)
  735. .ExecuteCommand();
  736. if (updatetask <= 0)
  737. {
  738. throw new Exception(string.Format("任务[{0}]生成移库时修改需要移库的任务失败.", task.TASK_NO));
  739. }
  740. });
  741. if (!string.IsNullOrWhiteSpace(result))
  742. {
  743. throw new Exception(result);
  744. }
  745. task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_WMSNO == moveTask.TASK_WMSNO);
  746. }
  747. else if (moveTaskresult.ResType == 3)
  748. {
  749. if (string.IsNullOrWhiteSpace(moveTaskresult.Memo1.Trim()))
  750. {
  751. throw new Exception(string.Format("调用移库接口报错:堆垛机[{0}]优先执行的入库任务号不能为空。", PlcName));
  752. }
  753. else
  754. {
  755. int task_no = Convert.ToInt16(moveTaskresult.Memo1.Trim());
  756. if (task_no <= 0)
  757. {
  758. throw new Exception(string.Format("调用移库接口报错:堆垛机[{0}]优先执行的入库任务号不能为零。", PlcName));
  759. }
  760. SugarBase.DB.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_PRIORITY = 10, TASK_EDITDATETIME = DateTime.Now })
  761. .Where(it => it.TASK_NO == task_no)
  762. .ExecuteCommand();
  763. }
  764. }
  765. }
  766. else if (task_DepthOne.TASK_WKSTATUS <= 1)
  767. {
  768. task = task_DepthOne;
  769. }
  770. }
  771. if (task.TASK_COMTYPE == 3)
  772. {
  773. srmSignal.TaskID = task.TASK_NO;
  774. #region 堆垛机取货地址
  775. srmSignal.RowPos1 = task.FromRow;
  776. srmSignal.Travelpos1 = task.FromCol;
  777. srmSignal.Liftpos1 = task.FromLayer;
  778. #endregion;
  779. #region 堆垛机放货地址
  780. srmSignal.RowPos2 = task.ToRow;
  781. srmSignal.Travelpos2 = task.ToCol;
  782. srmSignal.Liftpos2 = task.ToLayer;
  783. //writeSignal.Fork_dest_pos2 = (int)route.DEPTH;
  784. #endregion;
  785. startPos = task.TASK_POSIDFROM;
  786. posIdnext = task.TASK_POSIDTO;
  787. }
  788. }
  789. private static bool CheckIsExecuteTask(string cacheAreaName)
  790. {
  791. bool isExecute = false;
  792. var cacheInfoSet = Current.WCS_CacheInfoSet.Where(v => v.Cache_AreaName == cacheAreaName).ToList();
  793. if (cacheInfoSet.Count <= 0)
  794. {
  795. isExecute = true;
  796. }
  797. else
  798. {
  799. int cacheCount = cacheInfoSet.Sum(v => v.Cache_Count);
  800. var tasks = SugarBase.DB.Queryable<WCS_TASK>()
  801. .Where(v => v.TASK_COMTYPE == (int)TaskTypeEnum.TaskType_OutStorage &&
  802. (v.TASK_WKSTATUS > 1 || (v.TASK_WKSTATUS <= 1 && SqlFunc.IsNullOrEmpty(v.TASK_POSIDMOVE) == false)))
  803. .ToList();
  804. int curTaskCount = tasks.Count(v => v.TASK_POSIDTO.Contains(cacheAreaName) || cacheInfoSet.Any(t => v.TASK_POSIDNEXT.Contains(t.Cache_ConvNo) || v.TASK_POSIDTO.Contains(t.Cache_ConvNo)));
  805. if (curTaskCount < cacheCount)
  806. {
  807. int ph_StatusCount = 0;//光电信号数量
  808. foreach (var item in cacheInfoSet)
  809. {
  810. var cv = ConveyorHelper.GetConveyorSignal(item.Cache_PlcName, item.Cache_ConvNo);
  811. if (cv != null && (cv.DB521_Tasknum > 0 || cv.CvDB51_PH_Status))
  812. {
  813. if (tasks.Any(v => v.TASK_NO == cv.DB521_Tasknum) == false)
  814. {
  815. ph_StatusCount++;
  816. }
  817. }
  818. }
  819. if ((curTaskCount + ph_StatusCount) < cacheCount)
  820. {
  821. isExecute = true;
  822. }
  823. }
  824. }
  825. return isExecute;
  826. }
  827. private void WriteTaskToSrm(WCSWriteToSrmSignal srmSignal)
  828. {
  829. List<byte> list = new List<byte>();
  830. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Start_number).ToList());
  831. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.End_number).ToList());
  832. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Goodtype).ToList());
  833. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Runmode).ToList());
  834. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos1).ToList());
  835. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos1).ToList());
  836. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos1).ToList());
  837. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_start_pos1).ToList());
  838. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.RowPos2).ToList());
  839. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Travelpos2).ToList());
  840. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Liftpos2).ToList());
  841. list.AddRange(ExtendsUtil.UshortToByte((ushort)srmSignal.Fork_dest_pos2).ToList());
  842. list.AddRange(ExtendsUtil.UintToByte((uint)srmSignal.TaskID).ToList());
  843. Log4netHelper.Logger_Info.InfoFormat(string.Format("写入任务[{0}]信息", srmSignal.TaskID));
  844. bool result = WCS_PLCItem.Plc.Write((ushort)WriteDbName, 2, list.ToArray());
  845. if (result)
  846. {
  847. Log4netHelper.Logger_Info.InfoFormat(string.Format("堆垛机[{0}]写入任务[{1}]信息成功", PlcName, srmSignal.TaskID));
  848. }
  849. else
  850. {
  851. throw new Exception(string.Format("堆垛机[{0}]写入任务[{1}]520写入取放货信号失败", PlcName, srmSignal.TaskID));
  852. }
  853. }
  854. private WCS_TASK QueryMoveTask()
  855. {
  856. WCS_TASK task = null;
  857. var movetaskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_COMTYPE == (int)ComTypeEnum.移库 && v.TASK_WKSTATUS <= 1 && v.TASK_SRMNO == WCS_PLCItem.PLC_NAME).ToList();
  858. if (movetaskSet.Count > 0) task = movetaskSet[0];
  859. return task;
  860. }
  861. /// <summary>
  862. /// 调整堆垛机出入口顺序
  863. /// </summary>
  864. /// <param name="convNo"></param>
  865. private void SrmConvNoMoveToLast(string convNo)
  866. {
  867. try
  868. {
  869. if (!string.IsNullOrWhiteSpace(convNo))
  870. {
  871. //检测是否是最后一项
  872. if (SrmOutInInfoSet[SrmOutInInfoSet.Count() - 1].SRMOUTIN_CONVNO == convNo) return;
  873. //查询要调整执行顺序的输送线
  874. var outininfo = SrmOutInInfoSet.FirstOrDefault(v => v.SRMOUTIN_CONVNO == convNo);
  875. //删除当前
  876. SrmOutInInfoSet.Remove(outininfo);
  877. //添加到最后
  878. SrmOutInInfoSet.Add(outininfo);
  879. }
  880. }
  881. catch (Exception ex)
  882. {
  883. Log4netHelper.Logger_Info.ErrorFormat(ex.ToString());
  884. }
  885. }
  886. /// <summary>
  887. /// 加载堆垛机刷新数据
  888. /// </summary>
  889. private void Init_Refresh()
  890. {
  891. var srmconvinfoset = Current.WCS_SrmOutInInfoSet.Where(v => v.SRMOUTIN_SRMNO == PlcName && v.SRMOUTIN_ISSTOP == false).OrderBy(p => p.SRMOUTIN_PRIORITY).OrderBy(t => t.SRMOUTIN_SEQUENCE).ToList();
  892. if (SrmOutInInfoSet.Count != srmconvinfoset.Count || //元素个数不相同
  893. srmconvinfoset.Any(v => v.SRMOUTIN_ISUPDATE)) //元素已更新
  894. {
  895. SrmOutInInfoSet = srmconvinfoset;
  896. SugarBase.DB.Updateable<WCS_SrmOutInInfo>(it => new WCS_SrmOutInInfo() { SRMOUTIN_ISUPDATE = false })
  897. .Where(it => it.SRMOUTIN_SRMNO == PlcName)
  898. .ExecuteCommand();
  899. }
  900. }
  901. private int _assignInWareCell = 0;
  902. /// <summary>
  903. /// 分配入库货位
  904. /// </summary>
  905. private void AssignInWareCell()
  906. {
  907. if (Interlocked.Exchange(ref _assignInWareCell, 1) == 0)
  908. {
  909. try
  910. {
  911. var taskSet = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_SRMNO == PlcName && v.TASK_WKSTATUS != 5 && v.TASK_WKSTATUS > 1).ToList().OrderByDescending(v => v.TASK_PRIORITY).ToList();
  912. var taskSet_In = taskSet.Where(v => v.TASK_COMTYPE == 1).ToList();
  913. foreach (var task in taskSet_In)
  914. {
  915. if (SrmOutInInfoSet.Any(v => v.SRMOUTIN_CONVNO == task.TASK_POSIDCUR && (v.SRMOUTIN_OUTINTYPE == "in" || v.SRMOUTIN_OUTINTYPE == "outIn")) || task.TASK_POSIDCUR == "1025")
  916. {
  917. if (string.IsNullOrWhiteSpace(task.TASK_POSIDTO) || task.TASK_POSIDTO == PlcName)
  918. {
  919. //入库任务分配货位
  920. GetWareCell(task);
  921. }
  922. }
  923. }
  924. }
  925. catch (Exception ex)
  926. {
  927. LogMessageHelper.RecordLogMessage(string.Format("分配入库货位异常:[{0}]", ex.Message), ex);
  928. }
  929. finally
  930. {
  931. Interlocked.Exchange(ref _assignInWareCell, 0);
  932. }
  933. }
  934. }
  935. public bool GetWareCell(WCS_TASK task)
  936. {
  937. string resultMsg = string.Empty;
  938. //调度接口获取货位
  939. var getWareCell = Current.WmsInterface.I_WCS_GetWareCell(new GetWareCellParam() { WMSTaskNum = task.TASK_WMSNO.ToString(), TunnelNum = task.TASK_EndTunnelNum, PickUpEquipmentNo = task.TASK_POSIDNEXT });
  940. if (getWareCell.ResType)
  941. {
  942. resultMsg = TryCachHelper.TryTranExecute((db) =>
  943. {
  944. //修改任务分配货位
  945. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 2, TASK_POSIDNEXT = getWareCell.CellNo, TASK_POSIDTO = getWareCell.CellNo, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  946. .Where(it => it.TASK_NO == task.TASK_NO)
  947. .ExecuteCommand();
  948. //添加修改明细
  949. string msg = string.Format("任务[{0}]分配货位[{1}]成功。", task.TASK_NO, getWareCell.CellNo);
  950. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg);
  951. });
  952. }
  953. else
  954. {
  955. resultMsg = string.Format("任务[{0}]调用接口分配货位[{1}]失败,原因:{2}", task.TASK_NO, getWareCell.CellNo, getWareCell.ResMessage);
  956. LogMessageHelper.RecordLogMessage(resultMsg);
  957. }
  958. if (string.IsNullOrWhiteSpace(resultMsg))
  959. {
  960. task.TASK_POSIDNEXT = getWareCell.CellNo;
  961. task.TASK_POSIDTO = getWareCell.CellNo;
  962. return true;
  963. }
  964. else
  965. {
  966. return false;
  967. }
  968. }
  969. #endregion;
  970. }
  971. }