Base_Srm2.cs 53 KB

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