ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SECS S1F15 and S1F17 processing example source
    IT Story/C# & WPF 2022. 7. 3. 17:34
    반응형
    /// <summary>
            /// Host로부터 Offline 요청을 받는다.
            /// </summary>
            /// <remarks>2006/11/01                   [Ver 00]</remarks>
            private void PSecsDrv_S1F15()
            {
                try
                {
                    this.m_Info.Set_ReceiveHostSF("S1F15");
                }
                catch (Exception ex)
                {
                    this.m_Info.Set_Log(Common.EnuCommon.LogType.CIM, "", ex.ToString());
                }
            }
    
            private void S1F15()
            {
                int dintACK = 0;
    
                try
                {
                    //subReplyTrue();     //Reply가 들어왔음을 저장
                    if (this.m_Info.All.HostConnect == false) return;
    
                    if (this.m_Info.All.ControlState == Structure.classStructure.ControlState.OFFLINE)
                    {
                        dintACK = 2;         //2 = Equipment Already Offline
                    }
                    else
                    {
                        dintACK = 0;         //0 = Offline Accepted
    
                        m_Info.All.ControlStateChangeBYWHO = Structure.classStructure.BYWHO.ByHost;    //By HOST
                        m_Info.All.ControlStateOLD = m_Info.All.ControlState;     //현재의 ControlState를 백업
                        m_Info.All.ControlState = Structure.classStructure.ControlState.OFFLINE;
                        m_Info.All.WantControlState = Structure.classStructure.ControlState.OFFLINE;    //초기화
    
                        this.m_Info.Set_PLCCommand(Structure.classStructure.PLCCommand.ControlState, (int)this.m_Info.All.ControlState); //PLC로 현재 ControlState 를 써준다.
    
                        //HOST로 Online 변경 보고를 한다.(S6F11, CEID=72(Local), CEID=73(Remote))
                        this.m_Info.Set_SendSF(Structure.classStructure.SFName.S6F11EQPEventRequest, 71, 0, 0);   //뒤에 0은 전체장비를 의미
                    }
    
                    //HOST로 S1F16응답
                    this.PSecsDrv.S1F16.OFLACK = dintACK;
                    this.PSecsDrv.S1F16.Reply(this.PSecsDrv.S1F15.Header);
                }
                catch (Exception ex)
                {
                    this.m_Info.Set_Log(Common.EnuCommon.LogType.CIM, "", ex.ToString());
                }
            }
    
            /// <summary>
            ///  Host로부터 On line 확인 Stream Function을 수신시 
            ///  On line Data를 송신 한다.(S1F1수신 후 S1F2 송신)
            /// </summary>
            /// <remarks>2006/11/01                   [Ver 00]</remarks>
            private void PSecsDrv_S1F17()
            {
                try
                {
                    this.m_Info.Set_ReceiveHostSF("S1F17");
                }
                catch (Exception ex)
                {
                    this.m_Info.Set_Log(Common.EnuCommon.LogType.CIM, "", ex.ToString());
                }
            }
    
            private void S1F17()
            {
                int dintCEID = 0;
                string dstrMCMD = string.Empty;
                int dintACK = 0;
    
                try
                {
                    //subReplyTrue();     //Reply가 들어왔음을 저장
                    if (this.m_Info.All.HostConnect == false) return;
    
                    dstrMCMD = this.PSecsDrv.S1F17.MCMD.ToString();
    
                    if (dstrMCMD == "1" && this.m_Info.All.ControlState == Structure.classStructure.ControlState.ONLINEREMOTE)
                    {
                        this.PSecsDrv.S1F18.ONLACK = 2;         //2 = Equipment Already ON_LINE REMOTE
                        this.PSecsDrv.S1F18.Reply(this.PSecsDrv.S1F17.Header);
                        return;
                    }
    
                    if (dstrMCMD == "2" && this.m_Info.All.ControlState == Structure.classStructure.ControlState.ONLINELOCAL)
                    {
                        this.PSecsDrv.S1F18.ONLACK = 5;         //6 = Equipment Already ON_LINE LOCAL
                        this.PSecsDrv.S1F18.Reply(this.PSecsDrv.S1F17.Header);
                        return;
                    }
    
                    switch (dstrMCMD)
                    {
                        case "1":           //Remote
                            //if (m_Info.All.AutoMode == true)
                            //{
                            //    dintACK = 0;
                            //    dintCEID = 73;
                            //}
                            //else
                            //{
                            //    dintACK = 1;    //1 = ON_LINE REMOTE Not Allowed.
                            //}
    
                            m_Info.All.WantControlState = Structure.classStructure.ControlState.ONLINEREMOTE;   
    
                            dintACK = 0;
                            dintCEID = 73;
    
                            break;
    
                        //case "2":           //Local
                        //    //if (m_Info.All.AutoMode == true)
                        //    //{
                        //    //    dintACK = 3;
                        //    //    dintCEID = 72;
                        //    //}
                        //    //else
                        //    //{
                        //    //    dintACK = 5;    //5 = ON_LINE LOCAL Not Allowed.
                        //    //}
    
                        //    m_Info.All.WantControlState = Structure.classStructure.ControlState.ONLINELOCAL;   
    
                        //    dintACK = 3;
                        //    dintCEID = 72;
    
                        //    break;
    
                        default:
                            dintACK = 8;    //틀린 MCMD가 온경우
                            break;
                    }
    
                    //S1F18보고
                    this.PSecsDrv.S1F18.ONLACK = dintACK;
                    this.PSecsDrv.S1F18.Reply(this.PSecsDrv.S1F17.Header);
    
                    //Local, Remote로 변환 성공시 PLC에 써주고 HOST로 변경보고를 한다.
                    if ((dintACK == 0 || dintACK == 3) && (dstrMCMD == "1" || dstrMCMD == "2"))
                    {
                        m_Info.All.ControlStateChangeBYWHO = Structure.classStructure.BYWHO.ByHost;    //By HOST
                        m_Info.All.ControlStateOLD = m_Info.All.ControlState;     //현재의 ControlState를 백업
                        m_Info.All.ControlState = m_Info.All.WantControlState;
                        m_Info.All.WantControlState = Structure.classStructure.ControlState.UNKNOWN;    //초기화
    
                        this.m_Info.Set_PLCCommand(Structure.classStructure.PLCCommand.ControlState, (int)this.m_Info.All.ControlState); //PLC로 현재 ControlState 를 써준다.
    
                        //HOST로 Online 변경 보고를 한다.(S6F11, CEID=72(Local), CEID=73(Remote))
                        this.m_Info.Set_SendSF(Structure.classStructure.SFName.S6F11EQPEventRequest, dintCEID, 0, 0);   //뒤에 0은 전체장비를 의미
                    }
                }
                catch (Exception ex)
                {
                    this.m_Info.Set_Log(Common.EnuCommon.LogType.CIM, "", ex.ToString());
                }
            }
    반응형

    댓글

Designed by Tistory.