451 lines
18 KiB
C#
451 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using arDev.AzinAxt;
|
|
using arDev.AzinAxt.Emulator;
|
|
|
|
namespace Project.Dialog
|
|
{
|
|
public partial class fEmulator : Form
|
|
{
|
|
public arDev.AzinAxt.Emulator.CEmulMOT devM { get; private set; }
|
|
public arDev.AzinAxt.Emulator.CEmuleDIO devIO { get; private set; }
|
|
|
|
int axcount { get { return devM.axisCount; } }
|
|
|
|
JogController[] jobCtl;
|
|
|
|
public fEmulator(arDev.AzinAxt.MOT mot, int motCnt, int cntDI, int cntDO)
|
|
{
|
|
InitializeComponent();
|
|
|
|
devM = new CEmulMOT(motCnt);
|
|
devM.TimerInterval = 50;
|
|
|
|
devIO = new CEmuleDIO(cntDI, cntDO);
|
|
devIO.IOValueChagned += Dev_IOValueChagned;
|
|
|
|
Pub.flag.ValueChanged += Flag_ValueChanged;
|
|
|
|
//motion
|
|
this.jobCtl = new JogController[] { jog1, jog2, jog3, jog4, jog5, jog6, jog7 };
|
|
|
|
foreach (var item in jobCtl)
|
|
{
|
|
item.arDebugMode = false;
|
|
//item.ItemClick += Item_ItemClick;
|
|
}
|
|
|
|
for (int i = 0; i < motCnt; i++)
|
|
{
|
|
Boolean enb = i < motCnt;
|
|
jobCtl[i].MotionObject = mot;
|
|
jobCtl[i].Enabled = enb;
|
|
jobCtl[i].arUsage = enb;
|
|
jobCtl[i].arAutoUpdate = false;
|
|
jobCtl[i].Invalidate();
|
|
|
|
if (enb)
|
|
{
|
|
devM.MaxPosition[i] = jobCtl[i].arMaxLength;
|
|
devM.MinPosition[i] = jobCtl[i].arMinLength;
|
|
}
|
|
}
|
|
|
|
//i/o
|
|
this.tblDI.SuspendLayout();
|
|
this.tblDO.SuspendLayout();
|
|
|
|
var pinNameI = new string[cntDI];
|
|
var pinNameO = new string[cntDO];
|
|
var pinTitleI = new string[cntDI];
|
|
var pinTitleO = new string[cntDO];
|
|
|
|
for (int i = 0; i < pinNameI.Length; i++)
|
|
{
|
|
pinNameI[i] = "X" + i.ToString("X2").PadLeft(3, '0');// Enum.GetName(typeof(ePLCIPin), i); //Enum.GetNames(typeof(eDIName))[i];// i.ToString();
|
|
pinTitleI[i] = string.Empty;// i.ToString();// Enum.GetName(typeof(ePLCITitle), i); //Enum.GetNames(typeof(eDITitle))[i];
|
|
|
|
}
|
|
|
|
for (int i = 0; i < pinNameO.Length; i++)
|
|
{
|
|
pinNameO[i] = "Y" + i.ToString("X2").PadLeft(3, '0');// Enum.GetName(typeof(ePLCOPin), i); // Enum.GetNames(typeof(eDOName))[i];
|
|
pinTitleO[i] = string.Empty;//i.ToString();// Enum.GetName(typeof(ePLCOTitle), i); // Enum.GetNames(typeof(eDOTitle))[i];
|
|
}
|
|
|
|
tblDI.MatrixSize = new Point(8, 8);
|
|
tblDO.MatrixSize = new Point(8, 8);
|
|
|
|
tblDI.setTitle(pinTitleI);
|
|
tblDO.setTitle(pinTitleO);
|
|
|
|
tblDI.setNames(pinNameI);
|
|
tblDO.setNames(pinNameO);
|
|
|
|
tblDI.setItemTextAlign(ContentAlignment.BottomLeft);
|
|
tblDO.setItemTextAlign(ContentAlignment.BottomLeft);
|
|
|
|
tblDI.setValue(devIO.Input);
|
|
tblDO.setValue(devIO.Output);
|
|
|
|
//dio.IOValueChanged += dio_IOValueChanged;
|
|
|
|
this.tblDI.ItemClick += tblDI_ItemClick;
|
|
this.tblDO.ItemClick += tblDO_ItemClick;
|
|
|
|
this.tblDI.Invalidate();
|
|
this.tblDO.Invalidate();
|
|
|
|
|
|
}
|
|
|
|
|
|
private void fEmulator_Load(object sender, EventArgs e)
|
|
{
|
|
this.ctlContainer1.setDevice(this.devIO, this.devM);
|
|
timer1.Start();
|
|
this.toolStripStatusLabel1.Text = "Top Most :" + (this.TopMost ? "On" : "Off");
|
|
}
|
|
void tblDO_ItemClick(object sender, GridView.ItemClickEventArgs e)
|
|
{
|
|
var nVal = !devIO.Output[e.idx];//.Get(e.idx);// doValue[e.idx];// == 1 ? (ushort)0 : (ushort)1;
|
|
devIO.SetOutput(e.idx, nVal);
|
|
}
|
|
void tblDI_ItemClick(object sender, GridView.ItemClickEventArgs e)
|
|
{
|
|
var nVal = !devIO.Input[e.idx];
|
|
devIO.SetInput(e.idx, nVal);
|
|
}
|
|
private void Flag_ValueChanged(object sender, CInterLock.ValueEventArgs e)
|
|
{
|
|
var fg = (eFlag)e.ArrIDX;
|
|
}
|
|
private void Dev_IOValueChagned(object sender, CEmuleDIO.IOValueChangedArgs e)
|
|
{
|
|
if (e.Dir == CEmuleDIO.eDirection.In)
|
|
{
|
|
if (e.ArrIDX == (int)eDIName.BUT_STARTF && e.NewValue)
|
|
{
|
|
this.devIO.SetInput((int)eDIName.PORT0_DET_UP, false);
|
|
this.devIO.SetInput((int)eDIName.PORT1_DET_UP, false);
|
|
this.devIO.SetInput((int)eDIName.PORT2_DET_UP, false);
|
|
}
|
|
else if (e.ArrIDX == (int)eDIName.BUT_RESETF && e.NewValue)
|
|
{
|
|
this.devIO.SetInput((int)eDIName.PORT0_DET_UP, false);
|
|
this.devIO.SetInput((int)eDIName.PORT1_DET_UP, false);
|
|
this.devIO.SetInput((int)eDIName.PORT2_DET_UP, false);
|
|
}
|
|
|
|
//해당 아이템의 값을 변경하고 다시 그린다.
|
|
if (tblDI.setValue(e.ArrIDX, e.NewValue))
|
|
tblDI.Invalidate();//.drawItem(e.ArrIDX);
|
|
Console.WriteLine(string.Format("di change {0}:{1}", e.ArrIDX, e.NewValue.ToString()));
|
|
}
|
|
else
|
|
{
|
|
//sir sol값에따라서 감지 센서를 연동
|
|
if (e.ArrIDX == (int)eDOName.SOL_AIR) this.devIO.SetInput((int)eDIName.AIR_DETECT, e.NewValue);
|
|
//else if (e.ArrIDX == (int)eDOName.PICKF_VAC1 && e.NewValue == false) this.devIO.SetInput((int)eDIName.pick, e.NewValue); //진공이켜지만 아이템이 감지된걸로 한다
|
|
//else if (e.ArrIDX == (int)eDOName.PICKF_VAC2 && e.NewValue == false) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK2, e.NewValue);
|
|
//else if (e.ArrIDX == (int)eDOName.PICKF_VAC3 && e.NewValue == false) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK3, e.NewValue);
|
|
//else if (e.ArrIDX == (int)eDOName.PICKF_VAC4 && e.NewValue == false) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK4, e.NewValue);
|
|
|
|
//해당 아이템의 값을 변경하고 다시 그린다.
|
|
if (tblDO.setValue(e.ArrIDX, e.NewValue))
|
|
tblDO.Invalidate();//.drawItem(e.ArrIDX);
|
|
|
|
//모터가 run 되면 몇초있다가 꺼야하낟.
|
|
if (e.ArrIDX == (int)eDOName.PORT0_MOT_RUN)
|
|
{
|
|
MotorRunStart[0] = DateTime.Now;
|
|
}
|
|
else if (e.ArrIDX == (int)eDOName.PORT1_MOT_RUN)
|
|
{
|
|
MotorRunStart[1] = DateTime.Now;
|
|
}
|
|
else if (e.ArrIDX == (int)eDOName.PORT2_MOT_RUN)
|
|
{
|
|
MotorRunStart[2] = DateTime.Now;
|
|
}
|
|
else if (e.ArrIDX == (int)eDOName.PORT0_MOT_DIR)
|
|
{
|
|
MotorRunStart[0] = DateTime.Now;
|
|
}
|
|
else if (e.ArrIDX == (int)eDOName.PORT1_MOT_DIR)
|
|
{
|
|
MotorRunStart[1] = DateTime.Now;
|
|
}
|
|
else if (e.ArrIDX == (int)eDOName.PORT2_MOT_DIR)
|
|
{
|
|
MotorRunStart[2] = DateTime.Now;
|
|
}
|
|
|
|
|
|
Console.WriteLine(string.Format("do change {0}:{1}", e.ArrIDX, e.NewValue.ToString()));
|
|
}
|
|
}
|
|
|
|
DateTime[] MotorRunStart = new DateTime[] { DateTime.Now,DateTime.Now,DateTime.Now };
|
|
|
|
Boolean CheckTime(DateTime Start, int ElapSecond)
|
|
{
|
|
var ts = DateTime.Now - Start;
|
|
if (ts.TotalSeconds >= ElapSecond) return true;
|
|
else return false;
|
|
|
|
}
|
|
private void timer1_Tick(object sender, EventArgs e)
|
|
{
|
|
for (int i = 0; i < axcount; i++)
|
|
{
|
|
//각 축별 데이터를 표시한다
|
|
this.jobCtl[i].arIsOrg = devM.isOrg(i);
|
|
this.jobCtl[i].arIsInp = devM.isINp(i);
|
|
this.jobCtl[i].arIsAlm = devM.isAlm(i);
|
|
this.jobCtl[i].arIsLimN = devM.isLimM(i);
|
|
this.jobCtl[i].arIsLimP = devM.isLimP(i);
|
|
this.jobCtl[i].arIsSvON = devM.isSvOn(i);
|
|
|
|
this.jobCtl[i].ardAct = devM.dAct[i];
|
|
this.jobCtl[i].ardCmd = devM.dCmd[i];
|
|
this.jobCtl[i].arIsInit = true;// MotionObject.IsInit;
|
|
//this.jobCtl[i].arIsHSet = devM.isHSet[i];
|
|
|
|
this.jobCtl[i].Invalidate();
|
|
}
|
|
|
|
|
|
//포트용 모터가 켜져잇으ㅜ면 detect 작업을 자동으로 해준다
|
|
if(checkBox1.Checked)
|
|
{
|
|
if (Util_DO.GetIOOutput(eDOName.PORT0_MOT_RUN)) //역방향으로 모터가 가동 중이다
|
|
{
|
|
if (Util_DO.GetPortMotorDir(0) == eMotDir.CCW && CheckTime(MotorRunStart[0], 7))
|
|
devIO.SetInput((int)eDIName.PORT0_LIM_DN, true);
|
|
if (Util_DO.GetPortMotorDir(0) == eMotDir.CCW && CheckTime(MotorRunStart[0], 1))
|
|
devIO.SetInput((int)eDIName.PORT0_DET_UP, false);
|
|
|
|
if (Util_DO.GetPortMotorDir(0) == eMotDir.CW && CheckTime(MotorRunStart[0], 5))
|
|
devIO.SetInput((int)eDIName.PORT0_DET_UP, true);
|
|
if (Util_DO.GetPortMotorDir(0) == eMotDir.CW && CheckTime(MotorRunStart[0], 3))
|
|
devIO.SetInput((int)eDIName.PORT0_LIM_DN, false);
|
|
}
|
|
if (Util_DO.GetIOOutput(eDOName.PORT1_MOT_RUN)) //역방향으로 모터가 가동 중이다
|
|
{
|
|
if (Util_DO.GetPortMotorDir(1) == eMotDir.CCW && CheckTime(MotorRunStart[1], 7))
|
|
devIO.SetInput((int)eDIName.PORT1_LIM_DN, true);
|
|
if (Util_DO.GetPortMotorDir(1) == eMotDir.CCW && CheckTime(MotorRunStart[1], 1))
|
|
devIO.SetInput((int)eDIName.PORT1_DET_UP, false);
|
|
|
|
if (Util_DO.GetPortMotorDir(1) == eMotDir.CW && CheckTime(MotorRunStart[1], 5))
|
|
devIO.SetInput((int)eDIName.PORT1_DET_UP, true);
|
|
if (Util_DO.GetPortMotorDir(1) == eMotDir.CW && CheckTime(MotorRunStart[1], 3))
|
|
devIO.SetInput((int)eDIName.PORT1_LIM_DN, false);
|
|
}
|
|
if (Util_DO.GetIOOutput(eDOName.PORT2_MOT_RUN)) //역방향으로 모터가 가동 중이다
|
|
{
|
|
if (Util_DO.GetPortMotorDir(2) == eMotDir.CCW && CheckTime(MotorRunStart[2], 7))
|
|
devIO.SetInput((int)eDIName.PORT2_LIM_DN, true);
|
|
if (Util_DO.GetPortMotorDir(2) == eMotDir.CCW && CheckTime(MotorRunStart[2], 1))
|
|
devIO.SetInput((int)eDIName.PORT2_DET_UP, false);
|
|
|
|
if (Util_DO.GetPortMotorDir(2) == eMotDir.CW && CheckTime(MotorRunStart[2], 5))
|
|
devIO.SetInput((int)eDIName.PORT2_DET_UP, true);
|
|
if (Util_DO.GetPortMotorDir(2) == eMotDir.CW && CheckTime(MotorRunStart[2], 3))
|
|
devIO.SetInput((int)eDIName.PORT2_LIM_DN, false);
|
|
}
|
|
}
|
|
//if (Util_DO.GetPortMotorDir(0) == eMotDir.CW && Util_DO.GetIOOutput(eDOName.PORT0_MOT_RUN) == true && checkBox1.Checked)
|
|
// this.devIO.SetInput((int)eDIName.PORT1_DET_UP, true);
|
|
|
|
//if (Util_DO.GetPortMotorDir(1) == eMotDir.CW && Util_DO.GetIOOutput(eDOName.PORT1_MOT_RUN) == true && checkBox1.Checked)
|
|
// this.devIO.SetInput((int)eDIName.PORT2_DET_UP, true);
|
|
|
|
|
|
//백큠을 집는 행동 처리
|
|
if (Pub.sm.Step == StateMachine.eSMStep.RUN)
|
|
{
|
|
//ZL이 집는 위치일경우
|
|
if (Util_Mot.GetPKX_PosName() == ePickYPosition.PICKON)
|
|
{
|
|
if (checkBox2.Checked)
|
|
{
|
|
//if (devIO.Output[(int)eDOName.PICKF_VAC1]) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK1, true);
|
|
//if (devIO.Output[(int)eDOName.PICKF_VAC2]) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK2, true);
|
|
//if (devIO.Output[(int)eDOName.PICKF_VAC3]) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK3, true);
|
|
//if (devIO.Output[(int)eDOName.PICKF_VAC4]) this.devIO.SetInput((int)eDIName.PICKF_VAC_CHK4, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
//그룹박스내의 센서류 업데이트
|
|
this.ctlContainer1.updateControl();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void toolStripButton1_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
Pub.mot.SetSVON(true);
|
|
|
|
//emg on
|
|
devIO.SetInput((int)eDIName.BUT_EMGF, false);
|
|
// devIO.SetInput((int)eDIName.PICKF_OVERLOAD, true);
|
|
//devIO.SetInput((int)eDIName.PICKR_OVERLOAD, true);
|
|
|
|
SLLimP.arPin.PinIndex = (int)eDIName.PORT1_LIM_UP;
|
|
SLDetU.arPin.PinIndex = (int)eDIName.PORT1_DET_UP;
|
|
SLLimN.arPin.PinIndex = (int)eDIName.PORT1_LIM_DN;
|
|
|
|
SRLimP.arPin.PinIndex = (int)eDIName.PORT2_LIM_UP;
|
|
SRDetU.arPin.PinIndex = (int)eDIName.PORT2_DET_UP;
|
|
SRLimN.arPin.PinIndex = (int)eDIName.PORT2_LIM_DN;
|
|
|
|
//타워램프
|
|
ctlTowerLamp1.arPinRed.PinIndex = (int)eDOName.TWR_REDF;
|
|
ctlTowerLamp1.arPinYel.PinIndex = (int)eDOName.TWR_YELF;
|
|
ctlTowerLamp1.arPinGrn.PinIndex = (int)eDOName.TWR_GRNF;
|
|
ctlTowerLamp1.arPinBuz.PinIndex = (int)eDOName.BUZZER;
|
|
ctlTowerLamp1.arPinRed.Output = true;
|
|
ctlTowerLamp1.arPinYel.Output = true;
|
|
ctlTowerLamp1.arPinGrn.Output = true;
|
|
|
|
//전면조작버
|
|
sf1.arPin.PinIndex = (int)eDOName.SOL_AIR;
|
|
sf2.arPin.PinIndex = (int)eDOName.BUT_STARTF;
|
|
sf3.arPin.PinIndex = (int)eDOName.BUT_STOPF;
|
|
sf4.arPin.PinIndex = (int)eDOName.BUT_RESETF;
|
|
sf1.arPin.Output = true;
|
|
sf2.arPin.Output = true;
|
|
sf3.arPin.Output = true;
|
|
sf4.arPin.Output = true;
|
|
|
|
//모터구동
|
|
m1.Pin_Run.PinIndex = (int)eDOName.PORT0_MOT_RUN;
|
|
m2.Pin_Run.PinIndex = (int)eDOName.PORT1_MOT_RUN;
|
|
m1.Pin_Run.Output = true;
|
|
m2.Pin_Run.Output = true;
|
|
|
|
devIO.SetOutput((int)eDOName.SOL_AIR, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private void btAir_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
var bt = sender as UIControl.CtlSensor;
|
|
switch (bt.Text.ToLower())
|
|
{
|
|
case "air":
|
|
devIO.SetInput((int)eDIName.BUT_AIRF, true);
|
|
break;
|
|
case "stop":
|
|
devIO.SetInput((int)eDIName.BUT_STOPF, true);
|
|
break;
|
|
case "reset":
|
|
devIO.SetInput((int)eDIName.BUT_RESETF, true);
|
|
break;
|
|
case "start":
|
|
devIO.SetInput((int)eDIName.BUT_STARTF, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void btAir_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
var bt = sender as UIControl.CtlSensor;
|
|
switch (bt.Text.ToLower())
|
|
{
|
|
case "air":
|
|
devIO.SetInput((int)eDIName.BUT_AIRF, false);
|
|
break;
|
|
case "stop":
|
|
devIO.SetInput((int)eDIName.BUT_STOPF, false);
|
|
break;
|
|
case "reset":
|
|
devIO.SetInput((int)eDIName.BUT_RESETF, false);
|
|
break;
|
|
case "start":
|
|
devIO.SetInput((int)eDIName.BUT_STARTF, false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void m1_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Output[(int)eDOName.PORT0_MOT_RUN];
|
|
devIO.SetOutput((int)eDOName.PORT0_MOT_RUN, !cur);
|
|
}
|
|
|
|
private void m2_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Output[(int)eDOName.PORT1_MOT_RUN];
|
|
devIO.SetOutput((int)eDOName.PORT1_MOT_RUN, !cur);
|
|
}
|
|
|
|
private void SLLimP_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT1_LIM_UP];
|
|
devIO.SetInput((int)eDIName.PORT1_LIM_UP, !cur);
|
|
}
|
|
|
|
private void SRLimP_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT2_LIM_UP];
|
|
devIO.SetInput((int)eDIName.PORT2_LIM_UP, !cur);
|
|
}
|
|
|
|
private void SLDetU_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT1_DET_UP];
|
|
devIO.SetInput((int)eDIName.PORT1_DET_UP, !cur);
|
|
}
|
|
|
|
private void SRDetU_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT2_DET_UP];
|
|
devIO.SetInput((int)eDIName.PORT2_DET_UP, !cur);
|
|
}
|
|
|
|
private void SLLimN_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT1_LIM_DN];
|
|
devIO.SetInput((int)eDIName.PORT1_LIM_DN, !cur);
|
|
}
|
|
|
|
private void SRLimN_Click(object sender, EventArgs e)
|
|
{
|
|
var cur = devIO.Input[(int)eDIName.PORT2_LIM_DN];
|
|
devIO.SetInput((int)eDIName.PORT2_LIM_DN, !cur);
|
|
}
|
|
|
|
|
|
private void toolStripButton3_Click(object sender, EventArgs e)
|
|
{
|
|
devM.TimerInterval = 50;
|
|
}
|
|
|
|
private void toolStripButton2_Click(object sender, EventArgs e)
|
|
{
|
|
devM.TimerInterval = 100;
|
|
}
|
|
|
|
private void toolStripButton4_Click(object sender, EventArgs e)
|
|
{
|
|
devM.TimerInterval = 10;
|
|
}
|
|
}
|
|
}
|