using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using DataLinkMesWork; using MesDataFunction; using MesServerFunctions; using MesServerWork; using System.Windows.Forms; namespace MisDataFunDll { public partial class MisDataBaseFun { /// /// 扫描托盘码进行托盘校验 主要Pack线使用 拉取Pack号校验 /// /// /// /// /// 1 已通过或者无需验证 2 验证失败 3 本次验证成功 public static int ScanPalletCode(string OpName,string BarCode, string EngineID) { if(MisDataFun.GetSpecialOpExist(OpName, "到站扫托盘码")) { // 判断是否完成二次验证 string IsMatchBarcode = "0"; MIS_BASE.Read_TagValueByTagTypeID(54, OpName, out IsMatchBarcode); if (IsMatchBarcode != "1") { MIS_BASE.Read_EngineGetOver_PLC(OpName, out bool PartLoad_EngineGetOver_PLC); if (!PartLoad_EngineGetOver_PLC) { string msg1 = "无法扫码,PLC未传递机型!"; MisDataFun.LogRecording_OP(OpName, "ERROR", "Barcode", msg1); SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg1, "条码扫描"); return 2; } // 这里根据BarCode获取到 对于需要与PLC托盘信息校验的码值 string CheckCode = MisDataFun.GetPartCodeByBarCodde(OpName, BarCode); // 部分特殊工位不需要拉去PACK进行校验 如 150 if (MisDataFun.GetSpecialOpExist(OpName, "校验托盘码不拉PACK码")) CheckCode = BarCode; if (EngineID == CheckCode) { // MES比对信息完成 MIS_BASE.Write_MachineTime_ReadOver(OpName, true); string msgErr = "【" + OpName + "】" + "托盘信息与扫码信息比对成功!"; MisDataFun.LogRecording_OP(OpName, "INFO", "barcode", msgErr); SendMessageFun.AsyncSendMessage_Notice(OpName, msgErr); return 3; } else { // MES比对信息完成 比对不成功 MIS_BASE.Write_MachineTime_ReadOver(OpName, false); // MES报警 MIS_BASE.Write_TagValueByTagTypeID(34, OpName, true); string msgErr = "【" + OpName + "】" + "托盘信息与扫码信息比对失败,扫码信息:" + BarCode; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msgErr, "条码扫描"); MisDataFun.LogRecording_OP(OpName, "ERROR", "barcode", msgErr); return 2; } } } return 1; } /// /// 前序是否合格校验 /// /// /// public static bool NotAllowWorkVerify(string OpName,string EngineID) { // 查询是否 不允许工作 MisDataFun.Get_NotAllowWork(EngineID, OpName, out bool NotAllowWork); if (NotAllowWork) { string msg = "前序不合格 不进行工作:" + EngineID; MisDataFun.LogRecording_OP(OpName, "INFO", "MOM", msg); SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "返修放行"); MIS_BASE.Write_NotAllowWork(OpName, true); // 不允许工作 MIS_BASE.Write_MesErrorType(OpName, 1004); // 工位报警 前序不合格 不允许工作! return false; } return true; } /// /// 传递机型 判空 /// /// /// /// /// true 通过 false 不通过 public static bool EngineTypeVerify(string OpName, string EngineID, int EngineTypeID) { // 判断PLC机型是否写入 if (EngineTypeID == 0 || EngineID == "") { MIS_BASE.Write_TagValueByTagTypeID(34, OpName, true);// MES报警 string msg = "【" + OpName + "】" + "PLC机型写入为空,EngineTypeID:" + EngineTypeID + ",EngineID:" + EngineID; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "传递机型"); MisDataFun.LogRecording_OP(OpName, "ERROR", "EngineTypeGetOver", msg); MIS_BASE.Write_MesErrorType(OpName, 1002); // 工位报警 未读取到托盘产品信息! return false; } return true; } /// /// 上线用传递机型 判空 并且 判断一致性 /// /// /// /// /// /// /// true 通过 false 不通过 public static bool EngineTypeVerifyOnLine(string OpName,string EngineID,int EngineTypeID,string EngineID_MES,int EngineTypeID_MES) { // 判断PLC机型是否写入 if (EngineTypeID == 0 || EngineID == "") { MIS_BASE.Write_TagValueByTagTypeID(34, OpName, true);// MES报警 string msg = "【" + OpName + "】" + "PLC机型写入为空,EngineTypeID:" + EngineTypeID + ",EngineID:" + EngineID; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "传递机型"); MisDataFun.LogRecording_OP(OpName, "ERROR", "EngineTypeGetOver", msg); MIS_BASE.Write_MesErrorType(OpName, 1002); // 工位报警 未读取到托盘产品信息! return false; } //判断PLC机型与MES机型是否一致 if (EngineTypeID != EngineTypeID_MES || EngineID != EngineID_MES) { MIS_BASE.Write_TagValueByTagTypeID(34, OpName, true);// MES报警 string msg = "【" + OpName + "】" + "PLC机型与MES机型不一致,EngineTypeID:" + EngineTypeID + ",EngineID:" + EngineID + ",EngineTypeID_MES:" + EngineTypeID_MES + ",EngineID_MES:" + EngineID_MES; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "传递机型"); MisDataFun.LogRecording_OP(OpName, "ERROR", "EngineTypeGetOver", msg); MIS_BASE.Write_MesErrorType(OpName, 1001); // 工位报警 PLC机型与MES机型不一致 信息校验失败! return false; } return true; } public static bool CheckMesApiIsOk(string OpName, string EngineID, string apiName) { string procedureName; procedureName = "MOM_接口_Moby_执行状态_查询"; SqlParameter[] thisParms = new SqlParameter[3]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@产品编号", EngineID); thisParms[1] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); thisParms[2] = new System.Data.SqlClient.SqlParameter("@接口名称", apiName); DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out DataTable dt); if(dt.Rows.Count > 0) { int result = Convert.ToInt32(dt.Rows[0]["result"]); if (result != 2) return true; else { string msg = $"产品{EngineID}未成功入站 请成功入站后再操作"; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "扫码校验"); MisDataFun.LogRecording_OP(OpName, "WARNING", "MOM", msg); return false; } } return false; } /// /// 写入 保存完成和工作完成 并且对此进行一定判断校验 /// /// public static void WriteMesReadOver(string OpName, bool isOver) { if (isOver) { MIS_BASE.Read_WorkStart(OpName, out bool isWorkStart); if (!isWorkStart) { MisDataFun.LogRecording_OP(OpName, "WARNING", "WriteMesReadOver", "产品未在位 不予写入工作完成"); return; } MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES保存数据完成!"); MisDataFun.LogRecording_OP(OpName, "INFO", "MIS", "MES工作完成!"); } else { MIS_BASE.Write_FalseGO(OpName, false); // 不合格放行(MES) MIS_BASE.Write_ConfirmOkGo(OpName, false); // 合格放行(MES) } //通知PLC,MES工作完成 MIS_BASE.Write_MesWorkFinish(OpName, isOver); //通知PLC,MES保存完成 MIS_BASE.Write_MesReadOver(OpName, isOver); } /// /// 上盖装配新产品 根据工位扫码 写入产品信息至PLC /// /// /// /// public static bool WriteEngineDataByEngineID(string OpName, string BarCode) { string procedureName; procedureName = "生产计划_派工订单_执行列表_获取产品信息"; SqlParameter[] thisParms = new SqlParameter[2]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", OpName); thisParms[1] = new System.Data.SqlClient.SqlParameter("@BarCode", BarCode); DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms, out DataTable dt); if (dt.Rows.Count > 0) { // 写入产品信息 并且默认为扫描托盘码完成 string EngineID = dt.Rows[0]["发动机号"].ToString(); int EngineTypeID = Convert.ToInt32(dt.Rows[0]["机型代码"]); string EngineType = dt.Rows[0]["产品型号"].ToString(); string OrderForm = dt.Rows[0]["订单号"].ToString(); MIS_BASE.Write_EngineTypeID_MES(OpName, EngineTypeID); // 机型代码(MES) MIS_BASE.Write_EngineID_MES(OpName, EngineID); // 发动机号(MES) MIS_BASE.Write_EngineType_MES(OpName, EngineType); // 机型(MES) MIS_BASE.Write_OrderForm_MES(OpName, OrderForm); // 订单号(MES) MIS_BASE.Write_MachineTime_ReadOver(OpName, true); // 托盘信息校验成功 MIS_BASE.Write_EngineTypeGetOver_MES(OpName, true); // 传递机型(MES) return true; } string msg = $"无 {BarCode} 对应产品 请确认产品编码是否正确"; SendMessageFun.AsyncSendMessage_Notice_Error(OpName, msg, "扫码校验"); MisDataFun.LogRecording_OP(OpName, "WARNING", "MOM", msg); return false; } } }