/// <summary> /// CIM에서 설비로 발생하는 Event에 대한 처리 /// </summary> /// <param name="parameters">Parameter Array</param> /// <remarks> /// parameters[0] : cmdName /// parameters[1] : 1st parameter /// parameters[2] : 2nd parameter /// parameters[3] : 3rd parameter /// parameters[4] : 4th parameter /// parameters[5] : 5th Parameter /// </remarks> public void funProcessCIMEvent(object[] parameters) { string dstrBitAddress = "B1000"; string dstrData = FunStringH.funMakeLengthStringFirst("0", 256); //384개임 try { //EventBit를 초기화한다. pEqpAct.funBitWrite(dstrBitAddress, dstrData); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } }
/// <summary> /// 설비에서 CIM으로 발생하는 Event에 대한 처리 /// </summary> /// <param name="parameters">Parameter Array</param> /// <remarks> /// parameters[0] : strCompBit /// parameters[1] : dstrACTVal /// parameters[2] : dintActFrom /// parameters[3] : dstrACTFromSub /// parameters[4] : intBitVal /// parameters[5] : Special Parameter /// </remarks> public void funProcessEQPEvent(string[] parameters) { string strCompBit = parameters[0]; //int intUnitID = Convert.ToInt32(parameters[2]); StringBuilder dstrLog = new StringBuilder(); string[] dstrValue = null; string dstrHGLSID = ""; string dstrLOTID = ""; int dintSlotID = 0; string dstrGlassSize1 = ""; string dstrGlassSize2 = ""; InfoAct.clsSlot dslot = new InfoAct.clsSlot(0); string[] dstrDataValue = new string[4]; //MCC Log Data int dintIndex = 0; int dintPortID = 0; //LD/UD 작업 Port int dintJobStart = 0; int dintJobEnd = 0; bool dbolXPCStart = false; bool dbolProcChanged = false; try { try { m_pEqpAct.subWordReadSave("W2040", 8, EnuEQP.PLCRWType.ASCII_Data); //H-Glass(=panel)-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //E-Glass(=panel)-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Lot-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Batch-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Job-ID m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Port-ID m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Slot-NO m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Prod-Type m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Prod-Kind m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //ProductID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Runspec-ID m_pEqpAct.subWordReadSave("", 4, EnuEQP.PLCRWType.ASCII_Data); //Layer-ID m_pEqpAct.subWordReadSave("", 4, EnuEQP.PLCRWType.ASCII_Data); //Step-ID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //HOST PPID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //Flow-ID m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass(=panel)-Size(하위) ---->U2 2임.(하위 + Space(1) + 상위) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass(=panel)-Size(상위) ---->U2 2임.(하위 + Space(1) + 상위) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass-thickness(thickness) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass-State(빈값) m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Glass-Order m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Comment m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Use-Count m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Judgement m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Reason-Code m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Inspection-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Enc-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Prerun-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Turn-Dir m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Flip-State m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Work-State m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Multi-Use m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Pair Glass-ID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //Pair PPID m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name1 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value1 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name2 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value2 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name3 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value3 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name4 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value4 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name5 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value5 m_pEqpAct.subWordReadSave("", 168, EnuEQP.PLCRWType.Hex_Data); //Spare m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Job Start m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Job End //장비에서 GLS Data정보를 한꺼번에 읽는다. dstrValue = m_pEqpAct.funWordReadAction(true); //읽은 GLS Data를 Parsing해서 변수에 저장 dslot.H_PANELID = dstrValue[0].Trim(); dslot.E_PANELID = dstrValue[1].Trim(); dslot.LOTID = dstrValue[2].Trim(); dslot.BATCHID = dstrValue[3].Trim(); dslot.JOBID = dstrValue[4].Trim(); dslot.PORTID = dstrValue[5].Trim(); dintPortID = Convert.ToInt32(FunStringH.funMakeLengthStringFirst(dslot.PORTID, 4).Substring(2, 2)); dslot.SlotID = Convert.ToInt32(dstrValue[6]); dslot.SLOTNO = dstrValue[6]; dslot.PRODUCT_TYPE = dstrValue[7].Trim(); dslot.PRODUCT_KIND = dstrValue[8].Trim(); dslot.PRODUCTID = dstrValue[9].Trim(); dslot.RUNSPECID = dstrValue[10].Trim(); dslot.LAYERID = dstrValue[11].Trim(); dslot.STEPID = dstrValue[12].Trim(); dslot.HOSTPPID = dstrValue[13].Trim(); dslot.FLOWID = dstrValue[14].Trim(); dstrGlassSize1 = dstrValue[15].Trim(); dstrGlassSize2 = dstrValue[16].Trim(); dslot.SIZE = dstrGlassSize1 + " " + dstrGlassSize2; dslot.THICKNESS = Convert.ToInt32(dstrValue[17]); //dstrValue[18]은 Reserved임. Glass State dslot.GLASS_ORDER = dstrValue[19].Trim(); dslot.COMMENT = dstrValue[20].Trim(); dslot.USE_COUNT = dstrValue[21].Trim(); dslot.JUDGEMENT = dstrValue[22].Trim(); dslot.REASON_CODE = dstrValue[23].Trim(); dslot.INS_FLAG = dstrValue[24].Trim(); dslot.ENC_FLAG = dstrValue[25].Trim(); dslot.PRERUN_FLAG = dstrValue[26].Trim(); dslot.TURN_DIR = dstrValue[27].Trim(); dslot.FLIP_STATE = dstrValue[28].Trim(); dslot.WORK_STATE = dstrValue[29].Trim(); dslot.MULTI_USE = dstrValue[30].Trim(); dslot.PAIR_GLASSID = dstrValue[31].Trim(); dslot.PAIR_PPID = dstrValue[32].Trim(); for (int dintLoop = 0; dintLoop <= dslot.OPTION_NAME.Length - 1; dintLoop++) { dslot.OPTION_NAME[dintLoop] = dstrValue[dintIndex + 33].Trim(); dslot.OPTION_VALUE[dintLoop] = dstrValue[dintIndex + 34].Trim(); //dslot.OPTION_NAME[dintLoop] = "0"; //dslot.OPTION_VALUE[dintLoop] = "0"; dintIndex = dintIndex + 2; } dintIndex = 0; dintJobStart = Convert.ToInt32(dstrValue[44]); dintJobEnd = Convert.ToInt32(dstrValue[45]); if (dintJobStart == 1) { dslot.JOBStart = true; } else { dslot.JOBStart = false; } if (dintJobEnd == 1) { dslot.JOBEnd = true; } else { dslot.JOBEnd = false; } dstrLOTID = dslot.LOTID; dintSlotID = dslot.SlotID; dstrHGLSID = dslot.H_PANELID; pInfo.All.DataCheckGLSID = dstrHGLSID; pInfo.All.HostPPID = dstrValue[13].Trim(); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } finally { //PLC Req에 대한 CIM의 Confirm Bit를 준다. m_pEqpAct.subSetConfirmBit(strCompBit); } } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString() + ", dstrLOTID:" + dstrLOTID + ", dintSlotID: " + dintSlotID.ToString()); } }
/// <summary> /// CIM에서 설비로 발생하는 Event에 대한 처리 /// </summary> /// <param name="parameters">Parameter Array</param> /// <remarks> /// parameters[0] : cmdName /// parameters[1] : 1st parameter /// parameters[2] : 2nd parameter /// parameters[3] : 3rd parameter /// parameters[4] : 4th parameter /// parameters[5] : 5th Parameter /// </remarks> public void funProcessCIMEvent(object[] parameters) { string dstrWordAddress = ""; string dstrWordData = ""; string dstrBitAddress = "B1020"; string[] dstrValue; string dstrECID = FunStringH.funMakeLengthStringFirst("0", 48); int dintECID = 0; int dintIndex = 0; string strConvertData = ""; try { if (pInfo.All.ECIDChange.Count > 0) { for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).ECIDCount; dintLoop++) { dintIndex = pInfo.All.ECIDChange.IndexOfKey(dintLoop); //Key 값을 가지고 SortedList의 Index값을 가져온다. if (pInfo.All.ECIDChange.ContainsKey(dintLoop)) { dintECID = Convert.ToInt32(pInfo.All.ECIDChange.GetKey(dintIndex)); //Index값을 가지고 Key값을 알아온다, dstrValue = pInfo.All.ECIDChange.GetByIndex(dintIndex).ToString().Split(new char[] { ',' }); //Index값을 가지고 value값을 알아온다. //Word영역에 변경할 ECID를 Write한다. dstrWordData += pEqpAct.funWordWriteString(1, dintECID.ToString(), EnuEQP.PLCRWType.Int_Data); //dstrWordData += pEqpAct.funWordWriteString(2, dstrValue[0], EnuEQP.PLCRWType.Int_Data); if (!dstrValue[1].Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, dstrValue[1], EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, dstrValue[1], EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } if (!dstrValue[2].Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, dstrValue[2], EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, dstrValue[2], EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } if (!dstrValue[3].Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, dstrValue[3], EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, dstrValue[2], EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } //dstrWordData += pEqpAct.funWordWriteString(2, dstrValue[4], EnuEQP.PLCRWType.Int_Data); } else { clsECID CurrentECID = pInfo.Unit(0).SubUnit(0).ECID(dintLoop); dstrWordData += pEqpAct.funWordWriteString(1, CurrentECID.Index.ToString(), EnuEQP.PLCRWType.Int_Data); //dstrWordData += pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECSLL, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); if (!CurrentECID.ECWLL.Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECWLL, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECWLL, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } if (!CurrentECID.ECDEF.Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECDEF, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECDEF, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } if (!CurrentECID.ECWUL.Contains("-")) { dstrWordData += pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECWUL, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); } else { strConvertData = pEqpAct.funWordWriteString(2, FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentECID.ECWUL, CurrentECID.Format)), EnuEQP.PLCRWType.Int_Data); dstrWordData += strConvertData.Substring(4, 4) + strConvertData.Substring(0, 4); } } } //변경할 ECID 값을 써준다. dstrWordAddress = "W16C0"; pEqpAct.funWordWrite(dstrWordAddress, dstrWordData, EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 ////ECID 변경 지시를 내린다. pEqpAct.funBitWrite(dstrBitAddress, "1"); //if (pInfo.EQP("Main").DummyPLC) //{ //pEqpAct.funWordWrite("W2A00", dstrWordData, EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 //pEqpAct.funBitWrite("B1121", "1"); //} } } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } }
/// <summary> /// Glass APD를 읽어서 파일/구조체에 저장 /// </summary> /// <param name="strLOTID"></param> /// <param name="intSlotID"></param> private void subGLSAPDRead(string strGLSID, int intSlotID) { string dstrWriteData = ""; string dstrTemp = ""; string dstrWordAddress = "W2780"; string dstrValue = ""; string dstrDateTime = ""; string dstrReadData = ""; int dintLength = 0; int dintStartIndex = 0; try { //LOT이 존재하지 않거나 SlotID가 0이면 에러 로그를 출력하고 빠져나간다. if (pInfo.GLSID(strGLSID) == null || intSlotID == 0) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "subGLSAPDRead: strGlassID:" + strGLSID + ", intSlotID:" + intSlotID.ToString()); return; } ////기본 Data를 구성한다.(6개) //dstrTemp = strGLSID; //LOTID //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(1).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //dstrTemp = pInfo.LOTID(strLOTID).Slot(intSlotID).HOSTPPID; //PPID //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(2).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //dstrTemp = pInfo.LOTID(strLOTID).Slot(intSlotID).H_PANELID; //H_PANELID //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(3).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //dstrTemp = FunStringH.funMakeLengthStringFirst(intSlotID.ToString(), 2); //SLOTNO //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(4).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //dstrTemp = pInfo.LOTID(strLOTID).Slot(intSlotID).STEPID; //STEPID //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(5).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //dstrTemp = pInfo.Unit(0).SubUnit(0).EQPState; //pInfo.LOTID(strLOTID).Slot(intSlotID).GLSAPD(6).Value = dstrTemp; //dstrWriteData = dstrWriteData + dstrTemp + ","; //파일로 쓰기 위해 결합 //Word를 Block으로 한번에 읽는다. dstrReadData = m_pEqpAct.funWordRead(dstrWordAddress, pInfo.All.GLSAPDPLCReadLength * 4, EnuEQP.PLCRWType.Hex_Data).Trim(); for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).GLSAPDCount; dintLoop++) { try { dintLength = pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Length * 4; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); //문자열을 자른다. //if (pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).HaveMinusValue == false) //{ //날짜 데이터일 경우 읽은 값을 4자리로 끊어서 구조체에 저장 if (pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Format.ToUpper() == "YY/MM/DD/HH/MM/SS") { dstrValue = dstrTemp; for (int dintStep = 1; dintStep <= dintLength / 4; dintStep++) { dstrTemp = dstrValue.Substring((dintStep - 1) * 4, 4); //문자열을 잘라온다. dstrTemp = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); //PLC로 읽은 Hex를 10진수(Int)로 변환한다. if (dintStep != 1) { dstrTemp = FunStringH.funMakeLengthStringFirst(dstrTemp, 2); //월, 일, 시, 분, 초를 2자리로 맞춘다. } dstrDateTime = dstrDateTime + dstrTemp + "/"; } dstrDateTime = dstrDateTime.Substring(0, dstrDateTime.Length - 1); dstrValue = dstrDateTime; //최종 변환한 값 dstrDateTime = ""; //초기화 } else { //2 Word일때 처리 if (pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Length > 1) { if (pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Length == 8) { string strTemp = ""; for (int dintLoop2 = 0; dintLoop2 < 7; dintLoop2++) { string strTemp2 = dstrTemp.Substring(dintLoop2 * 4, 4); strTemp2 = strTemp2.Substring(2, 2) + strTemp2.Substring(0, 2); strTemp += FunTypeConversion.funHexConvert(strTemp2, EnuEQP.StringType.ASCString); } dstrTemp = strTemp; //dstrTemp = FunTypeConversion.funHexConvert(strTemp, EnuEQP.StringType.ASCString); } else { dstrTemp = dstrTemp.Substring(4, 4) + dstrTemp.Substring(0, 4); dstrTemp = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); } dstrValue = dstrTemp; //최종 변환된 값 } else { //1 Word임. dstrValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); //PLC로 읽은 Hex를 10진수(Int)로 변환한다. } } //} //else //{ // //항목의 값에 음수값이 있는 경우 음수 값 처리 // dstrValue = FunTypeConversion.funPlusMinusAPDCalc(dstrTemp); //} //소수점을 붙인다. dstrValue = CommonAct.FunStringH.funPoint(dstrValue, pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Format); } catch { dstrValue = "0"; } finally { pInfo.Unit(0).SubUnit(0).GLSAPD(dintLoop).Value = dstrValue; //구조체에 저장 dstrWriteData = dstrWriteData + dstrValue + ","; //파일로 쓰기 위해 결합 //읽을 Index 증가 dintStartIndex = dintStartIndex + dintLength; #region LOTAPD //LOT APD에 data를 저장한다.(후에 LOT APD 보고시 사용) //switch (pInfo.Unit(0).SubUnit(0).LOTAPD(dintLoop).Type) //{ // case "DateTime": // break; // case "Other": //Overwrite함. // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // break; // case "Boolean": //하나라도 1인 값이 있으면 1로 설정한다.(0 혹은 1의 값 경우) // if (pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "1") // { // } // else // { // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // } // break; // case "Numeric": //값을 누적한다. // dstrTemp = pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Name.Substring(pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Name.LastIndexOf("_") + 1).ToUpper(); // if (dstrTemp == "MIN") // { // if (pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "") //첫번째 값이 들어올때는 그 값을 Min으로 한다. // { // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // } // else // { // //기존의 값 > 새로 들어온값 ---> 새로들오온 값을 Min으로 저장 // if (Convert.ToSingle(pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value) > Convert.ToSingle(dstrValue)) // { // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // } // } // } // else if (dstrTemp == "MAX") // { // if (pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "") //첫번째 값이 들어올때는 그 값을 Max으로 한다. // { // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // } // else // { // //기존의 값 < 새로 들어온값 ---> 새로들오온 값을 Max으로 저장 // if (Convert.ToSingle(pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value) < Convert.ToSingle(dstrValue)) // { // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = dstrValue; // } // } // } // else if (dstrTemp == "AVG") // { // if (pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "") pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = "0"; // //기존의 값 + 새로 들어온 값을 계속 더한다.(평균은 subLOTAPDRead()에서 한다.) // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = Convert.ToString(Convert.ToSingle(pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value) + Convert.ToSingle(dstrValue)); // } // else // { // if (pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "") pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = "0"; // //기존의 값 + 새로 들어온 값을 계속 더한다.(평균은 subLOTAPDRead()에서 한다.) // pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = Convert.ToString(Convert.ToSingle(pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value) + Convert.ToSingle(dstrValue)); // } // break; // //case "Numeric": //값을 누적한다. // // if (m_pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value == "") m_pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = "0"; // // m_pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value = Convert.ToString(Convert.ToSingle(m_pInfo.LOTID(strLOTID).LOTAPD(dintLoop).Value) + Convert.ToSingle(dstrValue)); // // break; //} #endregion } } //마지막의 콤마는 제거 dstrWriteData = dstrWriteData.Remove(dstrWriteData.Length - 1); //파일에 저장 pInfo.subLog_Set(InfoAct.clsInfo.LogType.GLSPDC, dstrWriteData); //HOST로 보고(S6F11, CEID=81, Process Data(GLS)) pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F13GLSAPD, strGLSID, intSlotID, strGLSID); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString() + ", strGLSID:" + strGLSID + ", intSlotID:" + intSlotID.ToString()); } }
/// <summary> /// 설비에서 CIM으로 발생하는 Event에 대한 처리 /// </summary> /// <param name="parameters">Parameter Array</param> /// <remarks> /// parameters[0] : strCompBit /// parameters[1] : dstrACTVal /// parameters[2] : dintActFrom /// parameters[3] : dstrACTFromSub /// parameters[4] : intBitVal /// parameters[5] : Special Parameter /// </remarks> public void funProcessEQPEvent(string[] parameters) { string strCompBit = parameters[0]; int intUnitID = Convert.ToInt32(parameters[2]); int intSubUnitID = Convert.ToInt32(parameters[3]); int intModuleNo = Convert.ToInt32(parameters[1]); StringBuilder dstrLog = new StringBuilder(); string[] dstrValue = null; string dstrHGLSID = ""; string dstrLOTID = ""; int dintSlotID = 0; string dstrGlassSize1 = ""; string dstrGlassSize2 = ""; InfoAct.clsSlot dslot = new InfoAct.clsSlot(0); string[] dstrDataValue = new string[4]; //MCC Log Data int dintIndex = 0; int dintPortID = 0; //LD/UD 작업 Port int dintJobStart = 0; int dintJobEnd = 0; bool dbolXPCStart = false; bool dbolProcChanged = false; InfoAct.clsGLS CurrentGLS; string strMCCData = ""; //[2015/05/18](Add by HS) string dstrWordAddress = ""; int nIndex = 0; try { #region Unit1 if (intModuleNo == 13 || intModuleNo == 14 || intModuleNo == 15) //ST01 { try { pInfo.All.RPCPPID = ""; if (intModuleNo != 15) { m_pEqpAct.subWordReadSave("W2040", 8, EnuEQP.PLCRWType.ASCII_Data); //H-Glass(=panel)-ID } else { m_pEqpAct.subWordReadSave("W2380", 8, EnuEQP.PLCRWType.ASCII_Data); //H-Glass(=panel)-ID } m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //E-Glass(=panel)-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Lot-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Batch-ID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Job-ID m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Port-ID m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Slot-NO m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Prod-Type m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Prod-Kind m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //ProductID m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Runspec-ID m_pEqpAct.subWordReadSave("", 4, EnuEQP.PLCRWType.ASCII_Data); //Layer-ID m_pEqpAct.subWordReadSave("", 4, EnuEQP.PLCRWType.ASCII_Data); //Step-ID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //HOST PPID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //Flow-ID m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass(=panel)-Size(하위) ---->U2 2임.(하위 + Space(1) + 상위) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass(=panel)-Size(상위) ---->U2 2임.(하위 + Space(1) + 상위) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass-thickness(thickness) m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Glass-State(빈값) m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Glass-Order m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Comment m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Use-Count m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Judgement m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Reason-Code m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Inspection-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Enc-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Prerun-Flag m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Turn-Dir m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.ASCII_Data); //Flip-State m_pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.ASCII_Data); //Work-State m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Multi-Use m_pEqpAct.subWordReadSave("", 8, EnuEQP.PLCRWType.ASCII_Data); //Pair Glass-ID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.ASCII_Data); //Pair PPID m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name1 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value1 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name2 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value2 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name3 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value3 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name4 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value4 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Name5 m_pEqpAct.subWordReadSave("", 20, EnuEQP.PLCRWType.ASCII_Data); //Option Value5 //m_pEqpAct.subWordReadSave("", 11, EnuEQP.PLCRWType.Hex_Data); //Spare //m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //상부 / 하부 작업 진행여부 확인 //m_pEqpAct.subWordReadSave("", 156, EnuEQP.PLCRWType.Hex_Data); //Spare //m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Job Start //m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //Job End //장비에서 GLS Data정보를 한꺼번에 읽는다. dstrValue = m_pEqpAct.funWordReadAction(true); //읽은 GLS Data를 Parsing해서 변수에 저장 dslot.H_PANELID = dstrValue[0].Trim(); dslot.E_PANELID = dstrValue[1].Trim(); dslot.LOTID = dstrValue[2].Trim(); dslot.BATCHID = dstrValue[3].Trim(); dslot.JOBID = dstrValue[4].Trim(); dslot.PORTID = dstrValue[5].Trim(); dintPortID = Convert.ToInt32(FunStringH.funMakeLengthStringFirst(dslot.PORTID, 4).Substring(2, 2)); dslot.SlotID = Convert.ToInt32(dstrValue[6]); dslot.SLOTNO = dstrValue[6]; dslot.PRODUCT_TYPE = dstrValue[7].Trim(); dslot.PRODUCT_KIND = dstrValue[8].Trim(); dslot.PRODUCTID = dstrValue[9].Trim(); dslot.RUNSPECID = dstrValue[10].Trim(); dslot.LAYERID = dstrValue[11].Trim(); dslot.STEPID = dstrValue[12].Trim(); dslot.HOSTPPID = dstrValue[13].Trim(); dslot.FLOWID = dstrValue[14].Trim(); dstrGlassSize1 = dstrValue[15].Trim(); dstrGlassSize2 = dstrValue[16].Trim(); dslot.SIZE = dstrGlassSize1 + " " + dstrGlassSize2; dslot.THICKNESS = Convert.ToInt32(dstrValue[17]); //dstrValue[18]은 Reserved임. Glass State dslot.GLASS_ORDER = dstrValue[19].Trim(); dslot.COMMENT = dstrValue[20].Trim(); dslot.USE_COUNT = dstrValue[21].Trim(); dslot.JUDGEMENT = dstrValue[22].Trim(); dslot.REASON_CODE = dstrValue[23].Trim(); dslot.INS_FLAG = dstrValue[24].Trim(); dslot.ENC_FLAG = dstrValue[25].Trim(); dslot.PRERUN_FLAG = dstrValue[26].Trim(); dslot.TURN_DIR = dstrValue[27].Trim(); dslot.FLIP_STATE = dstrValue[28].Trim(); dslot.WORK_STATE = dstrValue[29].Trim(); dslot.MULTI_USE = dstrValue[30].Trim(); dslot.PAIR_GLASSID = dstrValue[31].Trim(); dslot.PAIR_PPID = dstrValue[32].Trim(); for (int dintLoop = 0; dintLoop <= dslot.OPTION_NAME.Length - 1; dintLoop++) { dslot.OPTION_NAME[dintLoop] = dstrValue[dintIndex + 33].Trim(); dslot.OPTION_VALUE[dintLoop] = dstrValue[dintIndex + 34].Trim(); //dslot.OPTION_NAME[dintLoop] = "0"; //dslot.OPTION_VALUE[dintLoop] = "0"; dintIndex = dintIndex + 2; } dintIndex = 0; //상부, 하부 확인 - ksh //A3 사용안함 //if (dstrValue[44] == "0") //{ // pInfo.All.GlassUpperJobFlag = true; //} //else //{ // pInfo.All.GlassUpperJobFlag = false; //} //dintJobStart = Convert.ToInt32(dstrValue[46]); //dintJobEnd = Convert.ToInt32(dstrValue[47]); //if (dintJobStart == 1) dslot.JOBStart = true; //else dslot.JOBStart = false; //if (dintJobEnd == 1) dslot.JOBEnd = true; //else dslot.JOBEnd = false; dstrLOTID = dslot.LOTID; dintSlotID = dslot.SlotID; dstrHGLSID = dslot.H_PANELID; if (intModuleNo == 13) { m_pEqpAct.funWordWrite("W1FC0", dslot.H_PANELID.PadRight(16, ' '), EnuEQP.PLCRWType.ASCII_Data); } else if (intModuleNo == 14) { m_pEqpAct.funWordWrite("W1FD0", dslot.H_PANELID.PadRight(16, ' '), EnuEQP.PLCRWType.ASCII_Data); } else { m_pEqpAct.funWordWrite("W1FE0", dslot.H_PANELID.PadRight(16, ' '), EnuEQP.PLCRWType.ASCII_Data); } } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } finally { //PLC Req에 대한 CIM의 Confirm Bit를 준다. m_pEqpAct.subSetConfirmBit(strCompBit); } //장비에 GLS In시 읽은 Data를 로그를 남긴다. dstrLog.Append("LOTID:" + dslot.LOTID + ","); dstrLog.Append("SlotID:" + dslot.SlotID + ","); dstrLog.Append("GLS Arrive -> UnitID:" + intUnitID.ToString() + ","); dstrLog.Append(intUnitID.ToString() + ","); dstrLog.Append("HGLSID:" + dslot.H_PANELID + ","); dstrLog.Append("EGLSID:" + dslot.E_PANELID + ","); dstrLog.Append("BatchID:" + dslot.BATCHID + ","); dstrLog.Append("JobID:" + dslot.JOBID + ","); dstrLog.Append("PortID:" + dslot.PORTID + ","); dstrLog.Append("ProdType:" + dslot.PRODUCT_TYPE + ","); dstrLog.Append("ProdKind:" + dslot.PRODUCT_KIND + ","); dstrLog.Append("ProdID:" + dslot.PRODUCTID + ","); dstrLog.Append("RunspecID:" + dslot.RUNSPECID + ","); dstrLog.Append("LayerID:" + dslot.LAYERID + ","); dstrLog.Append("StepID:" + dslot.STEPID + ","); dstrLog.Append("HOSTPPID:" + dslot.HOSTPPID + ","); dstrLog.Append("FlowID:" + dslot.FLOWID + ","); dstrLog.Append("GlassSize1:" + dstrGlassSize1 + ","); dstrLog.Append("GlassSize2:" + dstrGlassSize2 + ","); dstrLog.Append("Glassthickness:" + dslot.THICKNESS.ToString() + ","); dstrLog.Append("GlassOrder:" + dslot.GLASS_ORDER + ","); dstrLog.Append("Comment:" + dslot.COMMENT + ","); dstrLog.Append("UseCount:" + dslot.USE_COUNT + ","); dstrLog.Append("Judgement:" + dslot.JUDGEMENT + ","); dstrLog.Append("ReasonCode:" + dslot.REASON_CODE + ","); dstrLog.Append("InspectionFlag:" + dslot.INS_FLAG + ","); dstrLog.Append("EncFlag:" + dslot.ENC_FLAG + ","); dstrLog.Append("PrerunFlag:" + dslot.PRERUN_FLAG + ","); dstrLog.Append("TurnDir:" + dslot.TURN_DIR + ","); dstrLog.Append("FlipState:" + dslot.FLIP_STATE + ","); dstrLog.Append("WorkState:" + dslot.WORK_STATE + ","); dstrLog.Append("MultiUse:" + dslot.MULTI_USE + ","); dstrLog.Append("PairGlassID:" + dslot.PAIR_GLASSID + ","); dstrLog.Append("PairPPID:" + dslot.PAIR_PPID + ","); for (int dintLoop = 0; dintLoop <= dslot.OPTION_NAME.Length - 1; dintLoop++) { dstrLog.Append("OptionName" + Convert.ToString(dintLoop + 1) + ":" + dslot.OPTION_NAME[dintLoop] + ","); dstrLog.Append("OptionValue" + Convert.ToString(dintLoop + 1) + ":" + dslot.OPTION_VALUE[dintLoop] + ","); } dstrLog.Append("JobStart:" + dintJobStart.ToString() + ","); dstrLog.Append("JobEnd:" + dintJobEnd.ToString()); //pInfo.subLog_Set(InfoAct.clsInfo.LogType.GLSInOut, dstrLog.ToString()); dstrLog.Clear(); dstrLog.Append(dslot.GlassID + ","); dstrLog.Append(dslot.SLOTNO + ","); switch (intModuleNo) { case 13: dstrLog.Append("ST01 Glass IN"); break; case 14: dstrLog.Append("ST02 Glass IN"); break; case 15: dstrLog.Append("GL01 Glass IN"); break; } pInfo.subLog_Set(InfoAct.clsInfo.LogType.GLSInOut, dstrLog.ToString()); //LOT의 첫번째 GLS이면 LOT정보를 생성한다. //if (pInfo.LOTID(dslot.LOTID) == null) subCreateLOTInfo(dslot.LOTID, dintJobStart); if (pInfo.GLSID(dslot.H_PANELID) == null) { pInfo.AddGLS(dslot.H_PANELID); } pInfo.GLSID(dslot.H_PANELID).CopyFrom(dslot); CurrentGLS = pInfo.GLSID(dslot.H_PANELID); ////GLS Data를 구조체에 저장 //InfoAct.clsSlot currentSlot = pInfo.LOTID(dstrLOTID).Slot(dintSlotID); //currentSlot.CopyFrom(dslot); CurrentGLS.StartTime = DateTime.Now.ToString("yyyyMMddHHmmss"); CurrentGLS.GLASS_STATE = 3; //Processing //pInfo.LOTID(dstrLOTID).InCount += 1; //LOT의 GLS개수 증가 if (pInfo.Unit(0).SubUnit(0).AddCurrGLS(CurrentGLS.H_PANELID) == true) { InfoAct.clsGLS curGLS = pInfo.Unit(0).SubUnit(0).CurrGLS(CurrentGLS.H_PANELID); curGLS.H_PANELID = CurrentGLS.H_PANELID; curGLS.SlotID = CurrentGLS.SlotID; pInfo.Unit(0).SubUnit(0).GLSExist = true; } if (pInfo.Unit(intUnitID).SubUnit(0).AddCurrGLS(CurrentGLS.H_PANELID) == true) { InfoAct.clsGLS curGLS = pInfo.Unit(intUnitID).SubUnit(0).CurrGLS(CurrentGLS.H_PANELID); curGLS.H_PANELID = CurrentGLS.H_PANELID; curGLS.SlotID = CurrentGLS.SlotID; pInfo.Unit(intUnitID).SubUnit(0).GLSExist = true; } if (pInfo.Unit(intUnitID).SubUnit(intSubUnitID).AddCurrGLS(CurrentGLS.H_PANELID) == true) { InfoAct.clsGLS curGLS = pInfo.Unit(intUnitID).SubUnit(intSubUnitID).CurrGLS(CurrentGLS.H_PANELID); curGLS.H_PANELID = CurrentGLS.H_PANELID; curGLS.SlotID = CurrentGLS.SlotID; pInfo.Unit(intUnitID).SubUnit(intSubUnitID).GLSExist = true; } string dstrOLDHOSTPPID = ""; string dstrNEWHOSTPPID = ""; if (pInfo.EQP("Main").DummyPLC == false) { if (pInfo.Unit(0).SubUnit(0).HOSTPPID(CurrentGLS.HOSTPPID) == null) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "Arrive HostPPID Null!! HostPPID : " + CurrentGLS.HOSTPPID); } dstrOLDHOSTPPID = pInfo.All.CurrentHOSTPPID; //이전 PPID 백업 dstrNEWHOSTPPID = CurrentGLS.HOSTPPID; pInfo.All.CurrentHOSTPPID = dstrNEWHOSTPPID; //변경된 HOSTPPID를 입력 pInfo.All.CurrentEQPPPID = pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrNEWHOSTPPID).EQPPPID; } if (pInfo.All.EQPSpecifiedCtrlBYWHO == "1")// || pInfo.All.EQPSpecifiedCtrlBYWHO == "2") { //HOST나 OP에서 발생한것임 } else { pInfo.All.EQPSpecifiedCtrlBYWHO = "2"; //BY EQP } //wordwrite시점은 MCC로 정보를 보내기전으로... //MCC로 메세지 전송후 보내면 MCC에서 Data 읽을때 이전Data를 읽을 수 있음. string dstrMCCWordAddress = "W1D00"; dstrMCCWordAddress = CommonAct.FunTypeConversion.funAddressAdd(dstrMCCWordAddress, 64 * (intModuleNo - 13)); string strGlassData = ""; strGlassData += m_pEqpAct.funWordWriteString(4, CurrentGLS.STEPID.PadRight(4, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(28, CurrentGLS.H_PANELID.PadRight(28, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(8, CurrentGLS.LOTID.PadRight(8, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(10, CurrentGLS.HOSTPPID.PadRight(10, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(1, CurrentGLS.SLOTNO, EnuEQP.PLCRWType.Int_Data); strGlassData += m_pEqpAct.funWordWriteString(1, "0", EnuEQP.PLCRWType.Int_Data); strGlassData += m_pEqpAct.funWordWriteString(1, "1", EnuEQP.PLCRWType.Int_Data); m_pEqpAct.funWordWrite(dstrMCCWordAddress, strGlassData, EnuEQP.PLCRWType.Hex_Data); DateTime dt = DateTime.Now; strMCCData = ""; if (dstrOLDHOSTPPID != dstrNEWHOSTPPID) { //CEID=131보고 pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11EquipmentSpecifiedControlEvent, 131, dstrOLDHOSTPPID, dstrNEWHOSTPPID); //[2015/04/23]MCC Event Log(Add by HS) strMCCData = "EVENT;"; strMCCData += "CEID_131" + ","; strMCCData += pInfo.Unit(intUnitID).SubUnit(intSubUnitID).ModuleID + ","; strMCCData += CurrentGLS.STEPID + ","; strMCCData += CurrentGLS.H_PANELID + ","; strMCCData += CurrentGLS.LOTID + ","; strMCCData += pInfo.All.CurrentHOSTPPID + "=" + pInfo.All.CurrentEQPPPID + ","; strMCCData += dstrOLDHOSTPPID + ","; strMCCData += dstrNEWHOSTPPID + ";"; pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.MCCDataSend, strMCCData); } if (pInfo.EQP("Main").EQPID.Contains("A3GLM")) //하부 라미시나리오 { if (intModuleNo == 15) { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 16, intUnitID, 0, dslot.H_PANELID, dslot.SlotID); pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 16, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); //pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 26, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); } else { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 16, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 26, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); //[2015/04/23]MCC Event Log(Add by HS) strMCCData = "EVENT;"; strMCCData += "CEID_16" + ","; strMCCData += pInfo.Unit(intUnitID).SubUnit(intSubUnitID).ModuleID + ","; strMCCData += CurrentGLS.STEPID + ","; strMCCData += CurrentGLS.H_PANELID + ","; strMCCData += CurrentGLS.LOTID + ","; strMCCData += pInfo.All.CurrentHOSTPPID + "=" + pInfo.All.CurrentEQPPPID + ";"; pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.MCCDataSend, strMCCData); } } else//상부 라미 시나리오 { //Layer1 보고(CEID=16, PANEL PROCESS START for MODULE) pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 16, intUnitID, 0, dslot.H_PANELID, dslot.SlotID); pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 16, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 26, intUnitID, intSubUnitID, dslot.H_PANELID, dslot.SlotID); //[2015/04/23]MCC Event Log(Add by HS) strMCCData += "EVENT;"; strMCCData += "CEID_16" + ","; strMCCData += pInfo.Unit(intUnitID).SubUnit(intSubUnitID).ModuleID + ","; strMCCData += CurrentGLS.STEPID + ","; strMCCData += CurrentGLS.H_PANELID + ","; strMCCData += CurrentGLS.LOTID + ","; strMCCData += pInfo.All.CurrentHOSTPPID + "=" + pInfo.All.CurrentEQPPPID + ";"; pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.MCCDataSend, strMCCData); } // 20130220 이상창.. 여기가 위치가맞나..? // 상태 변경 후에 보고하도록 변경해야하나..? #region "Process Step" string dstrModuleID = pInfo.Unit(intUnitID).SubUnit(0).ModuleID; //foreach (InfoAct.clsProcessStep tmpProcStep in this.pInfo.Unit(0).SubUnit(0).ProcessStepValues()) //{ // if (dstrModuleID.Equals(tmpProcStep.StartModuleID) || dstrModuleID.Equals(tmpProcStep.EndModuleID)) // { // if (tmpProcStep.ProcessEvent.ToUpper().Equals("START")) // { // pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 26, 0, dslot.LOTID, dslot.SlotID); // } // } // if (!dbolProcChanged && dstrModuleID.Equals(tmpProcStep.StartModuleID)) // { // if (pInfo.Unit(0).SubUnit(0).CurrGLS(currentSlot.H_PANELID) != null) // { // currentSlot.StepNo_OLD = currentSlot.StepNo; // currentSlot.StepNo = tmpProcStep.StepNO; // } // pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedProcessStatusEvent, 23, 0, dslot.LOTID, dslot.SlotID); // //break; // dbolProcChanged = true; // } //} #endregion //2012.11.06 김영식... Normal/APC/RPC/PPC Start 여부 판정하여 CIM Event 처리 // 20121212 lsc if (this.pInfo.Unit(0).SubUnit(0).EOID(this.pInfo.funGetEOIDNameToIndex("RPC")).EOV == 1 && pInfo.RPC(dslot.H_PANELID) != null) { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S16F131RPCStart, dstrHGLSID); pInfo.All.RPCDBUpdateCheck = true; CurrentGLS.IsRPCRunning = true; dbolXPCStart = true; pInfo.All.RPCPPID = pInfo.RPC(dstrHGLSID).RPC_PPID; if (pInfo.APC(dslot.H_PANELID) != null) { pInfo.APC(dslot.H_PANELID).State = "2"; pInfo.subProcessDataStatusSet(InfoAct.clsInfo.ProcessDataType.APC, dstrHGLSID); } } else if (this.pInfo.Unit(0).SubUnit(0).EOID(this.pInfo.funGetEOIDNameToIndex("APC")).EOV == 1 && pInfo.APC(dslot.H_PANELID) != null) { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S16F111APCStart, dstrHGLSID); CurrentGLS.IsAPCRunning = true; dbolXPCStart = true; } if (dbolXPCStart == false) { //pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.NormalStart, dstrHGLSID); } //unit별로 현재 Glass ID 저장 pInfo.Unit(intUnitID).SubUnit(0).HGLSID = dslot.H_PANELID; pInfo.Unit(intUnitID).SubUnit(intSubUnitID).HGLSID = dslot.H_PANELID; pInfo.Unit(intUnitID).SubUnit(0).GLSExist = true; } #endregion #region Film구간 else { int dintDEPUnitID = 0; switch (intModuleNo) { case 7: //FT01 dstrWordAddress = "W22C0"; break; case 9: //AL01 dstrWordAddress = "W2300"; break; case 10: //LM01 dstrWordAddress = "W2320"; break; case 11: //DM01 dstrWordAddress = "W2340"; break; case 12: //IS01 dstrWordAddress = "W2360"; break; case 8: //FT02 dstrWordAddress = "W22E0"; break; } if (string.IsNullOrEmpty(dstrWordAddress)) { return; } m_pEqpAct.subWordReadSave(dstrWordAddress, 8, EnuEQP.PLCRWType.ASCII_Data); // LOTID m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); // SlotID string dstrproIDWordAddress = "W16B3"; string strPROID = m_pEqpAct.funWordRead(dstrproIDWordAddress, 8, EnuEQP.PLCRWType.ASCII_Data); //20160407 KEUN dstrWordAddress = "W1680"; string strFilmID = m_pEqpAct.funWordRead(dstrWordAddress, 50, EnuEQP.PLCRWType.ASCII_Data);//1605023 keun strLotID -> strFilmID로 수정. dstrValue = m_pEqpAct.funWordReadAction(true); m_pEqpAct.subSetConfirmBit(strCompBit); if (dstrValue[0].Length > 13) { dstrValue[0] = dstrValue[0].Substring(0, 13); } dstrLOTID = dstrValue[0].Trim(); dintSlotID = Convert.ToInt32(dstrValue[1].Trim()); dstrLog.Append("FilmID:" + strFilmID + ",");//1605023 keun strLotID -> strFilmID로 수정. dstrLog.Append("SlotID:" + dintSlotID + ","); dstrLog.Append("Film Arrive -> UnitID:" + intUnitID.ToString() + ","); dstrLog.Append(intUnitID.ToString()); //this.pInfo.subLog_Set(InfoAct.clsInfo.LogType.GLSInOut, dstrLog.ToString()); if (this.pInfo.LOTID(dstrLOTID) == null) { subCreateLOTInfo(dstrLOTID, 0); } if (pInfo.LOTID(dstrLOTID).Slot(dintSlotID) == null) { pInfo.LOTID(dstrLOTID).AddSlot(dintSlotID); pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, string.Format("Slot No Error!! AddSlot!! LotID : {0}, SlotNo : {1}", dstrLOTID, dintSlotID)); } if (string.IsNullOrEmpty(pInfo.LOTID(dstrLOTID).Slot(dintSlotID).GlassID)) { pInfo.LOTID(dstrLOTID).Slot(dintSlotID).GlassID = strFilmID.Trim(); pInfo.LOTID(dstrLOTID).Slot(dintSlotID).USE_COUNT = dintSlotID.ToString().PadLeft(3, '0'); //pInfo.LOTID(dstrLOTID).Slot(dintSlotID).PRODUCTID = dstrLOTID; pInfo.LOTID(dstrLOTID).Slot(dintSlotID).PRODUCTID = strPROID; //160407 KEUN } //dstrHGLSID = this.pInfo.LOTID(dstrLOTID).Slot(dintSlotID).H_PANELID; pInfo.Unit(intUnitID).SubUnit(0).FilmID = strFilmID; //1605023 keun strLotID -> strFilmID로 수정. pInfo.Unit(intUnitID).SubUnit(0).FilmCount = dintSlotID; pInfo.LOTID(dstrLOTID).Slot(dintSlotID).FilmExistUnitID = intUnitID; pInfo.Unit(intUnitID).SubUnit(0).FilmExist = true; pInfo.Unit(intUnitID).SubUnit(intSubUnitID).FilmID = strFilmID; //1605023 keun strLotID -> strFilmID로 수정. pInfo.Unit(intUnitID).SubUnit(intSubUnitID).FilmCount = dintSlotID; pInfo.LOTID(dstrLOTID).Slot(dintSlotID).FilmExistUnitID = intUnitID; pInfo.Unit(intUnitID).SubUnit(intSubUnitID).FilmExist = true; //wordwrite시점은 MCC로 정보를 보내기전으로... //MCC로 메세지 전송후 보내면 MCC에서 Data 읽을때 이전Data를 읽을 수 있음. string dstrMCCWordAddress = "W1B80"; dstrMCCWordAddress = CommonAct.FunTypeConversion.funAddressAdd(dstrMCCWordAddress, 64 * (intModuleNo - 7)); string strGlassData = ""; strGlassData += m_pEqpAct.funWordWriteString(4, "0000", EnuEQP.PLCRWType.ASCII_Data);//임시 strGlassData += m_pEqpAct.funWordWriteString(28, pInfo.LOTID(dstrLOTID).Slot(dintSlotID).GlassID.PadRight(28, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(8, dstrLOTID.PadRight(8, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(10, pInfo.All.CurrentHOSTPPID.PadRight(10, ' '), EnuEQP.PLCRWType.ASCII_Data); strGlassData += m_pEqpAct.funWordWriteString(1, dintSlotID.ToString(), EnuEQP.PLCRWType.Int_Data); strGlassData += m_pEqpAct.funWordWriteString(1, "0", EnuEQP.PLCRWType.Int_Data); strGlassData += m_pEqpAct.funWordWriteString(1, "1", EnuEQP.PLCRWType.Int_Data); m_pEqpAct.funWordWrite(dstrMCCWordAddress, strGlassData, EnuEQP.PLCRWType.Hex_Data); if (intModuleNo == 7) { //this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.FilmJobCommand, 1006, dintPortID); //Lot Start 지시 pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedJobProcess, 1006, 2, 1, 2, dstrLOTID, dintSlotID); pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11MaterialProcEvent, 1016, intModuleNo, dstrLOTID, dintSlotID, intUnitID, 0); } pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11MaterialProcEvent, 1016, intModuleNo, dstrLOTID, dintSlotID, intUnitID, intSubUnitID); //[2015/05/15]MCC Event Log(Add by HS) InfoAct.clsSlot CurrentSlot = pInfo.LOTID(dstrLOTID).Slot(dintSlotID); strMCCData = "EVENT;"; strMCCData += "CEID_1016" + ","; strMCCData += pInfo.Unit(intUnitID).SubUnit(intSubUnitID).ModuleID + ","; strMCCData += CurrentSlot.STEPID + ","; strMCCData += CurrentSlot.H_PANELID + ","; strMCCData += CurrentSlot.LOTID + ","; strMCCData += pInfo.All.CurrentHOSTPPID + "=" + pInfo.All.CurrentEQPPPID + ";"; pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.MCCDataSend, strMCCData); // 20130220 이상창.. 여기가 위치가맞나..? // 상태 변경 후에 보고하도록 변경해야하나..? #region "Process Step - 생략" //string dstrModuleID = pInfo.Unit(intUnitID).SubUnit(0).ModuleID; //foreach (InfoAct.clsProcessStep tmpProcStep in this.pInfo.Unit(0).SubUnit(0).ProcessStepValues()) //{ // if(dstrModuleID.Equals(tmpProcStep.StartModuleID) || dstrModuleID.Equals(tmpProcStep.EndModuleID)) // { // if (tmpProcStep.ProcessEvent.ToUpper().Equals("START")) // { // pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedPanelProcessEvent, 26, 0, currentSlot.LOTID, currentSlot.SlotID); // } // } // if (!dbolProcChanged && dstrModuleID.Equals(tmpProcStep.StartModuleID)) // { // if (pInfo.Unit(0).SubUnit(0).CurrGLS(currentSlot.H_PANELID) != null) // { // currentSlot.StepNo_OLD = currentSlot.StepNo; // currentSlot.StepNo = tmpProcStep.StepNO; // } // pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedProcessStatusEvent, 23, 0, currentSlot.LOTID, currentSlot.SlotID); // //break; // dbolProcChanged = true; // } //} #endregion } #endregion } catch (Exception ex) { pInfo.All.RPCPPID = ""; pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } }