ConvPlc04.cs 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  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;
  10. using WCS.PLC.Model.Equipment;
  11. namespace WCS.Workflow
  12. {
  13. public class ConvPlc04 : Base_Conv
  14. {
  15. #region 只读变量
  16. private readonly string Conv_1143 = "1143";//4堆垛机出口
  17. private readonly string Conv_1141 = "1141";//5堆垛机出口
  18. private readonly string Conv_1508 = "1508";//熟化房一
  19. private readonly string Conv_1509 = "1509";//熟化房二
  20. private readonly string Conv_1164 = "1164";//熟化房一
  21. private readonly string Conv_1165 = "1165";//熟化房二
  22. private readonly string Conv_1136 = "1136";//熟化房入口一
  23. private readonly string Conv_1138 = "1138";//熟化房入口二
  24. private readonly string Conv_1137 = "1137";//熟化房出口一
  25. private readonly string Conv_1139 = "1139";//熟化房出口二
  26. private readonly string Conv_1161 = "1161";//2号堆垛机出库(3楼男面)
  27. private readonly string Conv_1159 = "1159";//3号堆垛机出库(3楼男面)
  28. private readonly string Conv_1160 = "1160";//3号堆垛机出库(3楼男面)
  29. private readonly string Conv_1152 = "1152";//4号堆垛机出库(3楼男面)
  30. private readonly string Conv_1151 = "1151";//5号堆垛机出库(3楼男面)
  31. private readonly string Conv_1155 = "1155";
  32. private readonly string Conv_1156 = "1156";
  33. private readonly string Conv_1157 = "1157";
  34. private readonly string Conv_1158 = "1158";
  35. #endregion 只读变量
  36. #region 重载实现
  37. public override void Run()
  38. {
  39. //刷新任务数据
  40. WCSWorkflow.RefreshData();
  41. //上传熟化开始结束时间信息
  42. ThreadHelper.TaskThread(MatureSignalGet);
  43. //更新熟化连续模式
  44. ThreadHelper.TaskThread(UploadMatureMode);
  45. //堆垛机出口执行
  46. SrmOutConvExeTask();
  47. //输送线执行
  48. ConveyorWriteTaskExecute();
  49. //扫描入库
  50. Conv_ScanBarCodeExeTask();
  51. //更新熟化房当前信息到数据库
  52. ThreadHelper.TaskThread(MatureRoomRefresh);
  53. //任务完成
  54. ConvTaskFinish();
  55. //熟化房申请出库熟化
  56. ThreadHelper.TaskThread(ReqestInByMatureRoom);
  57. //进入熟化房请求确认
  58. RequestInByMatureConv(Conv_1136, Conv_1508);
  59. RequestInByMatureConv(Conv_1138, Conv_1509);
  60. //熟化房完成
  61. MatureConvFinish(Conv_1137, Conv_1508);
  62. MatureConvFinish(Conv_1139, Conv_1509);
  63. //熟化房输送线请求入库
  64. RequestOutByMatureConv(Conv_1137, Conv_1508);
  65. RequestOutByMatureConv(Conv_1139, Conv_1509);
  66. }
  67. #endregion 重载实现
  68. #region 功能实现
  69. private static int _atureRoomRefresh = 0;
  70. private void MatureRoomRefresh()
  71. {
  72. if (Interlocked.Exchange(ref _atureRoomRefresh, 1) == 0)
  73. {
  74. try
  75. {
  76. Thread.Sleep(6000);
  77. var matureRoomSet = SugarBase.DB.Queryable<MatureRoomInfo>().ToList();
  78. List<string> list = new List<string>() { Conv_1508, Conv_1509 };
  79. foreach (var item in list)
  80. {
  81. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  82. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item);
  83. var cs = conveyor.EquSignal_Conv;
  84. bool isOnLine = cs.DB521_Goodstype == 0 ? false : true;
  85. string faultMsg = cs.MatureRoomFault.ToString();
  86. var matureRoom = matureRoomSet.FirstOrDefault(v => v.MatureRoomNo == item);
  87. //修改熟化房的状态
  88. SugarBase.DB.Updateable<MatureRoomInfo>(it => new MatureRoomInfo()
  89. {
  90. MatureRoomTemperat = cs.DB521_Res04,
  91. MatureRoomDate = cs.DB521_Goodssize,
  92. MatureRoomIsOnLine = isOnLine,
  93. MatureRoomMode = cs.DB521_Goodsstart,
  94. MatureRoomTangentStatus = cs.DB521_Goodsend,
  95. MatureRoomAlaramsMsg = faultMsg
  96. })
  97. .Where(it => it.MatureRoomNo == item)
  98. .ExecuteCommand();
  99. }
  100. }
  101. catch (Exception ex)
  102. {
  103. LogMessageHelper.RecordLogMessage(ex);
  104. }
  105. finally
  106. {
  107. Interlocked.Exchange(ref _atureRoomRefresh, 0);
  108. }
  109. }
  110. }
  111. private static int _matureSignalGet = 0;
  112. private void MatureSignalGet()
  113. {
  114. if (Interlocked.Exchange(ref _matureSignalGet, 1) == 0)
  115. {
  116. try
  117. {
  118. List<string> list = new List<string>() { Conv_1164, Conv_1165 };
  119. foreach (var item in list)//1164、1165
  120. {
  121. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  122. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item);
  123. var cs = conveyor.EquSignal_Conv;
  124. // 开始与结束信号已被PLC复位,同时开始与结束确认信号为置位状态,开始复位确认信号
  125. if (!cs.DB521_B_Outside && !cs.DB521_L_Outside && cs.DB520_Confirm && cs.DB520_TaskDelete)
  126. {
  127. var converywrite = new WCSWriteToConveyorSignal();
  128. converywrite.Plc = plc.Plc;
  129. converywrite.DBName = plc.WriteDBName;
  130. converywrite.ConveyorNo = item;
  131. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  132. converywrite.Confirm = false;
  133. converywrite.TaskDelete = false;
  134. WriteTaskToBuffer(converywrite);
  135. }
  136. string matureNo = item == "1164" ? "A" : "B";
  137. if (!cs.DB521_B_Outside && !cs.DB521_L_Outside) return;
  138. int isContinueMode = cs.DB521_F_Outside == true ? 1 : 0;//是否连续熟化模式
  139. int num = cs.DB521_Goodstype;//熟化架数量
  140. if (cs.DB521_B_Outside && !cs.DB520_Confirm)//开始熟化标志 DB520_Confirm 开始确认标志
  141. {
  142. //调用上传WMS的接口上传熟化房信息
  143. var param = new GetMatureContinueParam
  144. {
  145. MatureRoomNo = matureNo,
  146. IsContinueMode = isContinueMode,
  147. MatureStartTime = DateTime.Now,
  148. MatureEndTime = null,
  149. MatureFrameNum = num
  150. };
  151. BaseWorkflow.GetMatureContinueMode(param, item, plc, 1);
  152. }
  153. if (cs.DB521_L_Outside && !cs.DB520_TaskDelete)////结束熟化标志 DB520_TaskDelete 结束确认标志
  154. {
  155. //调用上传WMS的接口上传熟化房信息
  156. var param = new GetMatureContinueParam
  157. {
  158. MatureRoomNo = matureNo,
  159. IsContinueMode = isContinueMode,
  160. MatureStartTime = null,
  161. MatureEndTime = DateTime.Now,
  162. MatureFrameNum = num
  163. };
  164. BaseWorkflow.GetMatureContinueMode(param, item, plc, 2);
  165. }
  166. }
  167. }
  168. catch (Exception ex)
  169. {
  170. LogMessageHelper.RecordLogMessage(ex);
  171. }
  172. finally
  173. {
  174. Interlocked.Exchange(ref _matureSignalGet, 0);
  175. }
  176. }
  177. }
  178. private static int _uploadMode = 0;
  179. private void UploadMatureMode()
  180. {
  181. if (Interlocked.Exchange(ref _uploadMode, 1) == 0)
  182. {
  183. try
  184. {
  185. List<string> list = new List<string>() { Conv_1164, Conv_1165 };
  186. string s = "BakeMode_";
  187. foreach (var item in list)
  188. {
  189. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  190. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item);
  191. var cs = conveyor.EquSignal_Conv;
  192. string matureNo = item == "1164" ? "A" : "B";
  193. var value = s + matureNo;
  194. //获取连续模式值
  195. var plcValue = cs.DB521_F_Outside.ToString();
  196. var sysset = SugarBase.DB.Queryable<WCS_SYSSET>().Where(v => v.SET_ID == value).First();
  197. if (sysset != null)
  198. {
  199. if (plcValue != sysset.SET_VALUE)
  200. {
  201. string result = TryCachHelper.TryTranExecute((db) =>
  202. {
  203. db.Updateable<WCS_SYSSET>(it => new WCS_SYSSET()
  204. {
  205. SET_VALUE = plcValue,
  206. })
  207. .Where(it => it.SET_ID == value)
  208. .ExecuteCommand();
  209. });
  210. if (!string.IsNullOrWhiteSpace(result))
  211. {
  212. throw new Exception(result);
  213. }
  214. }
  215. }
  216. }
  217. }
  218. catch (Exception ex)
  219. {
  220. LogMessageHelper.RecordLogMessage(ex);
  221. }
  222. finally
  223. {
  224. Interlocked.Exchange(ref _uploadMode, 0);
  225. }
  226. }
  227. }
  228. private void Conv_ScanBarCodeExeTask()
  229. {
  230. Conv_ScanningIn(Conv_1155, Conv_1155);
  231. //Conv_ScanningIn(Conv_1156, Conv_1156);
  232. //Conv_ScanningIn(Conv_1157, Conv_1157);
  233. Conv_ScanningIn(Conv_1158, Conv_1158);
  234. }
  235. private void ConvTaskFinish()
  236. {
  237. ConveyorTaskFinish(PlcName, Conv_1155, false, true);
  238. ConveyorTaskFinish(PlcName, Conv_1156, false, true);
  239. ConveyorTaskFinish(PlcName, Conv_1157, false, true);
  240. ConveyorTaskFinish(PlcName, Conv_1158, false, true);
  241. }
  242. protected override WCS_TASK ScanningCallWmsInterface(GetInTaskParam param)
  243. {
  244. if (param.EquipmentNo == Conv_1155 || param.EquipmentNo == Conv_1156 || param.EquipmentNo == Conv_1157 || param.EquipmentNo == Conv_1158)
  245. {
  246. param.Memo1 = "1";
  247. }
  248. return base.ScanningCallWmsInterface(param);
  249. }
  250. private void Conv_ScanningIn(string convNo, string exceptionConvNo, bool isCurAddressByNext = true)
  251. {
  252. try
  253. {
  254. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  255. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  256. var cs = conveyor.EquSignal_Conv;
  257. if (!cs.DB521_Request) return;
  258. if (cs.DB520_Confirm) return;
  259. var task = QueryTaskByBarcode(cs, convNo);
  260. if ((convNo == Conv_1155 || convNo == Conv_1158) && cs.DB521_Goodstype == 0)
  261. {
  262. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]外捡高度为零,WCS默认标识为1", convNo), true, LogLevelEnum.INFO.ToString());
  263. }
  264. if (task == null)
  265. {
  266. if (WcsScanConvIsUsed(convNo))
  267. {
  268. var param = new GetInTaskParam();
  269. param.ContainerBarCode = cs.BarCodeStr;
  270. param.ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1;
  271. param.MatBarCode = string.Empty;
  272. param.WareHouseId = Current.Pvchouseputong;
  273. param.EquipmentNo = convNo;
  274. param.EndPostion = srm;
  275. param.Memo1 = "1";
  276. param.Memo2 = exceptionConvNo;
  277. task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param);
  278. }
  279. }
  280. //判断任务是否存在,或已经执行
  281. if (task == null || task.TASK_WKSTATUS >= 2) return;
  282. var converywrite = new WCSWriteToConveyorSignal();
  283. converywrite.Plc = plc.Plc;
  284. converywrite.DBName = plc.WriteDBName;
  285. converywrite.ConveyorNo = convNo;
  286. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  287. converywrite.Tasknum = task.TASK_NO;
  288. converywrite.Goodssize = 0;//
  289. converywrite.Goodsstart = Convert.ToInt32(convNo);
  290. if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回)
  291. {
  292. converywrite.Notask = true;
  293. converywrite.Goodsend = Convert.ToInt32(exceptionConvNo);
  294. }
  295. else if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_COMTYPE == 2 && v.TASK_POSIDNEXT == convNo))
  296. {
  297. converywrite.Notask = true;
  298. converywrite.Goodsend = Convert.ToInt32(exceptionConvNo);
  299. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]条码[{1}]不能入库,存在出库到该位置的任务。", convNo, cs.BarCodeStr), true, LogLevelEnum.INFO.ToString());
  300. }
  301. else
  302. {
  303. if (isCurAddressByNext)
  304. {
  305. converywrite.Goodsend = Convert.ToInt32(convNo);
  306. }
  307. else
  308. {
  309. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  310. var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == convNo);
  311. converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS);
  312. }
  313. }
  314. if (convNo == Conv_1155)
  315. {
  316. LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString());
  317. }
  318. WriteInfoToConv(cs, converywrite);
  319. }
  320. catch (Exception ex)
  321. {
  322. LogMessageHelper.RecordLogMessage(ex);
  323. }
  324. }
  325. private void MatureConvFinish(string convNo, string matureRoomNo)
  326. {
  327. try
  328. {
  329. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  330. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  331. var cs = conveyor.EquSignal_Conv;
  332. if (!cs.DB521_Request) return;
  333. if (cs.DB523_Fault) return;
  334. if (cs.DB521_Tasknum > 10000) return;
  335. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo));
  336. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo));
  337. MatureRoomCache atureRooCache = null;
  338. string barcode = cs.BarCodeStr;
  339. if (barcode.ToUpper().Contains("ERROR") ||
  340. barcode.ToUpper().Contains("N") ||
  341. barcode.Contains("?") ||
  342. string.IsNullOrWhiteSpace(barcode))
  343. {
  344. if (SugarBase.DB.Queryable<WCS_TASK>().Any(v => v.TASK_COMTYPE == 1 && v.TASK_POSIDFROM == matureRoomNo &&
  345. (v.TASK_WKSTATUS <= 1 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9 || (v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == convNo))))
  346. {
  347. throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]存在未完成的任务,不能重复请求生成任务,请检查熟化房与输送线对接是否存在问题。", matureRoomNo, convNo));
  348. }
  349. if (Current.TaskSet.Any(v => v.TASK_COMTYPE == 1 && v.TASK_OutMatureRoomDate != null &&
  350. (v.TASK_WKSTATUS <= 1 || v.TASK_WKSTATUS == 7 || v.TASK_WKSTATUS == 9 || (v.TASK_WKSTATUS == 2 && v.TASK_POSIDNEXT == convNo))))
  351. {
  352. throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]存在未完成的任务,不能重复请求生成任务,请检查熟化房与输送线对接是否存在问题。", matureRoomNo, convNo));
  353. }
  354. atureRooCache = SugarBase.DB.Queryable<MatureRoomCache>().Where(v => v.MatureRoomNo.Contains(matureRoomNo) && SqlFunc.IsNullOrEmpty(v.Remark)).OrderBy(v => v.InMatureRoomDate).First();
  355. barcode = atureRooCache.BARCODE;
  356. //throw new Exception(string.Format("扫码失败,熟化房[{0}]输送线[{1}]请求入库查询到队列中的条码[{2}]", matureRoomNo, convNo, barcode));
  357. LogMessageHelper.RecordLogMessage(string.Format("扫码失败,熟化房[{0}]输送线[{1}]请求入库查询到队列中的条码[{2}]", matureRoomNo, convNo, barcode), true);
  358. }
  359. else
  360. {
  361. atureRooCache = SugarBase.DB.Queryable<MatureRoomCache>().Where(v => v.MatureRoomNo.Contains(matureRoomNo) && SqlFunc.IsNullOrEmpty(v.Remark)).OrderBy(v => v.InMatureRoomDate).First();
  362. if (barcode != atureRooCache.BARCODE)
  363. {
  364. throw new Exception(string.Format("扫码成功,熟化房[{0}]读取到条码[{1}]但是与熟化房队列条码[{2}]不一致,请检查是否存在问题。", matureRoomNo, barcode, atureRooCache.BARCODE));
  365. }
  366. LogMessageHelper.RecordLogMessage(string.Format("扫码成功,读取到条码[{0}]熟化房[{1}]", barcode, matureRoomNo));
  367. }
  368. var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode);
  369. if (task == null) return;
  370. if (task.TASK_WKSTATUS == (int)WkStatus.熟化房熟化完成) return;
  371. if (task.TASK_WKSTATUS == (int)WkStatus.完成任务) return;
  372. if (task.TASK_WKSTATUS != (int)WkStatus.熟化房熟化中) return;
  373. if (task.TASK_WKSTATUS <= 1) return;
  374. //var matureTask = Current.TaskSet.Where(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化中).OrderBy(v => v.TASK_InMatureRoomDate).FirstOrDefault();
  375. //if (task.TASK_BOXBARCODE.Trim() != matureTask.TASK_BOXBARCODE.Trim())
  376. //{
  377. // throw new Exception(string.Format("熟化房[{0}]出口[{1}]扫描条码[{2}]与任务列表中条码[{3}]不一致,请检查条码问题。", matureRoomNo, convNo, cs.BarCodeStr, matureTask.TASK_BOXBARCODE));
  378. //}
  379. var roomNo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == matureRoomNo);
  380. var roomNocs = roomNo.EquSignal_Conv;
  381. int hours = roomNocs.DB521_Goodssize - 4;
  382. //DateTime inMaturedate = task.TASK_InMatureRoomDate.GetValueOrDefault().AddHours(hours);
  383. //if (inMaturedate > SugarBase.DB.GetDate())
  384. //{
  385. // throw new Exception(string.Format("条码[{0}]开始熟化时间[{1}]比要求烘烤时间低于4小时以上(严重错误),不能出库完成,请检查熟化是否存在问题。", task.TASK_BOXBARCODE, task.TASK_InMatureRoomDate, hours));
  386. //}
  387. //修改状态
  388. string result = TryCachHelper.TryTranExecute((db) =>
  389. {
  390. DateTime dt = db.GetDate();
  391. int wkstatus = task.TASK_COMTYPE == 1 ? 14 : 99;
  392. if (atureRooCache.CurrentMatureNum < atureRooCache.MatureNum)
  393. {
  394. wkstatus = 14;
  395. //修改任务的状态
  396. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  397. {
  398. TASK_WKSTATUS = wkstatus,
  399. TASK_POSIDCUR = convNo,
  400. TASK_EDITUSERNO = "WCS",
  401. TASK_EDITDATETIME = DateTime.Now
  402. })
  403. .Where(it => it.TASK_NO == task.TASK_NO)
  404. .ExecuteCommand();
  405. }
  406. else
  407. {
  408. //修改任务的状态
  409. db.Updateable<WCS_TASK>(it => new WCS_TASK()
  410. {
  411. TASK_WKSTATUS = wkstatus,
  412. TASK_POSIDCUR = convNo,
  413. TASK_OutMatureRoomDate = dt,
  414. TASK_EDITUSERNO = "WCS",
  415. TASK_EDITDATETIME = DateTime.Now
  416. })
  417. .Where(it => it.TASK_NO == task.TASK_NO)
  418. .ExecuteCommand();
  419. }
  420. //添加修改明细
  421. string msg = string.Format("任务[{0}]熟化房熟化完成", task.TASK_NO);
  422. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg);
  423. });
  424. if (!string.IsNullOrWhiteSpace(result))
  425. {
  426. throw new Exception(result);
  427. }
  428. }
  429. catch (Exception ex)
  430. {
  431. LogMessageHelper.RecordLogMessage(ex);
  432. }
  433. }
  434. private void RequestOutByMatureConv(string convNo, string matureRoomNo)
  435. {
  436. try
  437. {
  438. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  439. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  440. var cs = conveyor.EquSignal_Conv;
  441. if (!cs.DB521_Request) return;
  442. if (cs.DB523_Fault) return;
  443. if (cs.DB521_Tasknum > 10000) return;
  444. //if (cs.DB521_BCR_Noread) throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo));
  445. //if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo));
  446. string barcode = cs.BarCodeStr;
  447. WCS_TASK task = null;
  448. if (cs.BarCodeStr.ToUpper().Contains("ERROR") ||
  449. cs.BarCodeStr.ToUpper().Contains("N") ||
  450. cs.BarCodeStr.Contains("?") ||
  451. string.IsNullOrWhiteSpace(cs.BarCodeStr))
  452. {
  453. task = Current.TaskSet.SingleOrDefault(v => v.TASK_COMTYPE == 1 && v.TASK_POSIDFROM == matureRoomNo && (v.TASK_POSIDCUR == matureRoomNo || v.TASK_POSIDCUR == convNo));
  454. if (task == null)
  455. {
  456. task = Current.TaskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化完成 && (v.TASK_POSIDCUR == convNo || v.TASK_POSIDCUR == matureRoomNo));
  457. }
  458. }
  459. else
  460. {
  461. task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode && v.TASK_COMTYPE == 1);
  462. if (task == null)
  463. {
  464. var matureRoom = SugarBase.DB.Queryable<MatureRoomCache>().First(v => v.BARCODE == barcode);
  465. if (matureRoom.MatureNum > 1 && matureRoom.CurrentMatureNum < matureRoom.MatureNum)
  466. {
  467. //是多次熟化任务(只支持48小时多次熟化)
  468. task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == barcode && v.MatureNum.GetValueOrDefault() == 4 && v.TASK_COMTYPE == 2);
  469. }
  470. }
  471. }
  472. if (task == null || task.TASK_POSIDNEXT == convNo) return;
  473. //下发任务
  474. var converywrite = new WCSWriteToConveyorSignal();
  475. converywrite.Plc = plc.Plc;
  476. converywrite.DBName = plc.WriteDBName;
  477. converywrite.ConveyorNo = convNo;
  478. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  479. converywrite.Tasknum = task.TASK_NO;
  480. converywrite.Goodssize = 0;//
  481. converywrite.Goodsstart = Convert.ToInt32(convNo);
  482. converywrite.Goodsend = converywrite.Goodsstart;
  483. WriteInfoToConvMRoom(cs, converywrite);
  484. }
  485. catch (Exception ex)
  486. {
  487. LogMessageHelper.RecordLogMessage(ex);
  488. }
  489. }
  490. private void ConveyorWriteTaskExecute()
  491. {
  492. }
  493. private void SrmOutConvExeTask()
  494. {
  495. SrmOutConvExeTask(Conv_1143, true);
  496. SrmOutConvExeTask(Conv_1141, true);
  497. SrmOutConvExeTask(Conv_1161, true);
  498. SrmOutConvExeTask(Conv_1160, false);
  499. SrmOutConvExeTask(Conv_1152, true);
  500. SrmOutConvExeTask(Conv_1151, true);
  501. }
  502. /// <summary>
  503. /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址)
  504. /// </summary>
  505. private void SrmOutConvExeTask(string convNo, bool endPosIsCurConv = false)
  506. {
  507. try
  508. {
  509. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  510. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  511. var cs = conveyor.EquSignal_Conv;
  512. if (!cs.DB521_Request) return;
  513. if (cs.DB523_Fault) return;
  514. var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList();
  515. var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成);
  516. if (task == null)
  517. {
  518. throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo));
  519. }
  520. var converywrite = new WCSWriteToConveyorSignal();
  521. converywrite.Plc = plc.Plc;
  522. converywrite.DBName = plc.WriteDBName;
  523. converywrite.ConveyorNo = convNo;
  524. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  525. converywrite.Tasknum = task.TASK_NO;
  526. converywrite.Goodscode = 0;
  527. converywrite.Goodstype = 0;
  528. converywrite.Goodssize = 0;
  529. converywrite.Goodsstart = Convert.ToInt32(convNo);
  530. if (endPosIsCurConv)
  531. {
  532. converywrite.Goodsend = converywrite.Goodsstart;
  533. }
  534. else
  535. {
  536. var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO);
  537. var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList();
  538. if (routes.Count == 1)
  539. {
  540. converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS);
  541. }
  542. else
  543. {
  544. throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO));
  545. }
  546. }
  547. WriteInfoToConv(cs, converywrite);
  548. }
  549. catch (Exception ex)
  550. {
  551. LogMessageHelper.RecordLogMessage(ex);
  552. }
  553. }
  554. private static int _reqestInByMatureRoom = 0;
  555. /// <summary>
  556. /// 熟化房申请出库熟化
  557. /// </summary>
  558. private void ReqestInByMatureRoom()
  559. {
  560. if (Interlocked.Exchange(ref _reqestInByMatureRoom, 1) == 0)
  561. {
  562. try
  563. {
  564. Thread.Sleep(60000);
  565. //if ((DateTime.Now.Hour == 8 && DateTime.Now.Minute >= 30) || (DateTime.Now.Hour > 8 && DateTime.Now.Hour < 14))
  566. //{
  567. if (Current.SysSets.FirstOrDefault(v => v.SET_ID == Conv_1508).SET_VALUE == "0")
  568. {
  569. ReqestInByMatureRoomItem(Conv_1508, Conv_1136);
  570. }
  571. if (Current.SysSets.FirstOrDefault(v => v.SET_ID == Conv_1509).SET_VALUE == "0")
  572. {
  573. ReqestInByMatureRoomItem(Conv_1509, Conv_1138);
  574. }
  575. //}
  576. }
  577. catch (Exception ex)
  578. {
  579. LogMessageHelper.RecordLogMessage(ex);
  580. }
  581. finally
  582. {
  583. Interlocked.Exchange(ref _reqestInByMatureRoom, 0);
  584. }
  585. }
  586. }
  587. private void ReqestInByMatureRoomItem(string convNo, string matureInConvNo)
  588. {
  589. bool a = false;
  590. //检测是否存在去熟化房的未执行任务
  591. TryCachHelper.TryTranExecute((db) =>
  592. {
  593. a = db.Queryable<WCS_TASK>().Any(v => v.TASK_POSIDTO == convNo && v.TASK_WKSTATUS < 13);
  594. });
  595. if (a) return;
  596. var matureinConvNo = ConveyorHelper.GetConveyorSignal(PlcName, matureInConvNo);
  597. //if (matureinConvNo.DB521_Tasknum > 0 || matureinConvNo.CvDB51_PH_Status) return;
  598. var conv_1141 = ConveyorHelper.GetConveyorSignal(PlcName, "1141");
  599. var conv_1143 = ConveyorHelper.GetConveyorSignal(PlcName, "1143");
  600. if ((conv_1141.DB521_Tasknum > 0 || conv_1141.CvDB51_PH_Status) && (conv_1143.DB521_Tasknum > 0 || conv_1143.CvDB51_PH_Status)) return;
  601. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  602. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  603. var cs = conveyor.EquSignal_Conv;
  604. if (cs.DB521_Goodstype != 1) return;//检测是否在线
  605. if (cs.DB521_Goodssize < 2) return;//检测烘烤时间是否正确
  606. //if (cs.DB521_Goodsstart != 1) return;//检测是否自动状态
  607. //if (cs.DB521_Goodsend == 1) return;//切线中,不能出库到熟化
  608. if (cs.DB521_Res04 == 0) return;//熟化房温度不能为零
  609. //int mature_Count = Current.TaskSet.Count(v => v.TASK_WKSTATUS == (int)WkStatus.熟化房熟化中 && v.TASK_POSIDNEXT == convNo);
  610. var mature_InTaskCount = Current.TaskSet.Count(v => v.TASK_MatureDate == cs.DB521_Goodssize && v.TASK_MatureTemperat <= cs.DB521_Res04 && v.TASK_MatureType == 1);
  611. //var mature_InTaskCount = Current.TaskSet.Count(v => v.TASK_MatureDate == cs.DB521_Goodssize && v.TASK_MatureType == 1);
  612. var mature_OutTaskCount = Current.TaskSet.Count(v => v.TASK_POSIDTO == matureInConvNo);
  613. if ((mature_InTaskCount + mature_OutTaskCount) < 60)
  614. {
  615. var param = new GetOutTaskParam();
  616. param.OutId = convNo;
  617. param.OutEndPostion = convNo;
  618. param.OutType = 1;
  619. param.WareHouseId = Current.Pvchouseputong;
  620. param.TASK_MatureDate = cs.DB521_Goodssize;
  621. param.TASK_MatureTemperat = cs.DB521_Res04;
  622. //调用WMS接口生成出库任务
  623. ThreadHelper.TaskThread(BaseWorkflow.GetOutTask, param, 2000);
  624. }
  625. }
  626. private void RequestInByMatureConv(string convNo, string matureRoomNo)
  627. {
  628. try
  629. {
  630. var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName);
  631. var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo);
  632. var cs = conveyor.EquSignal_Conv;
  633. if (!cs.DB521_Request) return;
  634. if (cs.DB523_Fault) return;
  635. if (cs.CvDB51_PH_Status) return;
  636. if (cs.DB521_Tasknum == 0) return;
  637. var task = Current.TaskSet.SingleOrDefault(v => v.TASK_NO == cs.DB521_Tasknum);
  638. var converywrite = new WCSWriteToConveyorSignal();
  639. converywrite.Plc = plc.Plc;
  640. converywrite.DBName = plc.WriteDBName;
  641. converywrite.ConveyorNo = convNo;
  642. converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox;
  643. converywrite.Remark_TaskNo = cs.DB521_Tasknum.ToString();
  644. converywrite.Remark = matureRoomNo;
  645. WriteInfoToConv_Room(cs, converywrite);
  646. }
  647. catch (Exception ex)
  648. {
  649. LogMessageHelper.RecordLogMessage(ex);
  650. }
  651. }
  652. /// <summary>
  653. /// 写入任务信息到输送机
  654. /// </summary>
  655. /// <param name="converySignal"></param>
  656. /// <param name="converywrite"></param>
  657. /// <param name="isNotTask"></param>
  658. public void WriteInfoToConv_Room(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite)
  659. {
  660. if (converySignal.DB520_Tasknum == converywrite.Tasknum &&
  661. converySignal.DB520_Goodscode == converywrite.Goodscode &&
  662. converySignal.DB520_Goodstype == converywrite.Goodstype &&
  663. converySignal.DB520_Goodssize == converywrite.Goodssize &&
  664. converySignal.DB520_Goodsstart == converywrite.Goodsstart &&
  665. converySignal.DB520_Goodsend == converywrite.Goodsend &&
  666. converySignal.DB520_Notask == converywrite.Notask &&
  667. converySignal.DB520_TaskDelete == converywrite.TaskDelete &&
  668. converySignal.DB520_RollerTurn == converywrite.UpMatRequest &&
  669. converySignal.DB520_Res01 == converywrite.Res01 &&
  670. converySignal.DB520_Res02 == converywrite.Res02 &&
  671. converySignal.DB520_Res03 == converywrite.Res03 &&
  672. converySignal.DB520_Res04 == converywrite.Res04)
  673. {
  674. string result = TryCachHelper.TryTranExecute((db) =>
  675. {
  676. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == Convert.ToInt32(converywrite.Remark_TaskNo));
  677. if (task == null) throw new Exception(string.Format("任务[{0}]未查询到信息.输送线[{1}]执行失败。", converywrite.Remark_TaskNo, converywrite.ConveyorNo));
  678. int wkstatus = (int)WkStatus.熟化房熟化中;
  679. var matureRoomItem = db.Queryable<MatureRoomCache>().First(v => v.BARCODE == task.TASK_BOXBARCODE);
  680. if (matureRoomItem == null)
  681. {
  682. DateTime dt = db.GetDate();
  683. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  684. {
  685. TASK_WKSTATUS = wkstatus,
  686. TASK_POSIDCUR = converywrite.Remark,
  687. TASK_POSIDNEXT = converywrite.Remark,
  688. TASK_EDITUSERNO = "WCS",
  689. TASK_EDITDATETIME = DateTime.Now,
  690. TASK_InMatureRoomDate = dt
  691. })
  692. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  693. if (updatecount <= 0)
  694. {
  695. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改任务信息失败。", task.TASK_NO));
  696. }
  697. var matureRoom = new MatureRoomCache();
  698. matureRoom.BARCODE = task.TASK_BOXBARCODE;
  699. matureRoom.MatureRoomNo = converywrite.Remark;
  700. matureRoom.MatureRoomName = matureRoom.MatureRoomNo == "1509" ? "B" : "A";
  701. matureRoom.InMatureRoomDate = db.GetDate();
  702. matureRoom.CurrentMatureNum = 1;
  703. matureRoom.MatureNum = task.MatureNum.GetValueOrDefault();
  704. if (db.Insertable(matureRoom).ExecuteCommand() <= 0)
  705. {
  706. throw new Exception(string.Format("任务[{0}]进入熟化房添加熟化房条码[{1}]进入队列失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  707. }
  708. }
  709. else if (matureRoomItem.CurrentMatureNum >= matureRoomItem.MatureNum)
  710. {
  711. throw new Exception(string.Format("任务[{0}]条码[{1}]进入熟化房次数不正确,请检查问题。", task.TASK_NO, task.TASK_BOXBARCODE));
  712. }
  713. else
  714. {
  715. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  716. {
  717. TASK_WKSTATUS = wkstatus,
  718. TASK_POSIDCUR = converywrite.Remark,
  719. TASK_POSIDNEXT = converywrite.Remark,
  720. TASK_EDITUSERNO = "WCS",
  721. TASK_EDITDATETIME = DateTime.Now
  722. })
  723. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  724. if (updatecount <= 0)
  725. {
  726. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改任务信息失败。", task.TASK_NO));
  727. }
  728. int matureNum = matureRoomItem.CurrentMatureNum + 1;
  729. DateTime lastdt = db.GetDate();
  730. int updateMature = db.Updateable<MatureRoomCache>(it => new MatureRoomCache()
  731. {
  732. CurrentMatureNum = matureNum,
  733. InMatureRoomDate = lastdt,
  734. Remark = ""
  735. })
  736. .Where(it => it.BARCODE == task.TASK_BOXBARCODE).ExecuteCommand();
  737. if (updateMature <= 0)
  738. {
  739. throw new Exception(string.Format("任务[{0}]进入熟化房确认修改熟化次数信息失败。", task.TASK_NO));
  740. }
  741. }
  742. string msg = string.Format("任务[{0}]已从输送线[{1}]进入熟化房[{2}]中", converywrite.Remark_TaskNo, converywrite.ConveyorNo, converywrite.Remark);
  743. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Remark, msg);
  744. ConfirmTask(converySignal, converywrite);
  745. });
  746. if (!string.IsNullOrWhiteSpace(result))
  747. {
  748. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Remark_TaskNo, converywrite.ConveyorNo, result));
  749. }
  750. }
  751. else
  752. {
  753. WriteTaskToBuffer(converywrite);
  754. }
  755. }
  756. /// <summary>
  757. /// 写入任务信息到输送机
  758. /// </summary>
  759. /// <param name="converySignal"></param>
  760. /// <param name="converywrite"></param>
  761. /// <param name="isNotTask"></param>
  762. public void WriteInfoToConvMRoom(ConvSignal converySignal, WCSWriteToConveyorSignal converywrite)
  763. {
  764. if (converySignal.DB520_Tasknum == converywrite.Tasknum &&
  765. converySignal.DB520_Goodscode == converywrite.Goodscode &&
  766. converySignal.DB520_Goodstype == converywrite.Goodstype &&
  767. converySignal.DB520_Goodssize == converywrite.Goodssize &&
  768. converySignal.DB520_Goodsstart == converywrite.Goodsstart &&
  769. converySignal.DB520_Goodsend == converywrite.Goodsend &&
  770. converySignal.DB520_Notask == converywrite.Notask &&
  771. converySignal.DB520_TaskDelete == converywrite.TaskDelete &&
  772. converySignal.DB520_RollerTurn == converywrite.UpMatRequest &&
  773. converySignal.DB520_Res01 == converywrite.Res01 &&
  774. converySignal.DB520_Res02 == converywrite.Res02 &&
  775. converySignal.DB520_Res03 == converywrite.Res03 &&
  776. converySignal.DB520_Res04 == converywrite.Res04)
  777. {
  778. string result = TryCachHelper.TryTranExecute((db) =>
  779. {
  780. var task = db.Queryable<WCS_TASK>().First(v => v.TASK_NO == converywrite.Tasknum);
  781. int updatecount = db.Updateable<WCS_TASK>(it => new WCS_TASK()
  782. {
  783. TASK_WKSTATUS = (int)WkStatus.输送机执行,
  784. TASK_POSIDNEXT = converywrite.Goodsend.ToString(),
  785. //TASK_ITEM5 = converywrite.Goodsstart.ToString(),
  786. TASK_EDITUSERNO = "WCS",
  787. TASK_EDITDATETIME = DateTime.Now
  788. })
  789. .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand();
  790. if (updatecount <= 0)
  791. {
  792. throw new Exception(string.Format("任务[{0}]出熟化房确认修改任务信息失败。", task.TASK_NO));
  793. }
  794. var matureroom = db.Queryable<MatureRoomCache>().Single(v => v.BARCODE == task.TASK_BOXBARCODE);
  795. if (matureroom == null)
  796. {
  797. throw new Exception(string.Format("任务[{0}]条码[{1}]出熟化房确认修改任务信息失败,队列中未找到该条码", task.TASK_NO));
  798. }
  799. else if (matureroom.CurrentMatureNum >= matureroom.MatureNum)
  800. {
  801. var matureRoom_dis = new MatureRoomCache_Dis();
  802. matureRoom_dis.BARCODE = task.TASK_BOXBARCODE;
  803. matureRoom_dis.MatureRoomNo = matureroom.MatureRoomNo;
  804. matureRoom_dis.MatureRoomName = matureroom.MatureRoomName;
  805. matureRoom_dis.InMatureRoomDate = matureroom.InMatureRoomDate;
  806. matureRoom_dis.OutMatureRoomDate = db.GetDate();
  807. matureRoom_dis.CurrentMatureNum = matureroom.CurrentMatureNum;
  808. matureRoom_dis.MatureNum = matureroom.MatureNum;
  809. if (db.Deleteable(matureroom).ExecuteCommand() <= 0)
  810. {
  811. throw new Exception(string.Format("任务[{0}]出熟化房删除熟化房条码[{1}]失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  812. }
  813. if (db.Insertable(matureRoom_dis).ExecuteCommand() <= 0)
  814. {
  815. throw new Exception(string.Format("任务[{0}]出熟化房添加熟化房条码[{1}]到历史队列失败。", task.TASK_NO, task.TASK_BOXBARCODE));
  816. }
  817. }
  818. else
  819. {
  820. int updateMatureRoom = db.Updateable<MatureRoomCache>(it => new MatureRoomCache()
  821. {
  822. Remark = "1"
  823. })
  824. .Where(it => it.BARCODE == task.TASK_BOXBARCODE).ExecuteCommand();
  825. if (updateMatureRoom <= 0)
  826. {
  827. throw new Exception(string.Format("任务[{0}]出熟化房确认修改熟化房信息失败。", task.TASK_NO));
  828. }
  829. }
  830. string msg = string.Format("任务已下发给输送机[{0}]执行,起点地址[{1}]目标地址[{2}]", converywrite.ConveyorNo, converywrite.Goodsstart, converywrite.Goodsend);
  831. CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, converywrite.Goodsend.ToString(), msg);
  832. ConfirmTask(converySignal, converywrite);
  833. });
  834. if (!string.IsNullOrWhiteSpace(result))
  835. {
  836. throw new Exception(string.Format("任务[{0}]输送机[{1}]执行失败,原因:[{1}]", converywrite.Tasknum, converywrite.ConveyorNo, result));
  837. }
  838. }
  839. else
  840. {
  841. WriteTaskToBuffer(converywrite);
  842. }
  843. }
  844. #endregion 功能实现
  845. }
  846. }