예제 #1
0
        /// <summary>
        /// Primary Message를 Biuld하여 Transaction을 Return한다.
        /// </summary>
        /// <param name="strParameters">Parameter 문자열</param>
        public Transaction funPrimarySend(string strParameters)
        {
            string[] arrayEvent;
            try
            {
                arrayEvent = strParameters.Split(',');

                string dstrMode     = arrayEvent[1]; //Mode(1: 생성, 2: 삭제, 3: 수정)
                string dstrPPIDType = arrayEvent[2];
                string dstrHOSTPPID = arrayEvent[3];
                string dstrEQPPPID  = arrayEvent[4];

                pMsgTran = pSecsDrv.MakeTransaction(this.StrPrimaryMsgName);

                pMsgTran.Primary().Item("MODE").Putvalue(dstrMode); //Mode(1: 생성, 2: 삭제, 3: 수정)
                pMsgTran.Primary().Item("MODULEID1").Putvalue(pInfo.Unit(3).SubUnit(0).ModuleID);
                pMsgTran.Primary().Item("PPID_TYPE").Putvalue(dstrPPIDType);

                switch (dstrPPIDType)
                {
                case "1":
                {
                    //string UP_EQPPPID = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(dstrEQPPPID).UP_EQPPPID;
                    //string LOW_EQPPPID = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(dstrEQPPPID).LOW_EQPPPID;

                    //pHost.subWaitPPIDSearch();

                    pMsgTran.Primary().Item("PPID").Putvalue(dstrEQPPPID);
                    pMsgTran.Primary().Item("COMMANDCOUNT").Putvalue(1);
                    pMsgTran.Primary().Item("CCODE" + 0).Putvalue(0);

                    int dintPPIDBodyCount = 0;
                    for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                    {
                        InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop);
                        if (currentPPIDBody.UseMode)
                        {
                            dintPPIDBodyCount++;
                        }
                    }

                    pMsgTran.Primary().Item("PPARMCOUNT" + 0).Putvalue(dintPPIDBodyCount);

                    int dintCount = 0;
                    for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                    {
                        InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID).PPIDBody(dintLoop);
                        if (currentPPIDBody.UseMode)
                        {
                            pMsgTran.Primary().Item("P_PARM_NAME" + 0 + dintCount).Putvalue(currentPPIDBody.Name);
                            pMsgTran.Primary().Item("P_PARM" + 0 + dintCount).Putvalue(currentPPIDBody.Value);
                            dintCount++;
                        }
                    }
                }
                break;

                case "2":
                {
                    pMsgTran.Primary().Item("PPID").Putvalue(dstrHOSTPPID);
                    pMsgTran.Primary().Item("COMMANDCOUNT").Putvalue(1);
                    pMsgTran.Primary().Item("CCODE" + 0).Putvalue(0);
                    pMsgTran.Primary().Item("PPARMCOUNT" + 0).Putvalue(1);
                    pMsgTran.Primary().Item("P_PARM_NAME" + 0 + 0).Putvalue("SUBPPID");
                    pMsgTran.Primary().Item("P_PARM" + 0 + 0).Putvalue(dstrEQPPPID);
                }
                break;
                }

                return(pMsgTran);
            }
            catch (Exception error)
            {
                pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, error.ToString());
                return(null);
            }
        }
예제 #2
0
파일: clsS7F25.cs 프로젝트: k2un/k2un
        /// <summary>
        /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다.
        /// </summary>
        /// <param name="msgTran">Primary Message의 Transaction</param>
        public void funPrimaryReceive(Transaction msgTran)
        {
            string  dstrModuleID     = "";
            string  dstrReceivedPPID = "";
            int     dintPPIDType     = 0;
            Boolean dbolPPIDNotExist = false;
            int     dintEQPPIDCount  = 0;   //HOST PPID에 Mapping되어있는 EQPPID의 개수

            try
            {
                dstrModuleID     = msgTran.Primary().Item("MODULEID").Getvalue().ToString().Trim();
                dstrReceivedPPID = msgTran.Primary().Item("PPID").Getvalue().ToString().Trim();
                dintPPIDType     = Convert.ToInt32(msgTran.Primary().Item("PPID_TYPE").Getvalue());

                //ModuleID가 존재하지 않는 경우
                if (dstrModuleID != this.pInfo.Unit(3).SubUnit(0).ModuleID)
                {
                    msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID);
                    msgTran.Secondary().Item("PPID").Putvalue(dstrReceivedPPID);
                    msgTran.Secondary().Item("PPID_TYPE").Putvalue(dintPPIDType);
                    msgTran.Secondary().Item("COMMANDCOUNT").Putvalue(0);

                    funSendReply(msgTran);

                    return;
                }

                if (dintPPIDType == 1)
                {
                    pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "SetUpPPID Start :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

                    pInfo.All.isReceivedFromHOST = true;                                            //HOST로 부터 S7F101를 받았음을 저장
                    pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.SetUpPPID, dintPPIDType);
                    pHost.subWaitDuringReadFromPLC();
                    pInfo.All.isReceivedFromHOST = false;                                           //HOST로 부터 S7F101를 받지 않았음을 저장(초기화)
                    pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "SetUpPPID Start :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

                    if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID) == null)
                    {
                        dbolPPIDNotExist = true;
                    }
                }
                else if (dintPPIDType == 2)
                {
                    //if (this.pInfo.EQP("Main").RecipeCheck == true)

                    if (pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID) == null)
                    {
                        //설비로 부터 PPID List를 읽어온다.
                        //HOST로 부터 S7F101를 받지 않았음을 저장(초기화)
                    }

                    if (pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID) == null)
                    {
                        dbolPPIDNotExist = true;
                    }
                }
                else
                {
                    dbolPPIDNotExist = true;
                }

                //PPID가 존재하지 않는 경우나 PPID_TYPE이 틀린 경우(1 혹은 2가 아닌값)
                if (dbolPPIDNotExist == true)
                {
                    msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID);
                    msgTran.Secondary().Item("PPID").Putvalue(dstrReceivedPPID);
                    msgTran.Secondary().Item("PPID_TYPE").Putvalue(dintPPIDType);
                    msgTran.Secondary().Item("COMMANDCOUNT").Putvalue(0);

                    funSendReply(msgTran);

                    return;
                }
                else
                {
                    if (dintPPIDType == 1)
                    {
                        pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "OneppidRead Start :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                        pInfo.All.isReceivedFromHOST = true;                                            //HOST로 부터 S7F101를 받았음을 저장
                        pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.OnePPIDRead, dintPPIDType, dstrReceivedPPID, "");
                        //[2015/04/20]임시add by HS)
                        funSetLog(InfoAct.clsInfo.LogType.CIM, "subWaitDuringReadFromPLC Start. Time" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                        pHost.subWaitDuringReadFromPLC();
                        //[2015/04/20]임시add by HS)
                        funSetLog(InfoAct.clsInfo.LogType.CIM, "subWaitDuringReadFromPLC End. Time" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
                        pInfo.All.isReceivedFromHOST = false;
                        pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, "OneppidRead END :" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));

                        ////pInfo.Unit(0).SubUnit(0).MappingEQPPPID(dstrReceivedPPID).PPIDCommand = InfoAct.clsInfo.PPIDCMD.Search;
                        ////pInfo.SetPPIDCMD(dstrReceivedPPID);
                        ////pHost.subWaitPPIDSearch();

                        //여기까지 오면 맞는 경우임
                        msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID);
                        msgTran.Secondary().Item("PPID").Putvalue(dstrReceivedPPID);
                        msgTran.Secondary().Item("PPID_TYPE").Putvalue(dintPPIDType);
                        msgTran.Secondary().Item("COMMANDCOUNT").Putvalue(1);

                        msgTran.Secondary().Item("CCODE" + 0).Putvalue(0);
                        //msgTran.Secondary().Item("PPARMCOUNT" + 0).Putvalue(pInfo.Unit(0).SubUnit(0).PPIDBodyCount);

                        //int dintPPIDBodyCount = pInfo.Unit(0).SubUnit(0).PPIDBodyCount;
                        //for (int dintLoop = 1; dintLoop <= dintPPIDBodyCount; dintLoop++)
                        //{
                        //    InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop);

                        //    msgTran.Secondary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Putvalue(currentPPIDBody.Name);
                        //    msgTran.Secondary().Item("P_PARM" + 0 + (dintLoop - 1)).Putvalue(currentPPIDBody.Value);
                        //}@

                        int dintPPIDBodyCount = 0;
                        for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                        {
                            InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop);
                            if (currentPPIDBody.UseMode)
                            {
                                dintPPIDBodyCount++;
                            }
                        }

                        msgTran.Secondary().Item("PPARMCOUNT" + 0).Putvalue(dintPPIDBodyCount);

                        int dintCount = 0;
                        for (int dintLoop = 1; dintLoop <= pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                        {
                            InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop);
                            if (currentPPIDBody.UseMode)
                            {
                                msgTran.Secondary().Item("P_PARM_NAME" + 0 + dintCount).Putvalue(currentPPIDBody.Name);
                                msgTran.Secondary().Item("P_PARM" + 0 + dintCount).Putvalue(currentPPIDBody.Value);
                                dintCount++;
                            }
                        }

                        //string UP_EQPPPID = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(dstrReceivedPPID).UP_EQPPPID;
                        //string LOW_EQPPPID = pInfo.Unit(0).SubUnit(0).MappingEQPPPID(dstrReceivedPPID).LOW_EQPPPID;

                        //for (int dintLoop = 1; dintLoop <= dintPPIDBodyCount; dintLoop++)
                        //{
                        //    InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(UP_EQPPPID).PPIDBody(dintLoop);
                        //    msgTran.Secondary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Putvalue("UPPER_" + currentPPIDBody.Name);
                        //    msgTran.Secondary().Item("P_PARM" + 0 + (dintLoop - 1)).Putvalue(currentPPIDBody.Value);
                        //}

                        //for (int dintLoop = 1; dintLoop <= dintPPIDBodyCount; dintLoop++)
                        //{
                        //    InfoAct.clsPPIDBody currentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(LOW_EQPPPID).PPIDBody(dintLoop);
                        //    msgTran.Secondary().Item("P_PARM_NAME" + 0 + (dintLoop - 1 + dintPPIDBodyCount)).Putvalue("LOWER_" + currentPPIDBody.Name);
                        //    msgTran.Secondary().Item("P_PARM" + 0 + (dintLoop - 1 + dintPPIDBodyCount)).Putvalue(currentPPIDBody.Value);
                        //}
                    }
                    else
                    {
                        //여기까지 오면 맞는 경우임
                        msgTran.Secondary().Item("MODULEID").Putvalue(dstrModuleID);
                        msgTran.Secondary().Item("PPID").Putvalue(dstrReceivedPPID);
                        msgTran.Secondary().Item("PPID_TYPE").Putvalue(dintPPIDType);
                        msgTran.Secondary().Item("COMMANDCOUNT").Putvalue(1);

                        //HOST PPID에 Mapping되어있는 장비 PPID의 개수를 알아온다.
                        foreach (string dstrHOSTPPID in this.pInfo.Unit(0).SubUnit(0).HOSTPPID())
                        {
                            if (dstrReceivedPPID == dstrHOSTPPID && this.pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrHOSTPPID).EQPPPID != "")
                            {
                                dintEQPPIDCount = dintEQPPIDCount + 1;
                            }
                        }

                        msgTran.Secondary().Item("CCODE" + (dintEQPPIDCount - 1)).Putvalue(0);
                        msgTran.Secondary().Item("PPARMCOUNT" + (dintEQPPIDCount - 1)).Putvalue(dintEQPPIDCount);

                        for (int dintLoop = 1; dintLoop <= dintEQPPIDCount; dintLoop++)
                        {
                            msgTran.Secondary().Item("P_PARM_NAME" + (dintEQPPIDCount - 1) + (dintLoop - 1)).Putvalue("SUBPPID");
                            msgTran.Secondary().Item("P_PARM" + (dintEQPPIDCount - 1) + (dintLoop - 1)).Putvalue(pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID).EQPPPID);
                        }
                    }
                }
                funSendReply(msgTran);
            }
            catch (Exception error)
            {
                funSetLog(InfoAct.clsInfo.LogType.CIM, error.ToString());
                return;
            }
            finally
            {
                pInfo.All.isReceivedFromHOST = false;      //초기화
                pInfo.All.PLCActionEnd       = false;      //초기화
            }
        }
예제 #3
0
        /// <summary>
        /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다.
        /// </summary>
        /// <param name="msgTran">Primary Message의 Transaction</param>
        public void funPrimaryReceive(Transaction msgTran)
        {
            string dstrModuleID     = "";
            int    dintPPIDType     = 0;
            string dstrReceivedPPID = "";
            int    dintACK          = 0;
            int    dintBodyIndex    = 0;
            string dstrTemp         = "";

            string[] dstrValue;

            string dstrBeforeEQPPPID = "";
            int    dintPPIDBodyCount = 0;
            int    dintPPIDBodyID    = 0;

            string dstrHOSTPPID = "";
            string dstrPPIDBody = "";
            //string dstrPPIDTime = "";
            string dstrEQPPPID = "";

            try
            {
                dstrModuleID     = msgTran.Primary().Item("MODULEID").Getvalue().ToString().Trim();
                dstrReceivedPPID = msgTran.Primary().Item("PPID").Getvalue().ToString().Trim();
                dintPPIDType     = Convert.ToInt32(msgTran.Primary().Item("PPID_TYPE").Getvalue());

                //ModuleID가 존재하지 않는 경우
                if (dstrModuleID != pInfo.Unit(3).SubUnit(0).ModuleID)
                {
                    msgTran.Secondary().Item("ACKC7").Putvalue(7);
                    funSendReply(msgTran);

                    return;
                }

                //현재 장비가 RUN중이면
                if (((dstrReceivedPPID == pInfo.All.CurrentHOSTPPID) && (dintPPIDType == 2)) ||
                    ((dstrReceivedPPID == pInfo.All.CurrentEQPPPID) && (dintPPIDType == 1)))
                {
                    msgTran.Secondary().Item("ACKC7").Putvalue(1);
                    funSendReply(msgTran);

                    return;
                }

                //dintACK = 1;


                switch (dintPPIDType)
                {
                case 1:
                    // 20121021 이상창
                    // 해당 레시피 없을경우 PLC와 레시피 동화 시도.
                    if (this.pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID) == null)
                    {
                        //if (this.pInfo.EQP("Main").RecipeCheck == true)
                        //{
                        this.pInfo.All.isReceivedFromHOST = true;                                         ///HOST로 부터 S7F101를 받았음을 저장
                        this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.SetUpPPID, dintPPIDType); //현재 운영중인 PPID를 PLC로 부터 읽는다.
                        pHost.subWaitDuringReadFromPLC();
                        this.pInfo.All.isReceivedFromHOST = false;                                        ///HOST로 부터 S7F101를 받지 않았음을 저장(초기화)
                        //}
                    }

                    //EQP PPID 존재여부 체크
                    if (this.pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID) == null)
                    {
                        dintACK = 10;
                    }
                    else
                    {
                        if (pInfo.EQP("Main").DummyPLC)
                        {
                            if (pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID) == null)
                            {
                                pInfo.Unit(0).SubUnit(0).AddEQPPPID(dstrReceivedPPID);

                                for (int dintLoop = 0; dintLoop < pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                                {
                                    pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).AddPPIDBody(dintLoop + 1);
                                    InfoAct.clsPPIDBody CurrentPPIDBody = pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop + 1);
                                    CurrentPPIDBody.DESC     = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).DESC;
                                    CurrentPPIDBody.Format   = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Format;
                                    CurrentPPIDBody.Index    = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Index;
                                    CurrentPPIDBody.Length   = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Length;
                                    CurrentPPIDBody.Max      = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Max;
                                    CurrentPPIDBody.Min      = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Min;
                                    CurrentPPIDBody.ModuleID = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).ModuleID;
                                    CurrentPPIDBody.Name     = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Name;
                                    CurrentPPIDBody.Range    = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Range;
                                    CurrentPPIDBody.Unit     = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).Unit;
                                    CurrentPPIDBody.UseMode  = pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).UseMode;
                                    CurrentPPIDBody.Value    = "0";
                                }
                            }
                        }
                        else
                        {
                            this.pInfo.All.isReceivedFromHOST = true;                                                                 ///HOST로 부터 S7F101를 받았음을 저장
                            this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.OnePPIDRead, dintPPIDType, dstrReceivedPPID, ""); //현재 운영중인 PPID를 PLC로 부터 읽는다.
                            pHost.subWaitDuringReadFromPLC();
                            this.pInfo.All.isReceivedFromHOST = false;                                                                ///HOST로 부터 S7F101를 받지 않았음을 저장(초기화)
                        }
                    }

                    //PPID Body 개수 체크
                    dintPPIDBodyCount = Convert.ToInt32(msgTran.Primary().Item("PPARMCOUNT" + 0).Getvalue());
                    int dintCount = 0;
                    for (int dintLoop = 0; dintLoop < pInfo.Unit(0).SubUnit(0).PPIDBodyCount; dintLoop++)
                    {
                        if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop + 1).UseMode)
                        {
                            dintCount++;
                        }
                    }

                    if (dintACK == 0 && dintPPIDBodyCount > dintCount)
                    {
                        dintACK = 3;
                    }

                    //PPID Body 범위 체크(NAK시 3으로 보냄)
                    if (dintACK == 0)
                    {
                        for (int dintLoop = 1; dintLoop <= dintPPIDBodyCount; dintLoop++)
                        {
                            //dintPPIDBodyID = funGetBodyNameToBodyID(msgTran.Primary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim());
                            dintPPIDBodyID = (int)pInfo.Unit(0).SubUnit(0).pHashPPIDBodyName_GetIndex[msgTran.Primary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim()];

                            if (dintPPIDBodyID == 0)      //Body Name이 존재하지 않는 경우 NAK
                            {
                                //A2 사양에서 S7F24의 ACK Code가 변경됨. 기존에 쓰이던 3번항목(Matrix Overflow)이 삭제되었으나 대체할 Code가 없음. 협의 필요 20101018 어우수
                                dintACK = 3;
                                break;
                            }

                            dstrPPIDBody = msgTran.Primary().Item("P_PARM" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim();

                            if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintPPIDBodyID).Length == 2)
                            {
                                if (pInfo.Unit(0).SubUnit(0).PPIDBody(dintPPIDBodyID).Min <= Convert.ToDouble(dstrPPIDBody) &&
                                    Convert.ToDouble(dstrPPIDBody) <= pInfo.Unit(0).SubUnit(0).PPIDBody(dintPPIDBodyID).Max)
                                {
                                    pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintPPIDBodyID).Value = dstrPPIDBody;
                                }
                                else
                                {
                                    dintACK = 11;       //PPID Body 범위를 벗어난 경우(11 = P_PARM exceeds in defined range)
                                    break;
                                }
                            }
                            else
                            {
                                pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintPPIDBodyID).Value = dstrPPIDBody;
                            }
                        }
                    }

                    //여기까지 오면 정상임
                    if (dintACK == 0)
                    {
                        dstrHOSTPPID = "";
                        dstrPPIDBody = "";

                        //조금 전 위에서 PLC에서 읽은 Data를 구성한다.
                        int dintBodyCount = pInfo.Unit(0).SubUnit(0).PPIDBodyCount;
                        for (int dintLoop = 1; dintLoop <= dintBodyCount; dintLoop++)
                        {
                            dstrTemp = this.pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop).Value;
                            //if (this.pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintLoop).Length == 2)
                            //{
                            //    dstrTemp = FunStringH.funMakePLCData(FunStringH.funMakeRound(dstrTemp, this.pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format));
                            //}

                            dstrPPIDBody = dstrPPIDBody + dstrTemp + ";";
                        }

                        dstrPPIDBody = dstrPPIDBody.Substring(0, dstrPPIDBody.Length - 1);

                        //PLC에서 읽은 Data 외에 HOST에서 받은(변경할) Data 저장
                        dstrValue = dstrPPIDBody.Split(new char[] { ';' });          //인자들을 분리한다.

                        for (int dintLoop = 1; dintLoop <= dintPPIDBodyCount; dintLoop++)
                        {
                            //dintBodyIndex = funGetBodyNameToBodyID(msgTran.Primary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim());
                            dintBodyIndex = (int)pInfo.Unit(0).SubUnit(0).pHashPPIDBodyName_GetIndex[msgTran.Primary().Item("P_PARM_NAME" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim()];

                            dstrTemp = msgTran.Primary().Item("P_PARM" + 0 + (dintLoop - 1)).Getvalue().ToString().Trim();
                            //if (this.pInfo.Unit(0).SubUnit(0).EQPPPID(dstrReceivedPPID).PPIDBody(dintBodyIndex).Length == 2)
                            //{
                            //    dstrTemp = FunStringH.funMakePLCData(FunStringH.funMakeRound(dstrTemp, this.pInfo.Unit(0).SubUnit(0).PPIDBody(dintLoop).Format));
                            //}

                            dstrValue[dintBodyIndex - 1] = dstrTemp;
                        }

                        dstrPPIDBody = "";
                        for (int dintLoop = 0; dintLoop < dstrValue.Length; dintLoop++)
                        {
                            dstrPPIDBody = dstrPPIDBody + dstrValue[dintLoop] + ";";
                        }
                        dstrPPIDBody = dstrPPIDBody.Substring(0, dstrPPIDBody.Length - 1);

                        //dstrPPIDTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                        dintPPIDType = 1;       //EQP PPID임.

                        //장비로 EQP PPID Body 수정 지시(PPID Type=1)
                        //인자: HOSTPPID, EQPPPID, Body, 시간, Version, PPID Type
                        this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.PPIDBodyModify, dstrHOSTPPID, dstrReceivedPPID, dstrPPIDBody, dintPPIDType.ToString());
                    }
                    break;

                case 2:
                    // 20121021 이상창
                    // 해당 레시피 없을경우 PLC와 레시피 동화 시도.
                    //if (this.pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID) == null)
                    //{
                    //    ////RecipeCheck = true일때만 PLC에서 Recipe 정보를 읽어서 동기화한다.
                    //    ////왜냐하면 Dummy로 테스트시 시간 단축 및 시나리오가 복잡해지기 때문임
                    //    //if (this.pInfo.EQP("Main").RecipeCheck == true)
                    //    //{
                    //        //this.pInfo.All.isReceivedFromHOST = true;    ///HOST로 부터 S7F101를 받았음을 저장
                    //        //this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.SetUpPPID, dintPPIDType);      //현재 운영중인 PPID를 PLC로 부터 읽는다.
                    //        //pHost.subWaitDuringReadFromPLC();
                    //        //this.pInfo.All.isReceivedFromHOST = false;    ///HOST로 부터 S7F101를 받지 않았음을 저장(초기화)
                    //    //}
                    //}

                    //HOST PPID 존재여부 체크
                    if (this.pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID) == null)
                    {
                        dintACK = 10;
                    }

                    //받은 HOST PPID에 Mapping할 EQPPPID가 존재하는지 체크
                    dstrEQPPPID = msgTran.Primary().Item("P_PARM" + 0 + 0).Getvalue().ToString().Trim();

                    if (dintACK == 0 && pInfo.Unit(0).SubUnit(0).EQPPPID(dstrEQPPPID) == null)
                    {
                        dintACK = 10;
                    }

                    //여기까지 오면 정상임
                    if (dintACK == 0)
                    {
                        //dstrBeforeEQPPPID = pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID).EQPPPID;   //변경전 EQPPPID

                        //dstrPPIDTime = DateTime.Now.ToString("yyyyMMddHHmmss");
                        //dintPPIDType = 2;   //HOST PPID임.

                        //장비로 HOST PPID Mapping 변경 지시(PPID Type=2)
                        //인자: HOSTPPID, 변경전 EQPPPID, 변경후 EQPPPID, 시간)
                        //this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.HOSTPPIDMappingChange, dstrReceivedPPID, dstrEQPPPID);//, dstrPPIDTime);
                        this.pInfo.Unit(0).SubUnit(0).HOSTPPID(dstrReceivedPPID).EQPPPID = dstrEQPPPID;
                        pInfo.subSendSF_Set(InfoAct.clsInfo.SFName.S7F107PPIDCreatDeleteAndPPBodyChangedReport, "3", 2, dstrReceivedPPID, dstrEQPPPID);
                    }
                    break;

                default:      //PPID_TYPE이 틀린 경우(1 혹은 2가 아닌값)
                {
                    dintACK = 8;
                }
                break;
                }


                msgTran.Secondary().Item("ACKC7").Putvalue(dintACK);
                funSendReply(msgTran);
            }
            catch (Exception error)
            {
                funSetLog(InfoAct.clsInfo.LogType.CIM, error.ToString());
                return;
            }
            finally
            {
                //PLC로 부터 리턴받은 값에 대해 사용된 변수 초기화
                pInfo.All.isReceivedFromHOST = false;      //초기화
                pInfo.All.PLCActionEnd       = false;      //초기화
            }
        }