ConveyorPlc01.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using WCS.Data;
  7. using WCS.Data.Models;
  8. using WCS.Data.Utils;
  9. using WCS.PLC;
  10. namespace WCS.Workflow
  11. {
  12. public class ConveyorPlc01 : Base_Conv
  13. {
  14. #region 只读变量
  15. private readonly string Conv_1002 = "1002";
  16. private readonly string Conv_1004 = "1004";
  17. private readonly string Conv_1013 = "1013";
  18. private readonly string Conv_1023 = "1023";
  19. private readonly string Conv_1009 = "1009";
  20. private readonly string Conv_1454 = "1454";
  21. private readonly string Conv_1455 = "1455";
  22. private readonly string Conv_1456 = "1456";
  23. private readonly string Conv_1441 = "1441";
  24. private readonly string Conv_1440 = "1440";
  25. private readonly string Conv_1442 = "1442";
  26. private readonly string Conv_1445 = "1445";
  27. private readonly string Conv_1447 = "1447";
  28. private readonly string Conv_1449 = "1449";
  29. private readonly string Conv_1451 = "1451";
  30. #endregion;
  31. #region 重载实现
  32. /// <summary>
  33. /// 调度PLC执行任务
  34. /// </summary>
  35. public override void Run()
  36. {
  37. //刷新任务数据
  38. WCSWorkflow.RefreshData();
  39. //扫码执行任务
  40. Conv_ScanBarCodeExeTask();
  41. //电控无扫码执行任务
  42. Conv_NoScanExeTask();
  43. //堆垛机出口任务执行
  44. SrmOutConvExeTask();
  45. //出口任务完成
  46. ConvTaskFinish();
  47. //输送机执行任务
  48. ConveyorWriteTaskExecute();
  49. }
  50. #endregion;
  51. #region 多线程调用
  52. #endregion;
  53. #region 模块调用
  54. private void Conv_NoScanExeTask()
  55. {
  56. Conv_NotScannExeTask(Conv_1013, string.Empty);
  57. //ThreadHelper.TaskThread(Conv_NotScannExeTask_1013);
  58. //ThreadHelper.TaskThread(Conv_NotScannExeTask_1004);
  59. //Conv_NotScannExeTask(Conv_1004, string.Empty, false, 1);
  60. }
  61. private static int _conv_NotScannExeTask = 0;
  62. /// <summary>
  63. /// 1013请求入库
  64. /// </summary>
  65. public void Conv_NotScannExeTask_1013()
  66. {
  67. if (Interlocked.Exchange(ref _conv_NotScannExeTask, 1) == 0)
  68. {
  69. Conv_NotScannExeTask(Conv_1013, string.Empty, false, 0);
  70. Interlocked.Exchange(ref _conv_NotScannExeTask, 0);
  71. }
  72. }
  73. //public void Conv_NotScannExeTask_1004()
  74. //{
  75. // if (Interlocked.Exchange(ref _conv_NotScannExeTask, 1) == 0)
  76. // {
  77. // Conv_NotScannExeTask(Conv_1004, string.Empty, false, 0);
  78. // Interlocked.Exchange(ref _conv_NotScannExeTask, 0);
  79. // }
  80. //}
  81. private void ConvTaskFinish()
  82. {
  83. ConveyorTaskFinish(PlcName, Conv_1454);
  84. ConveyorTaskFinish(PlcName, Conv_1455);
  85. ConveyorTaskFinish(PlcName, Conv_1456, false, true);
  86. ConveyorTaskFinish(PlcName, Conv_1445, false, true);
  87. ConveyorTaskFinish(PlcName, Conv_1447, false, true);
  88. ConveyorTaskFinish(PlcName, Conv_1449, false, true);
  89. }
  90. /// <summary>
  91. /// 扫码执行任务
  92. /// </summary>
  93. private void Conv_ScanBarCodeExeTask()
  94. {
  95. Conv_Scanning_1456();
  96. Conv_ScanningRequestIn(Conv_1451, Conv_1451);
  97. Conv_ScanningRequest(Conv_1004, Current.WareHouseId, Conv_1002);
  98. }
  99. /// <summary>
  100. /// WCS写入输送线执行任务
  101. /// </summary>
  102. private void ConveyorWriteTaskExecute()
  103. {
  104. ConveyorWriteTaskExecute(Conv_1009);
  105. ConveyorWriteTaskExecute(Conv_1023);
  106. }
  107. private void SrmOutConvExeTask()
  108. {
  109. SrmOutConvExeTask(PlcName, Conv_1454, true);
  110. SrmOutConvExeTask(PlcName, Conv_1455, true);
  111. SrmOutConvExeTask(PlcName, Conv_1456, true);
  112. SrmOutConvExeTask(PlcName, Conv_1441, false);
  113. SrmOutConvExeTask(PlcName, Conv_1442, true);
  114. }
  115. #endregion;
  116. #region 功能实现
  117. private void Conv_ScanningRequestIn(string convNo, string exitNo, bool iscurPosNo = true)
  118. {
  119. try
  120. {
  121. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  122. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  123. var cs = conveyor.EquSignal_Conv;
  124. if (!cs.DB521_Request) return;
  125. if (cs.DB520_Confirm) return;
  126. WCS_TASK task = QueryTaskByBarcode(cs, convNo);
  127. if (task == null)
  128. {
  129. if (WcsScanConvIsUsed(convNo))
  130. {
  131. var param = new GetInTaskParam()
  132. {
  133. ContainerBarCode = cs.BarCodeStr,
  134. ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1,
  135. MatBarCode = string.Empty,
  136. WareHouseId = Current.Pvchouseputong,
  137. EquipmentNo = convNo,
  138. EndPostion = srm,
  139. Memo2 = exitNo
  140. };
  141. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  142. }
  143. }
  144. if (task == null) return;
  145. //判断任务是否已经执行
  146. if (task.TASK_WKSTATUS >= 2) return;
  147. bool notask = false;
  148. int goodsend = 0;
  149. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  150. {
  151. notask = true;
  152. goodsend = Convert.ToInt32(exitNo);
  153. }
  154. else
  155. {
  156. if (iscurPosNo)
  157. {
  158. goodsend = Convert.ToInt32(convNo);
  159. }
  160. else
  161. {
  162. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  163. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == convNo);
  164. goodsend = Convert.ToInt32(route.ROUTE_SONPOS);
  165. }
  166. }
  167. if (goodsend == 0) return;
  168. var converywrite = new WCSWriteToConveyorSignal()
  169. {
  170. Plc = plc.Plc,
  171. DBName = plc.WriteDBName,
  172. ConveyorNo = convNo,
  173. WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,
  174. Tasknum = task.TASK_NO,
  175. Goodstype = 1,
  176. Goodssize = 0,//
  177. Goodsstart = Convert.ToInt32(convNo),
  178. Goodsend = goodsend,
  179. Notask = notask
  180. };
  181. if (convNo == Conv_1451)
  182. {
  183. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString());
  184. }
  185. WriteInfoToConv(cs, converywrite);
  186. }
  187. catch (Exception ex)
  188. {
  189. LogMessageHelper.RecordLogMessage(ex);
  190. }
  191. }
  192. protected override WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
  193. {
  194. //if (param.EquipmentNo == Conv_1004)
  195. //{
  196. // param.Memo1 = "1";
  197. //}
  198. return base.ScanningCallWmsInterface(param);
  199. }
  200. /// <summary>
  201. /// 输送线扫码执行
  202. /// </summary>
  203. private void Conv_Scanning_1456()
  204. {
  205. try
  206. {
  207. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  208. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1456);
  209. var cs = conveyor.EquSignal_Conv;
  210. if (!cs.DB521_Request) return;
  211. if (cs.DB520_Confirm) return;
  212. if (cs.DB521_Tasknum <= 0) return;
  213. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", Conv_1456));
  214. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", Conv_1456));
  215. //if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  216. // cs.BarCodeStr.ToUpper().Contains("N") ||
  217. // cs.BarCodeStr.Contains("?"))
  218. //{
  219. // throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", Conv_1456, cs.BarCodeStr));
  220. //}
  221. var converywrite = new WCSWriteToConveyorSignal();
  222. converywrite.Plc = plc.Plc;
  223. converywrite.DBName = plc.WriteDBName;
  224. converywrite.ConveyorNo = Conv_1456;
  225. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  226. var tasktemp = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDTO == Conv_1456 && v.TASK_WKSTATUS > 1 && v.TASK_COMTYPE == 2);
  227. if (tasktemp != null)
  228. {
  229. converywrite.Notask = true;
  230. string msg = string.Format("出入口[{0}]存在出库任务[{1}]不能执行入库", Conv_1456, tasktemp.TASK_NO);
  231. BaseWorkflow.AddLedErrorMsg(Conv_1456, msg, 1);
  232. }
  233. else
  234. {
  235. var task = QueryTaskByBarcode(cs, Conv_1456);
  236. //var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr);
  237. if (task == null)
  238. {
  239. if (WcsScanConvIsUsed(Conv_1456))
  240. {
  241. var param = new GetInTaskParam()
  242. {
  243. ContainerBarCode = cs.BarCodeStr,
  244. ContainerType = 1,
  245. MatBarCode = string.Empty,
  246. WareHouseId = Current.Pvchouseputong,
  247. EquipmentNo = Conv_1456,
  248. EndPostion = srm,
  249. Memo1 = "1",
  250. Memo2 = Conv_1456
  251. };
  252. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  253. }
  254. }
  255. if (task == null) return;
  256. //判断任务是否已经执行
  257. if (task.TASK_WKSTATUS >= 2) return;
  258. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  259. {
  260. converywrite.Notask = true;
  261. }
  262. converywrite.Tasknum = task.TASK_NO;
  263. converywrite.Goodstype = 1;
  264. converywrite.Goodssize = 0;//
  265. converywrite.Goodsstart = Convert.ToInt32(Conv_1456);
  266. converywrite.Goodsend = converywrite.Goodsstart;
  267. }
  268. //WriteInfoToConveyor(cs, converywrite);
  269. WriteInfoToConv(cs, converywrite);
  270. }
  271. catch (Exception ex)
  272. {
  273. LogMessageHelper.RecordLogMessage(ex);
  274. }
  275. }
  276. /// <summary>
  277. /// 输送线无扫码执行任务
  278. /// </summary>
  279. /// <param name="convNo">扫码输送线</param>
  280. /// <param name="exitNo">扫码异常退出口</param>
  281. /// <param name="endPosIsCurConv">目标地址是否当前输送线</param>
  282. /// <param name="plcindex">PLC索引</param>
  283. private void Conv_NotScannExeTask(string convNo, string exitNo, bool endPosIsCurConv = false, int plcindex = 0)
  284. {
  285. try
  286. {
  287. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  288. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  289. var cs = conveyor.EquSignal_Conv;
  290. if (cs.DB523_Fault) return;
  291. if (!cs.DB521_Request) return;
  292. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo && v.TASK_POSIDCUR == convNo && v.TASK_POSIDNEXT == convNo && v.TASK_WKSTATUS <= 1);
  293. if (task == null)
  294. {
  295. throw new Exception(string.Format("输送线[{0}]有请求未查询到任务信息", convNo));
  296. }
  297. var converywrite = new WCSWriteToConveyorSignal();
  298. converywrite.Plc = plc.PlcInstanceSet[plcindex];//plc.Plc;
  299. converywrite.DBName = plc.WriteDBName;
  300. converywrite.ConveyorNo = convNo;
  301. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  302. converywrite.Tasknum = task.TASK_NO;
  303. converywrite.Goodscode = 0;
  304. converywrite.Goodstype = 0;
  305. converywrite.Goodssize = 0;
  306. converywrite.Goodsstart = Convert.ToInt32(convNo);
  307. if (endPosIsCurConv)
  308. {
  309. converywrite.Goodsend = converywrite.Goodsstart;
  310. }
  311. else
  312. {
  313. //if (task.TASK_POSIDTO == srm)
  314. //{
  315. // ThreadHelper.TaskThread(BaseWorkflow.AssignSrm, task, 2000);
  316. // return;
  317. //}
  318. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  319. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  320. if (routes.Count == 1)
  321. {
  322. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  323. }
  324. else
  325. {
  326. converywrite.Goodsend = ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes);
  327. }
  328. }
  329. WriteInfoToConv(cs, converywrite);
  330. }
  331. catch (Exception ex)
  332. {
  333. LogMessageHelper.RecordLogMessage(ex);
  334. }
  335. }
  336. /// <summary>
  337. /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)
  338. /// </summary>
  339. private void SrmOutConvExeTask(string plcName, string convNo, bool endPosIsCurConv = false)
  340. {
  341. try
  342. {
  343. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);
  344. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  345. var cs = conveyor.EquSignal_Conv;
  346. if (!cs.DB521_Request) return;
  347. if (cs.DB523_Fault) return;
  348. var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList();
  349. var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成);
  350. if (task == null)
  351. {
  352. throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo));
  353. }
  354. var converywrite = new WCSWriteToConveyorSignal();
  355. converywrite.Plc = plc.Plc;
  356. converywrite.DBName = plc.WriteDBName;
  357. converywrite.ConveyorNo = convNo;
  358. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  359. converywrite.Tasknum = task.TASK_NO;
  360. converywrite.Goodscode = 0;
  361. converywrite.Goodstype = 0;
  362. converywrite.Goodssize = 0;
  363. converywrite.Goodsstart = Convert.ToInt32(convNo);
  364. if (endPosIsCurConv)
  365. {
  366. converywrite.Goodsend = converywrite.Goodsstart;
  367. }
  368. else
  369. {
  370. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  371. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  372. if (routes.Count == 1)
  373. {
  374. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  375. }
  376. else
  377. {
  378. throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO));
  379. }
  380. }
  381. //WriteInfoToConveyor(cs, converywrite);
  382. WriteInfoToConv(cs, converywrite);
  383. }
  384. catch (Exception ex)
  385. {
  386. LogMessageHelper.RecordLogMessage(ex);
  387. }
  388. }
  389. public override int ConveyorWriteTaskExecuteToMoreAddress(string convNo, WCS_TASK task, List<WCS_EQUIPMENTROUTE> routes)
  390. {
  391. int goodsend = 0;
  392. if (convNo == Conv_1013 || convNo == Conv_1009)
  393. {
  394. if (task.TASK_EndTunnelNum == "1" && task.TASK_SRMNO == "srm01")
  395. {
  396. goodsend = 1027;
  397. }
  398. else if (task.TASK_EndTunnelNum == "2" && task.TASK_SRMNO == "srm06")
  399. {
  400. goodsend = 1026;
  401. }
  402. else
  403. {
  404. throw new Exception(string.Format("任务[{0}]堆垛机编号[{1}]目标巷道[{2}]不正确。", task.TASK_NO, task.TASK_SRMNO, task.TASK_EndTunnelNum));
  405. }
  406. }
  407. else if (convNo == Conv_1023)
  408. {
  409. BaseWorkflow.AssignSrm(task);
  410. if (task.TASK_EndTunnelNum == "1")
  411. {
  412. goodsend = 1027;
  413. }
  414. else if (task.TASK_EndTunnelNum == "2")
  415. {
  416. goodsend = 1026;
  417. }
  418. else
  419. {
  420. throw new Exception(string.Format("任务[{0}]分配巷道失败。", task.TASK_NO));
  421. }
  422. }
  423. else
  424. {
  425. throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。"));
  426. }
  427. return goodsend;
  428. }
  429. #endregion;
  430. }
  431. }