Files
ATV_STDLabelAttach/Handler/Project/RunCode/StateMachine/_Loop.cs
ChiKyun Kim b037dd53e6 ..
2025-09-23 15:41:16 +09:00

247 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using arDev;
using AR;
namespace Project
{
public partial class FMain
{
DateTime lastDeleteTime = DateTime.Now;
DateTime HomeSuccessTime;
DateTime HomeChkTime;
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({step}) started");
}
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();
}
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($"The following command is not implemented {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() == 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("User step(automatic) execution completed, switching to idle state");
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 (PUB.flag.get(eVarBool.FG_USERSTEP) == true)
{
if (PUB.sm.Step >= eSMStep.RUN && PUB.sm.getNewStep >= eSMStep.RUN &&
PUB.sm.Step < eSMStep.FINISH && PUB.sm.getNewStep < eSMStep.FINISH)
{
//유저스텝에 걸려있지 않다면 자동으로 멈춘다
if (LockUserL.WaitOne(10) && LockUserR.WaitOne(10))
{
//Pub.Result.SetResultMessage(eResult.OPERATION, eECode.USER_STOP)
PUB.Result.ResultMessage = string.Empty;
PUB.sm.SetNewStep(eSMStep.PAUSE);
}
}
}
}
}
}
break;
}
}
void DeleteFile(string path)
{
var basetime = DateTime.Now.AddDays(-1 * AR.SETTING.Data.AutoDeleteDay);
var di = new System.IO.DirectoryInfo(path);
if (di.Exists)
{
var dirYear = di.GetDirectories().OrderBy(t => t.Name).FirstOrDefault();
if (dirYear != null)
{
var dirMon = dirYear.GetDirectories().OrderBy(t => t.Name).FirstOrDefault();
if (dirMon != null)
{
var dirDay = dirMon.GetDirectories().OrderBy(t => t.Name).FirstOrDefault();
if (dirDay != null)
{
var curDay = DateTime.Parse(string.Format("{0}-{1}-{2} 00:00:00", dirYear.ToString(), dirMon.ToString(), dirDay.ToString()));
if (curDay < basetime)
{
var dirLot = dirDay.GetDirectories().OrderBy(t => t.Name).FirstOrDefault();
if (dirLot != null)
{
var delfile = dirLot.GetFiles().FirstOrDefault();
if (delfile != null)
{
try
{
PUB.log.AddI("Remove Fle : " + delfile.FullName + ",time=" + delfile.LastWriteTime.ToString());
delfile.Delete();
}
catch (Exception ex)
{
PUB.log.AddE("deleete error : " + ex.Message);
}
}
else
{
string delpath = dirLot.FullName;
try
{
dirLot.Delete(true);
}
catch (Exception ex)
{
PUB.log.AddE("remove dir" + ex.Message + "," + delpath);
}
}
}
else
{
//이 폴더아래에 다른 폴더가 하나도 없다 즉 비어 있따.
string delpath = dirDay.FullName;
try
{
dirDay.Delete(true);
}
catch (Exception ex)
{
PUB.log.AddE("remove dir" + ex.Message + "," + delpath);
}
}
}
}
else
{
//날짜에 해당하는 폴더가 하나도 없다. 월 폴더를 제거한다.
string delpath = dirMon.FullName;
try
{
dirMon.Delete(true);
}
catch (Exception ex)
{
PUB.log.AddE("remove dir" + ex.Message + "," + delpath);
}
}
}
else
{
//이 달에 해당하는 데이터가 없다. 이 년도를 삭제한다.
string delpath = dirYear.FullName;
try
{
dirYear.Delete(true);
}
catch (Exception ex)
{
PUB.log.AddE("remove dir" + ex.Message + "," + delpath);
}
}
}
//년도별폴더목록을 정리함
//가장작은 년도를 기준으로 파일을 검색해서 1개씩 삭제함
}
}
}
}