Base_Srm.cs 56 KB

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