Tran_Biz.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. using NX_CommonClassLibrary;
  2. using NX_LogClassLibrary;
  3. using NX_ModelClassLibrary.BaseModel;
  4. using NX_ModelClassLibrary.Common;
  5. using NX_ModelClassLibrary.CustomEnum;
  6. using NX_ModelClassLibrary.CustomEvent;
  7. using NX_ModelClassLibrary.OpcModel;
  8. using NX_ModelClassLibrary.TranModel;
  9. using NX_OpcUaClientLibrary;
  10. using NX_WcsBiz.CommonBusiness;
  11. using NX_WcsBiz.WcsDispatch;
  12. using NX_WcsDal.CommonBusiness;
  13. using NX_WcsDal.WcsBusiness;
  14. using System;
  15. using System.Collections;
  16. using System.Collections.Generic;
  17. using System.Linq;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. namespace NX_WcsBiz.WcsBusiness
  21. {
  22. public class Tran_Biz
  23. {
  24. #region 单例模式
  25. /// <summary>
  26. /// 单例模式对象
  27. /// </summary>
  28. private static Tran_Biz _instance = null;
  29. private static readonly object lockObj = new object();
  30. /// <summary>
  31. /// 单例模式方法
  32. /// </summary>
  33. public static Tran_Biz Instance
  34. {
  35. get
  36. {
  37. if (_instance == null)
  38. {
  39. lock (lockObj)
  40. {
  41. if (_instance == null)
  42. {
  43. _instance = new Tran_Biz();
  44. }
  45. }
  46. }
  47. return _instance;
  48. }
  49. }
  50. #endregion
  51. #region 全局变量
  52. /// <summary>
  53. /// 输送线设备所属PLC信息列表
  54. /// </summary>
  55. public List<BasWcsPlcMd> tranBasPlcMdList;
  56. /// <summary>
  57. /// 输送线设备列表
  58. /// </summary>
  59. public List<BasWcsDevMd> tranDevList;
  60. /// <summary>
  61. /// 输送线设备类型
  62. /// </summary>
  63. public BasWcsDevTypeMd tranDevTypeMd;
  64. /// <summary>
  65. /// 输送线当前作业指令集合信息。
  66. /// </summary>
  67. public Hashtable CurrentWorkingCmdList;
  68. /// <summary>
  69. /// 日志显示帮助类对象
  70. /// </summary>
  71. public ShowLogToFrmHelper showLogToFrm = new ShowLogToFrmHelper();
  72. /// <summary>
  73. /// 日志头部
  74. /// </summary>
  75. private readonly string LogHeadText = "输送线业务类 ==>> ";
  76. #endregion
  77. #region 输送线主业务
  78. /// <summary>
  79. /// 初始化输送线业务类
  80. /// </summary>
  81. /// <returns></returns>
  82. public bool Init()
  83. {
  84. try
  85. {
  86. tranDevTypeMd = BasCommon_Biz.Instance.basWcsDevTypeMdList.FirstOrDefault(x => x.DevTypeCode == "TranType");
  87. tranDevList = BasCommon_Biz.Instance.basWcsDevMdList.FindAll(x => x.DevTypeCode == tranDevTypeMd.DevTypeCode);
  88. tranBasPlcMdList = new List<BasWcsPlcMd>();
  89. CurrentWorkingCmdList = Hashtable.Synchronized(new Hashtable());
  90. foreach (BasWcsDevMd item in tranDevList)
  91. {
  92. BasWcsPlcMd tmpMd = tranBasPlcMdList.FirstOrDefault(x => x.PlcCode == item.DevPlcNo);
  93. if (tmpMd != null)
  94. {
  95. tranBasPlcMdList.Add(tmpMd);
  96. }
  97. }
  98. ShowLogToForm($"初始化输送线业务类成功!", true, LogTypeEnum.Run);
  99. return true;
  100. }
  101. catch (Exception ex)
  102. {
  103. ShowLogToForm($"初始化输送线业务类发生异常!【{ex.Message}】", true, LogTypeEnum.Err);
  104. return false;
  105. }
  106. }
  107. /// <summary>
  108. /// 输送线主业务函数
  109. /// </summary>
  110. public void TranMainBizRunFunc()
  111. {
  112. try
  113. {
  114. //加载输送线指令
  115. List<WcsTranCmdMd> tranCmdLst = Tran_Dal.Instance.LoadTranUnFinishedCmd(AppConfigHelper.Get("CurrWcsControlRegionCode"));
  116. if (tranCmdLst != null && tranCmdLst.Count > 0)
  117. {
  118. foreach (WcsTranCmdMd item in tranCmdLst)
  119. {
  120. if (!CurrentWorkingCmdList.ContainsKey(item.TranCmdId))
  121. {
  122. CurrentWorkingCmdList.Add(item.TranCmdId, item);
  123. ShowLogToForm(GetTranBizRunLog("输送线指令加载成功!", item), true, LogTypeEnum.Run);
  124. }
  125. }
  126. foreach (DictionaryEntry item in CurrentWorkingCmdList)
  127. {
  128. WcsTranCmdMd tmpTranCmd = (WcsTranCmdMd)item.Value;
  129. switch (tmpTranCmd.CmdStatus)
  130. {
  131. case TranCmdStatusEnum.初始创建:
  132. SendPlcTranCmd(tmpTranCmd);
  133. break;
  134. case TranCmdStatusEnum.已下发PLC:
  135. UpdateCurrTranCmdWorking(tmpTranCmd);
  136. break;
  137. case TranCmdStatusEnum.执行中:
  138. FinishCurrCrnCmd(tmpTranCmd);
  139. break;
  140. default:
  141. break;
  142. }
  143. }
  144. }
  145. }
  146. catch (Exception ex)
  147. {
  148. ShowLogToForm($"输送线主业务函数运行发生异常!【{ex.Message}】", true, LogTypeEnum.Err);
  149. }
  150. }
  151. /// <summary>
  152. /// 下发输送线PLC指令信息
  153. /// </summary>
  154. /// <param name="wcsTranCmdMd">输送线指令对象</param>
  155. private void SendPlcTranCmd(WcsTranCmdMd wcsTranCmdMd)
  156. {
  157. BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == wcsTranCmdMd.TranDevNo);
  158. WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel");
  159. WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag");
  160. WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag");
  161. WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo");
  162. TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj<TranDevWorkModeEnum>(WorkModelOpcItemMd.OpcItemValue);
  163. bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  164. bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  165. int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "0");
  166. if (WorkModel == TranDevWorkModeEnum.联机待机 &&
  167. (FrontHaveGoodsFlag || BackEndHaveGoodsFlag) &&
  168. AlarmNo == 0)
  169. {
  170. WcsOpcItemMd WCS_WorkCmd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_WorkCmd");
  171. WcsOpcItemMd WCS_TaskNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TaskNo");
  172. WcsOpcItemMd WCS_TargetLocNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TargetLocNo");
  173. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TaskNo, wcsTranCmdMd.CmdNo))
  174. {
  175. //TODO:后续增加LOG
  176. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC指令号数据:【{wcsTranCmdMd.CmdNo}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  177. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TargetLocNo, (Convert.ToInt32(wcsTranCmdMd.ElocNo)) - 1000))
  178. {
  179. //TODO:后续增加LOG
  180. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC目标地址数据:【{wcsTranCmdMd.ElocNo}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  181. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_WorkCmd, (int)WcsWriteTranCmdTypeEnum.执行任务))
  182. {
  183. //TODO:后续增加LOG
  184. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC作业指令类型数据:【{WcsWriteTranCmdTypeEnum.执行任务}-{(int)WcsWriteTranCmdTypeEnum.执行任务}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  185. wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.已下发PLC;
  186. //更新数据库指令状态信息
  187. Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd);
  188. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】下发PLC:【{WcsWriteTranCmdTypeEnum.执行任务}】指令成功!", wcsTranCmdMd), true, LogTypeEnum.Run);
  189. }
  190. else
  191. {
  192. //TODO:后续增加LOG
  193. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC作业指令类型数据:【{WcsWriteTranCmdTypeEnum.执行任务}-{(int)WcsWriteTranCmdTypeEnum.执行任务}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  194. }
  195. }
  196. else
  197. {
  198. //TODO:后续增加LOG
  199. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC目标地址数据:【{wcsTranCmdMd.ElocNo}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  200. }
  201. }
  202. else
  203. {
  204. //TODO:后续增加LOG
  205. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC指令号数据:【{wcsTranCmdMd.CmdNo}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun);
  206. }
  207. }
  208. }
  209. /// <summary>
  210. /// 更新输送线指令作业中数据
  211. /// </summary>
  212. /// <param name="wcsTranCmdMd">输送线指令对象</param>
  213. private void UpdateCurrTranCmdWorking(WcsTranCmdMd wcsTranCmdMd)
  214. {
  215. BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == wcsTranCmdMd.TranDevNo);
  216. wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.执行中;
  217. //更新数据库指令状态信息
  218. Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd);
  219. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令状态更新为执行中!", wcsTranCmdMd), true, LogTypeEnum.Run);
  220. }
  221. /// <summary>
  222. /// 输送线指令完成函数
  223. /// </summary>
  224. /// <param name="wcsTranCmdMd">输送线指令对象</param>
  225. private void FinishCurrCrnCmd(WcsTranCmdMd wcsTranCmdMd)
  226. {
  227. BasWcsLocMd eLocMd = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == wcsTranCmdMd.ElocNo);
  228. BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == eLocMd.LocExtMsg);
  229. WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel");
  230. WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag");
  231. WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag");
  232. WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo");
  233. WcsOpcItemMd TargetLocNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "TargetLocNo");
  234. WcsOpcItemMd TaskNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "TaskNo");
  235. TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj<TranDevWorkModeEnum>(WorkModelOpcItemMd.OpcItemValue);
  236. bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  237. bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  238. int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "0");
  239. int TargetLocNo = Convert.ToInt32(TargetLocNoOpcItemMd.OpcItemValue ?? "0");
  240. int TaskNo = Convert.ToInt32(TaskNoOpcItemMd.OpcItemValue ?? "0");
  241. if (WorkModel == TranDevWorkModeEnum.联机待机 &&
  242. (FrontHaveGoodsFlag ||
  243. BackEndHaveGoodsFlag) &&
  244. AlarmNo == 0 &&
  245. (TargetLocNo + 1000).ToString() == wcsTranCmdMd.ElocNo &&
  246. TaskNo == wcsTranCmdMd.CmdNo)
  247. {
  248. wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.完成;
  249. //更新数据库指令状态信息
  250. Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd);
  251. //调用任务反馈,完成输送线指令。生成下一步的数据。
  252. DispUntilityReturnMd retmd = TaskResponse_Disp.Instance.TaskResponseHandleFunc(new TaskResponseMd
  253. {
  254. TrayCode = wcsTranCmdMd.TrayCode,
  255. PalletCode = wcsTranCmdMd.PalletCode,
  256. TaskNo = wcsTranCmdMd.TaskNo,
  257. CmdNo = wcsTranCmdMd.CmdNo,
  258. CurrentLocNo = wcsTranCmdMd.ElocNo,
  259. TaskResponseType = DispatchResponseHandleTypeEnum.输送线指令反馈完成
  260. });
  261. if (retmd.IsSuccess)
  262. {
  263. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令结束成功!【{retmd.RetMsg}】", wcsTranCmdMd), true, LogTypeEnum.Run);
  264. //CurrentWorkingCmdList.Remove(wcsTranCmdMd.TranCmdId);
  265. }
  266. else
  267. {
  268. ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令结束失败!【{retmd.RetMsg}】", wcsTranCmdMd), true, LogTypeEnum.Err);
  269. }
  270. }
  271. }
  272. public void TranOnLineLocBizRunFunc()
  273. {
  274. try
  275. {
  276. List<BasWcsLocMd> tranOnLineLocLst = BasCommon_Biz.Instance.allWcsLocList.FindAll(x => x.LocTypeCode == "OnLineLoc" || x.LocTypeCode == "OnLineAndGeneralLoc");
  277. if (tranOnLineLocLst != null && tranOnLineLocLst.Count > 0)
  278. {
  279. foreach (BasWcsLocMd item in tranOnLineLocLst)
  280. {
  281. BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == item.LocExtMsg);
  282. WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel");
  283. WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag");
  284. WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag");
  285. WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo");
  286. WcsOpcItemMd ApplyInStockOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "ApplyInStock");
  287. WcsOpcItemMd UltrahighFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "UltrahighFlag");
  288. WcsOpcItemMd OverWeightFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "OverWeightFlag");
  289. WcsOpcItemMd PalletCodeOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "PalletCode");
  290. WcsOpcItemMd WCS_PalletCode = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_PalletCode");
  291. TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj<TranDevWorkModeEnum>(WorkModelOpcItemMd.OpcItemValue);
  292. bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  293. bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False");
  294. int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "False");
  295. bool ApplyInStock = Convert.ToBoolean(ApplyInStockOpcItemMd.OpcItemValue ?? "False");
  296. bool UltrahighFlag = Convert.ToBoolean(UltrahighFlagOpcItemMd.OpcItemValue ?? "False");
  297. bool OverWeightFlag = Convert.ToBoolean(OverWeightFlagOpcItemMd.OpcItemValue ?? "False");
  298. //string PalletCode = PalletCodeOpcItemMd.OpcItemValue ?? "";
  299. BasBarcodeScannerMd scannMd = BasCommon_Biz.Instance.allBarcodeScannerList.FirstOrDefault(x => x.LocCode == item.LocCode);
  300. string PalletCode = string.Empty;
  301. if (scannMd != null)
  302. {
  303. PalletCode = scannMd.BarcodeMessage;
  304. }
  305. if (WorkModel == TranDevWorkModeEnum.联机待机 &&
  306. (FrontHaveGoodsFlag || BackEndHaveGoodsFlag) &&
  307. ApplyInStock &&
  308. !UltrahighFlag &&
  309. !OverWeightFlag &&
  310. !string.IsNullOrEmpty(PalletCode) &&
  311. AlarmNo == 0)
  312. {
  313. //向WCS调度请求任务。
  314. DispUntilityReturnMd retMd = TaskRequest_Disp.Instance.TaskRequestHandleFunc(new TaskRequestMd { PalletCode = PalletCode, CurrentLocNo = item.LocCode, TaskHandleType = DispatchRequestHandleTypeEnum.托盘申请上线 });
  315. if (retMd.IsSuccess)
  316. {
  317. ShowLogToForm(retMd.RetMsg, true, LogTypeEnum.Run);
  318. //同时吧托盘条码下发给PLC
  319. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_PalletCode, PalletCode))
  320. {
  321. scannMd.BarcodeMessage = string.Empty;
  322. //TODO:后续增加LOG
  323. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】写入OPC托盘号:【{PalletCode}】数据成功!", true, LogTypeEnum.OPCRun);
  324. }
  325. else
  326. {
  327. //TODO:后续增加LOG
  328. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】写入OPC托盘号:【{PalletCode}】数据失败!", true, LogTypeEnum.OPCRun);
  329. }
  330. }
  331. else
  332. {
  333. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】托盘申请上线失败!【{retMd.RetMsg}】", true, LogTypeEnum.Err);
  334. }
  335. }
  336. }
  337. }
  338. //Task.Run(() =>
  339. //{
  340. DispUntilityReturnMd retMdAuto = TaskRequest_Disp.Instance.TaskRequestHandleFunc(new TaskRequestMd { PalletCode = null, CurrentLocNo = null, TaskHandleType = DispatchRequestHandleTypeEnum.自动拆解MWS大任务 });
  341. if (retMdAuto != null)
  342. {
  343. if (retMdAuto.IsSuccess)
  344. {
  345. ShowLogToForm(retMdAuto.RetMsg, true, LogTypeEnum.Run);
  346. }
  347. else
  348. {
  349. ShowLogToForm(retMdAuto.RetMsg, true, LogTypeEnum.Err);
  350. }
  351. }
  352. //});
  353. }
  354. catch (Exception ex)
  355. {
  356. ShowLogToForm($"输送线上线口业务处理函数发生异常!【{ex.Message}】", true, LogTypeEnum.Err);
  357. }
  358. }
  359. #endregion
  360. #region 桌面显示Log、记录log到文本
  361. /// <summary>
  362. /// 桌面显示Log、记录log到文本
  363. /// </summary>
  364. /// <param name="msg">log内容</param>
  365. /// <param name="isShowFormFlag">是否输出到桌面日志端。true:输出桌面;false:只记录文本</param>
  366. /// <param name="logTypeEnum">日志类型枚举</param>
  367. private void ShowLogToForm(string msg, bool isShowFormFlag, LogTypeEnum logTypeEnum)
  368. {
  369. if (isShowFormFlag)
  370. {
  371. showLogToFrm.ShowLog(new ShowLogToFrmEventArgs(LogHeadText + msg));
  372. }
  373. LogHelper.WriteLog(LogHeadText + msg, logTypeEnum);
  374. }
  375. private string GetTranBizRunLog(string prefixStr, WcsTranCmdMd wcsTranCmdMd)
  376. {
  377. return $"{prefixStr} -- 任务号:【{wcsTranCmdMd.TaskNo}】指令号:【{wcsTranCmdMd.CmdNo}】组盘码:【{wcsTranCmdMd.TrayCode}】托盘号:【{wcsTranCmdMd.PalletCode}】起点站台:【{wcsTranCmdMd.SlocNo}】起点PLC号:【{wcsTranCmdMd.SplcNo}】终点站台:【{wcsTranCmdMd.ElocNo}】终点PLC号:【{wcsTranCmdMd.EplcNo}】指令类型:【{wcsTranCmdMd.CmdType}】动作类型:【{wcsTranCmdMd.ActiveType}】指令状态:【{wcsTranCmdMd.CmdStatus}】异常标识:【{wcsTranCmdMd.ErrFlag}】指令Log:【{wcsTranCmdMd.CmdLog}】异常Log:【{wcsTranCmdMd.ErrLog}】";
  378. }
  379. #endregion
  380. public List<WcsTranCmdMd> LoadCurrentWorkingTranCmd(string regionCode)
  381. {
  382. return Tran_Dal.Instance.LoadTranUnFinishedCmd(regionCode);
  383. }
  384. public string TranManualControl(string sTranDevNo, string eTranDevNo, WcsWriteTranCmdTypeEnum wcsWriteTranCmdType,string palletCode)
  385. {
  386. BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == sTranDevNo);
  387. WcsOpcItemMd WCS_WorkCmd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_WorkCmd");
  388. WcsOpcItemMd WCS_TaskNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TaskNo");
  389. WcsOpcItemMd WCS_TargetLocNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TargetLocNo");
  390. WcsOpcItemMd WCS_PalletCode = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_PalletCode");
  391. string cmdNo = BasCommon_Dal.Instance.GetSysSequence("Cmd_No");
  392. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TaskNo, cmdNo))
  393. {
  394. //TODO:后续增加LOG
  395. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC指令号数据:【{cmdNo}】成功!", false, LogTypeEnum.OPCRun);
  396. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TargetLocNo, (Convert.ToInt32(eTranDevNo.Replace("Tran", ""))) - 1000))
  397. {
  398. //TODO:后续增加LOG
  399. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC目标地址数据:【{eTranDevNo.Replace("Tran", "")}】成功!", false, LogTypeEnum.OPCRun);
  400. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_PalletCode, palletCode))
  401. {
  402. //TODO:后续增加LOG
  403. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC托盘号数据:【{palletCode}】成功!", false, LogTypeEnum.OPCRun);
  404. if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_WorkCmd, Convert.ToInt32(wcsWriteTranCmdType)))
  405. {
  406. //TODO:后续增加LOG
  407. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC作业指令类型数据:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】成功!", false, LogTypeEnum.OPCRun);
  408. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令成功!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】", true, LogTypeEnum.Run);
  409. return $"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令成功!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】!";
  410. }
  411. else
  412. {
  413. //TODO:后续增加LOG
  414. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC作业指令数据失败!", false, LogTypeEnum.OPCRun);
  415. }
  416. }
  417. else
  418. {
  419. //TODO:后续增加LOG
  420. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC托盘号数据失败!", false, LogTypeEnum.OPCRun);
  421. }
  422. }
  423. else
  424. {
  425. //TODO:后续增加LOG
  426. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC目标地址数据失败!", false, LogTypeEnum.OPCRun);
  427. }
  428. }
  429. else
  430. {
  431. //TODO:后续增加LOG
  432. ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC指令号数据失败!", false, LogTypeEnum.OPCRun);
  433. }
  434. return $"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令失败!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】!";
  435. }
  436. public List<WcsTranCmdMd> LoadAllTranCmd(WcsTranCmdSearchMd searchMd)
  437. {
  438. return Tran_Dal.Instance.LoadAllTranCmd(searchMd);
  439. }
  440. public object ReadTranOpcItem(string tranDevNo, string opcItemCode)
  441. {
  442. BasWcsDevMd basWcsDevMd = BasCommon_Biz.Instance.basWcsDevMdList.FirstOrDefault(x => x.DevCode == tranDevNo);
  443. WcsOpcItemMd tmpOpcItem = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basWcsDevMd.DevCode && x.PlcCode == basWcsDevMd.DevPlcNo && x.OpcItemCode == opcItemCode);
  444. return tmpOpcItem.OpcItemValue;
  445. }
  446. }
  447. }