Ejemplo n.º 1
0
        /// <summary>
        /// Primary Message에 대해 처리한 후 Secondary Message를 Biuld하여 Driver에 전송한다.
        /// </summary>
        /// <param name="msgTran">Primary Message의 Transaction</param>
        public void funPrimaryReceive(Transaction msgTran)
        {
            string dstrModuleID = "";

            string[] dstrDATATYPE;
            string[] dstrITEMNAME;
            string[] dstrITEMVALUE;
            string[] dstrREFERENCE;
            string[] dstrArrTemp;

            int dintDATACOUNT = 0;
            int dintACK       = 0;
            int dintTemp      = 0;

            int[] dintEAC;

            bool dbolNACK = false;

            try
            {
                dstrModuleID  = msgTran.Primary().Item("MODULEID").Getvalue().ToString().Trim();
                dintDATACOUNT = Convert.ToInt32(msgTran.Primary().Item("L2").Getvalue());
                msgTran.Secondary().Item("L2").Putvalue(dintDATACOUNT);


                dstrDATATYPE  = new string[dintDATACOUNT];
                dstrITEMNAME  = new string[dintDATACOUNT];
                dstrITEMVALUE = new string[dintDATACOUNT];
                dstrREFERENCE = new string[dintDATACOUNT];
                dintEAC       = new int[dintDATACOUNT];

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

                    funSendReply(msgTran);

                    return;
                }

                //Secondary에 Data 저장
                for (int dintLoop = 0; dintLoop < dintDATACOUNT; dintLoop++)
                {
                    dstrDATATYPE[dintLoop]  = msgTran.Primary().Item("DATA_TYPE" + dintLoop).Getvalue().ToString().Trim();
                    dstrITEMNAME[dintLoop]  = msgTran.Primary().Item("ITEM_NAME" + dintLoop).Getvalue().ToString().Trim();
                    dstrITEMVALUE[dintLoop] = msgTran.Primary().Item("ITEM_VALUE" + dintLoop).Getvalue().ToString().Trim();
                    dstrREFERENCE[dintLoop] = msgTran.Primary().Item("REFERENCE" + dintLoop).Getvalue().ToString().Trim();


                    InfoAct.clsMultiUseDataByTYPE clsTYPE = this.pInfo.Unit(0).SubUnit(0).MultiData.TYPES(dstrDATATYPE[dintLoop]);

                    if (clsTYPE != null)
                    {
                        InfoAct.clsMultiUseDataByITEM clsITEM = clsTYPE.ITEMS(dstrITEMNAME[dintLoop]);

                        if (clsITEM != null)
                        {
                            if (dstrREFERENCE[dintLoop] != clsITEM.REFERENCE)
                            {
                                dintACK           = 2;
                                dintEAC[dintLoop] = 4;
                            }
                            else
                            {
                                dintEAC[dintLoop] = 0;

                                #region IP check
                                if (clsITEM.REFERENCE.Contains("IP") || clsITEM.ITEM.Contains("IP"))
                                {
                                    dstrArrTemp = dstrITEMVALUE[dintLoop].Split('.');
                                    if (dstrArrTemp.Length != 4)
                                    {
                                        dintACK           = 2;
                                        dintEAC[dintLoop] = 3;
                                    }
                                    else
                                    {
                                        for (int dintLoopTemp = 0; dintLoopTemp < dstrArrTemp.Length; dintLoopTemp++)
                                        {
                                            int dintIPTemp = 0;

                                            if (int.TryParse(dstrArrTemp[dintLoopTemp], out dintIPTemp))
                                            {
                                                if (dintIPTemp > 255 || dintIPTemp < 0)
                                                {
                                                    dintACK           = 2;
                                                    dintEAC[dintLoop] = 3;
                                                    break;
                                                }
                                            }
                                            else
                                            {
                                                dintACK           = 2;
                                                dintEAC[dintLoop] = 3;
                                                break;
                                            }
                                        }
                                    }
                                }
                                #endregion
                                #region TIME check
                                else if (clsITEM.REFERENCE.Equals("MINUTE") || clsITEM.ITEM.Contains("TIME"))
                                {
                                    int dintTimeTemp = 0;

                                    if (int.TryParse(dstrITEMVALUE[dintLoop], out dintTimeTemp))
                                    {
                                        dintEAC[dintLoop] = 0;
                                    }
                                    else
                                    {
                                        dintACK           = 2;
                                        dintEAC[dintLoop] = 3;
                                    }
                                }
                                #endregion
                            }
                        }
                        else
                        {
                            dintACK           = 2;
                            dintEAC[dintLoop] = 2;
                        }
                    }
                    else
                    {
                        dintACK           = 2;
                        dintEAC[dintLoop] = 1;
                    }

                    if (dintACK != 0)
                    {
                        dbolNACK = true;
                    }
                }

                for (int dintLoop = 0; dintLoop < dintDATACOUNT; dintLoop++)
                {
                    msgTran.Secondary().Item("DATA_TYPE" + dintLoop).Putvalue(dstrDATATYPE[dintLoop]);
                    msgTran.Secondary().Item("ITEM_NAME" + dintLoop).Putvalue(dstrITEMNAME[dintLoop]);
                    msgTran.Secondary().Item("ITEM_VALUE" + dintLoop).Putvalue(dstrITEMVALUE[dintLoop]);
                    msgTran.Secondary().Item("REFERENCE" + dintLoop).Putvalue(dstrREFERENCE[dintLoop]);

                    msgTran.Secondary().Item("EAC" + dintLoop).Putvalue(dintEAC[dintLoop]);
                }


                msgTran.Secondary().Item("ACK").Putvalue(dintACK);
                funSendReply(msgTran);

                if (!dbolNACK)
                {
                    StringBuilder sb = new StringBuilder("SET;");

                    for (int dintLoop = 0; dintLoop < dstrITEMNAME.Length; dintLoop++)
                    {
                        pInfo.Unit(0).SubUnit(0).MultiData.TYPES("MCC").ITEMS(dstrITEMNAME[dintLoop].Trim()).VALUE = dstrITEMVALUE[dintLoop].Trim();

                        //sb.Append(dstrITEMNAME[dintLoop].Trim());
                        //sb.Append("=");
                        //sb.Append(dstrITEMVALUE[dintLoop].Trim());

                        //if (dintLoop < dstrITEMNAME.Length - 1) sb.Append(",");
                    }

                    //this.pInfo.subPLCCommand_Set(InfoAct.clsInfo.PLCCommand.Msg2MCC, sb.ToString());
                }
            }
            catch (Exception ex)
            {
                pInfo.subLog_Set(InfoAct.clsInfo.LogType.CIM, ex.ToString());
            }
        }