using DataLinkMesWork; using DC_A95; using SYNC_SAP_MES; using System; using System.Linq; /// /// /// namespace MesWork { /// /// 处理MIS逻辑 /// public partial class MesWorkForm { /// /// 处理MIS逻辑 /// /// private void MIS_Funtion(object e) { try { if (NotHandlerSignal == "1") { return; } var msgEvent = (OpcData.CustomeEvetnArgs)e; if (msgEvent.TagValue == null) return; var tagID = msgEvent.TagID.ToString(); var opCode = msgEvent.OpName.ToString();//工位号 var tagTypeCodeID = (int)msgEvent.TagTypeCodeID; var tagTypeID = (EnumTagTypeID)msgEvent.TagTypeID; var isFirstValue = msgEvent.IsFirstValue.ToString().ToLower(); string tagValue; switch (tagTypeID) { case EnumTagTypeID.BOOL: tagValue = (Convert.ToInt32(msgEvent.TagValue)).ToString(); break; default: tagValue = msgEvent.TagValue.ToString(); break; } if (ValueT(isFirstValue)) { //不处理第一次变化的值 return; } /* 15 系统健康 5 传递机型(AMS) 66 允许PLC工作(AMS) 34 发动机上线报警标志 20 AMS保存完数据(AMS) 112 发动机上线报警代码 73 机型标志(AMS) 74 变速箱总成编号(AMS) 75 产品型号(AMS) 116 缸体打印码 117 订单号 14 系统健康(PLC) 2 工件到位(PLC) 43 申请零件编号(PLC) 44 传递机型(PLC) 63 禁用MES(PLC) 9 机型标志(PLC) 10 变速箱总成编号(PLC) 11 产品型号(PLC) 80 托盘编号(PLC) 22 0空托盘,1合格件,2不合格件(PLC) 19 质量数据可以读数据(PLC) 21 质量数据工位合格标志(PLC) 23 0正常件,1返修件(PLC) 39 缸体打印码(PLC) 40 订单号(PLC) 120 上线缸体码(PLC) */ switch (tagTypeCodeID) { case 2://工件到位 if (tagValue == "1") { WritePLC_IF(73, opCode, 0);//机型ID WritePLC_IF(74, opCode, "");//发动机流水号(总成编号) WritePLC_IF(75, opCode, "");//产品型号,机型号 WritePLC_IF(116, opCode, "");//缸体码 WritePLC_IF(117, opCode, "");//订单号 WritePLC_IF(118, opCode, 0); // 打印位置 MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位 MesWorkForm.WritePLC_IF(34, opCode, false); } else { MesWorkForm.WritePLC_IF(112, opCode, 0); // 清空报警点位 MesWorkForm.WritePLC_IF(34, opCode, false); WritePLC_IF(20, opCode, false); // 保存完成 } break; case 14://心跳 WritePLC_IF(15, opCode, tagValue); break; case 19://允许保存 if (tagValue == "1") { var sortNo_PLC = ReadPLC(9, opCode).ToString(); var engineNo_PLC = ReadPLC(10, opCode).ToString(); var sortName_PLC = ReadPLC(11, opCode).ToString(); var partCode_PLC = ReadPLC(39, opCode).ToString(); var orderNo_PLC = ReadPLC(40, opCode).ToString(); var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString()); MesWork_QC.ProcessData_PartOff(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC); MesWork_QC.MesRead(opCode, tagValue, tagID); WritePLC_IF(20, opCode, true); } else { WritePLC_IF(5, opCode, false); WritePLC_IF(66, opCode, false); WritePLC_IF(20, opCode, false); } break; case 43://申请上线 if (tagValue == "1") { //1、是否有下发的订单 //2、是否申请上线 //3、是否满足上线条件 //4、缸体码是否符合生产机型 if (!OPCodes_LineSet.Split(',').Contains(opCode))//非线首 { return; } //SyncFunc_From_SAP.SyncDataOperationTask("手动同步"); PLC_R.Read_LineSet(opCode, out string partCode, out int palletNo); ExecuteDB.Select_OnLine_Plan_Engine(opCode, partCode, palletNo , out string engineNo, out int sortNo, out string sortName, out string printCode, out string orderNo , out int errCode, out string errMessage, out int printPosition); //*******************在此处验证*************************** //按规则拆解partCode(缸体二维码),再获取BOM,验证该工位物料中是否存在该型号的缸体 //var res_SortType_FromBOM = CALL_Interfalce_WebAPI.Get_BOMs_ByWebAPI(MesWorkForm.LineID_Product, engineNo); //********************************************** //上线报警代码:errCode //0 - 无错误 //1 - PLC逻辑错误,未申请上线 //2 - 没有可用订单 //3 - 扫描缸体码为空或格式错误 //4 - 缸体机型与生产机型不匹配 //5 - AMS写入信息与RFID信息验证不一致 //255 - 未知错误 if (errCode != 0)//获取计划失败 { PLC_W.Write_LineSetAlarm(opCode, errCode); LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"发动机上线申请错误:({errCode}){errMessage}"); } else { // 复位报警变量 //112 发动机上线报警代码 //34 发动机上线报警标志 MesWorkForm.WritePLC_IF(112, opCode, 0); MesWorkForm.WritePLC_IF(34, opCode, false); WritePLC_IF(73, opCode, sortNo);//机型ID WritePLC_IF(74, opCode, engineNo);//发动机流水号(总成编号) WritePLC_IF(75, opCode, sortName);//产品型号,机型号 WritePLC_IF(116, opCode, printCode);//缸体码 WritePLC_IF(117, opCode, orderNo);//订单号 WritePLC_IF(118, opCode, printPosition); // 打印位置 WritePLC_IF(5, opCode, true); //【PLC读取数据到RFID中,测试用】 //WritePLC_IF(9, opCode, sortNo);//机型ID //WritePLC_IF(10, opCode, engineNo);//发动机流水号(总成编号) //WritePLC_IF(11, opCode, sortName);//产品型号,机型号 //WritePLC_IF(39, opCode, partCode);//缸体码 //WritePLC_IF(40, opCode, orderNo);//订单号 LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"上线数据写入成功:engineNo={engineNo};sortNo={sortNo};sortName={sortName};printCode={printCode};orderNo={orderNo}"); } } else { WritePLC_IF(5, opCode, false); } break; case 44://传递机型 if (tagValue == "1") { var sortNo_PLC = ReadPLC(9, opCode).ToString(); var engineNo_PLC = ReadPLC(10, opCode).ToString(); var sortName_PLC = ReadPLC(11, opCode).ToString(); var partCode_PLC = ReadPLC(39, opCode).ToString(); var orderNo_PLC = ReadPLC(40, opCode).ToString(); var palletNo_PLC = Convert.ToInt32(ReadPLC(80, opCode).ToString()); if (OPCodes_LineSet.Split(',').Contains(opCode))//线首 { var sortNo = ReadPLC(73, opCode).ToString(); var engineNo = ReadPLC(74, opCode).ToString(); var sortName = ReadPLC(75, opCode).ToString(); var partCode = ReadPLC(116, opCode).ToString(); var orderNo = ReadPLC(117, opCode).ToString(); var str = $"{sortNo}|{engineNo}|{sortName}|{partCode}|{orderNo}"; var str_PLC = $"{sortNo_PLC}|{engineNo_PLC}|{sortName_PLC}|{partCode_PLC}|{orderNo_PLC}"; if (str != str_PLC) { var errCode = (int)Type_AlarmOnline.Err_RW_Diff; PLC_W.Write_LineSetAlarm(opCode, errCode); LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, opCode, $"发动机上线信息读写校验不一致:({errCode})W:{str},R:{str_PLC}"); return; } //上线验证完成,消耗计划 ExecuteDB.Update_ExcutePlan_LineSetOK(opCode, engineNo); WritePLC_IF(66, opCode, true); LogRecord.LogRecord.Insert_Log(Type_Log.OnLine, opCode, $"【{tagTypeCodeID}】上线下载数据验证成功,流水号消耗成功!opCode={opCode};engineNo={engineNo}"); } //保存进站数据 MesWork_QC.ProcessData_PartOn(opCode, engineNo_PLC, palletNo_PLC, sortNo_PLC); WritePLC_IF(66, opCode, true); } else { WritePLC_IF(66, opCode, false); } break; default: break; } } catch (Exception err) { LogRecord.LogRecord.Insert_Log(Type_Log.Alarm, "", $"MIS_Funtion报错!,,{err.Message}+{err.StackTrace}"); } } /// /// 数据库记录信号变化 /// /// private void TagTypeCodeID_TagDataOnChange(object msgEvent) { try { OpcData.CustomeEvetnArgs e = (OpcData.CustomeEvetnArgs)msgEvent; string tagValue; if (e.TagValue == null) return; switch (e.TagValue.ToString().ToLower()) { case "1": case "true": tagValue = "1"; break; default: tagValue = "0"; break; } string TagTypeCodeID; string opName; string TagID; string TagValue; DateTime arrivedTime; DateTime leavedTime; int TimeDiff; opName = e.OpName.ToString(); TagValue = tagValue; TagTypeCodeID = e.TagTypeCodeID.ToString(); TagID = e.TagID.ToString(); leavedTime = Convert.ToDateTime(e.TimeStamp); arrivedTime = Convert.ToDateTime(e.TimeStampBefore); TimeDiff = Convert.ToInt32(e.TagKeepTime); if (TagTypeCodeID != "14" && TagTypeCodeID != "15") { string procedureName; procedureName = "测量数据设备状态日志_增加数据"; System.Data.SqlClient.SqlParameter[] thisParms = new System.Data.SqlClient.SqlParameter[7]; thisParms[0] = new System.Data.SqlClient.SqlParameter("@工位号", opName); thisParms[1] = new System.Data.SqlClient.SqlParameter("@信号类型代码", TagTypeCodeID); thisParms[2] = new System.Data.SqlClient.SqlParameter("@TagID", TagID); thisParms[3] = new System.Data.SqlClient.SqlParameter("@TagValue", TagValue); thisParms[4] = new System.Data.SqlClient.SqlParameter("@到达时间", arrivedTime); thisParms[5] = new System.Data.SqlClient.SqlParameter("@离开时间", leavedTime); thisParms[6] = new System.Data.SqlClient.SqlParameter("@在线时间", TimeDiff); DataAccess.ExecuteStoredProcedure(procedureName, ref thisParms); } } catch (Exception err) { } } } }