Base_Conv.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using WCS.Data;
  6. using WCS.Data.Models;
  7. using WCS.PLC.Model.Equipment;
  8. using System.Linq;
  9. using WCS.Data.Utils;
  10. using System.Threading;
  11. namespace WCS.PLC
  12. {
  13. public class Base_Conv : Base_EquPlc
  14. {
  15. public Base_Conv()
  16. {
  17. }
  18. /// <summary>
  19. /// 写入任务信息到输送机
  20. /// </summary>
  21. /// <param name="converySignal"></param>
  22. /// <param name="converywrite"></param>
  23. /// <param name="isNotTask"></param>
  24. public virtual void WriteInfoToConveyor(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite, bool isNotTask = false)
  25. {
  26. if (converySignal.DB520_Tasknum == converywrite.Tasknum &&
  27. converySignal.DB520_Goodscode == converywrite.Goodscode &&
  28. converySignal.DB520_Goodstype == converywrite.Goodstype &&
  29. converySignal.DB520_Goodssize == converywrite.Goodssize &&
  30. converySignal.DB520_Goodsstart == converywrite.Goodsstart &&
  31. converySignal.DB520_Goodsend == converywrite.Goodsend &&
  32. converySignal.DB520_Notask== converywrite.Notask &&
  33. converySignal.DB520_TaskDelete == converywrite.TaskDelete &&
  34. converySignal.DB520_RollerTurn == converywrite.UpMatRequest &&
  35. converySignal.DB520_Res01 == converywrite.Res01 &&
  36. converySignal.DB520_Res02 == converywrite.Res02 &&
  37. converySignal.DB520_Res03 == converywrite.Res03 &&
  38. converySignal.DB520_Res04 == converywrite.Res04)
  39. {
  40. if (isNotTask)
  41. {
  42. ConfirmTask(converySignal, converywrite);
  43. }
  44. else
  45. {
  46. Log4netHelper.Logger_ProductLog.InfoFormat("任务[{0}]输送机[0]开始执行.",converywrite.Tasknum, converywrite.ConveyorNo);
  47. string result = TryCachHelper.TryTranExecute((db) =>
  48. {
  49. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == converywrite.Tasknum);
  50. if (string.IsNullOrWhiteSpace(converywrite.Srmno))
  51. {
  52. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  53. {
  54. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  55. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  56. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  57. TASK_EDITUSERNO = "WCS",
  58. TASK_EDITDATETIME = DateTime.Now
  59. })
  60. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  61. }
  62. else
  63. {
  64. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  65. {
  66. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  67. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  68. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  69. TASK_POSIDTO = converywrite.Srmno,
  70. TASK_SRMNO = converywrite.Srmno,
  71. TASK_EDITUSERNO = "WCS",
  72. TASK_EDITDATETIME = DateTime.Now
  73. })
  74. .Where(it => it.TASK_NO == task.TASK_NO)
  75. .ExecuteCommand();
  76. }
  77. string msg = string.Format("任务已下发给输送机[{0}]执行,起点地址[{1}]目标地址[{2}]", converywrite.ConveyorNo, converywrite.Goodsstart, converywrite.Goodsend);
  78. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Goodsend.ToString(), msg);
  79. ConfirmTask(converySignal, converywrite);
  80. });
  81. if (!string.IsNullOrWhiteSpace(result))
  82. {
  83. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Tasknum, converywrite.ConveyorNo, result));
  84. }
  85. Log4netHelper.Logger_ProductLog.InfoFormat("任务[{0}]输送机[0]执行结束.", converywrite.Tasknum, converywrite.ConveyorNo);
  86. }
  87. }
  88. else
  89. {
  90. WriteTaskToBuffer(converywrite);
  91. }
  92. }
  93. /// <summary>
  94. /// 写入任务信息到输送机
  95. /// </summary>
  96. /// <param name="converySignal"></param>
  97. /// <param name="converywrite"></param>
  98. /// <param name="isNotTask"></param>
  99. public virtual void WriteInfoToConv(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite, bool isNotTask = false)
  100. {
  101. WriteTaskToBuffer(converywrite);
  102. if (isNotTask)
  103. {
  104. ConfirmTask(converySignal, converywrite);
  105. }
  106. else
  107. {
  108. Log4netHelper.Logger_ProductLog.InfoFormat("任务[{0}]输送机[0]开始执行.", converywrite.Tasknum, converywrite.ConveyorNo);
  109. string result = TryCachHelper.TryTranExecute((db) =>
  110. {
  111. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == converywrite.Tasknum);
  112. if (converywrite.isClearPalletizingPos)
  113. {
  114. //清除机械手码垛位置条码记录
  115. var sysset = Current.SysSets.SingleOrDefault(v => v.SET_TYPE == "PalletizingPos" && v.SET_ID == task.TASK_POSIDFROM);
  116. if (sysset != null)
  117. {
  118. string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  119. db.Updateable<WCS_SYSSET>(it => new WCS_SYSSET()
  120. {
  121. SET_MEMO = "",
  122. SET_EDITUSERNO = "wcs",
  123. SET_EDITTIME = date
  124. })
  125. .Where(it => it.SET_ID == sysset.SET_ID).ExecuteCommand();
  126. }
  127. }
  128. if (string.IsNullOrWhiteSpace(converywrite.Srmno))
  129. {
  130. if (converywrite.Remark == converywrite.Goodsend.ToString())
  131. {
  132. //完成任务
  133. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  134. {
  135. TASK_WKSTATUS = 99,
  136. TASK_EDITUSERNO = "WCS",
  137. TASK_EDITDATETIME = DateTime.Now
  138. })
  139. .Where(it => it.TASK_NO == task.TASK_NO)
  140. .ExecuteCommand();
  141. }
  142. else
  143. {
  144. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  145. {
  146. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  147. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  148. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  149. TASK_EDITUSERNO = "WCS",
  150. TASK_EDITDATETIME = DateTime.Now
  151. })
  152. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  153. }
  154. }
  155. else
  156. {
  157. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  158. {
  159. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  160. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  161. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  162. TASK_POSIDTO = converywrite.Srmno,
  163. TASK_SRMNO = converywrite.Srmno,
  164. TASK_EDITUSERNO = "WCS",
  165. TASK_EDITDATETIME = DateTime.Now
  166. })
  167. .Where(it => it.TASK_NO == task.TASK_NO)
  168. .ExecuteCommand();
  169. }
  170. string msg = string.Format("任务已下发给输送机[{0}]执行,起点地址[{1}]目标地址[{2}]", converywrite.ConveyorNo, converywrite.Goodsstart, converywrite.Goodsend);
  171. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Goodsend.ToString(), msg);
  172. ConfirmTask(converySignal, converywrite);
  173. });
  174. if (!string.IsNullOrWhiteSpace(result))
  175. {
  176. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Tasknum, converywrite.ConveyorNo, result));
  177. }
  178. Log4netHelper.Logger_ProductLog.InfoFormat("任务[{0}]输送机[0]执行结束.", converywrite.Tasknum, converywrite.ConveyorNo);
  179. }
  180. }
  181. public string WriteInfoToConv(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite,string cacheAreaName, bool isNotTask = false)
  182. {
  183. using (var mutex = new Mutex(false, cacheAreaName))
  184. {
  185. string resultMsg = string.Empty;
  186. try
  187. {
  188. if (mutex.WaitOne(-1, false))
  189. {
  190. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v=>v.TASK_NO== converywrite.Tasknum);
  191. string barcode = task == null ? string.Empty : task.TASK_BOXBARCODE;
  192. Current.WcsInterface.CoatingRoomTrafficControl(converywrite.ConveyorNo, "", barcode);
  193. WriteInfoToConv(converySignal, converywrite, isNotTask);
  194. }
  195. }
  196. catch (Exception ex)
  197. {
  198. resultMsg = ex.Message;
  199. }
  200. finally
  201. {
  202. mutex.ReleaseMutex();
  203. }
  204. return resultMsg;
  205. }
  206. }
  207. public void WriteInfoToCv(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite, bool isNotTask = false)
  208. {
  209. string cacheAreaName = converywrite.Tasknum.ToString();
  210. var cacheInfo = SugarBase.DB.Queryable<WCS_CacheInfo>().First(v => v.Cache_ConvNo == converywrite.Goodsstart.ToString());
  211. if (cacheInfo != null)
  212. {
  213. cacheAreaName = cacheInfo.Cache_AreaName;
  214. }
  215. string errorMsg = WriteInfoToConv(converySignal, converywrite, cacheAreaName, isNotTask);
  216. if (!string.IsNullOrWhiteSpace(errorMsg)) throw new Exception(errorMsg);
  217. }
  218. /// <summary>
  219. /// 提交任务
  220. /// </summary>
  221. public virtual void ConfirmTask(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite)
  222. {
  223. if (!converySignal.DB520_Confirm)
  224. {
  225. if (converywrite.Plc.WriteBits((ushort)converywrite.DBName, (uint)((converywrite.WriteStartAddress + 16) * 8 + 1), true))
  226. {
  227. Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入确认信号到输送线[{1}]成功!", converywrite.Tasknum, converywrite.ConveyorNo));
  228. }
  229. else
  230. {
  231. throw new Exception(string.Format("任务[{0}]写入确认信号到输送线[{1}]失败!", converywrite.Tasknum, converywrite.ConveyorNo));
  232. }
  233. }
  234. else
  235. {
  236. throw new Exception(string.Format("任务[{0}]写入确认信号到输送线[{1}]失败,因为该信号未清除。", converywrite.Tasknum, converywrite.ConveyorNo));
  237. }
  238. }
  239. /// <summary>
  240. /// 写入任务信息
  241. /// </summary>
  242. /// <param name="writeDBName"></param>
  243. /// <param name="conv"></param>
  244. public virtual bool WriteTaskToBuffer(WCSWriteToConveyorSignal conv, bool isWriteConfirm = false)
  245. {
  246. List<byte> list = new List<byte>();
  247. //写入任务号
  248. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Tasknum).ToList());
  249. //var codes = Encoding.UTF8.GetBytes(conv.Goodscode);
  250. //货物条码
  251. list.AddRange(ExtendsUtil.UintToByte((uint)conv.Goodscode).ToList());
  252. //货物类型
  253. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodstype).ToList());
  254. //货位尺寸
  255. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodssize).ToList());
  256. //写入起点地址
  257. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsstart).ToList());
  258. //写入目标地址
  259. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Goodsend).ToList());
  260. BitArray bit16 = new BitArray(16);
  261. if (isWriteConfirm)
  262. {
  263. bit16[9] = conv.Confirm;
  264. }
  265. if (conv.Remark == conv.Goodsend.ToString())
  266. {
  267. bit16[0] = conv.TrayColor_Three;
  268. bit16[14] = conv.TrayColor_One;
  269. bit16[15] = conv.TrayColor_Two;
  270. }
  271. bit16[5] = conv.UpMatRequest;
  272. bit16[6] = conv.Res01;
  273. bit16[7] = conv.Res02;
  274. bit16[10] = conv.TaskDelete;//删除任务
  275. bit16[11] = conv.Notask;
  276. int BitInfo = ExtendsUtil.BitToInt(bit16);
  277. list.AddRange(ExtendsUtil.UshortToByte((ushort)BitInfo).ToList());
  278. if (conv.TASK_WEIGHT > 0)//1390获取重量值
  279. {
  280. list.AddRange(ExtendsUtil.UintToByte((uint)conv.TASK_WEIGHT).ToList());
  281. }
  282. else
  283. {
  284. list.AddRange(ExtendsUtil.UshortToByte((ushort)conv.Res03).ToList());
  285. }
  286. if (conv.Plc.Write((ushort)conv.DBName, (ushort)(conv.WriteStartAddress), list.ToArray()))
  287. {
  288. Log4netHelper.Logger_Info.InfoFormat(string.Format("输送机[{0}]写入任务[{1}]信息成功。", conv.Goodsstart, conv.Tasknum));
  289. return true;
  290. }
  291. else
  292. {
  293. throw new Exception(string.Format("输送机[{0}]写入任务[{1}]信息失败。", conv.Goodsstart, conv.Tasknum));
  294. }
  295. }
  296. /// <summary>
  297. /// 输送线任务完成
  298. /// </summary>
  299. /// <param name="plcName">Plc</param>
  300. /// <param name="convNo">输送线出口</param>
  301. /// <param name="isCheckEndPos">是否检测当前地址和任务目标地址一致</param>
  302. /// <param name="isTaskDelete">是否删除输送线任务</param>
  303. public virtual void ConveyorTaskFinish(string plcName, string convNo, bool isCheckEndPos = true, bool isTaskDelete = false)
  304. {
  305. try
  306. {
  307. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);
  308. var conveyorTo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  309. var cs = conveyorTo.EquSignal_Conv;
  310. if (cs.DB521_Tasknum > 0)
  311. {
  312. //调用函数完成任务
  313. string result = TryCachHelper.TryExecute((db) =>
  314. {
  315. WCS_TASK taskcur = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_WKSTATUS < 99);
  316. if (taskcur == null) return;
  317. if (isCheckEndPos)
  318. {
  319. if (taskcur.TASK_COMTYPE != 6 && taskcur.TASK_POSIDTO != convNo) return;
  320. }
  321. //任务类型不是出库/搬运/移动类型
  322. if (taskcur.TASK_COMTYPE != 2 && taskcur.TASK_COMTYPE != 4 && taskcur.TASK_COMTYPE != 5) return;
  323. //修改任务的状态
  324. db.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now })
  325. .Where(it => it.TASK_NO == taskcur.TASK_NO)
  326. .ExecuteCommand();
  327. });
  328. if (!string.IsNullOrWhiteSpace(result))
  329. {
  330. throw new Exception(result);
  331. }
  332. if (isTaskDelete)
  333. {
  334. if (cs.DB521_Tasknum > 0 && cs.DB523_Fault == false && cs.CvDB51_PH_Status == false
  335. //&& cs.DB521_Goodsend == Convert.ToInt32(convNo)
  336. && cs.DB521_Request)
  337. {
  338. var converywrite = new WCSWriteToConveyorSignal();
  339. converywrite.Plc = plc.Plc;
  340. converywrite.DBName = plc.WriteDBName;
  341. converywrite.ConveyorNo = convNo;
  342. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  343. converywrite.TaskDelete = true;
  344. WriteInfoToConv(cs, converywrite, true);
  345. }
  346. }
  347. }
  348. }
  349. catch (Exception ex)
  350. {
  351. LogMessageHelper.RecordLogMessage(ex);
  352. }
  353. }
  354. public string TranslationBarCode(string barCode)
  355. {
  356. var arr = barCode.Split('}');
  357. return arr[10];
  358. }
  359. public virtual void ConveyorWriteTaskExecute(string convNo, bool endPosIsCurConv = false)
  360. {
  361. try
  362. {
  363. var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv;
  364. if (equ_conv.DB523_Fault) return;
  365. if (!equ_conv.CvDB51_PH_Status) return;
  366. if (!equ_conv.DB521_Request) return;
  367. if (equ_conv.DB521_Tasknum <= 0) return;
  368. var task = SugarBase.DB.Queryable<WCS_TASK>().First(v => v.TASK_NO == equ_conv.DB521_Tasknum);
  369. if (task==null || task.TASK_POSIDNEXT != convNo) return;
  370. if (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4) return;
  371. if (equ_conv.DB521_H_Outside)
  372. {
  373. if (task.TASK_POSIDTO == srm) return;
  374. }
  375. if (convNo == "1072")
  376. {
  377. //检查是否绑定了第二个原膜卷
  378. if (string.IsNullOrWhiteSpace(task.TASK_ITEM6))
  379. {
  380. throw new Exception(string.Format("出库任务[{0}]未绑定原膜第二卷", task.TASK_NO));
  381. }
  382. }
  383. int goodsend = 0;
  384. if (endPosIsCurConv)
  385. {
  386. goodsend = Convert.ToInt32(convNo);
  387. }
  388. else
  389. {
  390. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  391. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  392. if (routes.Count == 1)
  393. {
  394. goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  395. }
  396. else
  397. {
  398. goodsend = ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes);
  399. }
  400. }
  401. if (goodsend == 0) return;
  402. var convwrite = new WCSWriteToConveyorSignal()
  403. {
  404. Plc = WCS_PLCItem.Plc,
  405. DBName = WCS_PLCItem.WriteDBName,
  406. ConveyorNo = convNo,
  407. WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox,
  408. Tasknum = task.TASK_NO,
  409. Goodscode = 0,//待定
  410. Goodstype = 0,
  411. Goodssize = 0,//待定
  412. Goodsstart = Convert.ToInt32(convNo),
  413. Goodsend = goodsend
  414. };
  415. SetConvwrite(convwrite,task);
  416. WriteInfoToConv(equ_conv, convwrite);
  417. }
  418. catch (Exception ex)
  419. {
  420. LogMessageHelper.RecordLogMessage(ex);
  421. }
  422. }
  423. /// <summary>
  424. /// 多个地址
  425. /// </summary>
  426. /// <param name="routes"></param>
  427. /// <returns></returns>
  428. public virtual int ConveyorWriteTaskExecuteToMoreAddress(string convNo,WCS_TASK task,List<WCS_EQUIPMENTROUTE> routes)
  429. {
  430. throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。"));
  431. }
  432. public virtual void SetConvwrite(WCSWriteToConveyorSignal convwrite,WCS_TASK task) { }
  433. /// <summary>
  434. /// 扫描通用方法
  435. /// </summary>
  436. /// <param name="convPosFrom">扫描位置输送线</param>
  437. /// <param name="exitNo">扫描异常退回输送线(为空则不能退回)</param>
  438. /// <param name="convPosTo">任务目标地址(为空则查询路由表)</param>
  439. protected virtual void Conv_ScanningRequest(string convPosFrom, string warehouseid, string exitNo="",string convPosTo="")
  440. {
  441. try
  442. {
  443. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  444. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convPosFrom);
  445. var cs = conveyor.EquSignal_Conv;
  446. if (!cs.DB521_Request) return;
  447. if (cs.DB520_Confirm) return;
  448. string barcode = cs.BarCodeStr;
  449. WCS_TASK task = null;
  450. if (convPosFrom == "1004")
  451. {
  452. var conveyor01 = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == exitNo);
  453. var cs01 = conveyor01.EquSignal_Conv;
  454. task = QueryTaskByBarcode(cs01, convPosFrom);
  455. barcode = TranslationBarCode(cs01.BarCodeStr);
  456. }
  457. else
  458. {
  459. task = QueryTaskByBarcode(cs, convPosFrom);
  460. }
  461. if (task == null)
  462. {
  463. var param = new GetInTaskParam();
  464. param.ContainerBarCode = barcode;
  465. param.ContainerType = 1;
  466. param.MatBarCode = string.Empty;
  467. param.WareHouseId = warehouseid;
  468. param.EquipmentNo = convPosFrom;
  469. param.EndPostion = srm;
  470. param.Memo2 = exitNo;
  471. task = ScanningCallWmsInterface(param);
  472. }
  473. if (task == null) return;
  474. var converywrite = new WCSWriteToConveyorSignal();
  475. converywrite.Plc = plc.Plc;
  476. converywrite.DBName = plc.WriteDBName;
  477. converywrite.ConveyorNo = convPosFrom;
  478. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  479. converywrite.Tasknum = task.TASK_NO;
  480. converywrite.Goodstype = 1;
  481. converywrite.Goodssize = 0;//
  482. converywrite.Goodsstart = Convert.ToInt32(convPosFrom);
  483. //判断任务是否已经执行
  484. if (task.TASK_WKSTATUS >= 2) return;
  485. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  486. {
  487. converywrite.Notask = true;
  488. converywrite.Goodsend = Convert.ToInt32(exitNo);
  489. }
  490. else
  491. {
  492. if (string.IsNullOrWhiteSpace(convPosTo))
  493. {
  494. var routeSet = EquRouteHelper.QueryRoute(convPosFrom, task.TASK_POSIDTO);
  495. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convPosFrom).ToList();
  496. if (routes.Count() == 0)
  497. {
  498. throw new Exception(string.Format("输送线扫描位置[{0}]任务[{1}]查询路由失败。", convPosFrom, task.TASK_NO));
  499. }
  500. else if (routes.Count() == 1)
  501. {
  502. converywrite.Goodsend = Convert.ToInt32(routes.First().ROUTE_SONPOS);
  503. }
  504. else
  505. {
  506. converywrite.Goodsend = QueryTaskPosTo(task, convPosFrom);
  507. }
  508. }
  509. else
  510. {
  511. converywrite.Goodsend = Convert.ToInt32(convPosTo);
  512. }
  513. }
  514. WriteInfoToConv(cs, converywrite);
  515. }
  516. catch (Exception ex)
  517. {
  518. BaseWorkflow.AddLedErrorMsg(convPosFrom, ex.Message, 0);
  519. LogMessageHelper.RecordLogMessage(ex);
  520. }
  521. }
  522. protected virtual WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
  523. {
  524. return ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param, 3000);
  525. }
  526. protected virtual WCS_TASK ScanningCallWmsInterface(string barcode,string convPosFrom,string exitNo, string convPosTo)
  527. {
  528. var param = new GetInTaskParam()
  529. {
  530. ContainerBarCode = barcode,
  531. ContainerType = 1,
  532. MatBarCode = string.Empty,
  533. WareHouseId = Current.Pvchouseputong,
  534. EquipmentNo = convPosFrom,
  535. EndPostion = srm,
  536. Memo2 = exitNo
  537. };
  538. return ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  539. }
  540. protected virtual int QueryTaskPosTo(WCS_TASK task,string convPosFrom)
  541. {
  542. throw new Exception(string.Format("扫描任务[{0}]有多个目标地址需要编写扩展函数。", task.TASK_NO));
  543. }
  544. protected WCS_TASK QueryTaskByBarcode(ConvSignal cs, string convNo)
  545. {
  546. if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo));
  547. if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo));
  548. if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  549. cs.BarCodeStr.ToUpper().Contains("N") ||
  550. cs.BarCodeStr.Contains("?"))
  551. {
  552. throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convNo, cs.BarCodeStr));
  553. }
  554. string code = cs.BarCodeStr;
  555. if (convNo == "1004")
  556. {
  557. code = TranslationBarCode(cs.BarCodeStr);
  558. }
  559. WCS_TASK task = null;
  560. var tasks = SugarBase.DB.Queryable<WCS_TASK>().Where(v => v.TASK_BOXBARCODE == code && v.TASK_COMTYPE == 6).ToList();
  561. foreach (var item in tasks)
  562. {
  563. if (item.TASK_WKSTATUS == 2)
  564. {
  565. int updateResult = SugarBase.DB.Updateable<WCS_TASK>(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now })
  566. .Where(it => it.TASK_NO == item.TASK_NO)
  567. .ExecuteCommand();
  568. if (updateResult <= 0)
  569. {
  570. throw new Exception(string.Format("异常任务[{0}]结束失败。", item.TASK_NO));
  571. }
  572. }
  573. else
  574. {
  575. task = item;
  576. }
  577. }
  578. if (task == null)
  579. {
  580. task = SugarBase.DB.Queryable<WCS_TASK>().Single(v => v.TASK_BOXBARCODE == code && v.TASK_COMTYPE != 6);
  581. }
  582. return task;
  583. }
  584. public class WCSWriteToConveyorSignal
  585. {
  586. public PLC Plc;
  587. /// <summary>
  588. /// DB名称
  589. /// </summary>
  590. public int DBName;
  591. /// <summary>
  592. /// 输送线编号
  593. /// </summary>
  594. public string ConveyorNo;
  595. /// <summary>
  596. /// 写入信号起始地址
  597. /// </summary>
  598. public int WriteStartAddress;
  599. /// <summary>
  600. /// 任务类型 1放货、2取货、3码盘、4拆盘 、5取托盘组、6送托盘组
  601. /// </summary>
  602. public int TaskType;
  603. /// <summary>
  604. /// AGV任务号
  605. /// </summary>
  606. public string AgvTasknum;
  607. /// <summary>
  608. /// 入库分配的堆垛机编号
  609. /// </summary>
  610. public string Srmno;
  611. public string Remark;
  612. public string Remark_TaskNo;
  613. public int TASK_WEIGHT;
  614. public bool isClearPalletizingPos = false;
  615. #region 写入PLC的WCS信息
  616. /// <summary>
  617. /// 任务号
  618. /// </summary>
  619. public int Tasknum;
  620. /// <summary>
  621. /// 货物条码
  622. /// </summary>
  623. public int Goodscode;
  624. /// <summary>
  625. /// 货物类型(1.熟化架 2.原膜托盘)
  626. /// </summary>
  627. public int Goodstype;
  628. /// <summary>
  629. /// 货物尺寸
  630. /// </summary>
  631. public int Goodssize;
  632. /// <summary>
  633. /// 起始地址
  634. /// </summary>
  635. public int Goodsstart;
  636. /// <summary>
  637. /// 目标地址
  638. /// </summary>
  639. public int Goodsend;
  640. /// <summary>
  641. /// WCS确认信号
  642. /// </summary>
  643. public bool Confirm;
  644. /// <summary>
  645. /// 任务删除
  646. /// </summary>
  647. public bool TaskDelete;
  648. /// <summary>
  649. /// 上位未分配任务
  650. /// </summary>
  651. public bool Notask;
  652. /// <summary>
  653. /// 子托盘颜色1
  654. /// </summary>
  655. public bool TrayColor_One;
  656. /// <summary>
  657. /// 子托盘颜色2
  658. /// </summary>
  659. public bool TrayColor_Two;
  660. /// <summary>
  661. /// 子托盘颜色3
  662. /// </summary>
  663. public bool TrayColor_Three;
  664. /// <summary>
  665. /// 备用(放货请求)
  666. /// </summary>
  667. public bool UpMatRequest;
  668. /// <summary>
  669. /// 备用(放货完成)
  670. /// </summary>
  671. public bool Res01;
  672. /// <summary>
  673. /// 备用(取货请求)
  674. /// </summary>
  675. public bool Res02;
  676. /// <summary>
  677. /// 备用(取货完成)
  678. /// </summary>
  679. public int Res03;
  680. /// <summary>
  681. /// 备用
  682. /// </summary>
  683. public int Res04;
  684. #endregion;
  685. }
  686. }
  687. }