/// <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 strMessage = parameters[0].ToString(); string dstrBitAddress = "B1003";; string dstrWordAddress = "W1010"; string strType = ""; try { strType = parameters[1].ToString().Trim(); if (strMessage.Length > 1000) //메시지 길이 초과시 1000자로 조정 { strMessage = strMessage.Substring(0, 1000); } else { strMessage = FunStringH.funStringData(strMessage, 1000); //1000자로 맞춘다. } pEqpAct.funWordWrite("W1010", strMessage, EnuEQP.PLCRWType.ASCII_Data, false); if (strType == "O") { pEqpAct.funBitWrite("B1003", "1", false); } else { pEqpAct.funBitWrite("B1005", "1", false); } } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString() + ", strMessage:" + strMessage); } }
/// <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 /// (string strHOSTPPID, string strEQPPPID, string strTime, string strPPIDRev, string dstrPPIDType) /// </remarks> public void funProcessCIMEvent(object[] parameters) { string dstrWordAddress = "W1210"; string dstrWordData = ""; string dstrBitAddress = ""; StringBuilder dstrLog = new StringBuilder(); string dstrTemp = ""; try { InfoAct.clsEQPPPID CurrentEQPPPID = (InfoAct.clsEQPPPID)parameters[0]; dstrWordData += pEqpAct.funWordWriteString(1, CurrentEQPPPID.EQPPPID, EnuEQP.PLCRWType.Int_Data); dstrWordData += pEqpAct.funWordWriteString(10, "".PadRight(20), EnuEQP.PLCRWType.Hex_Data); dstrWordData += pEqpAct.funWordWriteString(1, "1", EnuEQP.PLCRWType.Int_Data); for (int dintLoop = 0; dintLoop < pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Length == 2) { if (CurrentEQPPPID.PPIDBody(dintLoop + 1) == null) { dstrTemp = "0"; } else { dstrTemp = FunStringH.funMakePLCData(FunStringH.funMakeRound(CurrentEQPPPID.PPIDBody(dintLoop + 1).Value, this.pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Format)); } dstrWordData += pEqpAct.funWordWriteString(2, dstrTemp, EnuEQP.PLCRWType.Int_Data); } else { if (CurrentEQPPPID.PPIDBody(dintLoop + 1) == null) { dstrTemp = ""; } else { dstrTemp = CurrentEQPPPID.PPIDBody(dintLoop + 1).Value; } dstrWordData += pEqpAct.funWordWriteString(8, dstrTemp.PadRight(16), EnuEQP.PLCRWType.ASCII_Data); } } pEqpAct.funWordWrite(dstrWordAddress, dstrWordData, EnuEQP.PLCRWType.Hex_Data); //PPID 생성지시 dstrBitAddress = "B1032"; pEqpAct.funBitWrite(dstrBitAddress, "1"); if (pInfo.EQP("Main").DummyPLC) { pEqpAct.funWordWrite("W2540", dstrWordData, EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 pEqpAct.funBitWrite("B113A", "1"); } } 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] : cmdName /// parameters[1] : 1st parameter /// parameters[2] : 2nd parameter /// parameters[3] : 3rd parameter /// parameters[4] : 4th parameter /// parameters[5] : 5th Parameter /// (string strHOSTPPID, string strEQPPPID, string dstrPPIDBody, string dstrPPIDType) /// </remarks> public void funProcessCIMEvent(object[] parameters) { string strHOSTPPID = parameters[0].ToString(); string dstrEQPPPID = parameters[1].ToString(); string dstrPPIDBody = parameters[2].ToString(); string dstrPPIDType = parameters[3].ToString(); string dstrWordData = ""; string dstrValue = " "; string[] dstrData = null; string dstrHOSTPPID = FunStringH.funStringData("", 20); //HOST PPID는 항상 공백으로 써줌(필요없음) int dintPPIDType = 1; //EQP PPID(1) string strWordAddress = "W1210"; string dstrBitAddress = ""; string dstrTemp = ""; try { string[] arrCon = dstrPPIDBody.Split(';'); dstrWordData += pEqpAct.funWordWriteString(1, dstrEQPPPID, EnuEQP.PLCRWType.Int_Data); dstrWordData += pEqpAct.funWordWriteString(10, "".PadRight(20), EnuEQP.PLCRWType.Hex_Data); dstrWordData += pEqpAct.funWordWriteString(1, "1", EnuEQP.PLCRWType.Int_Data); for (int dintLoop = 0; dintLoop < arrCon.Length; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Length == 2) { dstrTemp = FunStringH.funMakePLCData(FunStringH.funMakeRound(arrCon[dintLoop], this.pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Format)); dstrWordData += pEqpAct.funWordWriteString(2, dstrTemp, EnuEQP.PLCRWType.Int_Data); } else { dstrWordData += pEqpAct.funWordWriteString(8, arrCon[dintLoop].PadRight(16), EnuEQP.PLCRWType.ASCII_Data); } } pEqpAct.funWordWrite(strWordAddress, dstrWordData, EnuEQP.PLCRWType.Hex_Data); //EQP PPID Body 수정 dstrBitAddress = "B1034"; pEqpAct.funBitWrite(dstrBitAddress, "1"); if (pInfo.EQP("Main").DummyPLC) { pEqpAct.funWordWrite("W2540", dstrWordData, EnuEQP.PLCRWType.Hex_Data); pEqpAct.funBitWrite("B113B", "1"); } } 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] : 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] : 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 strHOSTPPID = parameters[0].ToString(); // lsc string dstrBitAddress = "B1034"; string dstrWordAddress = "W1010"; string dstrWordData = ""; try { strHOSTPPID = FunStringH.funStringData(strHOSTPPID, 20); //20자로 맞춘다. dstrWordData += pEqpAct.funWordWriteString(10, strHOSTPPID, EnuEQP.PLCRWType.ASCII_Data); //HOSTPPID pEqpAct.funWordWrite(dstrWordAddress, dstrWordData, EnuEQP.PLCRWType.Hex_Data); dstrWordData = ""; //초기화 pEqpAct.funBitWrite(dstrBitAddress, "1"); } 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]; string dstrWordAddress = ""; StringBuilder dstrLog = new StringBuilder(); int dintLength = 0; string dstrTemp = ""; int dintBodyIndex = 3; //PPID Body Index string dstrAfterHOSTPPID = ""; string dstrAfterEQPPPID = ""; string dstrBeforeEQPPPID = ""; int dintAfterPPIDType = 0; string[] dstrAfterValue; try { dstrWordAddress = "W2040"; //m_pEqpAct.subWordReadSave(dstrWordAddress, 10, EnuEQP.PLCRWType.ASCII_Data); //HOST PPID m_pEqpAct.subWordReadSave(dstrWordAddress, 1, EnuEQP.PLCRWType.Int_Data); //EQP PPID m_pEqpAct.subWordReadSave("", 10, EnuEQP.PLCRWType.Int_Data); //Spare m_pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //PPID Type //for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) //{ // dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; // m_pEqpAct.subWordReadSave("", dintLength, EnuEQP.PLCRWType.Int_Data); //Body //} dstrAfterValue = m_pEqpAct.funWordReadAction(true); //PLC Req에 대한 CIM의 Confirm Bit를 준다.5 m_pEqpAct.subSetConfirmBit(strCompBit); dstrAfterHOSTPPID = dstrAfterValue[0]; dstrAfterEQPPPID = dstrAfterValue[1]; dintAfterPPIDType = Convert.ToInt32(dstrAfterValue[3]); if (pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrAfterHOSTPPID) == null) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, string.Format("존재하지 않는 HostPPID: {0} 에 대한 Mapping 변경 보고됨.", dstrAfterHOSTPPID)); return; } if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrAfterEQPPPID) == null) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, string.Format("HostPPID: {0} 에 존재하지 않는 EQPPPID: {1} Mapping 변경 보고됨.", dstrAfterHOSTPPID, dstrAfterEQPPPID)); return; } dstrBeforeEQPPPID = pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrAfterHOSTPPID).EQPPPID; pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrAfterHOSTPPID).EQPPPID = dstrAfterEQPPPID; //로그를 출력한다. dstrLog.Append(FunStringH.funPaddingStringData("-", 30, '-') + "\r\n"); dstrLog.Append("HOST PPID Mapping 수정(After Data)" + "\r\n"); dstrLog.Append("AfterHOSTPPID:" + dstrAfterHOSTPPID + ","); dstrLog.Append("AfterEQPPPID:" + dstrAfterEQPPPID + ","); dstrLog.Append("AfterPPIDType:" + dintAfterPPIDType.ToString() + "\r\n"); //for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) //{ // dstrTemp = FunStringH.funPoint(dstrAfterValue[dintBodyIndex + dintLoop - 1], pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // dstrLog.Append(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name + ":" + dstrTemp + "\r\n"); //} dstrLog.Append(FunStringH.funPaddingStringData("-", 30, '-') + "\r\n"); pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, dstrLog.ToString()); //HOST로 HOST Mapping 변경 보고 //인자:변경(3), PPIDTYPE, HOSTPPID, EQPPPID pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S7F107PPIDCreatDeleteAndPPBodyChangedReport, "3", dintAfterPPIDType, dstrAfterHOSTPPID, dstrAfterEQPPPID); m_pEqpAct.subSetParameterLog("HOST PPID Mapping 수정", dstrAfterHOSTPPID, null, dstrBeforeEQPPPID, dstrAfterEQPPPID); //최종 수정된 날짜 Ini에 변경 FunINIMethod.subINIWriteValue("ETCInfo", "RECIPELastModified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), pInfo.All.SystemINIFilePath); } 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] : 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 dstrHGLSID = ""; string dstrWordAddress = ""; string dstrBitAddress = ""; bool dbolItemCheck = false; string strAPCEQPPPID = ""; string dstrValue = ""; int APCItemIndex = 0; string JobRecipe = ""; string strWordWriteData = ""; try { //dstrHGLSID = parameters[0].ToString(); dstrHGLSID = parameters[0].ToString(); //Test dstrWordAddress = "W1440"; dstrBitAddress = "B1018"; strAPCEQPPPID = pInfo.APC(dstrHGLSID).EQPPPID; //if (pInfo.All.GlassUpperJobFlag) //{ // JobRecipe = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(strAPCEQPPPID).UP_EQPPPID; //} //else //{ // JobRecipe = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(strAPCEQPPPID).LOW_EQPPPID; //} for (int dintLoop = 0; dintLoop < 574; dintLoop++) { pEqpAct.funWordWrite(dstrWordAddress, "0", EnuEQP.PLCRWType.Int_Data); dstrWordAddress = CommonAct.FunTypeConversion.funAddressAdd(dstrWordAddress, 1); } dstrWordAddress = "W1440"; for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBodyCount; dintLoop++) { dbolItemCheck = false; for (int dintLoop2 = 0; dintLoop2 < pInfo.APC(dstrHGLSID).ParameterName.Length; dintLoop2++) { if (pInfo.APC(dstrHGLSID).ParameterName[dintLoop2] == pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Name) { APCItemIndex = dintLoop2; dbolItemCheck = true; break; } } if (dbolItemCheck) { dstrValue = Convert.ToInt32(FunStringH.funMakePLCData(pInfo.APC(dstrHGLSID).ParameterValue[APCItemIndex].ToString())).ToString(); } else { dstrValue = FunStringH.funMakePLCData(pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Value); } //if (pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Length > 1) //{ // pEqpAct.funDoubleWordWrite(dstrWordAddress, dstrValue, EnuEQP.PLCRWType.Int_Data); //} //else //{ // pEqpAct.funWordWrite(dstrWordAddress, dstrValue, EnuEQP.PLCRWType.Int_Data); //} //dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) { if (dstrValue.Contains("-")) { strWordWriteData = pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dstrValue, EnuEQP.PLCRWType.Int_Data); } else { strWordWriteData = pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dstrValue, EnuEQP.PLCRWType.Int_Data).Substring(4, 4) + pEqpAct.funWordWriteString(2, dstrValue, EnuEQP.PLCRWType.Int_Data).Substring(0, 4); } pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(4, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, 1); pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(0, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length - 1); } else { pEqpAct.funWordWrite(dstrWordAddress, dstrValue.PadRight(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length), EnuEQP.PLCRWType.ASCII_Data); dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); } } pEqpAct.funWordWrite("W167E", strAPCEQPPPID, EnuEQP.PLCRWType.Int_Data); pEqpAct.funBitWrite(dstrBitAddress, "1"); //pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S16F111APCStart, dstrHGLSID); } 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[] dstrValue; string dstrWordAddress = "W2540"; StringBuilder dstrLog = new StringBuilder(); string dstrHOSTPPID = ""; string dstrEQPPPID = ""; int dintPPIDType = 0; string dstrTemp = ""; int dintLength = 0; int dintBodyIndex = 3; //PPID Body Index string APCType = ""; string strWordAddress = ""; //[2015/04/20](Add by HS) string dstrReadData = ""; int dintStartIndex = 0; string strValue = ""; int dintReadcount = 0; try { //[2015/04/20]임시add by HS) pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, string.Format("actOnePPIDInfoRequest Start. Time = {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); dstrEQPPPID = m_pEqpAct.funWordRead("W2540", 1, EnuEQP.PLCRWType.Int_Data); dintPPIDType = 1; //150429 고석현 수정 //매번 읽으면 늦어지므로 EQPPPID가 존재하면 그대로 보고 EQPPPID가 //pInfo.Unit(0).SubUnit(0).RemoveEQPPPID(dstrEQPPPID); dintReadcount = (pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5) * 2; strWordAddress = "W254C"; if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBodyCount == 0) { //[2015/04/20] PPID Body 값 Block으로 한번에(Add by HS) dstrReadData = m_pEqpAct.funWordRead("W254C", dintReadcount, EnuEQP.PLCRWType.Hex_Data, false).Trim(); #region EQPPPID에 Body 저장 for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 4; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length > 1) { string dstrTemp1 = dstrTemp.Substring(0, 4); string dstrTemp2 = dstrTemp.Substring(4, 4); dstrTemp = dstrTemp2 + dstrTemp1; strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); dstrTemp = FunStringH.funPoint(strValue, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; } else { strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.ASCString); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = strValue; } dintStartIndex += dintLength; #region 변경전 [2015.04.20] Modify by HS //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; //if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) //{ // dstrTemp = FunStringH.funPoint(m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.Int_Data), pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //else //{ // dstrTemp = m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.ASCII_Data); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); #endregion } } #endregion strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, dintReadcount); dstrReadData = m_pEqpAct.funWordRead(strWordAddress, 80, EnuEQP.PLCRWType.ASCII_Data, false); dintStartIndex = 0; #region EQPPPID에 Film Code 저장 for (int dintLoop = 251; dintLoop <= 255; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 2; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp.Trim(); } dintStartIndex += dintLength; } #endregion } } ////dstrHOSTPPID = dstrValue[0]; //dstrEQPPPID = dstrValue[0]; //dintPPIDType = Convert.ToInt32(dstrValue[2]); ////로그를 남긴다. //switch (dintPPIDType) //{ // case 1: // dstrTemp = "EQP PPID 정보 요청(One)"; // break; // case 2: // dstrTemp = "HOST PPID 정보 요청(One)"; // break; // default: //여기로 들어오면 Error임. // dstrTemp = "PPID 정보 요청(One)"; // break; //} //dstrLog.Append(FunStringH.funPaddingStringData("-", 30, '-') + "\r\n"); //dstrLog.Append(dstrTemp + "\r\n"); //dstrLog.Append("HOSTPPID:" + dstrHOSTPPID + ","); //dstrLog.Append("EQPPPID:" + dstrEQPPPID + ","); //dstrLog.Append("PPIDType:" + dintPPIDType.ToString() + "\r\n"); //for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) //{ // dstrTemp = FunStringH.funPoint(dstrValue[dintBodyIndex + dintLoop - 1], pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // dstrLog.Append(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name + ":" + dstrTemp + "\r\n"); //} //dstrLog.Append(FunStringH.funPaddingStringData("-", 30, '-')); //pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, dstrLog.ToString()); switch (dintPPIDType) { case 1: //EQP PPID //기존에 EQPPPID가 존재하면 지운다. //pInfo.Unit(0).SubUnit(0).RemoveEQPPPID(dstrEQPPPID); //if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) //{ // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).EQPPPID = dstrEQPPPID; // for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) // { // //EQPPPID에 Body 저장 // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; // dstrTemp = FunStringH.funPoint(dstrValue[dintBodyIndex + dintLoop - 1], pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; // } //} //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBodyCheck = true; break; case 2: //HOST PPID if (pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrHOSTPPID) == null) { //기존에 HOSTPPID가 존재하지 않으면 새로 생성한다. pInfo.Unit(0).SubUnit(0).AddHOSTPPID(dstrHOSTPPID); } pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrHOSTPPID).EQPPPID = dstrEQPPPID; pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrHOSTPPID).HostPPID = dstrHOSTPPID; break; default: break; } //if (pInfo.All.APCStartEQPPPIDCheck) //{ // pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.APCStart, pInfo.All.DataCheckGLSID); //} } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } finally { pInfo.All.isReceivedFromHOST = false; //초기화 pInfo.All.PLCActionEnd = true; //PLC로 부터 값을 읽었음을 저장 pInfo.All.PLCActionEnd2 = true; pInfo.All.APCPPIDReadFlag = true; //[2015/04/20]임시add by HS) pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, string.Format("actOnePPIDInfoRequest End. Time = {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); } }
/// <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 dstrHGLSID = ""; string dstrWordAddress = "W1440"; string dstrBitAddress = ""; bool dbolItemCheck = false; string strAPCEQPPPID = ""; string dstrValue = ""; int APCItemIndex = 0; string JobRecipe = ""; string strWordWriteData = ""; try { #region 임시 dstrHGLSID = "TEST"; dstrWordAddress = "W1440"; dstrBitAddress = "B1018"; for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBodyCount; dintLoop++) { dbolItemCheck = false; for (int dintLoop2 = 0; dintLoop2 < pInfo.APC(dstrHGLSID).ParameterName.Length; dintLoop2++) { if (pInfo.APC(dstrHGLSID).ParameterName[dintLoop2] == pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Name) { APCItemIndex = dintLoop2; dbolItemCheck = true; break; } } if (dbolItemCheck) { dstrValue = Convert.ToInt32(FunStringH.funMakePLCData(pInfo.APC(dstrHGLSID).ParameterValue[APCItemIndex].ToString())).ToString(); } else { dstrValue = FunStringH.funMakePLCData(pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Value); } //if (pInfo.Unit(0).SubUnit(0).EQPPPID(strAPCEQPPPID).PPIDBody(dintLoop).Length > 1) //{ // pEqpAct.funDoubleWordWrite(dstrWordAddress, dstrValue, EnuEQP.PLCRWType.Int_Data); //} //else //{ // pEqpAct.funWordWrite(dstrWordAddress, dstrValue, EnuEQP.PLCRWType.Int_Data); //} //dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) { if (dstrValue.Contains("-")) { strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dstrValue.ToString(), EnuEQP.PLCRWType.Int_Data); //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData, EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 } else { strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dstrValue.ToString(), EnuEQP.PLCRWType.Int_Data).Substring(4, 4) + m_pEqpAct.funWordWriteString(2, dstrValue.ToString(), EnuEQP.PLCRWType.Int_Data).Substring(0, 4); } m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(4, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, 1); m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(0, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData, EnuEQP.PLCRWType.Hex_Data); dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length - 1); } else { strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dstrValue, EnuEQP.PLCRWType.ASCII_Data); dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); } } //pEqpAct.funBitWrite(dstrBitAddress, "1"); //pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S16F111APCStart, dstrHGLSID); #endregion //int dintTest = 124; //for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) //{ // if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) // { // dintTest -= 1; // if (dintTest < 0) // { // strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dintTest.ToString(), EnuEQP.PLCRWType.Int_Data); // //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData, EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 // } // else // { // strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dintTest.ToString(), EnuEQP.PLCRWType.Int_Data).Substring(4, 4) + m_pEqpAct.funWordWriteString(2, dintTest.ToString(), EnuEQP.PLCRWType.Int_Data).Substring(0, 4); // } // m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(4, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 // dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, 1); // m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(0, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 // //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData, EnuEQP.PLCRWType.Hex_Data); // dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length - 1); // } // else // { // strWordWriteData = m_pEqpAct.funWordWriteString(pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, dintTest.ToString(), EnuEQP.PLCRWType.ASCII_Data); // dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); // } // //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(4, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 // //dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, 1); // //m_pEqpAct.funWordWrite(dstrWordAddress, strWordWriteData.Substring(0, 4), EnuEQP.PLCRWType.Hex_Data); //변경할 ECID 데이터 // //dstrWordAddress = FunTypeConversion.funAddressAdd(dstrWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length - 1); //} } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } }
/// <summary> /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다. /// </summary> /// <param name="msgTran">Primary Message의 Transaction</param> public void funPrimaryReceive(Transaction msgTran) { string dstrModuleID = ""; int dintECIDCount = 0; int dintECID = 0; Boolean dbolLayerExist = false; int dintIndex = 0; try { dstrModuleID = msgTran.Primary().Item("MODULEID").Getvalue().ToString().Trim(); //for (int dintUnit = 0; dintUnit <= pInfo.UnitCount; dintUnit++) //{ if (dstrModuleID == pInfo.Unit(3).SubUnit(0).ModuleID) { dbolLayerExist = true; //break; } //} //ModuleID가 존재하지 않는 경우(Layer2도 비교한다.) if (dbolLayerExist == false) { msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); msgTran.Secondary().Item("ECCOUNT").Putvalue(0); funSendReply(msgTran); return; } dintECIDCount = Convert.ToInt32(msgTran.Primary().Item("ECIDCNT").Getvalue()); ArrayList arrCon = new ArrayList(); //받은 ECID중에 존재하지 않는것이 하나라도 있으면 L,0으로 보고한다. for (int dintLoop = 1; dintLoop <= dintECIDCount; dintLoop++) { dintECID = Convert.ToInt32(msgTran.Primary().Item("ECID" + (dintLoop - 1)).Getvalue()); if (pInfo.Unit(0).SubUnit(0).ECID(dintECID) == null) { msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); msgTran.Secondary().Item("ECCOUNT").Putvalue(0); funSendReply(msgTran); return; } if (arrCon.Contains(dintECID) == true) { msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); msgTran.Secondary().Item("ECCOUNT").Putvalue(0); funSendReply(msgTran); return; } arrCon.Add(dintECID); } msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); //ECID를 PLC에서 읽는다. //this.PInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "시작(subS2F29): " + DateTime.Now.ToString("yyyyMMddHHmmss") + ": " + DateTime.Now.Millisecond.ToString()); if (pInfo.EQP("Main").DummyPLC == false) { pInfo.All.isReceivedFromHOST = true; //HOST로 부터 S2F29를 받았음을 저장 pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.ECIDRead); //ECID를 PLC로 부터 읽는다. pHost.subWaitDuringReadFromPLC(); //바로 위에 PLC로 준 명령이 완료될때까지 이 함수에서 대기한다. pInfo.All.isReceivedFromHOST = false; //HOST로 부터 S2F29를 받지 않았음을 저장(초기화) } //this.PInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "종료(subS2F29): " + DateTime.Now.ToString("yyyyMMddHHmmss") + ": " + DateTime.Now.Millisecond.ToString()); //dstrModuleID = pInfo.Unit(0).SubUnit(0).ModuleID; //HOST로 부터 받은 List가 L, 0이면 모든 ECID 보고 if (dintECIDCount == 0) { int ecidCount = pInfo.Unit(0).SubUnit(0).ECIDCount; msgTran.Secondary().Item("ECCOUNT").Putvalue(ecidCount); for (int dintLoop = 1; dintLoop <= ecidCount; dintLoop++) { //ECID 중 사용하지 않는것(Spare)는 제외하고 보고한다. if (pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ModuleID.Contains(dstrModuleID) == true) //&& pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Use == true) { InfoAct.clsECID currentECID = pInfo.Unit(0).SubUnit(0).ECID(dintIndex + 1); msgTran.Secondary().Item("ECID" + dintIndex).Putvalue(currentECID.Index); msgTran.Secondary().Item("ECNAME" + dintIndex).Putvalue(currentECID.Name); msgTran.Secondary().Item("ECDEF" + dintIndex).Putvalue(FunStringH.funPoint(currentECID.ECDEF, currentECID.Format)); msgTran.Secondary().Item("ECSLL" + dintIndex).Putvalue(FunStringH.funPoint(currentECID.ECSLL, currentECID.Format)); msgTran.Secondary().Item("ECSUL" + dintIndex).Putvalue(FunStringH.funPoint(currentECID.ECSUL, currentECID.Format)); msgTran.Secondary().Item("ECWLL" + dintIndex).Putvalue(FunStringH.funPoint(currentECID.ECWLL, currentECID.Format)); msgTran.Secondary().Item("ECWUL" + dintIndex).Putvalue(FunStringH.funPoint(currentECID.ECWUL, currentECID.Format)); dintIndex = dintIndex + 1; } } } else { msgTran.Secondary().Item("ECCOUNT").Putvalue(dintECIDCount); if (dstrModuleID == this.pInfo.Unit(0).SubUnit(0).ModuleID) //Layer1단 모두 보고 { for (int dintLoop = 1; dintLoop <= dintECIDCount; dintLoop++) { dintECID = Convert.ToInt32(msgTran.Primary().Item("ECID" + (dintLoop - 1)).Getvalue()); InfoAct.clsECID currentECID = pInfo.Unit(0).SubUnit(0).ECID(dintECID); msgTran.Secondary().Item("ECID" + (dintLoop - 1)).Putvalue(currentECID.Index); msgTran.Secondary().Item("ECNAME" + (dintLoop - 1)).Putvalue(currentECID.Name); msgTran.Secondary().Item("ECDEF" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECDEF, currentECID.Format)); msgTran.Secondary().Item("ECSLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSLL, currentECID.Format)); msgTran.Secondary().Item("ECSUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSUL, currentECID.Format)); msgTran.Secondary().Item("ECWLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWLL, currentECID.Format)); msgTran.Secondary().Item("ECWUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWUL, currentECID.Format)); } } else //Layer2단 해당 되는것만 보고 { for (int dintLoop = 1; dintLoop <= dintECIDCount; dintLoop++) { dintECID = Convert.ToInt32(msgTran.Primary().Item("ECID" + (dintLoop - 1)).Getvalue()); if (dstrModuleID != this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ModuleID) { if (this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ModuleID.Length > 13) { if (dstrModuleID != this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ModuleID.Substring(0, 13)) { dintECIDCount = 0; break; } else { InfoAct.clsECID currentECID = pInfo.Unit(0).SubUnit(0).ECID(dintECID); msgTran.Secondary().Item("ECID" + (dintLoop - 1)).Putvalue(currentECID.Index); msgTran.Secondary().Item("ECNAME" + (dintLoop - 1)).Putvalue(currentECID.Name); msgTran.Secondary().Item("ECDEF" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECDEF, currentECID.Format)); msgTran.Secondary().Item("ECSLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSLL, currentECID.Format)); msgTran.Secondary().Item("ECSUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSUL, currentECID.Format)); msgTran.Secondary().Item("ECWLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWLL, currentECID.Format)); msgTran.Secondary().Item("ECWUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWUL, currentECID.Format)); } } else { dintECIDCount = 0; break; } } else { InfoAct.clsECID currentECID = pInfo.Unit(0).SubUnit(0).ECID(dintECID); msgTran.Secondary().Item("ECID" + (dintLoop - 1)).Putvalue(currentECID.Index); msgTran.Secondary().Item("ECNAME" + (dintLoop - 1)).Putvalue(currentECID.Name); msgTran.Secondary().Item("ECDEF" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECDEF, currentECID.Format)); msgTran.Secondary().Item("ECSLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSLL, currentECID.Format)); msgTran.Secondary().Item("ECSUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECSUL, currentECID.Format)); msgTran.Secondary().Item("ECWLL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWLL, currentECID.Format)); msgTran.Secondary().Item("ECWUL" + (dintLoop - 1)).Putvalue(FunStringH.funPoint(currentECID.ECWUL, currentECID.Format)); } } } } funSendReply(msgTran); } catch (Exception error) { funSetLog(InfoAct.clsInfo.LogType.CIM, error.ToString()); return; } finally { this.pInfo.All.isReceivedFromHOST = false; //초기화 this.pInfo.All.PLCActionEnd = false; //초기화 } }
/// <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()); } }
public void Save() { bool dbolError = false; float fMIN = 0; float fECSLL = 0; float fECDEF = 0; float fECSUL = 0; float fMax = 0; int dintECID = 0; BindingSource pEOIDListSource = new BindingSource(); string arrECID = ""; string dstrSQL = ""; try { File.Copy(Application.StartupPath + @"\system\System.mdb", Application.StartupPath + @"\system\System.mdb.bak", true); try { //유효성검사 for (int dintLoop = 0; dintLoop < this.dataGridView1.RowCount; dintLoop++) { dintECID = Convert.ToInt32(this.dataGridView1.Rows[dintLoop].Cells[0].Value); fMIN = Convert.ToSingle(dataGridView1[2, dintLoop].Value.ToString()); fECSLL = Convert.ToSingle(dataGridView1[4, dintLoop].Value.ToString()); fECDEF = Convert.ToSingle(dataGridView1[5, dintLoop].Value.ToString()); fECSUL = Convert.ToSingle(dataGridView1[6, dintLoop].Value.ToString()); fMax = Convert.ToSingle(dataGridView1[8, dintLoop].Value.ToString()); if (fMIN > fECSLL || fECSLL > fECDEF || fECDEF > fECSUL || fECSUL > fMax) { dbolError = true; MessageBox.Show("올바르지 않는 Data가 있습니다!!"); break; } //if (dbolError == true) //{ // string dstrErrorMsg = this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Name + " 의 값은 " + this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL // + "~" + this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL + " 이어야 합니다."; // MessageBox.Show(dstrErrorMsg, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} } if (dbolError == false) { pInfo.All.ECIDChange.Clear(); pInfo.All.ECIDChangeFromHost = ""; pInfo.All.ECIDChangeHOSTReport.Clear(); //바뀐 EOV 값이 있는지 검사한다. for (int dintLoop = 0; dintLoop < this.dataGridView1.RowCount; dintLoop++) { dintECID = Convert.ToInt32(this.dataGridView1.Rows[dintLoop].Cells[0].Value); fMIN = Convert.ToSingle(dataGridView1[2, dintLoop].Value.ToString()); fECSLL = Convert.ToSingle(dataGridView1[4, dintLoop].Value.ToString()); fECDEF = Convert.ToSingle(dataGridView1[5, dintLoop].Value.ToString()); fECSUL = Convert.ToSingle(dataGridView1[6, dintLoop].Value.ToString()); fMax = Convert.ToSingle(dataGridView1[8, dintLoop].Value.ToString()); clsECID CurrentECID = pInfo.Unit(0).SubUnit(0).ECID(dintECID); if (Convert.ToSingle(CurrentECID.ECWLL) != fECSLL ||Convert.ToSingle( CurrentECID.ECDEF )!= fECDEF || Convert.ToSingle(CurrentECID.ECWUL) != fECSUL) { this.pInfo.All.ECIDChange.Add(dintECID, FunStringH.funMakePLCData(FunStringH.funMakeRound(fMIN.ToString(), CurrentECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(fECSLL.ToString(), CurrentECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(fECDEF.ToString(), CurrentECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(fECSUL.ToString(), CurrentECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(fMax.ToString(), CurrentECID.Format))); this.pInfo.All.ECIDChangeFromHost += dintECID + ";"; this.pInfo.All.ECIDChangeHOSTReport.Add(dintECID, fMIN + "," + fECSLL + "," + fECDEF + "," + fECSUL + "," + fMax); } } if (string.IsNullOrEmpty(pInfo.All.ECIDChangeFromHost)) { MessageBox.Show("변경된 ECID가 존재하지 않습니다."); pInfo.All.ECIDChange.Clear(); pInfo.All.ECIDChangeFromHost = ""; pInfo.All.ECIDChangeHOSTReport.Clear(); return; } else { pInfo.All.ECIDChangeBYWHO = "2"; //arrECID = arrECID.Substring(0, arrECID.Length - 1); pInfo.subPLCCommand_Set(clsInfo.PLCCommand.ECIDChange); MessageBox.Show("PLC에 ECID 변경 요청을 하였습니다."); } } //if (!DBAct.clsDBAct.funBeginTransaction()) //{ // MessageBox.Show("DB Transaction NG!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; //} ////DataAdapter 생성 //OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM tbECID order by ECID", DBAct.clsDBAct.funOleDbConnect()); //OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter); ////DataAdapter를 이용하여 DB로 업데이트를 한다. //dataAdapter.SelectCommand.Transaction = DBAct.clsDBAct.funOleDbTransaction(); //dataAdapter.Update((DataTable)pEOIDListSource.DataSource); //if (!DBAct.clsDBAct.funCommitTransaction()) //{ // MessageBox.Show("DB Commit Transaction NG!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); // DBAct.clsDBAct.funRollbackTransaction(); // return; //} //dstrSQL = "SELECT * FROM tbECID order by ECID"; //pInfo.Unit(0).SubUnit(0).RemoveECID(); //DataTable dt = DBAct.clsDBAct.funSelectQuery(dstrSQL); //pInfo.AddDataTable("ECID", dt); //pInfo.AddViewEvent(InfoAct.clsInfo.ViewEvent.ECIDUpdate); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); DBAct.clsDBAct.funRollbackTransaction(); DBAct.clsDBAct.funDisconnect(); // DB 연결을 끊는다. MessageBox.Show("DB Update Fail, Because DB Process Error!", "DB Update Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); } ////if (this.pEditMode) subSaveECList(); ////else subSaveECValue(); } 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]); 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()); } }
/// <summary> /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다. /// </summary> /// <param name="msgTran">Primary Message의 Transaction</param> public void funPrimaryReceive(Transaction msgTran) { string dstrModuleID = ""; int dintECIDCount = 0; int dintECID = 0; string dstrECName = ""; Boolean dbolFail = false; bool dbolECNameFail = false; bool dbolECIDFail = false; int dintFailCount = 0; //int dintECSLL = 0; //int dintECWLL = 0; //int dintECDEF = 0; //int dintECWUL = 0; //int dintECSUL = 0; float dintECSLL = 0; float dintECWLL = 0; float dintECDEF = 0; float dintECWUL = 0; float dintECSUL = 0; int dintEAC = 0; int dintEACName = 0; int dintEACECID = 0; int dintTEAC = 0; int dintEAC_SLL = 0; int dintEAC_WLL = 0; int dintEAC_DEF = 0; int dintEAC_WUL = 0; int dintEAC_SUL = 0; bool dbolErrorCheck = true; Boolean dbolLayerExist = false; Queue dqECID = new Queue(); try { dstrModuleID = msgTran.Primary().Item("MODULEID").Getvalue().ToString().Trim(); //for (int dintUnit = 0; dintUnit <= this.pInfo.UnitCount; dintUnit++) //{ if (dstrModuleID == pInfo.Unit(3).SubUnit(0).ModuleID) { dbolLayerExist = true; //break; } //} //ModuleID가 존재하지 않는 경우 if (dbolLayerExist == false) { msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); msgTran.Secondary().Item("MIACK").Putvalue(1); //1 : There is no such a MOUDLEID msgTran.Secondary().Item("ECCOUNT").Putvalue(0); funSendReply(msgTran); return; } msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID); msgTran.Secondary().Item("MIACK").Putvalue(0); dintECIDCount = Convert.ToInt32(msgTran.Primary().Item("ECCOUNT").Getvalue()); msgTran.Secondary().Item("ECCOUNT").Putvalue(dintECIDCount); //받은 ECID중에 존재하지 않는것이 하나라도 있으면 NAK으로 보고하고 PLC에 모두 적용하지 않는다. for (int dintLoop = 1; dintLoop <= dintECIDCount; dintLoop++) { dintECID = Convert.ToInt32(msgTran.Primary().Item("ECID" + (dintLoop - 1)).Getvalue()); dstrECName = msgTran.Primary().Item("ECNAME" + (dintLoop - 1)).Getvalue().ToString().Trim(); //존재하지 않는 ECID가 왔을때 if (pInfo.Unit(0).SubUnit(0).ECID(dintECID) == null) { dbolECIDFail = true; } else { if (dstrECName != this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Name) //존재하지 않는 ECID가 왔을때 { dbolECNameFail = true; } else if (this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).ModuleID.Contains(dstrModuleID) == false) { dbolFail = true; } else { string dstrFormat = this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Format; dintECSLL = Convert.ToSingle(FunStringH.funMakeRound(msgTran.Primary().Item("ECSLL" + (dintLoop - 1)).Getvalue().ToString().Trim(), dstrFormat)); dintECWLL = Convert.ToSingle(FunStringH.funMakeRound(msgTran.Primary().Item("ECWLL" + (dintLoop - 1)).Getvalue().ToString().Trim(), dstrFormat)); dintECDEF = Convert.ToSingle(FunStringH.funMakeRound(msgTran.Primary().Item("ECDEF" + (dintLoop - 1)).Getvalue().ToString().Trim(), dstrFormat)); dintECWUL = Convert.ToSingle(FunStringH.funMakeRound(msgTran.Primary().Item("ECWUL" + (dintLoop - 1)).Getvalue().ToString().Trim(), dstrFormat)); dintECSUL = Convert.ToSingle(FunStringH.funMakeRound(msgTran.Primary().Item("ECSUL" + (dintLoop - 1)).Getvalue().ToString().Trim(), dstrFormat)); Single dSingleMin = Convert.ToSingle(this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Min); Single dSingleMax = Convert.ToSingle(this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Max); if (Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL) != dintECSLL) { dbolFail = true; dintEAC_SLL = 2; } else if (Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL) != dintECSUL) { dbolFail = true; dintEAC_SUL = 2; } else #region Min & Max 값 확인 if ((dintECDEF < dSingleMin) || (dintECDEF > dSingleMax)) { dbolFail = true; dintEAC_DEF = 2; } else if ((dintECSUL < dSingleMin) || (dintECSUL > dSingleMax)) { dbolFail = true; dintEAC_SUL = 2; } else if ((dintECSLL < dSingleMin) || (dintECSLL > dSingleMax)) { dbolFail = true; dintEAC_SLL = 2; } else if ((dintECWUL < dSingleMin) || (dintECWUL > dSingleMax)) { dbolFail = true; dintEAC_WUL = 2; } else if ((dintECWLL < dSingleMin) || (dintECWLL > dSingleMax)) { dbolFail = true; dintEAC_WLL = 2; } //if ((dintECWUL < dSingleMin) || (dintECWUL > dSingleMax)) //{ // dbolFail = true; // dintEAC_WUL = 2; //} //if ((dintECWLL < dSingleMin) || (dintECWLL > dSingleMax)) //{ // dbolFail = true; // dintEAC_WLL = 2; //} #endregion if (!dbolFail) { dbolErrorCheck = false; // 각 항목별 Data 확인 if (dintECSUL >= dintECWUL && dintECSUL >= dintECDEF && dintECSUL >= dintECWLL && dintECSUL >= dintECSLL) { if (dintECWUL >= dintECDEF && dintECWUL >= dintECWLL && dintECWLL >= dintECSLL) { if (dintECDEF >= dintECWLL && dintECDEF >= dintECSLL) { if (dintECWLL < dintECSLL) { dbolFail = true; dintEAC_WLL = 2; } else { dqECID.Enqueue(dintECID); //Update를 위해 Queue에 저장 } } else { if (!(dintECDEF > dintECWLL)) { dintEAC_DEF = 2; dintEAC_WLL = 2; } else { dintEAC_DEF = 2; dintEAC_SLL = 2; } dbolFail = true; //dintEAC_DEF = 2; } } else { if (!(dintECWUL > dintECDEF)) { dintEAC_WUL = 2; dintEAC_DEF = 2; } else if (!(dintECWUL > dintECWLL)) { dintEAC_WUL = 2; dintEAC_WLL = 2; } else { dintEAC_WUL = 2; dintEAC_SLL = 2; } dbolFail = true; //dintEAC_DEF = 2; } } else { if (!(dintECSUL > dintECWUL)) { dintEAC_SUL = 2; dintEAC_WUL = 2; } else if (!(dintECSUL > dintECDEF)) { dintEAC_SUL = 2; dintEAC_DEF = 2; } else if (!(dintECSUL > dintECWLL)) { dintEAC_SUL = 2; dintEAC_WLL = 2; } else { dintEAC_SUL = 2; dintEAC_SLL = 2; } dbolFail = true; //dintEAC_DEF = 2; } } } } if (dbolFail == true) //Validation 체크 에러 { dintFailCount = dintFailCount + 1; //각 항목별로 Fail이 났을때 1씩 증가 dintEAC = 2; if (dbolErrorCheck == false) { if (Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL) != dintECSLL) { dintEAC_SLL = 2; } else if (Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL) != dintECSUL) { dintEAC_SUL = 2; } else { //dintEAC_SLL = 0; //dintEAC_WLL = 0; //dintEAC_DEF = 0; //dintEAC_SUL = 0; //dintEAC_WUL = 0; //WLL 확인 if (!(Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL) <= dintECWLL && dintECWLL <= Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECDEF))) { dintEAC_WLL = 2; dintEAC_SLL = 0; //dintEAC_WLL = 0; dintEAC_DEF = 0; dintEAC_SUL = 0; dintEAC_WUL = 0; } else { if (!(Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWLL) <= dintECDEF && dintECDEF <= Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWUL))) { dintEAC_DEF = 2; dintEAC_SLL = 0; dintEAC_WLL = 0; //dintEAC_DEF = 0; dintEAC_SUL = 0; dintEAC_WUL = 0; } else { if (!(Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECDEF) <= dintECWUL && dintECWUL <= Convert.ToSingle(pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL))) { dintEAC_WUL = 2; dintEAC_SLL = 0; dintEAC_WLL = 0; dintEAC_DEF = 0; dintEAC_SUL = 0; //dintEAC_WUL = 0; } else { int a = 0; } } } } } } else { dintEAC = 0; } if (dbolECIDFail == true) { dintEACECID = 2; } else { dintEACECID = 0; } if (dbolECNameFail == true) { dintEACName = 2; } else { dintEACName = 0; } if (dbolFail || dbolECIDFail || dbolECNameFail) { dintTEAC = 1; } else { dintTEAC = 0; } dbolFail = false; dbolECIDFail = false; dbolECNameFail = false; msgTran.Secondary().Item("TEAC" + (dintLoop - 1)).Putvalue(dintTEAC); msgTran.Secondary().Item("ECID" + (dintLoop - 1)).Putvalue(dintECID); msgTran.Secondary().Item("EAC1" + (dintLoop - 1)).Putvalue(dintEACECID); msgTran.Secondary().Item("ECNAME" + (dintLoop - 1)).Putvalue(dstrECName); msgTran.Secondary().Item("EAC2" + (dintLoop - 1)).Putvalue(dintEACName); msgTran.Secondary().Item("ECDEF" + (dintLoop - 1)).Putvalue(dintECDEF); msgTran.Secondary().Item("EAC3" + (dintLoop - 1)).Putvalue(dintEAC_DEF); msgTran.Secondary().Item("ECSLL" + (dintLoop - 1)).Putvalue(dintECSLL); msgTran.Secondary().Item("EAC4" + (dintLoop - 1)).Putvalue(dintEAC_SLL); msgTran.Secondary().Item("ECSUL" + (dintLoop - 1)).Putvalue(dintECSUL); msgTran.Secondary().Item("EAC5" + (dintLoop - 1)).Putvalue(dintEAC_SUL); msgTran.Secondary().Item("ECWLL" + (dintLoop - 1)).Putvalue(dintECWLL); msgTran.Secondary().Item("EAC6" + (dintLoop - 1)).Putvalue(dintEAC_WLL); msgTran.Secondary().Item("ECWUL" + (dintLoop - 1)).Putvalue(dintECWUL); msgTran.Secondary().Item("EAC7" + (dintLoop - 1)).Putvalue(dintEAC_WUL); dintEAC_SLL = 0; dintEAC_WLL = 0; dintEAC_DEF = 0; dintEAC_WUL = 0; dintEAC_SUL = 0; } //HOST로 S2F16 보고 funSendReply(msgTran); if (dintFailCount > 0) { //Error가 발생한것임. dqECID.Clear(); return; } ////NACK값이 하나라도 존재하면 PLC에 적용하지 않느다. ////2011.01.13 송은선 //if (dintEAC != 0 && dintTEAC != 0) //{ // dqECID.Clear(); // return; //} //카운트가 0이상이면 맞는게 있음 if (dqECID.Count > 0) { this.pInfo.All.ECIDChangeBYWHO = "1"; //BY HOST this.pInfo.All.ECIDChange.Clear(); //초기화 this.pInfo.All.ECIDChangeHOSTReport.Clear(); //초기화 this.pInfo.All.ECIDChangeFromHost = ""; string dstrECSLL = string.Empty; string dstrECWLL = string.Empty; string dstrECDEF = string.Empty; string dstrECWUL = string.Empty; string dstrECSUL = string.Empty; //PLC에 Write할 ECID를 저장한다. for (int dintLoop = 1; dintLoop <= dintECIDCount; dintLoop++) { dintECID = Convert.ToInt32(msgTran.Primary().Item("ECID" + (dintLoop - 1)).Getvalue()); if (dqECID.Contains(dintECID) == true) { string dstrFormat = this.pInfo.Unit(0).SubUnit(0).ECID(dintECID).Format; dstrECSLL = FunStringH.funMakePLCData(FunStringH.funMakeRound(msgTran.Primary().Item("ECSLL" + (dintLoop - 1)).Getvalue().ToString(), dstrFormat)); dstrECWLL = FunStringH.funMakePLCData(FunStringH.funMakeRound(msgTran.Primary().Item("ECWLL" + (dintLoop - 1)).Getvalue().ToString(), dstrFormat)); dstrECDEF = FunStringH.funMakePLCData(FunStringH.funMakeRound(msgTran.Primary().Item("ECDEF" + (dintLoop - 1)).Getvalue().ToString(), dstrFormat)); dstrECWUL = FunStringH.funMakePLCData(FunStringH.funMakeRound(msgTran.Primary().Item("ECWUL" + (dintLoop - 1)).Getvalue().ToString(), dstrFormat)); dstrECSUL = FunStringH.funMakePLCData(FunStringH.funMakeRound(msgTran.Primary().Item("ECSUL" + (dintLoop - 1)).Getvalue().ToString(), dstrFormat)); this.pInfo.All.ECIDChange.Add(dintECID, dstrECSLL + "," + dstrECWLL + "," + dstrECDEF + "," + dstrECWUL + "," + dstrECSUL); this.pInfo.All.ECIDChangeFromHost += dintECID + ";"; this.pInfo.All.ECIDChangeHOSTReport.Add(dintECID, dstrECSLL + "," + dstrECWLL + "," + dstrECDEF + "," + dstrECWUL + "," + dstrECSUL); } } //HOST에서 받은것외에 없는 항목은 CIM이 가지고 있는 Data를 써준다. //변경할 ECID만 써주는게 아니고 모든 ECID를 써주기 때문임 for (int dintLoop = 1; dintLoop <= this.pInfo.Unit(0).SubUnit(0).ECIDCount; dintLoop++) { if (this.pInfo.All.ECIDChange.ContainsKey(dintLoop) == true) { } else { InfoAct.clsECID pECID = pInfo.Unit(0).SubUnit(0).ECID(dintLoop); this.pInfo.All.ECIDChange.Add(dintLoop, FunStringH.funMakePLCData(FunStringH.funMakeRound(pECID.ECSLL, pECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(pECID.ECWLL, pECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(pECID.ECDEF, pECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(pECID.ECWUL, pECID.Format)) + "," + FunStringH.funMakePLCData(FunStringH.funMakeRound(pECID.ECSUL, pECID.Format))); } } //PLC로 ECID 변경 Write this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.ECIDChange); } } catch (Exception error) { funSetLog(InfoAct.clsInfo.LogType.CIM, error.ToString()); return; } }
/// <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]; StringBuilder dstrLog = new StringBuilder(); string dstrEQPPPID = ""; int dintPPIDType = 0; string dstrTemp = ""; string strWordAddress = ""; try { dstrEQPPPID = m_pEqpAct.funWordRead("W2540", 1, EnuEQP.PLCRWType.Int_Data); dintPPIDType = 1; pInfo.Unit(0).SubUnit(0).RemoveEQPPPID(dstrEQPPPID); #region 수정 전 //strWordAddress = "W254C"; //if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) //{ // for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) // { // //EQPPPID에 Body 저장 // if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) // { // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; // if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) // { // dstrTemp = FunStringH.funPoint(m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.Int_Data), pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; // } // else // { // dstrTemp = m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.ASCII_Data); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; // } // strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); // } // } //} #endregion #region 수정 후 int dintReadcount = (pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5) * 2; string dstrReadData = ""; int dintLength = 0; string strValue = ""; int dintStartIndex = 0; strWordAddress = "W254C"; if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) { //if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBodyCount == 0) //{ //[2015/04/20] PPID Body 값 Block으로 한번에(Add by HS) dstrReadData = m_pEqpAct.funWordRead("W254C", dintReadcount, EnuEQP.PLCRWType.Hex_Data, false).Trim(); #region EQPPPID에 Body 저장 for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 4; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length > 1) { string dstrTemp1 = dstrTemp.Substring(0, 4); string dstrTemp2 = dstrTemp.Substring(4, 4); dstrTemp = dstrTemp2 + dstrTemp1; strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); dstrTemp = FunStringH.funPoint(strValue, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; } else { strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.ASCString); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = strValue; } dintStartIndex += dintLength; #region 변경전 [2015.04.20] Modify by HS //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; //if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) //{ // dstrTemp = FunStringH.funPoint(m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.Int_Data), pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //else //{ // dstrTemp = m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.ASCII_Data); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); #endregion } } #endregion strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, dintReadcount); dstrReadData = m_pEqpAct.funWordRead(strWordAddress, 80, EnuEQP.PLCRWType.ASCII_Data, false); dintStartIndex = 0; #region EQPPPID에 Film Code 저장 for (int dintLoop = 251; dintLoop <= 255; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 2; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp.Trim(); } dintStartIndex += dintLength; } #endregion //} } #endregion //PLC Req에 대한 CIM의 Confirm Bit를 준다. m_pEqpAct.subSetConfirmBit(strCompBit); switch (dintPPIDType) { case 1: //EQP PPID //Parameter.log에 로그 출력 m_pEqpAct.subSetParameterLog("EQP PPID 생성", "", null, dstrEQPPPID, dstrEQPPPID); int[] arrData = new int[16]; string strData = ""; if (pInfo.EQP("Main").DummyPLC) { foreach (string strEQPPID in pInfo.Unit(0).SubUnit(0).EQPPPID()) { arrData[Convert.ToInt32(strEQPPID) - 1] = 1; } for (int dintLoop = 16; dintLoop > 0; dintLoop--) { strData += arrData[dintLoop - 1].ToString(); } strData = CommonAct.FunTypeConversion.funBinConvert(strData, EnuEQP.StringType.Hex); m_pEqpAct.funWordWrite("W2A00", strData, EnuEQP.PLCRWType.Hex_Data); } pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S7F107PPIDCreatDeleteAndPPBodyChangedReport, "1", "1", "", dstrEQPPPID); break; } //최종 수정된 날짜 Ini에 변경 FunINIMethod.subINIWriteValue("ETCInfo", "RECIPELastModified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), pInfo.All.SystemINIFilePath); } 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] : 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]; StringBuilder dstrLog = new StringBuilder(); string dstrEQPPPID = ""; int dintPPIDType = 0; string dstrTemp = ""; string strWordAddress = ""; try { //m_pEqpAct.subWordReadSave("W2040", 10, EnuEQP.PLCRWType.ASCII_Data); //HOST PPID dstrEQPPPID = m_pEqpAct.funWordRead("W2540", 1, EnuEQP.PLCRWType.Int_Data); dintPPIDType = 1; #region 수정 전 //pInfo.Unit(0).SubUnit(0).RemoveEQPPPID(dstrEQPPPID); //strWordAddress = "W254C"; //if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) //{ // for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++) // { // //EQPPPID에 Body 저장 // if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) // { // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; // if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) // { // dstrTemp = FunStringH.funPoint(m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.Int_Data), pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; // } // else // { // dstrTemp = m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.ASCII_Data); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; // } // strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); // } // } //} # endregion #region 수정 후 int dintReadcount = (pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5) * 2; string dstrReadData = ""; int dintLength = 0; string strValue = ""; int dintStartIndex = 0; strWordAddress = "W254C"; if (pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrEQPPPID) == true) { //if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBodyCount == 0) //{ //[2015/04/20] PPID Body 값 Block으로 한번에(Add by HS) dstrReadData = m_pEqpAct.funWordRead("W254C", dintReadcount, EnuEQP.PLCRWType.Hex_Data, false).Trim(); #region EQPPPID에 Body 저장 for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount - 5; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 4; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length > 1) { string dstrTemp1 = dstrTemp.Substring(0, 4); string dstrTemp2 = dstrTemp.Substring(4, 4); dstrTemp = dstrTemp2 + dstrTemp1; strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.Decimal); dstrTemp = FunStringH.funPoint(strValue, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; } else { strValue = FunTypeConversion.funHexConvert(dstrTemp, EnuEQP.StringType.ASCString); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = strValue; } dintStartIndex += dintLength; #region 변경전 [2015.04.20] Modify by HS //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; //pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; //if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length == 2) //{ // dstrTemp = FunStringH.funPoint(m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.Int_Data), pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //else //{ // dstrTemp = m_pEqpAct.funWordRead(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length, EnuEQP.PLCRWType.ASCII_Data); // pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp; //} //strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length); #endregion } } #endregion strWordAddress = CommonAct.FunTypeConversion.funAddressAdd(strWordAddress, dintReadcount); dstrReadData = m_pEqpAct.funWordRead(strWordAddress, 80, EnuEQP.PLCRWType.ASCII_Data, false); dintStartIndex = 0; #region EQPPPID에 Film Code 저장 for (int dintLoop = 251; dintLoop <= 255; dintLoop++) { if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).AddPPIDBody(dintLoop) == true) { pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).DESC = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).DESC; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Format = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Length = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).ModuleID; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Name = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Name; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Range = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Range; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Unit = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Unit; pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).UseMode = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).UseMode; dintLength = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Length * 2; //Length에 맞게 자를 문자열 개수를 가져온다. dstrTemp = dstrReadData.Substring(dintStartIndex, dintLength); pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop).Value = dstrTemp.Trim(); } dintStartIndex += dintLength; } #endregion //} } #endregion //PLC Req에 대한 CIM의 Confirm Bit를 준다. m_pEqpAct.subSetConfirmBit(strCompBit); switch (dintPPIDType) { case 1: //EQP PPID { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S7F107PPIDCreatDeleteAndPPBodyChangedReport, "3", "1", "", dstrEQPPPID); ArrayList arrCon = new ArrayList(); InfoAct.clsHOSTPPID CurrentPPID; foreach (string strPPID in pInfo.Unit(0).SubUnit(0).HOSTPPID()) { CurrentPPID = pInfo.Unit(0).SubUnit(0).HOSTPPID(strPPID); if (CurrentPPID.EQPPPID == dstrEQPPPID) { arrCon.Add(strPPID); } } string dstrSQL = ""; for (int dintLoop = 0; dintLoop < arrCon.Count; dintLoop++) { pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S7F107PPIDCreatDeleteAndPPBodyChangedReport, "3", "2", arrCon[dintLoop].ToString(), dstrEQPPPID); //pInfo.Unit(0).SubUnit(0).RemoveHOSTPPID(arrCon[dintLoop].ToString()); dstrSQL = string.Format("Update `tbHOSTPPID` set EQPPPID='{0}', DTime='{1}' Where HOSTPPID='{2}';", dstrEQPPPID, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), arrCon[dintLoop].ToString()); DBAct.clsDBAct.funExecuteQuery(dstrSQL); } } break; } //최종 수정된 날짜 Ini에 변경 FunINIMethod.subINIWriteValue("ETCInfo", "RECIPELastModified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), pInfo.All.SystemINIFilePath); }
/// <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 = ""; StringBuilder dstrLog = new StringBuilder(); string[] dstrValue = null; int dintIndex = 0; string dstrECSLL = ""; string dstrECWLL = ""; string dstrECDEF = ""; string dstrECWUL = ""; string dstrECSUL = ""; string dstrSQL = ""; int dintECID = 0; try { dstrWordAddress = "W2A00"; for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).ECIDCount; dintLoop++) { if (dintLoop == 1) { pEqpAct.subWordReadSave(dstrWordAddress, 1, EnuEQP.PLCRWType.Int_Data); //ECID } else { pEqpAct.subWordReadSave("", 1, EnuEQP.PLCRWType.Int_Data); //ECID } pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.Int_Data); //ECSLL pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.Int_Data); //ECDEF pEqpAct.subWordReadSave("", 2, EnuEQP.PLCRWType.Int_Data); //ECSUL } dstrValue = pEqpAct.funWordReadAction(true); // 디비트랜젝션... 해야지.. if (DBAct.clsDBAct.funOleDbTransaction() == null) { DBAct.clsDBAct.funBeginTransaction(); } OleDbTransaction odbTransaction = DBAct.clsDBAct.funOleDbTransaction(); //변경된 ECID 값을 구조체에 저장, DB Update, HOST로 보고 for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).ECIDCount; dintLoop++) { dintECID = Convert.ToInt32(dstrValue[dintIndex++]); if (dintLoop == dintECID) { dstrECSLL = dstrValue[dintIndex++]; dstrECDEF = dstrValue[dintIndex++]; dstrECSUL = dstrValue[dintIndex++]; //dstrECSLL = FunTypeConversion.funDecimalConvert(dstrECSLL, EnuEQP.StringType.Hex); //dstrECDEF = FunTypeConversion.funDecimalConvert(dstrECDEF, EnuEQP.StringType.Hex); //dstrECSUL = FunTypeConversion.funDecimalConvert(dstrECSUL, EnuEQP.StringType.Hex); //dstrECSLL = FunTypeConversion.funPlusMinusAPDCalc(dstrECSLL); //dstrECDEF = FunTypeConversion.funPlusMinusAPDCalc(dstrECDEF); //dstrECSUL = FunTypeConversion.funPlusMinusAPDCalc(dstrECSUL); dstrECSLL = FunStringH.funPoint(dstrECSLL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); dstrECDEF = FunStringH.funPoint(dstrECDEF, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); dstrECSUL = FunStringH.funPoint(dstrECSUL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); //if (pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL != dstrECSLL || //pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWLL != dstrECWLL || //pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECDEF != dstrECDEF || //pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWUL != dstrECWUL || //pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL != dstrECSUL) //if ( // pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWLL != dstrECSLL || // pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECDEF != dstrECDEF || // pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWUL != dstrECSUL // ) { //구조체 업데이트 pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSLL = dstrECSLL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWLL = dstrECSLL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECDEF = dstrECDEF; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWUL = dstrECSUL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSUL = dstrECSUL; //dstrSQL = "Update tbECID set ECWLL=" + dstrECSLL + ", ECDEF=" + dstrECDEF + // ", ECWUL=" + dstrECSUL + " Where ECID=" + dintLoop.ToString(); dstrSQL = "Update tbECID set ECSLL=" + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSLL + ", ECWLL=" + dstrECSLL + ", ECDEF=" + dstrECDEF + ", ECWUL=" + dstrECSUL + ", ECSUL=" + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSUL + " Where ECID=" + dintLoop.ToString(); if (DBAct.clsDBAct.funExecuteNonQuery(dstrSQL) == false) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "DB Update Fail(subLoadECID): ECID: " + dintLoop.ToString()); } } } //dintIndex += 6; } if (DBAct.clsDBAct.funOleDbTransaction() != null) { DBAct.clsDBAct.funCommitTransaction(); } // 디비내용 업데이트는 한번만 하면 되지.. 이게 뭐니... pInfo.DeleteTable("ECID"); dstrSQL = "SELECT * FROM tbECID order by ECID"; DataTable dt = DBAct.clsDBAct.funSelectQuery(dstrSQL); pInfo.AddDataTable("ECID", dt); pInfo.AddViewEvent(InfoAct.clsInfo.ViewEvent.ECIDUpdate); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); } finally { if (!DBAct.clsDBAct.funIsNullTransaction()) { DBAct.clsDBAct.funCommitTransaction(); } //HOST로 부터 S2F29가 와서 PLC로 부터 모두 읽었다고 저장, 그리고 HOST Act단에서 S2F30을 응답 if (pInfo.All.isReceivedFromHOST == true) { pInfo.All.isReceivedFromHOST = false; //초기화 pInfo.All.PLCActionEnd = true; //PLC로 부터 값을 읽었음을 저장 } } }
/// <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> /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다. /// </summary> /// <param name="msgTran">Primary Message의 Transaction</param> public void funPrimaryReceive(Transaction msgTran) { int dintAck3 = (int)LOTInfoValidation.Accepted; int dintLOTIndex = 0; string dstrHostGLSMapping10 = ""; string dstrProcessGLSMapping10 = ""; string dstrGLSLoaderMapping10 = ""; string dstrPortModuleID = ""; int dintPortID = 0; int dintSlotID = 0; int dintPortType = 0; string dstrHPanelID = ""; string dstrHOSTPPID = ""; string dstrProductType = ""; string dstrCSTID = ""; int dintCSTType = 0; string dstrMapStif = ""; string dstrCurStif = ""; int dintOrder = 0; string SlotArray = ""; string strGLSID = ""; //subSetLog(InfoAct.clsInfo.LogType.ReceivedPrimaryMessage, "funPrimaryReceive() S" + msgTran.Primary().Stream + "F" + msgTran.Primary().Function + "Start"); // 수신메시지추적 [6/3/2013 Hojun]) int dintUnitID = 0; int dintSubUnitID = 0; try { dstrPortModuleID = msgTran.Primary().Item("PORTID").Getvalue().ToString(); for (int dintLoop = 0; dintLoop < 6; dintLoop++) { if (pInfo.Port(dintLoop + 1).HostReportPortID == dstrPortModuleID) { dintPortID = dintLoop + 1; switch (dintLoop + 1) { case 1: dintUnitID = 1; dintSubUnitID = 1; break; case 2: dintUnitID = 1; dintSubUnitID = 2; break; case 3: dintUnitID = 1; dintSubUnitID = 3; break; case 4: dintUnitID = 1; dintSubUnitID = 4; break; case 5: dintUnitID = 2; dintSubUnitID = 1; break; case 6: dintUnitID = 2; dintSubUnitID = 2; break; } break; } } dstrCSTID = msgTran.Primary().Item("CSTID").Getvalue().ToString(); dintPortType = Convert.ToInt32(msgTran.Primary().Item("PORT_TYPE").Getvalue()); if (dintPortID == 0 || dintPortID > 6) { dintAck3 = (int)LOTInfoValidation.ParameterError; } else { if (pInfo.Port(dintPortID).S3F115Received) { dintAck3 = (int)LOTInfoValidation.AlreadyReceived; } else if (0 != dintPortType) { dintAck3 = (int)LOTInfoValidation.ParameterError; } } if (dintAck3 == 0) { //if (dintPortType == 0) //{ // dintAck3 = (int)LOTInfoValidation.ParameterError; //} //else if (pInfo.Port(dintPortID).PortState == "4") { dintAck3 = (int)LOTInfoValidation.Busy; } else if ((pInfo.Port(dintPortID).PortState == "0") || (string.IsNullOrEmpty(pInfo.Port(dintPortID).CSTID))) { if (dintPortID == 2) { dintAck3 = (int)LOTInfoValidation.NoCST; } } else if (pInfo.Port(dintPortID).PortState != "2") { dintAck3 = (int)LOTInfoValidation.PortStateNotWaiting; } else if (string.IsNullOrEmpty(pInfo.Port(dintPortID).CSTID) == false) { if (pInfo.Port(dintPortID).CSTID != dstrCSTID.Trim()) { dintAck3 = (int)LOTInfoValidation.CSTIDMismatch; } else { //[2015/05/20]FI01에서도 저장되게 조건식 추가(Add by HS) if (dintUnitID == 1 && dintSubUnitID == 2 || dintUnitID == 1 && dintSubUnitID == 1) { dstrHostGLSMapping10 = FunStringH.funPaddingStringData("0", 56, '0'); dstrProcessGLSMapping10 = FunStringH.funPaddingStringData("0", 56, '0'); dstrGLSLoaderMapping10 = FunStringH.funPaddingStringData("0", 56, '0'); dstrCSTID = msgTran.Primary().Item("CSTID").Getvalue().ToString(); dintCSTType = Convert.ToInt32(msgTran.Primary().Item("CST_TYPE").Getvalue()); dstrMapStif = msgTran.Primary().Item("MAP_STIF").Getvalue().ToString(); dstrCurStif = msgTran.Primary().Item("CUR_STIF").Getvalue().ToString(); int dintGlassCount = Convert.ToInt32(msgTran.Primary().Item("M_COUNT").Getvalue()); //pInfo.Port(dintPortID).SlotCount = dintGlassCount; pInfo.Port(dintPortID).GLSHostMapping10 = dstrMapStif; pInfo.Port(dintPortID).GLSLoaderMapping10 = dstrMapStif; pInfo.Port(dintPortID).GLSProcessMapping10_HOST = dstrCurStif; pInfo.Port(dintPortID).GLSRealMapping10 = dstrCurStif; pInfo.Port(dintPortID).CSTType = dintCSTType.ToString(); pInfo.Port(dintPortID).arrSlotNo.Clear(); //SlotArray += dstrCSTID + ","; for (int dintIndex = 0; dintIndex < dintGlassCount; dintIndex++) { int.TryParse(msgTran.Primary().Item("USE_COUNT" + dintIndex).Getvalue().ToString(), out dintSlotID); SlotArray += dintSlotID + ","; if (pInfo.Port(dintPortID).arrSlotNo.Contains(dintSlotID) == false) { pInfo.Port(dintPortID).arrSlotNo.Add(dintSlotID); } for (int dintLoop2 = 1; dintLoop2 <= dintSlotID; dintLoop2++) { if (pInfo.Port(dintPortID).Slot(dintLoop2) == null) { if (pInfo.Port(dintPortID).AddSlot(dintLoop2) == false) { pInfo.subLog_Set(clsInfo.LogType.CIM, "Port Slot Add Error!!"); //continue; } } } clsSlot dpSlot = pInfo.Port(dintPortID).Slot(1); if (dpSlot == null) { pInfo.Port(dintPortID).AddSlot(1); dpSlot = pInfo.Port(dintPortID).Slot(1); } //dpSlot.H_PANELID = msgTran.Primary().Item("H_GLASSID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.GlassID = msgTran.Primary().Item("MATERIALID" + dintIndex).Getvalue().ToString().Trim(); strGLSID = dpSlot.GlassID; //150122 고석현 dpSlot.E_PANELID = msgTran.Primary().Item("M_SETID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.LOTID = msgTran.Primary().Item("LOTID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.BATCHID = msgTran.Primary().Item("BATCHID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.JOBID = msgTran.Primary().Item("JOBID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PORTID = msgTran.Primary().Item("PORTID1" + dintIndex).Getvalue().ToString().Trim(); dpSlot.SLOTNO = msgTran.Primary().Item("SLOTNO" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PRODUCT_TYPE = msgTran.Primary().Item("PROD_TYPE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PRODUCT_KIND = msgTran.Primary().Item("PROD_KIND" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PRODUCTID = msgTran.Primary().Item("PRODUCTID" + dintIndex).Getvalue().ToString().Trim(); //strGLSID = dpSlot.PRODUCTID; //150122 고석현 dpSlot.RUNSPECID = msgTran.Primary().Item("RUNSPECID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.LAYERID = msgTran.Primary().Item("LAYERID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.STEPID = msgTran.Primary().Item("STEPID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.HOSTPPID = msgTran.Primary().Item("PPID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.FLOWID = msgTran.Primary().Item("FLOWID" + dintIndex).Getvalue().ToString().Trim(); int[] arrSIZE = { 0, 0 }; arrSIZE = (int[])msgTran.Primary().Item("M_SIZE" + dintIndex).Getvalue(); //dpSlot.SIZE = msgTran.Primary().Item("SIZE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.SIZE1 = arrSIZE[0]; dpSlot.SIZE2 = arrSIZE[1]; dpSlot.THICKNESS = Convert.ToInt32(msgTran.Primary().Item("M_THICKNESS" + dintIndex).Getvalue().ToString().Trim()); dpSlot.GLASS_STATE = Convert.ToInt32(msgTran.Primary().Item("M_STATE" + dintIndex).Getvalue().ToString().Trim()); dpSlot.GLASS_ORDER = msgTran.Primary().Item("M_ORDER" + dintIndex).Getvalue().ToString().Trim(); dpSlot.COMMENT = msgTran.Primary().Item("COMMENT" + dintIndex).Getvalue().ToString().Trim(); dpSlot.USE_COUNT = msgTran.Primary().Item("USE_COUNT" + dintIndex).Getvalue().ToString().Trim(); dpSlot.JUDGEMENT = msgTran.Primary().Item("JUDGEMENT" + dintIndex).Getvalue().ToString().Trim(); dpSlot.REASON_CODE = msgTran.Primary().Item("REASON_CODE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.INS_FLAG = msgTran.Primary().Item("INS_FLAG" + dintIndex).Getvalue().ToString().Trim(); dpSlot.ENC_FLAG = msgTran.Primary().Item("LIBRARYID" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PRERUN_FLAG = msgTran.Primary().Item("PRERUN_FLAG" + dintIndex).Getvalue().ToString().Trim(); dpSlot.TURN_DIR = msgTran.Primary().Item("TURN_DIR" + dintIndex).Getvalue().ToString().Trim(); dpSlot.FLIP_STATE = msgTran.Primary().Item("FLIP_STATE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.WORK_STATE = msgTran.Primary().Item("WORK_STATE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.MULTI_USE = msgTran.Primary().Item("MULTI_USE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PAIR_GLASSID = msgTran.Primary().Item("STAGE_STATE" + dintIndex).Getvalue().ToString().Trim(); dpSlot.PAIR_PPID = msgTran.Primary().Item("LOCATION" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_NAME[0] = msgTran.Primary().Item("OPTION_NAME1" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_VALUE[0] = msgTran.Primary().Item("OPTION_VALUE1" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_NAME[1] = msgTran.Primary().Item("OPTION_NAME2" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_VALUE[1] = msgTran.Primary().Item("OPTION_VALUE2" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_NAME[2] = msgTran.Primary().Item("OPTION_NAME3" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_VALUE[2] = msgTran.Primary().Item("OPTION_VALUE3" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_NAME[3] = msgTran.Primary().Item("OPTION_NAME4" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_VALUE[3] = msgTran.Primary().Item("OPTION_VALUE4" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_NAME[4] = msgTran.Primary().Item("OPTION_NAME5" + dintIndex).Getvalue().ToString().Trim(); dpSlot.OPTION_VALUE[4] = msgTran.Primary().Item("OPTION_VALUE5" + dintIndex).Getvalue().ToString().Trim(); } if (dintAck3 == (int)LOTInfoValidation.Accepted) { pInfo.Port(dintPortID).HostPPID = dstrHOSTPPID; } } } } } msgTran.Secondary().Item("ACKC3").Putvalue(dintAck3); funSendReply(msgTran); //pInfo.subPLCCommand_Set(clsInfo.PLCCommand.LotInfoSet, dintPortID, dintSlotID); if (dintAck3 == (int)LOTInfoValidation.Accepted) { //[2015/05/20]FI01에서도 저장되게 조건식 추가(Add by HS) if (dintUnitID == 1 && dintSubUnitID == 2 || dintUnitID == 1 && dintSubUnitID == 1) { pInfo.Port(dintPortID).S3F115Received = true; clsSlot dpSlot = pInfo.Port(dintPortID).Slot(1); if (dpSlot != null) { int dintFilmCount = Convert.ToInt32(dpSlot.USE_COUNT); //[2015/06/23]FI02에서만 저장되게 조건식 추가(Add by HS) if (dintUnitID == 1 && dintSubUnitID == 2) { pInfo.subPLCCommand_Set(clsInfo.PLCCommand.LotinformationSend, strGLSID, dintFilmCount, dpSlot.PRODUCTID); } if (pInfo.LOTID(pInfo.Port(dintPortID).CSTID) == null) { pInfo.AddLOT(pInfo.Port(dintPortID).CSTID); } for (int dintLoop = 1; dintLoop <= dintFilmCount; dintLoop++) { if (pInfo.LOTID(pInfo.Port(dintPortID).CSTID).Slot(dintLoop) == null) { pInfo.LOTID(pInfo.Port(dintPortID).CSTID).AddSlot(dintLoop); } //pInfo.LOTID(strGLSID).Slot(dintLoop).GlassID = strGLSID + dintLoop.ToString().PadLeft(3, '0'); pInfo.LOTID(pInfo.Port(dintPortID).CSTID).Slot(dintLoop).GlassID = strGLSID; pInfo.LOTID(pInfo.Port(dintPortID).CSTID).Slot(dintLoop).USE_COUNT = dintLoop.ToString(); pInfo.LOTID(pInfo.Port(dintPortID).CSTID).Slot(dintLoop).PRODUCTID = dpSlot.PRODUCTID; } } if (dintPortID == 2) { //this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.FilmJobCommand, 1001, dintPortID); //Lot Start 지시 } } //150122 고석현 if (dintUnitID == 1 && dintSubUnitID == 1) { pInfo.subPLCCommand_Set(clsInfo.PLCCommand.FI01_Check, "1"); } } else { pInfo.Port(dintPortID).S3F115Received = false; } } catch (Exception ex) { pInfo.subLog_Set(clsInfo.LogType.CIM, ex.ToString()); return; } finally { } }
/// <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 dintIndex = 0; //int dintIndex2 = 0; string dstrWordAddress = ""; string dstrECIDReport = ""; string dstrECSLL = ""; string dstrECWLL = ""; string dstrECDEF = ""; string dstrECWUL = ""; string dstrECSUL = ""; string dstrLog = ""; string dstrSQL = ""; string[] dstrValue = null; int dintECID = 0; string dstrECIDReadData = ""; string strData = ""; string dstrECID = ""; try { dstrWordAddress = "W2A00"; dstrECIDReadData = m_pEqpAct.funWordRead(dstrWordAddress, pInfo.Unit(0).SubUnit(0).ECIDCount * 7, EnuEQP.PLCRWType.Hex_Data); //PLC Req에 대한 CIM의 Confirm Bit를 준다. m_pEqpAct.subSetConfirmBit(strCompBit); // 디비트랜젝션... 해야지.. if (DBAct.clsDBAct.funOleDbTransaction() == null) { DBAct.clsDBAct.funBeginTransaction(); } OleDbTransaction odbTransaction = DBAct.clsDBAct.funOleDbTransaction(); for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).ECIDCount; dintLoop++) { strData = dstrECIDReadData.Substring((dintLoop - 1) * 28, 28); dstrECID = strData.Substring(0, 4); dintECID = Convert.ToInt32(FunTypeConversion.funHexConvert(dstrECID, EnuEQP.StringType.Decimal)); //ECID //dstrECSLL = strData.Substring(4, 8); // ECSLL dstrECWLL = strData.Substring(4, 8); dstrECWLL = dstrECWLL.Substring(4, 4) + dstrECWLL.Substring(0, 4); dstrECDEF = strData.Substring(12, 8); // ECDEF dstrECDEF = dstrECDEF.Substring(4, 4) + dstrECDEF.Substring(0, 4); //dstrECSUL = strData.Substring(20, 8); // ECSUL dstrECWUL = strData.Substring(20, 8); dstrECWUL = dstrECWUL.Substring(4, 4) + dstrECWUL.Substring(0, 4); //dstrECSLL = FunTypeConversion.funDecimalConvert(dstrECSLL, EnuEQP.StringType.Hex); //dstrECDEF = FunTypeConversion.funDecimalConvert(dstrECDEF, EnuEQP.StringType.Hex); //dstrECSUL = FunTypeConversion.funDecimalConvert(dstrECSUL, EnuEQP.StringType.Hex); dstrECWLL = FunTypeConversion.funHexConvert(dstrECWLL, EnuEQP.StringType.Decimal); dstrECDEF = FunTypeConversion.funHexConvert(dstrECDEF, EnuEQP.StringType.Decimal); dstrECWUL = FunTypeConversion.funHexConvert(dstrECWUL, EnuEQP.StringType.Decimal); ////dstrECSLL = FunTypeConversion.funPlusMinusAPDCalc(dstrECSLL); //dstrECWLL = FunTypeConversion.funPlusMinusAPDCalc(dstrECWLL); //dstrECDEF = FunTypeConversion.funPlusMinusAPDCalc(dstrECDEF); ////dstrECSUL = FunTypeConversion.funPlusMinusAPDCalc(dstrECSUL); //dstrECWUL = FunTypeConversion.funPlusMinusAPDCalc(dstrECWUL); //dstrECSLL = FunStringH.funPoint(dstrECSLL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); dstrECWLL = FunStringH.funPoint(dstrECWLL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); dstrECDEF = FunStringH.funPoint(dstrECDEF, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); //dstrECSUL = FunStringH.funPoint(dstrECSUL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); dstrECWUL = FunStringH.funPoint(dstrECWUL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).Format); if (pInfo.Unit(0).SubUnit(0).ECID(dintECID) != null) { if (pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECDEF != dstrECDEF || pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWLL != dstrECWLL || pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECWUL != dstrECWUL) // pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSLL != dstrECSLL || //pInfo.Unit(0).SubUnit(0).ECID(dintECID).ECSUL != dstrECSUL) { dstrECIDReport += dintLoop.ToString() + ";"; //로그 출력 //dstrLog = dstrLog + "ECID" + ","; //dstrLog = dstrLog + DateTime.Now.ToString("yyyyMMddHHmmss") + ","; //dstrLog = dstrLog + "변경" + ","; //dstrLog = dstrLog + pInfo.All.UserID + ","; //dstrLog = dstrLog + "ECID(" + dintLoop.ToString() + "): " + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).DESC + ","; //dstrLog = dstrLog + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSLL + ","; //dstrLog = dstrLog + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECDEF + ","; //dstrLog = dstrLog + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSUL + ","; //dstrLog = dstrLog + dstrECSLL + ","; //dstrLog = dstrLog + dstrECWLL + ","; //dstrLog = dstrLog + dstrECDEF + ","; //dstrLog = dstrLog + dstrECWUL + ","; //dstrLog = dstrLog + dstrECSUL; dstrLog = string.Format("ECID,{0},변경,{1},ECID({2}): {3},{4} -> {5}, {6} -> {7}, {8} -> {9}", DateTime.Now.ToString("yyyyMMddHHmmss"), pInfo.All.UserID, dintLoop.ToString(), pInfo.Unit(0).SubUnit(0).ECID(dintLoop).DESC, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWLL, dstrECWLL, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECDEF, dstrECDEF, pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWUL, dstrECWUL ); pInfo.subLog_Set(InfoAct.clsInfo.LogType.Parameter, dstrLog); //로그 출력 dstrLog = ""; //초기화 //구조체 업데이트 pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSLL = dstrECWLL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWLL = dstrECWLL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECDEF = dstrECDEF; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECWUL = dstrECWUL; pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSUL = dstrECWUL; dstrSQL = "Update tbECID set ECSLL=" + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSLL + ", ECWLL=" + dstrECWLL + ", ECDEF=" + dstrECDEF + ", ECWUL=" + dstrECWUL + ", ECSUL=" + pInfo.Unit(0).SubUnit(0).ECID(dintLoop).ECSUL + " Where ECID=" + dintLoop.ToString(); if (DBAct.clsDBAct.funExecuteNonQuery(dstrSQL) == false) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "DB Update Fail(subLoadECID): ECID: " + dintLoop.ToString()); } } } } if (DBAct.clsDBAct.funOleDbTransaction() != null) { DBAct.clsDBAct.funCommitTransaction(); } // 디비내용 업데이트는 한번만 하면 되지.. 이게 뭐니... pInfo.DeleteTable("ECID"); dstrSQL = "SELECT * FROM tbECID order by ECID"; DataTable dt = DBAct.clsDBAct.funSelectQuery(dstrSQL); pInfo.AddDataTable("ECID", dt); pInfo.AddViewEvent(InfoAct.clsInfo.ViewEvent.ECIDUpdate); if (pInfo.All.ECIDChangeBYWHO == "1" || pInfo.All.ECIDChangeBYWHO == "2") { //HOST나 OP에서 발생한것임 dstrECIDReport = pInfo.All.ECIDChangeFromHost; pInfo.All.ECIDChangeFromHost = ""; //m_pInfo.All.ECIDChangeBYWHO = ""; } else { pInfo.All.ECIDChangeBYWHO = "2"; //By Equipment } pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S6F11RelatedEquipmentParameterEvent, 102, dstrECIDReport); //마지막 인자는 ECID임 pInfo.All.ECIDChangeBYWHO = ""; //최종 수정된 날짜 Ini에 변경 FunINIMethod.subINIWriteValue("ETCInfo", "ECIDLastModified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), pInfo.All.SystemINIFilePath); } catch (Exception ex) { pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString()); if (!DBAct.clsDBAct.funIsNullTransaction()) { DBAct.clsDBAct.funCommitTransaction(); } } }