153 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Drawing;
 | |
| using System.Linq;
 | |
| using System.Text;
 | |
| using AR;
 | |
| using arDev;
 | |
| using COMM;
 | |
| namespace vmsnet
 | |
| {
 | |
|     public partial class FMain
 | |
|     {
 | |
|         void SM_Loop(object sender, StateMachine.RunningEventArgs e)
 | |
|         {
 | |
|             //main loop
 | |
|             var step = (ESMStep)e.Step;
 | |
|             var obj = this.GetType();
 | |
| 
 | |
|             var stepName = step.ToString();
 | |
|           
 | |
| 
 | |
|             var methodName = $"_STEP_{stepName}";
 | |
|             var methodNameStart = $"_STEP_{stepName}_START";
 | |
|             var runMethodName = $"_{stepName}";
 | |
| 
 | |
|             var method = obj.GetMethod(methodName);
 | |
|             var methodS = obj.GetMethod(methodNameStart);
 | |
| 
 | |
|             switch (step)
 | |
|             {
 | |
|                 case ESMStep.NOTSET:
 | |
|                     PUB.log.Add("S/M Initialize Start");
 | |
|                     PUB.sm.SetNewStep(ESMStep.INIT);
 | |
|                     break;
 | |
| 
 | |
|                 case ESMStep.WAITSTART:
 | |
|                     if (e.isFirst) PUB.log.Add("EVENT WAITSTART");
 | |
|                     break;
 | |
| 
 | |
|                 case ESMStep.PAUSE:
 | |
|                 case ESMStep.EMERGENCY:
 | |
|                 case ESMStep.ERROR:
 | |
|                     if (e.isFirst)
 | |
|                     {
 | |
|                         _SM_MAIN_ERROR(e.isFirst, (ESMStep)e.Step, e.StepTime);
 | |
|                     }
 | |
|                     break;
 | |
| 
 | |
|                 default:
 | |
| 
 | |
|                     if (e.isFirst)
 | |
|                     {
 | |
|                         //시작명령은 반드시 구현할 필요가 없다
 | |
|                         if (methodS != null) methodS.Invoke(this, new object[] { step });
 | |
|                         else
 | |
|                         {
 | |
|                           //  hmi1.ClearMessage();
 | |
|                             PUB.log.Add($"Undefined step start :{step}");
 | |
|                         }
 | |
| 
 | |
|                         if (step == ESMStep.HOME_QUICK || step == ESMStep.HOME_FULL || PUB.sm.getOldStep == ESMStep.IDLE || PUB.sm.getOldStep == ESMStep.FINISH)
 | |
|                         {
 | |
|                             PUB.sm.seq.ClearData(step);
 | |
|                             PUB.sm.seq.Clear(step);
 | |
|                         }
 | |
| 
 | |
|                         PUB.sm.seq.ClearTime();
 | |
|                         PUB.sm.RaiseStepStarted();
 | |
|                         return;
 | |
|                     }
 | |
| 
 | |
|                     //if (PUB.popup.needClose) System.Threading.Thread.Sleep(10);
 | |
|                     //else
 | |
|                     {
 | |
|                         //스텝번호값 보정 220313
 | |
|                         if (PUB.sm.seq.Get(step) < 1) PUB.sm.seq.Update(step, 1);
 | |
| 
 | |
|                         if (method == null)
 | |
|                         {
 | |
|                             var runMethod = obj.GetMethod(runMethodName);
 | |
|                             if (runMethod == null)
 | |
|                             {
 | |
|                                 PUB.log.AddE($"unknown command : {methodName}/{runMethodName}");
 | |
|                                // PUB.Result.SetResultMessage(eResult.DEVELOP, eECode.NOFUNCTION, eNextStep.ERROR, methodName, runMethodName);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 var stepName2 = step.ToString();
 | |
|                         
 | |
|                                 //실행코드는 있으니 처리한다.
 | |
|                                 //if (PUB.popup.needClose) System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다.
 | |
|                                 //else
 | |
|                                 {
 | |
|                                     //실행가능여부를 확인 합니다
 | |
|                                     //if (CheckSystemRunCondition(false) == true)
 | |
|                                     {
 | |
|                                         //동작상태가 아니라면 처리하지 않는다.
 | |
|                                         if (PUB.sm.Step == step && PUB.sm.getNewStep == step)
 | |
|                                         {
 | |
|                                             var param = new object[] { step };
 | |
|                                             var rlt = (bool)runMethod.Invoke(this, param);
 | |
|                                             if (rlt == true)
 | |
|                                             {
 | |
|                                                 PUB.log.AddI("change to idle by userstep(auto)");
 | |
|                                                 PUB.sm.SetNewStep(ESMStep.IDLE, true);
 | |
|                                             }
 | |
|                                         }
 | |
|                                     }
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             var param = new object[] { step, e.StepTime, PUB.sm.seq.GetTime(step) };
 | |
|                             var rlt = (StepResult)method.Invoke(this, param);
 | |
|                             if (rlt == StepResult.Complete) PUB.sm.RaiseStepCompleted();
 | |
|                             else
 | |
|                             {
 | |
|                                 //사용자 스텝이 설정되어있다면 자동으로 멈춘다  220223
 | |
|                                 if (rlt == StepResult.Error)
 | |
|                                 {
 | |
|                                     if (PUB.sm.getNewStep != ESMStep.ERROR)
 | |
|                                         PUB.sm.SetNewStep(ESMStep.ERROR);
 | |
|                                 }
 | |
| 
 | |
|                                 if (VAR.BOOL[EVarBool.USERSTEP] == true)
 | |
|                                 {
 | |
|                                     if (PUB.sm.Step >= ESMStep.RUN && PUB.sm.getNewStep >= ESMStep.RUN &&
 | |
|                                         PUB.sm.Step < ESMStep.FINISH && PUB.sm.getNewStep < ESMStep.FINISH)
 | |
|                                     {
 | |
|                                         ////유저스텝에 걸려있지 않다면 자동으로 멈춘다
 | |
|                                         //if (PUB.LockUserStep.WaitOne(3)==false)
 | |
|                                         //{
 | |
|                                         //    //Pub.Result.SetResultMessage(eResult.OPERATION, eECode.USER_STOP)
 | |
|                                         //    PUB.Result.ResultMessage = "USERSTEP - AUTO STOP";
 | |
|                                         //    PUB.sm.SetNewStep(ESMStep.PAUSE);
 | |
| 
 | |
|                                         //    //한번멈추면 다시 실행되게한다.
 | |
|                                         //    UserStepRun();
 | |
|                                         //}
 | |
|                                     }
 | |
|                                 }
 | |
|                             }
 | |
|                         }
 | |
|                     }
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| }
 | 
