using iWareCC.Common.Helper; using iWareCC.SrmService; using iWareCommon.Common.Globle; using iWareCommon.Utils; using iWareModel; using iWareSql; using iWareSql.DataAccess; using iWareSql.DBModel; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using XiGang.Core.Model; namespace iWareCC { /// /// 四个入库口扫描检测线程 /// public static class LineInSacnResult { /// /// 四个入库口扫描检测线程 /// public static void HandlerLineInSacnResult(object int_device) { while (true) { var errMsg = ""; var showErrMsg = ""; try { SystemWarningMsg._lbl_Alert_LineInScan = ""; //if (SystemValue.isAllowRuning_LineInScan && SystemValue.isStartedModel) if (true)//注意:不需要启动模式 { SingleDo((int)EDevice.一号堆垛机, out errMsg); showErrMsg += errMsg + SysGloble.SPLIT_STR; SingleDo((int)EDevice.二号堆垛机, out errMsg); showErrMsg += errMsg + SysGloble.SPLIT_STR; SingleDo((int)EDevice.三号堆垛机, out errMsg); showErrMsg += errMsg + SysGloble.SPLIT_STR; SingleDo((int)EDevice.四号堆垛机, out errMsg); showErrMsg += errMsg + SysGloble.SPLIT_STR; } SystemWarningMsg._lbl_Alert_LineInScan = showErrMsg; } catch (Exception ex) { SystemWarningMsg._lbl_Alert_LineInScan += "HandlerLineInSacnResult 出现异常:" + ex.Message + SysGloble.SPLIT_STR; Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.LineInScanTheadService, "HandlerLineInSacnResult 出现异常:" + ex.Message, ex); } Thread.Sleep(1000);//休眠2秒 } } private static void SingleDo(int int_device, out string errMsg) { errMsg = ""; EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_device.ToString()); var stationCode = ""; var scanCode = GetScanValueBySrmStationCode(device, ref stationCode); var srm = FormCC.srmViewDict[(int)device]; if (srm.R_PickReqForInStore) {//必须堆垛机请求了才可以 //只有当堆垛机有任务执行时,并且是入库任务的时候才判断 var realSrmSourcePlace = int_device + "-" + srm.SrmSourcePlace; if (string.IsNullOrEmpty(scanCode)) { errMsg = "设备:" + device.ToString() + ",输送线扫描的值为空"; return; } if (srm.R_TaskNo > 0 && (srm.R_State == (int)ESrmState.取货中 || srm.R_State == (int)ESrmState.取货定位中) && SysGloble.Dict_SpecialPlace_IN.ContainsKey(realSrmSourcePlace)) { if (srm.R_TaskNo > 0 && srm.R_TaskNo <= 100) {//手动 MyExtendHelper.WriteScanValidateACK(false, "手动任务", stationCode, srm.R_TaskNo, true, "", scanCode); errMsg = "设备:" + device.ToString() + ",判断是手动任务,验证通过"; return; } else { using (DbModel context = new DbModel()) { //拿到堆垛机要入库时,应该正确的托盘号 var queryState = (int)DeviceTaskStatusEnum.已下发; var queryTaskNo = srm.R_TaskNo.ToString(); var queryEDeviceType = (int)EDeviceType.堆垛机; var task = context.Task_Part.Where(x => x.DeviceType == queryEDeviceType && x.PlcTaskId == queryTaskNo && x.TaskState == queryState).FirstOrDefault(); if (task == null) { errMsg = "设备:" + device.ToString() + ",获取任务为NULL,PLC任务号:" + queryTaskNo; return; /* //表示是手动进去的? WriteScanFailACK("我认为是手动任务", stationCode, srm.R_TaskNo, true, "", scanCode); errMsg = "设备:" + device.ToString() + ",判断是手动任务(系统),验证通过"; return; //*/ } else { var sysSalverCode = task.SalverCode; //如果是 托盘入库任务,就不校验 if (task.MaterialType == (int)MaterialTypeEnum.托盘) { MyExtendHelper.WriteScanValidateACK(false, "自动任务,验证托盘", stationCode, Convert.ToInt32(task.PlcTaskId), true, sysSalverCode, scanCode); errMsg = "设备:" + device.ToString() + ",判断是自动任务,验证通过"; return; } else { if (scanCode != sysSalverCode) {//校验不通过 //首先要判断 OK信号是否是true,如果是true,就不需要写验证不通过了,否则会影响wcs手动入库口扫码强制验证通过的节奏 bool isSMQZYZTG = false; if (ValidateScanSuccessACK(stationCode, ref isSMQZYZTG) == false) { //注意:这里停留1秒,继续判断下 Thread.Sleep(2000); if (ValidateScanSuccessACK(stationCode, ref isSMQZYZTG) == false) { MyExtendHelper.WriteScanValidateACK(false, "自动任务,验证发动机", stationCode, Convert.ToInt32(task.PlcTaskId), false, sysSalverCode, scanCode); errMsg = "设备:" + device.ToString() + ",判断是自动任务,验证不通过,系统托盘号:" + sysSalverCode + ",扫描值:" + scanCode + ",任务号:" + task.PlcTaskId; return; } else { if (isSMQZYZTG) {//强制验证通过 MyExtendHelper.WriteScanValidateACK(false, "[强制验证通过]自动任务,验证发动机", stationCode, Convert.ToInt32(task.PlcTaskId), true, sysSalverCode, scanCode); } } } else { errMsg = "设备:" + device.ToString() + ",判断是自动任务,本来是验证不通过,但是由于人工手动入库口扫码强制验证通过,所以就不推送验证不通过信号了,系统托盘号:" + sysSalverCode + ",扫描值:" + scanCode + ",任务号:" + task.PlcTaskId; if (isSMQZYZTG) {//强制验证通过 MyExtendHelper.WriteScanValidateACK(false, "[强制验证通过]自动任务,验证发动机", stationCode, Convert.ToInt32(task.PlcTaskId), true, sysSalverCode, scanCode); } return; } } else {//校验通过 MyExtendHelper.WriteScanValidateACK(false, "自动任务,验证发动机", stationCode, Convert.ToInt32(task.PlcTaskId), true, sysSalverCode, scanCode); errMsg = "设备:" + device.ToString() + ",判断是自动任务,验证通过"; return; } } } } } } else { errMsg = "设备:" + device.ToString() + "不满足条件,任务号:" + srm.R_TaskNo + ",状态:" + srm.StateName + ",不是取货中或取货定位中"; return; } } else { MyExtendHelper.SetSrm_IN_SMQZYZTG(device, false); ResetACK(stationCode, srm, device); errMsg = "设备:" + device.ToString() + ",堆垛机没有请求取货"; return; } } /// /// 验证OK信号的真假 /// /// /// private static bool ValidateScanSuccessACK(string stationCode, ref bool isSMQZYZTG) { var isOk = false; switch (stationCode) { case "1002": if (FormCC.rgvView.W_1002_ScanSuccessACK || FormCC.Srm1_IN_SMQZYZTG) { isOk = true; } if (FormCC.Srm1_IN_SMQZYZTG) isSMQZYZTG = true; break; case "1004": if (FormCC.rgvView.W_1004_ScanSuccessACK || FormCC.Srm2_IN_SMQZYZTG) { isOk = true; } if (FormCC.Srm2_IN_SMQZYZTG) isSMQZYZTG = true; break; case "1006": if (FormCC.rgvView.W_1006_ScanSuccessACK || FormCC.Srm3_IN_SMQZYZTG) { isOk = true; } if (FormCC.Srm3_IN_SMQZYZTG) isSMQZYZTG = true; break; case "1007": if (FormCC.rgvView.W_1007_ScanSuccessACK || FormCC.Srm4_IN_SMQZYZTG) { isOk = true; } if (FormCC.Srm4_IN_SMQZYZTG) isSMQZYZTG = true; break; } return isOk; } private static void ResetACK(string stationCode, SrmView srm, EDevice device) { var isNeedRest = false; switch (stationCode) { case "1002": if (FormCC.rgvView.W_1002_ScanFailACK || FormCC.rgvView.W_1002_ScanSuccessACK) { isNeedRest = true; } break; case "1004": if (FormCC.rgvView.W_1004_ScanFailACK || FormCC.rgvView.W_1004_ScanSuccessACK) { isNeedRest = true; } break; case "1006": if (FormCC.rgvView.W_1006_ScanFailACK || FormCC.rgvView.W_1006_ScanSuccessACK) { isNeedRest = true; } break; case "1007": if (FormCC.rgvView.W_1007_ScanFailACK || FormCC.rgvView.W_1007_ScanSuccessACK) { isNeedRest = true; } break; } if (isNeedRest) { //重置输送线的信号 MyExtendHelper.WriteScanValidateACK(true, "重置任务", stationCode, srm.R_TaskNo, false, "", ""); } } /// /// 根据堆垛机的入库口获取 扫描值 /// /// /// private static string GetScanValueBySrmStationCode(EDevice device, ref string stationCode) { if (FormCC.rgvView == null) { return ""; } if (device == EDevice.一号堆垛机) { stationCode = "1002"; return FormCC.rgvView.R_1002_Scan; } else if (device == EDevice.二号堆垛机) { stationCode = "1004"; return FormCC.rgvView.R_1004_Scan; } else if (device == EDevice.三号堆垛机) { stationCode = "1006"; return FormCC.rgvView.R_1006_Scan; } else if (device == EDevice.四号堆垛机) { stationCode = "1007"; return FormCC.rgvView.R_1007_Scan; } return ""; } } }