using MesServerWork; using MesDataFunction; using MisDataFunDll; using MisDataSaveDate; using System; using System.Data; namespace MesServerFunctions { partial class FunctionMES { /// /// OP431 保存:按 PLC 允许保存时间生成静置质量数据,正常过站后带质量数据出站。 /// private void MesRead(object e) { try { var msgEvent = (DeviceDriver_BasicData.CustomeEvetnArgs)e; string opName = Convert.ToString(msgEvent.OpName); int tagValue = Convert.ToInt32(msgEvent.TagValue); if (tagValue != 1) { MisDataBaseFun.WriteMesReadOver(opName, false); MIS_BASE.Write_OpNameIsOk(opName, -99); MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存数据取消!"); return; } MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "PLC允许保存OP431静置数据!"); // 读取 PLC 当前产品信息,后续质量数据和出站都以该产品码为准。 MIS_BASE.GetEngineTypeFromPLC(opName, out int engineTypeID, out string engineType, out string engineID, out int palletCode, out string orderForm); if (string.IsNullOrWhiteSpace(engineID)) { WriteManualStaticMesReadError(opName, "PLC产品码为空,无法保存静置数据"); return; } // 重新查询 MES 执行信息,避免直接使用 PLC 中不完整的订单/机型数据。 MisDataFun.Moby_Select_PDC(engineID, out orderForm, out engineType, out engineTypeID); if (engineTypeID <= 0) { WriteManualStaticMesReadError(opName, "未查询到产品执行信息:" + engineID); return; } // PLC 合格标识只保留合格/不合格两种结果。 MIS_BASE.Read_QualityMask(opName, out int qualityMask); qualityMask = NormalizeManualStaticQualityMask(qualityMask); // 组装 OP431 静置质量数据:开始时间、完成时间、时间差、库位号。 if (!TryBuildManualStaticOutData(engineID, qualityMask, out ManualStaticOutData staticOutData, out string message)) { WriteManualStaticMesReadError(opName, message); return; } // 保存信号到达时,回写线下静置结束时间和静置时长。 if (!FinishManualStaticRecord(engineID, staticOutData.FinishTime, staticOutData.Minutes, out message)) { WriteManualStaticMesReadError(opName, message); return; } // 将四项静置质量数据写入测量数据合格索引和明细表。 if (!WriteManualStaticOutQualityData(opName, engineID, staticOutData, out message)) { WriteManualStaticMesReadError(opName, message); return; } // 写正常过站记录后查询 MOM 上传质量数据组。 MisDataFun.WorkStartInsert(opName, qualityMask); MisDataFun.GetPartQualityGroupParams(opName, engineID, out DataTable dtQuality); if (dtQuality == null || dtQuality.Rows.Count == 0) { WriteManualStaticMesReadError(opName, "未查询到OP431静置质量数据组,禁止静默出站:" + engineID); return; } // 带质量数据调用工厂 MES 出站,返回 13921 时按不合格完成。 CallWebService.Call_dataCollectForSfcEx(opName, engineID, dtQuality, qualityMask, out string code, out string momMessage); if (code == "0") { MIS_BASE.Write_OpNameIsOk(opName, qualityMask); } else if (code == "13921") { qualityMask = 2; MIS_BASE.Write_OpNameIsOk(opName, qualityMask); MisDataFun.LogRecording_OP(opName, "INFO", "MOM", engineID + " 工厂MES质量判定不合格,按不合格完成OP431过站"); } else { WriteManualStaticMesReadError(opName, "出站失败:" + engineID + ",错误代码:" + code + ",消息:" + momMessage); return; } MisDataBaseFun.WriteMesReadOver(opName, true); MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES保存OP431静置数据完成!"); MisDataFun.LogRecording_OP(opName, "INFO", "MIS", "MES工作完成!"); } catch (Exception err) { MyLog4Net.MyLogHelper.Error("Function1062.MesRead", err.Message); MisDataFun.LogRecording_OP(ManualStaticOutOpName, "ERROR", "MesRead", err.Message); } } /// /// OP431 保存失败时统一复位保存完成、置 MES 报警并通知页面。 /// private void WriteManualStaticMesReadError(string opName, string message) { MisDataBaseFun.WriteMesReadOver(opName, false); MIS_BASE.Write_TagValueByTagTypeID(34, opName, true); SendMessage.AsyncSendMessage_Notice(opName, "【" + opName + "】" + message); MisDataFun.LogRecording_OP(opName, "ERROR", "MesRead", message); } } }