Base_Srm3.cs 58 KB

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