466 lines
22 KiB
C#
466 lines
22 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
|
|
{
|
|
|
|
|
|
void _DIO_INPUT_VALUE_CHANGED(eDIName pin, Boolean value)
|
|
{
|
|
//카드사이즈 센서 적용
|
|
if (pin == eDIName.PORT0_SIZE_07 || pin == eDIName.PORT0_SIZE_13)
|
|
{
|
|
if (value)
|
|
{
|
|
//둘중하나가 들어오면 시작시간을 설정한다
|
|
if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
|
|
{
|
|
VAR.TIME.Update(eVarTime.MAGNET0);
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET0, true, "SENSOR");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
var b1 = DIO.GetIOInput(eDIName.PORT0_SIZE_07);
|
|
var b2 = DIO.GetIOInput(eDIName.PORT0_SIZE_13);
|
|
if (b1 == false && b2 == false)
|
|
{
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET0, false, "SENSOR");
|
|
DIO.SetPortMagnet(0, false);
|
|
//if (Util_DO.GetIOOutput(eDOName.CART_MAG0))
|
|
//Util_DO.SetOutput(eDOName.CART_MAG0, false);
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.PORT1_SIZE_07 || pin == eDIName.PORT1_SIZE_13)
|
|
{
|
|
if (value)
|
|
{
|
|
//둘중하나가 들어오면 시작시간을 설정한다
|
|
//if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
|
|
{
|
|
VAR.TIME.Update(eVarTime.MAGNET1);
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET1, true, "SENSOR");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var b1 = DIO.GetIOInput(eDIName.PORT1_SIZE_07);
|
|
var b2 = DIO.GetIOInput(eDIName.PORT1_SIZE_13);
|
|
if (b1 == false && b2 == false)
|
|
{
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET1, false, "SENSOR");
|
|
DIO.SetPortMagnet(1, false);
|
|
//if (Util_DO.GetIOOutput(eDOName.CART_MAG1))
|
|
//Util_DO.SetOutput(eDOName.CART_MAG1, false);
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.PORT2_SIZE_07 || pin == eDIName.PORT2_SIZE_13)
|
|
{
|
|
if (value)
|
|
{
|
|
//둘중하나가 들어오면 시작시간을 설정한다
|
|
if (VAR.BOOL[eVarBool.Use_Conveyor] == false)
|
|
{
|
|
VAR.TIME.Update(eVarTime.MAGNET2);
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET2, true, "SENSOR");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var b1 = DIO.GetIOInput(eDIName.PORT2_SIZE_07);
|
|
var b2 = DIO.GetIOInput(eDIName.PORT2_SIZE_13);
|
|
if (b1 == false && b2 == false)
|
|
{
|
|
PUB.flag.set(eVarBool.FG_WAT_MAGNET2, false, "SENSOR");
|
|
DIO.SetPortMagnet(2, false);
|
|
//if (Util_DO.GetIOOutput(eDOName.CART_MAG2))
|
|
// Util_DO.SetOutput(eDOName.CART_MAG2, false);
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.DOORF1 || pin == eDIName.DOORF2 || pin == eDIName.DOORF3)
|
|
{
|
|
int PortIDX = 0;
|
|
eVarBool FG_RDY_PORT;
|
|
if (pin == eDIName.DOORF1) { PortIDX = 0; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PL; }
|
|
else if (pin == eDIName.DOORF2) { PortIDX = 1; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PC; }
|
|
else { PortIDX = 2; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PR; }
|
|
|
|
//전면도어가 열렸다
|
|
if (DIO.GetIOInput(pin) == true)
|
|
{
|
|
|
|
|
|
|
|
if (PUB.flag.get(FG_RDY_PORT) == true)
|
|
{
|
|
PUB.flag.set(FG_RDY_PORT, false, "IOCHANGE");
|
|
if (PUB.sm.Step > eSMStep.IDLE)
|
|
PUB.log.AddAT("Releasing PORT_READY(L) due to safety sensor detection");
|
|
}
|
|
|
|
//도어가 열리면 포트를 멈춘다 210329
|
|
if (DIO.GetPortMotorRun(0)) DIO.SetPortMotor(0, DIO.GetPortMotorDir(0), false, "DOOR OPEN");
|
|
if (DIO.GetPortMotorRun(1)) DIO.SetPortMotor(1, DIO.GetPortMotorDir(1), false, "DOOR OPEN");
|
|
if (DIO.GetPortMotorRun(2)) DIO.SetPortMotor(2, DIO.GetPortMotorDir(2), false, "DOOR OPEN");
|
|
|
|
//210331
|
|
if (PUB.sm.Step != eSMStep.RUN)
|
|
{
|
|
PUB.mot.MoveStop("Dorr oopen");
|
|
}
|
|
|
|
if (PUB.sm.isRunning == false && AR.SETTING.Data.PickerAutoMoveForDoor)
|
|
{
|
|
var motSpeed = 300;
|
|
var motAcc = 500;
|
|
if (pin == eDIName.DOORF3) //좌측도어가 열렸다
|
|
{
|
|
var DoorF2 = DIO.GetIOInput(eDIName.DOORF2);
|
|
var DoorF1 = DIO.GetIOInput(eDIName.DOORF1);
|
|
if (DoorF2 == false && DoorF1 == false) //중앙도어가 닫혀있다
|
|
{
|
|
var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
|
|
var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();
|
|
|
|
if (PosLM && PosRM && PosPZ)
|
|
{
|
|
//x위치가 pickon 보다 작으면 옴겨줘야 한다.
|
|
var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));
|
|
if (xpos < 1)
|
|
{
|
|
var mPos = MOT.GetPXPos(ePXLoc.PICKON);
|
|
MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.DOORF2) //중앙도어가 열렸다
|
|
{
|
|
//좌우측 닫혀있고 프린트M 위치가 Ready 여아한다.
|
|
var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
|
|
var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();
|
|
|
|
if (PosPZ)
|
|
{
|
|
var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));
|
|
|
|
if (Math.Abs(xpos) < 100) //중앙근처 10 mm 안에 있다면
|
|
{
|
|
var DoorF1 = DIO.GetIOInput(eDIName.DOORF1);
|
|
var DoorF3 = DIO.GetIOInput(eDIName.DOORF3);
|
|
|
|
if (DoorF1 == false && DoorF3 == false)
|
|
{
|
|
if (PosLM)
|
|
{
|
|
var mPos = MOT.GetPXPos(ePXLoc.READYL);
|
|
MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
|
|
}
|
|
else if (PosRM)
|
|
{
|
|
var mPos = MOT.GetPXPos(ePXLoc.READYR);
|
|
MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
|
|
}
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
else if (pin == eDIName.DOORF1) //우측도어가 열렸다
|
|
{
|
|
var DoorF2 = DIO.GetIOInput(eDIName.DOORF2);
|
|
var DoorF3 = DIO.GetIOInput(eDIName.DOORF3);
|
|
if (DoorF2 == false && DoorF3 == false) //중앙도어가 닫혀있다
|
|
{
|
|
var PosPZ = MOT.getPositionMatch(MOT.GetPZPos(ePZLoc.READY));//.MOT.GetPKZ_PosName();
|
|
var PosLM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosRM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//.MOT.GetPRM_PosName();
|
|
|
|
if (PosLM && PosRM && PosPZ)
|
|
{
|
|
//x위치가 pickon 보다 작으면 옴겨줘야 한다.
|
|
var xpos = MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON));
|
|
if (xpos > 1)
|
|
{
|
|
var mPos = MOT.GetPXPos(ePXLoc.PICKON);
|
|
MOT.Move(eAxis.PX_PICK, mPos.Position, motSpeed, motAcc, false, false, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//안전센서가 감지되었다면 얼라인을 초기화 해준다
|
|
hmi1.arVar_Port[PortIDX].AlignOK = 0;
|
|
hmi1.arVar_Port[PortIDX].errorCount = 0;
|
|
|
|
//동작중일경우 추가 작업
|
|
if (PUB.sm.Step > eSMStep.IDLE)
|
|
{
|
|
//안전센서가 들어와잇다면 이 값을 초기화 해준다
|
|
if (DIO.isSaftyDoorF(PortIDX, true) == false && PUB.flag.get(eVarBool.FG_JOB_END) == true)
|
|
VAR.TIME.Update(eVarTime.JOB_END);
|
|
}
|
|
|
|
//오류 혹은 Wait 상태일때에는 프린터 Z축을 올려준다
|
|
if (PUB.sm.Step == eSMStep.WAITSTART || PUB.sm.Step == eSMStep.PAUSE)
|
|
{
|
|
if (pin == eDIName.DOORF3)
|
|
{
|
|
var PosM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosZ = MOT.getPositionMatch(MOT.GetLZPos(eLZLoc.PICKON));//.MOT.GetPRM_PosName();
|
|
if (PosM && PosZ)
|
|
{
|
|
PUB.log.Add("Raising printer L Z-axis due to door opening");
|
|
var Pos = MOT.GetLZPos(eLZLoc.PICKON);
|
|
MOT.Move(Pos);
|
|
}
|
|
}
|
|
else if (pin == eDIName.DOORF1)
|
|
{
|
|
var PosM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));// MOT.GetPRM_PosName();
|
|
var PosZ = MOT.getPositionMatch(MOT.GetRZPos(eRZLoc.PICKON));// GetPRZ_PosName();
|
|
if (PosM && PosZ)
|
|
{
|
|
PUB.log.Add("Raising printer R Z-axis due to door opening");
|
|
MOT.Move(eAxis.PR_UPDN, 0, 100, 1000, false, false, false);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//도어를 다시 닫았을때처리해준다.
|
|
|
|
//오류 혹은 Wait 상태일때에는 프린터 Z축을 올려준다
|
|
if (PUB.sm.Step == eSMStep.WAITSTART || PUB.sm.Step == eSMStep.PAUSE)
|
|
{
|
|
if (pin == eDIName.DOORF3)
|
|
{
|
|
|
|
var PosM = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosZ = MOT.getPositionMatch(MOT.GetLZPos(eLZLoc.READY));//.MOT.GetPRM_PosName();
|
|
if (PosM && PosZ)
|
|
{
|
|
var zpos = MOT.GetLZPos(eLZLoc.PICKON);
|
|
PUB.log.Add("Lowering printer L Z-axis due to door closing");
|
|
MOT.Move(eAxis.PL_UPDN, zpos.Position, 100, 1000, false, false, false);
|
|
}
|
|
}
|
|
else if (pin == eDIName.DOORF1)
|
|
{
|
|
var PosM = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY));//. MOT.GetPLM_PosName();
|
|
var PosZ = MOT.getPositionMatch(MOT.GetRZPos(eRZLoc.READY));//.MOT.GetPRM_PosName();
|
|
if (PosM && PosZ)
|
|
{
|
|
var zpos = MOT.GetRZPos(eRZLoc.PICKON);
|
|
PUB.log.Add("Lowering printer R Z-axis due to door closing");
|
|
MOT.Move(eAxis.PR_UPDN, zpos.Position, 100, 1000, false, false, false);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
else if (pin == eDIName.BUT_AIRF) //여기서부터는 스위치 영역
|
|
{
|
|
//AIR버튼은 IDLE 이상일떄에 동작 한다
|
|
if (value == true && PUB.sm.Step >= eSMStep.IDLE)
|
|
{
|
|
var curState = DIO.GetIOOutput(eDOName.SOL_AIR);
|
|
if (curState == false)
|
|
{
|
|
DIO.SetAIR(!curState);
|
|
PUB.log.AddI("Air ON");
|
|
}
|
|
else
|
|
{
|
|
DIO.SetAIR(!curState);
|
|
PUB.log.AddAT("Air OFF");
|
|
}
|
|
}
|
|
//AIR의 LED는 실제 AIR 출력 상태와 동기화 한다 * output event 에서 처리함
|
|
}
|
|
else if (pin == eDIName.BUT_EMGF)
|
|
{
|
|
PUB.log.AddAT(string.Format("Emergency Status : {0} Value= {1}", pin, value));
|
|
if (value == false)
|
|
{
|
|
//로더컨트롤의 이머전시 상탤르 설정한다 (둘중 하나라도 꺼지면 비상값이다)
|
|
|
|
EmergencyTime = DateTime.Now; //한놈이라도 이머전시가 들어오면 강제 멈춘다
|
|
PUB.mot.MoveStop("emg", true);
|
|
|
|
//포트 모터 정지
|
|
DIO.SetPortMotor(0, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
|
|
DIO.SetPortMotor(1, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
|
|
DIO.SetPortMotor(2, eMotDir.CW, false, "EMG"); System.Threading.Thread.Sleep(1);
|
|
}
|
|
else
|
|
{
|
|
//둘다 ON 되어잇다면 비상을 해제한다
|
|
if (DIO.IsEmergencyOn() != true) hmi1.arDI_Emergency = false;
|
|
}
|
|
|
|
//Emg는 B접점이라서 LED상태를 반전시킨다
|
|
if (pin == eDIName.BUT_EMGF) DIO.SetOutput(eDOName.BUT_EMGF, !value);
|
|
|
|
}
|
|
else if (pin == eDIName.BUT_STARTF) //시작버튼
|
|
{
|
|
if (PUB.flag.get(eVarBool.FG_MOVE_PICKER))
|
|
{
|
|
if (value)
|
|
{
|
|
if (VAR.BOOL[eVarBool.Enable_PickerMoveX] && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
|
|
PUB.mot.JOG((int)eAxis.PX_PICK, arDev.MOT.MOTION_DIRECTION.Negative, AR.SETTING.Data.JOG_Speed, AR.SETTING.Data.JOG_Acc);
|
|
}
|
|
else
|
|
{
|
|
PUB.mot.MoveStop("xmove", (int)eAxis.PX_PICK);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
|
|
{
|
|
if (value && PUB.sm.Step >= eSMStep.IDLE)
|
|
{
|
|
PUB.log.AddI("START BUTTON");
|
|
this._BUTTON_START();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.BUT_STOPF) //중단버튼
|
|
{
|
|
if (PUB.flag.get(eVarBool.FG_MOVE_PICKER))
|
|
{
|
|
if (value)
|
|
{
|
|
if (VAR.BOOL[eVarBool.Enable_PickerMoveX] && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
|
|
PUB.mot.JOG((int)eAxis.PX_PICK, arDev.MOT.MOTION_DIRECTION.Positive, AR.SETTING.Data.JOG_Speed, AR.SETTING.Data.JOG_Acc);
|
|
}
|
|
else
|
|
{
|
|
PUB.mot.MoveStop("xmove", (int)eAxis.PX_PICK);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
|
|
{
|
|
if (value && PUB.sm.Step >= eSMStep.IDLE)
|
|
{
|
|
PUB.log.AddI("STOP BUTTON");
|
|
_BUTTON_STOP();
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
else if (pin == eDIName.BUT_RESETF) //리셋버튼
|
|
{
|
|
if (PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
|
|
{
|
|
if (value && PUB.sm.Step >= eSMStep.IDLE)
|
|
{
|
|
|
|
if (value) PUB.Result.ResetButtonDownTime = DateTime.Now;
|
|
else PUB.Result.ResetButtonDownTime = new DateTime(1982, 11, 23);
|
|
|
|
PUB.log.AddI("RESET BUTTON");
|
|
_BUTTON_RESET();
|
|
}
|
|
}
|
|
|
|
//요약폼이 있었다면 해제 해준다. - 210329
|
|
if (PUB.sm.Step == eSMStep.FINISH)
|
|
HideSummary();
|
|
}
|
|
else if (pin == eDIName.PORTL_DET_UP || pin == eDIName.PORTC_DET_UP || pin == eDIName.PORTR_DET_UP)
|
|
{
|
|
var pidx = 0;
|
|
eVarBool FG_RDY_PORT = eVarBool.FG_RDY_PORT_PL;
|
|
var value1 = DIO.GetIOInput(pin);
|
|
|
|
if (pin == eDIName.PORTC_DET_UP)
|
|
{
|
|
pidx = 1;
|
|
FG_RDY_PORT = eVarBool.FG_RDY_PORT_PC;
|
|
if (value1 == true) //해당 제품이 검출되어 멈춘다면, 키엔스 데이터를 초기화 해준다.
|
|
{
|
|
//Pub.Result.ItemData[1].VisionData.Clear("DIO DET1");
|
|
//PUB.flag.set(eVarBool.END_VISION1, false, "DIO DET1");
|
|
//데이터 손실건이 나와서 처리하지 않게한다 210318
|
|
}
|
|
}
|
|
else if (pin == eDIName.PORTR_DET_UP) { pidx = 2; FG_RDY_PORT = eVarBool.FG_RDY_PORT_PR; }
|
|
|
|
if (PUB.sm.Step != eSMStep.RUN && value1 == false) //감지가 꺼지면 ready 를 해제한다
|
|
PUB.flag.set(FG_RDY_PORT, false, "IOCHANGE");
|
|
else if (hmi1.arVar_Port[pidx].AlignOK != 1)
|
|
PUB.Result.PortAlignTime[0] = DateTime.Now.Ticks; //시작시간을 초기화 해준다
|
|
|
|
//동작중에 들어오면 바로 멈추게한다. 이것은 SPS에서 적용되어야하지만 더 빠르게 반응하기 위해서 그렇게 한다 - 200813
|
|
if (value1 && DIO.GetPortMotorDir(pidx) == eMotDir.CW)
|
|
DIO.SetPortMotor(pidx, eMotDir.CW, false, "_DIO_DETECT");
|
|
}
|
|
|
|
|
|
if (pin == eDIName.PORTL_LIM_DN)
|
|
{
|
|
//좌측포트의 하단부리밋센서가 검출될경우 마그넷이 on 되어있다면 off한다.
|
|
if (DIO.GetIOInput(eDIName.PORTL_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTL_MAGNET) == true)
|
|
{
|
|
DIO.SetPortMagnet(0, false);
|
|
PUB.log.Add("Left port magnet OFF");
|
|
}
|
|
}
|
|
else if (pin == eDIName.PORTC_LIM_DN)
|
|
{
|
|
//좌측포트의 하단부리밋센서가 검출될경우 마그넷이 on 되어있다면 off한다.
|
|
if (DIO.GetIOInput(eDIName.PORTC_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTC_MAGNET) == true)
|
|
{
|
|
DIO.SetPortMagnet(1, false);
|
|
PUB.log.Add("Center port magnet OFF");
|
|
|
|
if(PUB.sm.Step == eSMStep.FINISH)
|
|
{
|
|
DIO.SetBuzzer(false); //부저종료 231005
|
|
}
|
|
}
|
|
}
|
|
else if (pin == eDIName.PORTR_LIM_DN)
|
|
{
|
|
//좌측포트의 하단부리밋센서가 검출될경우 마그넷이 on 되어있다면 off한다.
|
|
if (DIO.GetIOInput(eDIName.PORTR_LIM_DN) == true && DIO.GetIOOutput(eDOName.PORTR_MAGNET) == true)
|
|
{
|
|
DIO.SetPortMagnet(2, false);
|
|
PUB.log.Add("Right port magnet OFF");
|
|
}
|
|
}
|
|
else if (pin == eDIName.R_CONV4 || pin == eDIName.L_CONV1 || pin == eDIName.L_CONV4 || pin == eDIName.R_CONV1)
|
|
{
|
|
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
|
}
|
|
|
|
}
|
|
}
|
|
} |