Files
ATV_STDLabelAttach/Handler/Project/RunCode/_SM_RUN.cs
2025-09-09 17:24:19 +09:00

203 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using AR;
namespace Project
{
public partial class FMain
{
bool[] runStepisFirst = new bool[] { false, false };
#region "Is Can Pick On/Off"
Boolean isCanPLPickOn()
{
//아이템을 가지고 있으면 안된다.
if (PUB.flag.get(eVarBool.FG_PL_ITEMON)) return false;
//Y축이 집는 위치가 아니면 빠져나감
var Pos = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));// MOT.GetPLM_PosName();
if (Pos) return false;
return true;
}
Boolean isCanPRPickOn()
{
//아이템을 가지고 있으면 안된다.
if (PUB.flag.get(eVarBool.FG_PR_ITEMON)) return false;
//Y축이 집는 위치가 아니면 빠져나감
var Pos = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));// MOT.GetPRM_PosName();
if (Pos) return false;
return true;
}
Boolean isCanPLPickOff()
{
//아이템이 없으면 불가
if (PUB.flag.get(eVarBool.FG_PL_ITEMON) == false) return false;
//Y축 위치 확인
var PosH07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH07));
var PosM07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM07));
var PosL07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL07));
var PosH13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH13));
var PosM13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM13));
var PosL13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL13));
if (PosH07 && PosM07 && PosL07 && PosH13 && PosM13 && PosL13) return false;
//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
if (PUB.flag.get(eVarBool.FG_RDY_PORT_PL) == false || hmi1.arVar_Port[0].AlignOK != 1) return false;
return true;
}
Boolean isCanPRPickOff()
{
//아이템이 없으면 불가
if (PUB.flag.get(eVarBool.FG_PR_ITEMON) == false) return false;
//Y축 위치 확인
var PosH07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH07));
var PosM07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM07));
var PosL07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL07));
var PosH13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH13));
var PosM13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM13));
var PosL13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL13));
if (PosH07 && PosM07 && PosL07 && PosH13 && PosM13 && PosL13) return false;
//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
if (PUB.flag.get(eVarBool.FG_RDY_PORT_PR) == false || hmi1.arVar_Port[2].AlignOK != 1) return false;
return true;
}
Boolean isCanPickOffL()
{
//아이템이 없으면 불가
if (PUB.flag.get(eVarBool.FG_PK_ITEMON) == false) return false;
//Y축 위치 확인
if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFL)) == false) return false;
//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
if (PUB.flag.get(eVarBool.FG_RDY_PORT_PL) == false || hmi1.arVar_Port[0].AlignOK != 1) return false;
return true;
}
Boolean isCanPickOn()
{
//아이템을 가지고 있으면 안된다.
if (PUB.flag.get(eVarBool.FG_PK_ITEMON)) return false;
//Y축이 집는 위치가 아니면 빠져나감
if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKON)) == false) return false;
//포트가 준비되어 있지 않다면 가져갈수 없다
if (PUB.Result.DryRun == false && (PUB.flag.get(eVarBool.FG_RDY_PORT_PC) == false || hmi1.arVar_Port[1].AlignOK != 1)) return false;
return true;
}
Boolean isCanPickOffR()
{
//아이템이 없으면 불가
if (PUB.flag.get(eVarBool.FG_PK_ITEMON) == false) return false;
//Y축 위치 확인
if (MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFR)) == false) return false;
//포트가 준비되지않았거나, 감지가 안되었다면 진행 불가
if (PUB.flag.get(eVarBool.FG_RDY_PORT_PR) == false || hmi1.arVar_Port[2].AlignOK != 1) return false;
return true;
}
#endregion
bool CheckPauseCondition(Boolean lightCheck)
{
//비상정지체크
if (DIO.IsEmergencyOn() == true || PUB.mot.HasEmergencyStop)
{
//이것은 SPS에서 추가로 처리된다
PUB.Result.SetResultMessage(eResult.EMERGENCY, eECode.EMERGENCY, eNextStep.NOTHING);// false);
return false;
}
//홈이 잡혀잇는지 체크한다
if (PUB.mot.HasHomeSetOff == true)
{
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
return false;
}
if (lightCheck == false)
{
//안전센서체크
if (DIO.isSaftyDoorF() == false)
{
PUB.Result.SetResultMessage(eResult.EMERGENCY, eECode.DOORSAFTY, eNextStep.PAUSE);// false);
PUB.mot.MoveStop("Safety issue", true);
if (DIO.isSaftyDoorF(0, false) == false) DIO.SetPortMotor(0, eMotDir.CW, false, "Safety error");
if (DIO.isSaftyDoorF(1, false) == false) DIO.SetPortMotor(1, eMotDir.CW, false, "Safety error");
if (DIO.isSaftyDoorF(2, false) == false) DIO.SetPortMotor(2, eMotDir.CW, false, "Safety error");
return false;
}
//에어공급출력체크
if (AR.SETTING.Data.DisableSensor_AIRCheck == false && DIO.GetIOOutput(eDOName.SOL_AIR) == false)
{
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AIRNOOUT, eNextStep.PAUSE);//false);
return false;
}
//오버로드체크
if (hmi1.arVar_Port[0].OverLoad)
{
PUB.Result.SetResultMessage(eResult.SENSOR, eECode.PORTOVERLOAD, eNextStep.PAUSE, new object[] { "FRONT-LEFT" });
return false;
}
}
return true;
}
Boolean isPortLimDN(int idx)
{
if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_LIM_DN);
else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_LIM_DN);
else return DIO.GetIOInput(eDIName.PORTR_LIM_DN);
}
Boolean isPortLimUP(int idx)
{
if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_LIM_UP);
else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_LIM_UP);
else return DIO.GetIOInput(eDIName.PORTR_LIM_UP);
}
Boolean isPortDetUp(int idx)
{
if (idx < 0 || idx > 2) throw new Exception("Port number must be between (0~2)");
if (idx == 0) return DIO.GetIOInput(eDIName.PORTL_DET_UP);
else if (idx == 1) return DIO.GetIOInput(eDIName.PORTC_DET_UP);
else return DIO.GetIOInput(eDIName.PORTR_DET_UP);
}
}//cvass
}