ConveyorPlc01.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  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. var param = new GetInTaskParam()
  130. {
  131. ContainerBarCode = cs.BarCodeStr,
  132. ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1,
  133. MatBarCode = string.Empty,
  134. WareHouseId = Current.Pvchouseputong,
  135. EquipmentNo = convNo,
  136. EndPostion = srm,
  137. Memo2 = exitNo
  138. };
  139. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  140. }
  141. if (task == null) return;
  142. //判断任务是否已经执行
  143. if (task.TASK_WKSTATUS >= 2) return;
  144. bool notask = false;
  145. int goodsend = 0;
  146. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  147. {
  148. notask = true;
  149. goodsend = Convert.ToInt32(exitNo);
  150. }
  151. else
  152. {
  153. if (iscurPosNo)
  154. {
  155. goodsend = Convert.ToInt32(convNo);
  156. }
  157. else
  158. {
  159. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  160. var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == convNo);
  161. goodsend = Convert.ToInt32(route.ROUTE_SONPOS);
  162. }
  163. }
  164. if (goodsend == 0) return;
  165. var converywrite = new WCSWriteToConveyorSignal()
  166. {
  167. Plc = plc.Plc,
  168. DBName = plc.WriteDBName,
  169. ConveyorNo = convNo,
  170. WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox,
  171. Tasknum = task.TASK_NO,
  172. Goodstype = 1,
  173. Goodssize = 0,//
  174. Goodsstart = Convert.ToInt32(convNo),
  175. Goodsend = goodsend,
  176. Notask = notask
  177. };
  178. if (convNo == Conv_1451)
  179. {
  180. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString());
  181. }
  182. WriteInfoToConv(cs, converywrite);
  183. }
  184. catch (Exception ex)
  185. {
  186. LogMessageHelper.RecordLogMessage(ex);
  187. }
  188. }
  189. protected override WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
  190. {
  191. //if (param.EquipmentNo == Conv_1004)
  192. //{
  193. // param.Memo1 = "1";
  194. //}
  195. return base.ScanningCallWmsInterface(param);
  196. }
  197. /// <summary>
  198. /// 输送线扫码执行
  199. /// </summary>
  200. private void Conv_Scanning_1456()
  201. {
  202. try
  203. {
  204. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  205. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1456);
  206. var cs = conveyor.EquSignal_Conv;
  207. if (!cs.DB521_Request) return;
  208. if (cs.DB520_Confirm) return;
  209. if (cs.DB521_Tasknum <= 0) return;
  210. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", Conv_1456));
  211. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", Conv_1456));
  212. //if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  213. // cs.BarCodeStr.ToUpper().Contains("N") ||
  214. // cs.BarCodeStr.Contains("?"))
  215. //{
  216. // throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", Conv_1456, cs.BarCodeStr));
  217. //}
  218. var converywrite = new WCSWriteToConveyorSignal();
  219. converywrite.Plc = plc.Plc;
  220. converywrite.DBName = plc.WriteDBName;
  221. converywrite.ConveyorNo = Conv_1456;
  222. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  223. var tasktemp = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDTO == Conv_1456 && v.TASK_WKSTATUS > 1 && v.TASK_COMTYPE == 2);
  224. if (tasktemp != null)
  225. {
  226. converywrite.Notask = true;
  227. string msg = string.Format("出入口[{0}]存在出库任务[{1}]不能执行入库", Conv_1456, tasktemp.TASK_NO);
  228. BaseWorkflow.AddLedErrorMsg(Conv_1456, msg, 1);
  229. }
  230. else
  231. {
  232. var task = QueryTaskByBarcode(cs, Conv_1456);
  233. //var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr);
  234. if (task == null)
  235. {
  236. var param = new GetInTaskParam()
  237. {
  238. ContainerBarCode = cs.BarCodeStr,
  239. ContainerType = 1,
  240. MatBarCode = string.Empty,
  241. WareHouseId = Current.Pvchouseputong,
  242. EquipmentNo = Conv_1456,
  243. EndPostion = srm,
  244. Memo1 = "1",
  245. Memo2 = Conv_1456
  246. };
  247. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  248. }
  249. if (task == null) return;
  250. //判断任务是否已经执行
  251. if (task.TASK_WKSTATUS >= 2) return;
  252. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  253. {
  254. converywrite.Notask = true;
  255. }
  256. converywrite.Tasknum = task.TASK_NO;
  257. converywrite.Goodstype = 1;
  258. converywrite.Goodssize = 0;//
  259. converywrite.Goodsstart = Convert.ToInt32(Conv_1456);
  260. converywrite.Goodsend = converywrite.Goodsstart;
  261. }
  262. //WriteInfoToConveyor(cs, converywrite);
  263. WriteInfoToConv(cs, converywrite);
  264. }
  265. catch (Exception ex)
  266. {
  267. LogMessageHelper.RecordLogMessage(ex);
  268. }
  269. }
  270. /// <summary>
  271. /// 输送线无扫码执行任务
  272. /// </summary>
  273. /// <param name="convNo">扫码输送线</param>
  274. /// <param name="exitNo">扫码异常退出口</param>
  275. /// <param name="endPosIsCurConv">目标地址是否当前输送线</param>
  276. /// <param name="plcindex">PLC索引</param>
  277. private void Conv_NotScannExeTask(string convNo, string exitNo, bool endPosIsCurConv = false, int plcindex = 0)
  278. {
  279. try
  280. {
  281. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  282. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  283. var cs = conveyor.EquSignal_Conv;
  284. if (cs.DB523_Fault) return;
  285. if (!cs.DB521_Request) return;
  286. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo && v.TASK_POSIDCUR == convNo && v.TASK_POSIDNEXT == convNo && v.TASK_WKSTATUS <= 1);
  287. if (task == null)
  288. {
  289. throw new Exception(string.Format("输送线[{0}]有请求未查询到任务信息", convNo));
  290. }
  291. var converywrite = new WCSWriteToConveyorSignal();
  292. converywrite.Plc = plc.PlcInstanceSet[plcindex];//plc.Plc;
  293. converywrite.DBName = plc.WriteDBName;
  294. converywrite.ConveyorNo = convNo;
  295. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  296. converywrite.Tasknum = task.TASK_NO;
  297. converywrite.Goodscode = 0;
  298. converywrite.Goodstype = 0;
  299. converywrite.Goodssize = 0;
  300. converywrite.Goodsstart = Convert.ToInt32(convNo);
  301. if (endPosIsCurConv)
  302. {
  303. converywrite.Goodsend = converywrite.Goodsstart;
  304. }
  305. else
  306. {
  307. //if (task.TASK_POSIDTO == srm)
  308. //{
  309. // ThreadHelper.TaskThread(BaseWorkflow.AssignSrm, task, 2000);
  310. // return;
  311. //}
  312. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  313. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  314. if (routes.Count == 1)
  315. {
  316. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  317. }
  318. else
  319. {
  320. converywrite.Goodsend = ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes);
  321. }
  322. }
  323. WriteInfoToConv(cs, converywrite);
  324. }
  325. catch (Exception ex)
  326. {
  327. LogMessageHelper.RecordLogMessage(ex);
  328. }
  329. }
  330. /// <summary>
  331. /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)
  332. /// </summary>
  333. private void SrmOutConvExeTask(string plcName, string convNo, bool endPosIsCurConv = false)
  334. {
  335. try
  336. {
  337. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName);
  338. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  339. var cs = conveyor.EquSignal_Conv;
  340. if (!cs.DB521_Request) return;
  341. if (cs.DB523_Fault) return;
  342. var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList();
  343. var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成);
  344. if (task == null)
  345. {
  346. throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo));
  347. }
  348. var converywrite = new WCSWriteToConveyorSignal();
  349. converywrite.Plc = plc.Plc;
  350. converywrite.DBName = plc.WriteDBName;
  351. converywrite.ConveyorNo = convNo;
  352. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  353. converywrite.Tasknum = task.TASK_NO;
  354. converywrite.Goodscode = 0;
  355. converywrite.Goodstype = 0;
  356. converywrite.Goodssize = 0;
  357. converywrite.Goodsstart = Convert.ToInt32(convNo);
  358. if (endPosIsCurConv)
  359. {
  360. converywrite.Goodsend = converywrite.Goodsstart;
  361. }
  362. else
  363. {
  364. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  365. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  366. if (routes.Count == 1)
  367. {
  368. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  369. }
  370. else
  371. {
  372. throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO));
  373. }
  374. }
  375. //WriteInfoToConveyor(cs, converywrite);
  376. WriteInfoToConv(cs, converywrite);
  377. }
  378. catch (Exception ex)
  379. {
  380. LogMessageHelper.RecordLogMessage(ex);
  381. }
  382. }
  383. public override int ConveyorWriteTaskExecuteToMoreAddress(string convNo, WCS_TASK task, List<WCS_EQUIPMENTROUTE> routes)
  384. {
  385. int goodsend = 0;
  386. if (convNo == Conv_1013 || convNo == Conv_1009)
  387. {
  388. if (task.TASK_EndTunnelNum == "1" && task.TASK_SRMNO == "srm01")
  389. {
  390. goodsend = 1027;
  391. }
  392. else if (task.TASK_EndTunnelNum == "2" && task.TASK_SRMNO == "srm01")
  393. {
  394. goodsend = 1026;
  395. }
  396. else
  397. {
  398. throw new Exception(string.Format("任务[{0}]堆垛机编号[{1}]目标巷道[{2}]不正确。", task.TASK_NO, task.TASK_SRMNO, task.TASK_EndTunnelNum));
  399. }
  400. }
  401. else if (convNo == Conv_1023)
  402. {
  403. BaseWorkflow.AssignSrm(task);
  404. if (task.TASK_EndTunnelNum == "1")
  405. {
  406. goodsend = 1027;
  407. }
  408. else if (task.TASK_EndTunnelNum == "2")
  409. {
  410. goodsend = 1026;
  411. }
  412. else
  413. {
  414. throw new Exception(string.Format("任务[{0}]分配巷道失败。", task.TASK_NO));
  415. }
  416. }
  417. else
  418. {
  419. throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。"));
  420. }
  421. return goodsend;
  422. }
  423. #endregion;
  424. }
  425. }