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;
}
}
}