using NX_CommonClassLibrary; using NX_LogClassLibrary; using NX_ModelClassLibrary.BaseModel; using NX_ModelClassLibrary.Common; using NX_ModelClassLibrary.CustomEnum; using NX_ModelClassLibrary.CustomEvent; using NX_ModelClassLibrary.OpcModel; using NX_ModelClassLibrary.TranModel; using NX_OpcUaClientLibrary; using NX_WcsBiz.CommonBusiness; using NX_WcsBiz.WcsDispatch; using NX_WcsDal.CommonBusiness; using NX_WcsDal.WcsBusiness; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace NX_WcsBiz.WcsBusiness { public class Tran_Biz { #region 单例模式 /// /// 单例模式对象 /// private static Tran_Biz _instance = null; private static readonly object lockObj = new object(); /// /// 单例模式方法 /// public static Tran_Biz Instance { get { if (_instance == null) { lock (lockObj) { if (_instance == null) { _instance = new Tran_Biz(); } } } return _instance; } } #endregion #region 全局变量 /// /// 输送线设备所属PLC信息列表 /// public List tranBasPlcMdList; /// /// 输送线设备列表 /// public List tranDevList; /// /// 输送线设备类型 /// public BasWcsDevTypeMd tranDevTypeMd; /// /// 输送线当前作业指令集合信息。 /// public Hashtable CurrentWorkingCmdList; /// /// 日志显示帮助类对象 /// public ShowLogToFrmHelper showLogToFrm = new ShowLogToFrmHelper(); /// /// 日志头部 /// private readonly string LogHeadText = "输送线业务类 ==>> "; #endregion #region 输送线主业务 /// /// 初始化输送线业务类 /// /// public bool Init() { try { tranDevTypeMd = BasCommon_Biz.Instance.basWcsDevTypeMdList.FirstOrDefault(x => x.DevTypeCode == "TranType"); tranDevList = BasCommon_Biz.Instance.basWcsDevMdList.FindAll(x => x.DevTypeCode == tranDevTypeMd.DevTypeCode); tranBasPlcMdList = new List(); CurrentWorkingCmdList = Hashtable.Synchronized(new Hashtable()); foreach (BasWcsDevMd item in tranDevList) { BasWcsPlcMd tmpMd = tranBasPlcMdList.FirstOrDefault(x => x.PlcCode == item.DevPlcNo); if (tmpMd != null) { tranBasPlcMdList.Add(tmpMd); } } ShowLogToForm($"初始化输送线业务类成功!", true, LogTypeEnum.Run); return true; } catch (Exception ex) { ShowLogToForm($"初始化输送线业务类发生异常!【{ex.Message}】", true, LogTypeEnum.Err); return false; } } /// /// 输送线主业务函数 /// public void TranMainBizRunFunc() { try { //加载输送线指令 List tranCmdLst = Tran_Dal.Instance.LoadTranUnFinishedCmd(AppConfigHelper.Get("CurrWcsControlRegionCode")); if (tranCmdLst != null && tranCmdLst.Count > 0) { foreach (WcsTranCmdMd item in tranCmdLst) { if (!CurrentWorkingCmdList.ContainsKey(item.TranCmdId)) { CurrentWorkingCmdList.Add(item.TranCmdId, item); ShowLogToForm(GetTranBizRunLog("输送线指令加载成功!", item), true, LogTypeEnum.Run); } } foreach (DictionaryEntry item in CurrentWorkingCmdList) { WcsTranCmdMd tmpTranCmd = (WcsTranCmdMd)item.Value; switch (tmpTranCmd.CmdStatus) { case TranCmdStatusEnum.初始创建: SendPlcTranCmd(tmpTranCmd); break; case TranCmdStatusEnum.已下发PLC: UpdateCurrTranCmdWorking(tmpTranCmd); break; case TranCmdStatusEnum.执行中: FinishCurrCrnCmd(tmpTranCmd); break; default: break; } } } } catch (Exception ex) { ShowLogToForm($"输送线主业务函数运行发生异常!【{ex.Message}】", true, LogTypeEnum.Err); } } /// /// 下发输送线PLC指令信息 /// /// 输送线指令对象 private void SendPlcTranCmd(WcsTranCmdMd wcsTranCmdMd) { BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == wcsTranCmdMd.TranDevNo); WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel"); WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag"); WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag"); WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo"); TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj(WorkModelOpcItemMd.OpcItemValue); bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "0"); if (WorkModel == TranDevWorkModeEnum.联机待机 && (FrontHaveGoodsFlag || BackEndHaveGoodsFlag) && AlarmNo == 0) { WcsOpcItemMd WCS_WorkCmd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_WorkCmd"); WcsOpcItemMd WCS_TaskNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TaskNo"); WcsOpcItemMd WCS_TargetLocNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TargetLocNo"); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TaskNo, wcsTranCmdMd.CmdNo)) { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC指令号数据:【{wcsTranCmdMd.CmdNo}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TargetLocNo, (Convert.ToInt32(wcsTranCmdMd.ElocNo)) - 1000)) { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC目标地址数据:【{wcsTranCmdMd.ElocNo}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_WorkCmd, (int)WcsWriteTranCmdTypeEnum.执行任务)) { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC作业指令类型数据:【{WcsWriteTranCmdTypeEnum.执行任务}-{(int)WcsWriteTranCmdTypeEnum.执行任务}】成功!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.已下发PLC; //更新数据库指令状态信息 Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd); ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】下发PLC:【{WcsWriteTranCmdTypeEnum.执行任务}】指令成功!", wcsTranCmdMd), true, LogTypeEnum.Run); } else { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC作业指令类型数据:【{WcsWriteTranCmdTypeEnum.执行任务}-{(int)WcsWriteTranCmdTypeEnum.执行任务}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); } } else { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC目标地址数据:【{wcsTranCmdMd.ElocNo}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); } } else { //TODO:后续增加LOG ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】写入OPC指令号数据:【{wcsTranCmdMd.CmdNo}】失败!", wcsTranCmdMd), false, LogTypeEnum.OPCRun); } } } /// /// 更新输送线指令作业中数据 /// /// 输送线指令对象 private void UpdateCurrTranCmdWorking(WcsTranCmdMd wcsTranCmdMd) { BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == wcsTranCmdMd.TranDevNo); wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.执行中; //更新数据库指令状态信息 Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd); ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令状态更新为执行中!", wcsTranCmdMd), true, LogTypeEnum.Run); } /// /// 输送线指令完成函数 /// /// 输送线指令对象 private void FinishCurrCrnCmd(WcsTranCmdMd wcsTranCmdMd) { BasWcsLocMd eLocMd = BasCommon_Biz.Instance.allWcsLocList.FirstOrDefault(x => x.LocCode == wcsTranCmdMd.ElocNo); BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == eLocMd.LocExtMsg); WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel"); WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag"); WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag"); WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo"); WcsOpcItemMd TargetLocNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "TargetLocNo"); WcsOpcItemMd TaskNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "TaskNo"); TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj(WorkModelOpcItemMd.OpcItemValue); bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "0"); int TargetLocNo = Convert.ToInt32(TargetLocNoOpcItemMd.OpcItemValue ?? "0"); int TaskNo = Convert.ToInt32(TaskNoOpcItemMd.OpcItemValue ?? "0"); if (WorkModel == TranDevWorkModeEnum.联机待机 && (FrontHaveGoodsFlag || BackEndHaveGoodsFlag) && AlarmNo == 0 && (TargetLocNo + 1000).ToString() == wcsTranCmdMd.ElocNo && TaskNo == wcsTranCmdMd.CmdNo) { wcsTranCmdMd.CmdStatus = TranCmdStatusEnum.完成; //更新数据库指令状态信息 Tran_Dal.Instance.UpdateTranCmdStatus(wcsTranCmdMd); //调用任务反馈,完成输送线指令。生成下一步的数据。 DispUntilityReturnMd retmd = TaskResponse_Disp.Instance.TaskResponseHandleFunc(new TaskResponseMd { TrayCode = wcsTranCmdMd.TrayCode, PalletCode = wcsTranCmdMd.PalletCode, TaskNo = wcsTranCmdMd.TaskNo, CmdNo = wcsTranCmdMd.CmdNo, CurrentLocNo = wcsTranCmdMd.ElocNo, TaskResponseType = DispatchResponseHandleTypeEnum.输送线指令反馈完成 }); if (retmd.IsSuccess) { ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令结束成功!【{retmd.RetMsg}】", wcsTranCmdMd), true, LogTypeEnum.Run); //CurrentWorkingCmdList.Remove(wcsTranCmdMd.TranCmdId); } else { ShowLogToForm(GetTranBizRunLog($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【自动】指令结束失败!【{retmd.RetMsg}】", wcsTranCmdMd), true, LogTypeEnum.Err); } } } public void TranOnLineLocBizRunFunc() { try { List tranOnLineLocLst = BasCommon_Biz.Instance.allWcsLocList.FindAll(x => x.LocTypeCode == "OnLineLoc" || x.LocTypeCode == "OnLineAndGeneralLoc"); if (tranOnLineLocLst != null && tranOnLineLocLst.Count > 0) { foreach (BasWcsLocMd item in tranOnLineLocLst) { BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == item.LocExtMsg); WcsOpcItemMd WorkModelOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WorkModel"); WcsOpcItemMd FrontHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "FrontHaveGoodsFlag"); WcsOpcItemMd BackEndHaveGoodsFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "BackEndHaveGoodsFlag"); WcsOpcItemMd AlarmNoOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "AlarmNo"); WcsOpcItemMd ApplyInStockOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "ApplyInStock"); WcsOpcItemMd UltrahighFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "UltrahighFlag"); WcsOpcItemMd OverWeightFlagOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "OverWeightFlag"); WcsOpcItemMd PalletCodeOpcItemMd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "PalletCode"); WcsOpcItemMd WCS_PalletCode = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_PalletCode"); TranDevWorkModeEnum WorkModel = EnumExtensionHelper.GetEnumObj(WorkModelOpcItemMd.OpcItemValue); bool FrontHaveGoodsFlag = Convert.ToBoolean(FrontHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); bool BackEndHaveGoodsFlag = Convert.ToBoolean(BackEndHaveGoodsFlagOpcItemMd.OpcItemValue ?? "False"); int AlarmNo = Convert.ToInt32(AlarmNoOpcItemMd.OpcItemValue ?? "False"); bool ApplyInStock = Convert.ToBoolean(ApplyInStockOpcItemMd.OpcItemValue ?? "False"); bool UltrahighFlag = Convert.ToBoolean(UltrahighFlagOpcItemMd.OpcItemValue ?? "False"); bool OverWeightFlag = Convert.ToBoolean(OverWeightFlagOpcItemMd.OpcItemValue ?? "False"); //string PalletCode = PalletCodeOpcItemMd.OpcItemValue ?? ""; BasBarcodeScannerMd scannMd = BasCommon_Biz.Instance.allBarcodeScannerList.FirstOrDefault(x => x.LocCode == item.LocCode); string PalletCode = string.Empty; if (scannMd != null) { PalletCode = scannMd.BarcodeMessage; } if (WorkModel == TranDevWorkModeEnum.联机待机 && (FrontHaveGoodsFlag || BackEndHaveGoodsFlag) && ApplyInStock && !UltrahighFlag && !OverWeightFlag && !string.IsNullOrEmpty(PalletCode) && AlarmNo == 0) { //向WCS调度请求任务。 DispUntilityReturnMd retMd = TaskRequest_Disp.Instance.TaskRequestHandleFunc(new TaskRequestMd { PalletCode = PalletCode, CurrentLocNo = item.LocCode, TaskHandleType = DispatchRequestHandleTypeEnum.托盘申请上线 }); if (retMd.IsSuccess) { ShowLogToForm(retMd.RetMsg, true, LogTypeEnum.Run); //同时吧托盘条码下发给PLC if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_PalletCode, PalletCode)) { scannMd.BarcodeMessage = string.Empty; //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】写入OPC托盘号:【{PalletCode}】数据成功!", true, LogTypeEnum.OPCRun); } else { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】写入OPC托盘号:【{PalletCode}】数据失败!", true, LogTypeEnum.OPCRun); } } else { ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】入库口站台:【{item.LocCode}】【自动】托盘申请上线失败!【{retMd.RetMsg}】", true, LogTypeEnum.Err); } } } } //Task.Run(() => //{ DispUntilityReturnMd retMdAuto = TaskRequest_Disp.Instance.TaskRequestHandleFunc(new TaskRequestMd { PalletCode = null, CurrentLocNo = null, TaskHandleType = DispatchRequestHandleTypeEnum.自动拆解MWS大任务 }); if (retMdAuto != null) { if (retMdAuto.IsSuccess) { ShowLogToForm(retMdAuto.RetMsg, true, LogTypeEnum.Run); } else { ShowLogToForm(retMdAuto.RetMsg, true, LogTypeEnum.Err); } } //}); } catch (Exception ex) { ShowLogToForm($"输送线上线口业务处理函数发生异常!【{ex.Message}】", true, LogTypeEnum.Err); } } #endregion #region 桌面显示Log、记录log到文本 /// /// 桌面显示Log、记录log到文本 /// /// log内容 /// 是否输出到桌面日志端。true:输出桌面;false:只记录文本 /// 日志类型枚举 private void ShowLogToForm(string msg, bool isShowFormFlag, LogTypeEnum logTypeEnum) { if (isShowFormFlag) { showLogToFrm.ShowLog(new ShowLogToFrmEventArgs(LogHeadText + msg)); } LogHelper.WriteLog(LogHeadText + msg, logTypeEnum); } private string GetTranBizRunLog(string prefixStr, WcsTranCmdMd wcsTranCmdMd) { 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}】"; } #endregion public List LoadCurrentWorkingTranCmd(string regionCode) { return Tran_Dal.Instance.LoadTranUnFinishedCmd(regionCode); } public string TranManualControl(string sTranDevNo, string eTranDevNo, WcsWriteTranCmdTypeEnum wcsWriteTranCmdType,string palletCode) { BasWcsDevMd basTranDev = tranDevList.FirstOrDefault(x => x.DevCode == sTranDevNo); WcsOpcItemMd WCS_WorkCmd = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_WorkCmd"); WcsOpcItemMd WCS_TaskNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TaskNo"); WcsOpcItemMd WCS_TargetLocNo = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_TargetLocNo"); WcsOpcItemMd WCS_PalletCode = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basTranDev.DevCode && x.PlcCode == basTranDev.DevPlcNo && x.OpcItemCode == "WCS_PalletCode"); string cmdNo = BasCommon_Dal.Instance.GetSysSequence("Cmd_No"); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TaskNo, cmdNo)) { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC指令号数据:【{cmdNo}】成功!", false, LogTypeEnum.OPCRun); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_TargetLocNo, (Convert.ToInt32(eTranDevNo.Replace("Tran", ""))) - 1000)) { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC目标地址数据:【{eTranDevNo.Replace("Tran", "")}】成功!", false, LogTypeEnum.OPCRun); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_PalletCode, palletCode)) { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC托盘号数据:【{palletCode}】成功!", false, LogTypeEnum.OPCRun); if (LeadOpcUaClientHelper.Instance.WriteOpcItemValue(WCS_WorkCmd, Convert.ToInt32(wcsWriteTranCmdType))) { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC作业指令类型数据:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】成功!", false, LogTypeEnum.OPCRun); ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令成功!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】", true, LogTypeEnum.Run); return $"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令成功!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】!"; } else { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC作业指令数据失败!", false, LogTypeEnum.OPCRun); } } else { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC托盘号数据失败!", false, LogTypeEnum.OPCRun); } } else { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC目标地址数据失败!", false, LogTypeEnum.OPCRun); } } else { //TODO:后续增加LOG ShowLogToForm($"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】写入OPC指令号数据失败!", false, LogTypeEnum.OPCRun); } return $"输送线:【{basTranDev.DevCode}-{basTranDev.DevName}】【手动】下发给PLC指令失败!指令号:【{cmdNo}】指令类型:【{wcsWriteTranCmdType}-{(int)wcsWriteTranCmdType}】托盘号:【{palletCode}】起始点:【{sTranDevNo}】目标点:【{eTranDevNo}】!"; } public List LoadAllTranCmd(WcsTranCmdSearchMd searchMd) { return Tran_Dal.Instance.LoadAllTranCmd(searchMd); } public object ReadTranOpcItem(string tranDevNo, string opcItemCode) { BasWcsDevMd basWcsDevMd = BasCommon_Biz.Instance.basWcsDevMdList.FirstOrDefault(x => x.DevCode == tranDevNo); WcsOpcItemMd tmpOpcItem = BasCommon_Biz.Instance.allOpcItemList.FirstOrDefault(x => x.DevCode == basWcsDevMd.DevCode && x.PlcCode == basWcsDevMd.DevPlcNo && x.OpcItemCode == opcItemCode); return tmpOpcItem.OpcItemValue; } } }