Initial commit
This commit is contained in:
174
Handler/Project/RunCode/Device/_Joystick.cs
Normal file
174
Handler/Project/RunCode/Device/_Joystick.cs
Normal file
@@ -0,0 +1,174 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using arDev;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
private void Joystick_InputChanged(object sender, arDev.Joystick.JoystickRaw.InputChangedEventHandler e)
|
||||
{
|
||||
|
||||
var keyName = e.input.ToString();
|
||||
if (e.input == HidSharp.Reports.Usage.Button5) keyName = "L-TRIGGER";
|
||||
else if (e.input == HidSharp.Reports.Usage.Button6) keyName = "R-TRIGGER";
|
||||
else if (e.input == HidSharp.Reports.Usage.Button9) keyName = "SELECT";
|
||||
else if (e.input == HidSharp.Reports.Usage.Button10) keyName = "START";
|
||||
else if (e.input == HidSharp.Reports.Usage.Button4) keyName = "BUT-Y";
|
||||
else if (e.input == HidSharp.Reports.Usage.Button1) keyName = "BUT-X";
|
||||
|
||||
PUB.log.Add("JOYSTICK", string.Format("[{0}] {1}->{2}", keyName, e.oldValue, e.newValue));
|
||||
|
||||
if (PUB.sm.Step != eSMStep.IDLE && PUB.sm.Step != eSMStep.ERROR && PUB.flag.get(eVarBool.FG_MOVE_PICKER) == false && PUB.sm.Step != eSMStep.WAITSTART) return;
|
||||
|
||||
if (e.input == HidSharp.Reports.Usage.Button4) //stop
|
||||
{
|
||||
if (e.newValue > 0)
|
||||
{
|
||||
PUB.log.Add("Joystick Click : Stop");
|
||||
_BUTTON_STOP();
|
||||
}
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.Button1) //reset
|
||||
{
|
||||
if (e.newValue > 0)
|
||||
{
|
||||
PUB.log.Add("Joystick Click : Reset");
|
||||
_BUTTON_RESET();
|
||||
}
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.Button9) //select button
|
||||
{
|
||||
if (e.newValue == 1)
|
||||
{
|
||||
PUB.Result.JoystickAxisGroup += 1;
|
||||
if (PUB.Result.JoystickAxisGroup > 3) PUB.Result.JoystickAxisGroup = 0;
|
||||
}
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.Button10) //start button
|
||||
{
|
||||
if (e.newValue == 1 && PUB.flag.get(eVarBool.FG_SCR_JOBSELECT) == false)
|
||||
{
|
||||
if (PUB.sm.Step >= eSMStep.IDLE)
|
||||
{
|
||||
PUB.log.AddI("START BUTTON");
|
||||
this._BUTTON_START();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.Button5) //ltrigger
|
||||
{
|
||||
AR.SETTING.Data.Enable_SpeedLimit = true;
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.Button6) //ltrigger
|
||||
{
|
||||
AR.SETTING.Data.Enable_SpeedLimit = false;
|
||||
}
|
||||
|
||||
//트리거 L,R을 눌렀을때 홈 가능한 위치라면 홈을 진행한다
|
||||
if (e.newValue > 0 && (e.input == HidSharp.Reports.Usage.Button5 || e.input == HidSharp.Reports.Usage.Button6))
|
||||
{
|
||||
//두개가 동시에 눌렷을때
|
||||
if (PUB.joystick.Buttons[4] && PUB.joystick.Buttons[5])
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_INIT_MOTIO) == false) return;
|
||||
if (PUB.sm.isRunning == true) return;
|
||||
if (DIO.IsEmergencyOn() == true) return;
|
||||
if (PUB.sm.Step == eSMStep.RUN) return;
|
||||
|
||||
PUB.log.AddAT("조이스틱으로 홈 초기화작업");
|
||||
Func_sw_initialize();
|
||||
}
|
||||
}
|
||||
|
||||
//동작중만 아니면 작동하게한다.
|
||||
if (PUB.sm.Step != eSMStep.RUN)
|
||||
{
|
||||
short axisH = 0;
|
||||
short axisV = 1;
|
||||
if (PUB.Result.JoystickAxisGroup == 1) //왼쪽뭉치
|
||||
{
|
||||
axisH = 2;
|
||||
axisV = 3;
|
||||
}
|
||||
else if (PUB.Result.JoystickAxisGroup == 2) //오른쪽뭉치
|
||||
{
|
||||
axisH = 4;
|
||||
axisV = 5;
|
||||
}
|
||||
else if (PUB.Result.JoystickAxisGroup == 3) //theta, picker-Z
|
||||
{
|
||||
axisH = 6;
|
||||
axisV = 1;
|
||||
}
|
||||
|
||||
//X축으로 이동하는것은 PX,
|
||||
if (e.input == HidSharp.Reports.Usage.GenericDesktopX)
|
||||
{
|
||||
if (e.newValue == 0)
|
||||
{
|
||||
//좌
|
||||
PUB.mot.JOG(axisH, arDev.MOT.MOTION_DIRECTION.Negative, 100, 500, false, false);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, true, "joystick");
|
||||
}
|
||||
else if (e.newValue == 127)
|
||||
{
|
||||
//멈춤
|
||||
PUB.mot.MoveStop("Joystick", axisH);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, false, "joystick");
|
||||
}
|
||||
else if (e.newValue == 255)
|
||||
{
|
||||
//우
|
||||
PUB.mot.JOG(axisH, arDev.MOT.MOTION_DIRECTION.Positive, 100, 500, false, false);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, true, "joystick");
|
||||
}
|
||||
}
|
||||
else if (e.input == HidSharp.Reports.Usage.GenericDesktopY)
|
||||
{
|
||||
if (e.newValue == 0)
|
||||
{
|
||||
//상
|
||||
PUB.mot.JOG(axisV, arDev.MOT.MOTION_DIRECTION.Negative, 100, 500, false, false);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, true, "joystick");
|
||||
}
|
||||
else if (e.newValue == 127)
|
||||
{
|
||||
//멈춤
|
||||
PUB.mot.MoveStop("Joystick", axisV);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, false, "joystick");
|
||||
}
|
||||
else if (e.newValue == 255)
|
||||
{
|
||||
//하
|
||||
PUB.mot.JOG(axisV, arDev.MOT.MOTION_DIRECTION.Positive, 100, 500, false, false);
|
||||
PUB.flag.set(eVarBool.FG_JOYSTICK, true, "joystick");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Joystick_Disconnected(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.AddE("조이스틱 연결 종료");
|
||||
}
|
||||
|
||||
private void Joystick_Connected(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.AddI("조이스틱 연결 완료");
|
||||
}
|
||||
|
||||
private void Joystick_Changed(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.AddAT("조이스틱 감지");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
436
Handler/Project/RunCode/Device/_Keyence.cs
Normal file
436
Handler/Project/RunCode/Device/_Keyence.cs
Normal file
@@ -0,0 +1,436 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
private void Keyence_BarcodeRecv(object sender, Device.KeyenceBarcode.RecvDataEvent e)
|
||||
{
|
||||
var dev = sender as Device.KeyenceBarcode;
|
||||
if (e.RawData.StartsWith("ERROR"))
|
||||
{
|
||||
//로그가 너무 많이 쌓이니 해제한다
|
||||
//Pub.log.AddE("Reader RES : " + resp);
|
||||
}
|
||||
else if (e.RawData.StartsWith("OK"))
|
||||
{
|
||||
//OK회신
|
||||
}
|
||||
else
|
||||
{
|
||||
//값은 받았다
|
||||
if (PUB.sm.Step != eSMStep.HOME_FULL && PUB.sm.Step != eSMStep.HOME_QUICK)
|
||||
{
|
||||
// PUB.logKeyence.Add($"{resp.Replace("\n", "").Replace("\r", "")}");
|
||||
ParseBarcode(e.RawData, dev.Tag.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
//PUB.logKeyence.Add($"Code Ignore by Home Process({resp.Replace("\n", "").Replace("\r", "")})");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool imageprocess = false;
|
||||
private void Keyence_ImageRecv(object sender, Device.KeyenceBarcode.RecvImageEvent e)
|
||||
{
|
||||
|
||||
var dev = sender as Device.KeyenceBarcode;
|
||||
System.Windows.Forms.PictureBox keyenceview;
|
||||
if (dev.Tag == "R") keyenceview = keyenceviewR;
|
||||
else keyenceview = keyenceviewF;
|
||||
|
||||
if (imageprocess == false)
|
||||
{
|
||||
imageprocess = true;
|
||||
|
||||
if (PUB.sm.Step >= eSMStep.IDLE && this.IsDisposed == false && this.Disposing == false)
|
||||
{
|
||||
|
||||
//var oimage = this.pictureBox1.Image;
|
||||
//this.pictureBox1.Image = e.Image;
|
||||
//if (oimage != null) oimage.Dispose();
|
||||
|
||||
if (keyenceview.Image == null)
|
||||
{
|
||||
//var newbitmap = new Bitmap(e.Image.Width,e.Image.Height, e.Image.PixelFormat);
|
||||
var old = keyenceview.Image;
|
||||
//var newbitmap = PUB.keyence.CreateBitmap(e.Image.Width, e.Image.Height);
|
||||
//PUB.keyence.UpdateBitmap((Bitmap)e.Image, newbitmap);
|
||||
keyenceview.Image = e.Image;
|
||||
if (old != null) old.Dispose();
|
||||
PUB.log.AddAT("최초 이미지 수신");
|
||||
}
|
||||
else
|
||||
{
|
||||
//내용ㅁㄴ업데이트하자
|
||||
var preimage = keyenceview.Image as Bitmap;
|
||||
keyenceview.Image = e.Image;
|
||||
if (preimage != null) preimage.Dispose();
|
||||
//PUB.keyence.UpdateBitmap((Bitmap)e.Image, preimage);
|
||||
//this.pictureBox2.Invalidate();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (this.IsDisposed)
|
||||
{
|
||||
dev.Dispose();
|
||||
}
|
||||
|
||||
imageprocess = false;
|
||||
}
|
||||
}
|
||||
|
||||
double GetAngle(Point pt1, Point pt2)
|
||||
{
|
||||
var val = Math.Asin((pt2.Y - pt1.Y) / Math.Sqrt(Math.Pow(pt2.X - pt1.X, 2.0) + Math.Pow(pt2.Y - pt1.Y, 2.0)));
|
||||
|
||||
|
||||
double retval = 0.0;
|
||||
if ((pt2.X - pt1.X) >= 0 && (pt2.Y - pt1.Y) >= 0)
|
||||
retval = val;
|
||||
else if ((pt2.X - pt1.X) < 0 && (pt2.Y - pt1.Y) >= 0)
|
||||
retval = Math.PI - val;
|
||||
else if ((pt2.X - pt1.X) < 0 && (pt2.Y - pt1.Y) < 0)
|
||||
retval = Math.PI - val;
|
||||
else if ((pt2.X - pt1.X) >= 0 && (pt2.Y - pt1.Y) < 0)
|
||||
retval = Math.PI * 2 + val;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
private string KeyenceBarcodeDataF = string.Empty;
|
||||
private string KeyenceBarcodeDataR = string.Empty;
|
||||
//List<Class.KeyenceBarcodeData> barcodelist = new List<Class.KeyenceBarcodeData>();
|
||||
void ParseBarcode(string response, string Source)
|
||||
{
|
||||
|
||||
//220901 - 특문있었ㅇ츰
|
||||
var r1 = (char)0x1D;
|
||||
var r2 = (char)0x1E;
|
||||
var r3 = (char)0x04;
|
||||
var r4 = (char)0x00;
|
||||
response = response.Replace(r1.ToString(), "");
|
||||
response = response.Replace(r2.ToString(), "");
|
||||
response = response.Replace(r3.ToString(), "");
|
||||
response = response.Replace(r4.ToString(), "");
|
||||
response = response.Replace("\r", "");
|
||||
response = response.Replace("\n", "");
|
||||
response = response.Replace("\0", "");
|
||||
response = response.RemoveNoneASCII().Trim();
|
||||
|
||||
///101409576:522/1171:427/1143:429/1134:524/1155:475/1151\r
|
||||
var frames = response.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var itemC = PUB.Result.ItemDataC;
|
||||
|
||||
//키엔스바코드패턴검사
|
||||
var Pattern = @"^(\d+):(\w+.*):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+)";
|
||||
Pattern = @"^(\d+):(.*):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+):(\d+/\d+)";
|
||||
var RegX = new System.Text.RegularExpressions.Regex(Pattern);
|
||||
foreach (var resp in frames)
|
||||
{
|
||||
if (RegX.IsMatch(resp.Trim()) == false)
|
||||
{
|
||||
//에러처리 221018
|
||||
if (resp.StartsWith("0:ERROR")) continue;
|
||||
|
||||
PUB.log.AddE($"***바코드({Source}) 응답데이터 오류 값(키엔스 전송포맷을 확인하세요) " + resp);
|
||||
listView21.SetText(9, 3, "ERR");//.setTitle(8, 1, "ERR");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (AR.VAR.BOOL[eVarBool.JOB_PickON_Retry]) //221110
|
||||
{
|
||||
if (PUB.sm.Step == eSMStep.RUN)
|
||||
PUB.log.AddAT($"피커({Source}) 재시도 중이라 바코드를 무시 합니다:{resp}");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
var MatchList = RegX.Matches(resp.Trim());
|
||||
var buf = MatchList[0].Groups;
|
||||
|
||||
//var buf = resp.Split(':'); //데이터는 :로 분리되어있음
|
||||
//if (buf.Length != 7) //데이터는 총 6개의 데이터로 구성됨
|
||||
//{
|
||||
// PUB.log.AddE("***바코드 응답데이터 오류 값(키엔스 전송포맷을 확인하세요) " + resp);
|
||||
// gridView2.setTitle(8, 1, "ERR");
|
||||
// continue;
|
||||
//}
|
||||
|
||||
var angle = 0;
|
||||
Boolean STDData = false; //들어온 자료가 amkor std 바코드여부
|
||||
var sym = buf[1].Value;
|
||||
var vData = buf[2].Value.Trim();
|
||||
|
||||
|
||||
if (Source == "R") KeyenceBarcodeDataR = vData;
|
||||
else KeyenceBarcodeDataF = vData;
|
||||
|
||||
//바코드 무시조건 확인
|
||||
//if (PUB.Result.BCDIgnorePattern != null)
|
||||
//{
|
||||
// Boolean ignore = false;
|
||||
// foreach (var ignoreitem in PUB.Result.BCDIgnorePattern)
|
||||
// {
|
||||
// if (ignoreitem.Pattern.isEmpty()) continue;
|
||||
// RegX = new System.Text.RegularExpressions.Regex(ignoreitem.Pattern);
|
||||
// if (RegX.IsMatch(vData))
|
||||
// {
|
||||
// var igmsg = "무시바코드 Patter: " + ignoreitem.Pattern + ",값=" + vData;
|
||||
// ignore = true;
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// if (ignore) continue;
|
||||
//}
|
||||
|
||||
var vV1 = buf[3].Value.Split('/');
|
||||
var vV2 = buf[4].Value.Split('/');
|
||||
var vV3 = buf[5].Value.Split('/');
|
||||
var vV4 = buf[6].Value.Split('/');
|
||||
var vCP = buf[7].Value.Split('/');
|
||||
|
||||
var vertex = new Point[4];
|
||||
vertex[0] = new Point(int.Parse(vV1[0]), int.Parse(vV1[1]));
|
||||
vertex[1] = new Point(int.Parse(vV2[0]), int.Parse(vV2[1]));
|
||||
vertex[2] = new Point(int.Parse(vV3[0]), int.Parse(vV3[1]));
|
||||
vertex[3] = new Point(int.Parse(vV4[0]), int.Parse(vV4[1]));
|
||||
var vertextCP = new Point(int.Parse(vCP[0]), int.Parse(vCP[1]));
|
||||
|
||||
var ReelCP = Point.Empty;
|
||||
if (itemC.VisionData.ReelSize == eCartSize.Inch13)
|
||||
ReelCP = AR.SETTING.Data.CenterPosition13;
|
||||
else
|
||||
ReelCP = AR.SETTING.Data.CenterPosition7;
|
||||
|
||||
//각도를 이곳에서 처리함
|
||||
angle = (int)(GetAngle(vertex[0], vertex[1]) * 180.0 / Math.PI);
|
||||
|
||||
//var atkstdbcd = new StdLabelPrint.CAmkorSTDBarcode(vData);
|
||||
//if (atkstdbcd.DisposalCode) //사용하지않는 103코드라면 아에 처리안함
|
||||
//{
|
||||
// PUB.log.AddE("***폐기된 103 코드형태라 처리하지 않음" + vData);
|
||||
// continue;
|
||||
//}
|
||||
|
||||
//특정좌표가 기준점으로부터 몇도 틀어져 있는가?
|
||||
//math.atan2(PY - CY, PX - CX)
|
||||
|
||||
//회전후좌표계산
|
||||
//x = root((px - cx) ^ 2 + (py - cy) ^ 2) * cos@ +cx
|
||||
//y = root(px ^ 2 + py ^ 2) * sin@ +cy
|
||||
double theta = 0.0;// Pub.Result.ItemData[1].VisionData.BaseAngle;
|
||||
if (itemC.VisionData.BaseAngle(out string msg, out Class.KeyenceBarcodeData angbcd))
|
||||
{
|
||||
theta = angbcd.Angle;
|
||||
}
|
||||
|
||||
|
||||
var theta_rad = -theta * Math.PI / 180.0;
|
||||
var PX = (int)(Math.Cos(theta_rad) * (vertextCP.X - ReelCP.X) - Math.Sin(theta_rad) * (vertextCP.Y - ReelCP.Y)) + ReelCP.X;
|
||||
var PY = (int)(Math.Sin(theta_rad) * (vertextCP.X - ReelCP.X) + Math.Cos(theta_rad) * (vertextCP.Y - ReelCP.Y)) + ReelCP.Y;
|
||||
|
||||
|
||||
float LabelAngRad = (float)(Math.Atan2(PY - ReelCP.Y, PX - ReelCP.X));// 2; //라벨의 위치값을 찾아서 입력해야한다.
|
||||
var labelpos = (float)(LabelAngRad * 180.0 / Math.PI);
|
||||
if (labelpos < 0) labelpos = 360 + labelpos;
|
||||
|
||||
byte lp = 0;
|
||||
|
||||
if (labelpos >= 15 * 22.5 && labelpos <= 360) lp = 6;
|
||||
else if (labelpos >= 0 && labelpos <= 22.5) lp = 6;
|
||||
else if (labelpos >= 1 * 22.5 && labelpos <= 3 * 22.5) lp = 3;
|
||||
else if (labelpos >= 3 * 22.5 && labelpos <= 5 * 22.5) lp = 2;
|
||||
else if (labelpos >= 5 * 22.5 && labelpos <= 7 * 22.5) lp = 1;
|
||||
else if (labelpos >= 7 * 22.5 && labelpos <= 9 * 22.5) lp = 4;
|
||||
else if (labelpos >= 9 * 22.5 && labelpos <= 11 * 22.5) lp = 7;
|
||||
else if (labelpos >= 11 * 22.5 && labelpos <= 13 * 22.5) lp = 8;
|
||||
else if (labelpos >= 13 * 22.5 && labelpos <= 15 * 22.5) lp = 9;
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//중첩된 데이터가 있는가?
|
||||
lock (itemC.VisionData.barcodelist)
|
||||
{
|
||||
//키값에 소스위치도 같이 포함한다
|
||||
var valuekey = Source + vData;
|
||||
var bcdin = itemC.VisionData.barcodelist.ContainsKey(valuekey);//.Where(t => t.Value.CheckIntersect(vertextCP, vData) == true).FirstOrDefault();
|
||||
if (bcdin == false)
|
||||
{
|
||||
PUB.logKeyence.Add($"{resp.Replace("\n", "").Replace("\r", "")}");
|
||||
|
||||
//없다면 추가한다.
|
||||
var newitem = new Class.KeyenceBarcodeData()
|
||||
{
|
||||
AmkorData = new StdLabelPrint.CAmkorSTDBarcode(vData),
|
||||
CenterPX = vertextCP,
|
||||
Data = vData,
|
||||
vertex = vertex,
|
||||
Angle = angle,
|
||||
LabelPosition = lp,
|
||||
barcodeSymbol = sym,
|
||||
barcodeSource = Source,
|
||||
};
|
||||
|
||||
var addok = itemC.VisionData.barcodelist.TryAdd(valuekey, newitem);
|
||||
if (addok) PUB.log.Add($"[NEW:{sym}] " + Source + " " + vData);
|
||||
else PUB.log.AddE($"X-[NEW:{sym}] " + Source + " " + vData);
|
||||
|
||||
itemC.VisionData.UpdateBarcodePositionData();
|
||||
itemC.VisionData.BarcodeTouched = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
//기존데이터와 좌표가 겹치면 두고 다르면 업데이트한다
|
||||
var predata = itemC.VisionData.barcodelist[valuekey];
|
||||
if (predata.CheckIntersect(vertextCP, vData) == false)
|
||||
{
|
||||
var newitem = new Class.KeyenceBarcodeData()
|
||||
{
|
||||
AmkorData = new StdLabelPrint.CAmkorSTDBarcode(vData),
|
||||
CenterPX = vertextCP,
|
||||
Data = vData,
|
||||
vertex = vertex,
|
||||
Angle = angle,
|
||||
LabelPosition = lp,
|
||||
barcodeSymbol = sym,
|
||||
barcodeSource = Source,
|
||||
};
|
||||
|
||||
//기존정보를 지우고
|
||||
PUB.log.Add($"[UPD:{sym}] " + Source + " " + vData);
|
||||
itemC.VisionData.barcodelist[valuekey] = newitem;
|
||||
itemC.VisionData.UpdateBarcodePositionData();
|
||||
itemC.VisionData.BarcodeTouched = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
listView21.SetText(9, 3, $"{angle} > {theta}");
|
||||
listView21.SetText(10, 3, itemC.VisionData.QRInputRaw.isEmpty() ? $"DETECT" : $"NONE");
|
||||
listView21.SetText(13, 2, $"LABEL");
|
||||
listView21.SetText(13, 3, $"{labelpos:N1}");
|
||||
}
|
||||
}
|
||||
|
||||
Boolean IsSIDValue(string data)
|
||||
{
|
||||
if (data.Length != 9) return false;
|
||||
decimal a = 0;
|
||||
if (decimal.TryParse(data, out a) == false) return false;
|
||||
if (data.StartsWith("10") == false) return false;
|
||||
return true;
|
||||
}
|
||||
Boolean IsDateValue(string date, out string datestr)
|
||||
{
|
||||
//821123 과 19821123 의 데이터를 판별한다
|
||||
datestr = string.Empty;
|
||||
date = date.Replace("-", "").Replace("/", "");
|
||||
if (date.Length == 6)
|
||||
{
|
||||
var vy = date.Substring(0, 2);
|
||||
var vm = date.Substring(2, 2);
|
||||
var vd = date.Substring(4, 2);
|
||||
if (isDigit(vy) == false || isDigit(vm) == false || isDigit(vd) == false)
|
||||
return false;
|
||||
if (vy.toInt() < 0 || vy.toInt() > 29) return false;
|
||||
if (vm.toInt() < 1 || vm.toInt() > 12) return false;
|
||||
if (vd.toInt() < 1 || vd.toInt() > 21) return false;
|
||||
datestr = "20" + vy + vm + vd;
|
||||
return true;
|
||||
|
||||
}
|
||||
else if (date.Length == 8)
|
||||
{
|
||||
var vy = date.Substring(0, 4);
|
||||
var vm = date.Substring(4, 2);
|
||||
var vd = date.Substring(6, 2);
|
||||
if (isDigit(vy) == false || isDigit(vm) == false || isDigit(vd) == false)
|
||||
return false;
|
||||
if (vy.toInt() < 2000 || vy.toInt() > 2900) return false;
|
||||
if (vm.toInt() < 1 || vm.toInt() > 12) return false;
|
||||
if (vd.toInt() < 1 || vd.toInt() > 31) return false;
|
||||
datestr = vy + vm + vd;
|
||||
return true;
|
||||
}
|
||||
else return false;
|
||||
}
|
||||
Boolean isDigit(string v)
|
||||
{
|
||||
int a;
|
||||
return int.TryParse(v, out a);
|
||||
}
|
||||
|
||||
|
||||
string cmd = string.Empty;
|
||||
DateTime LastTrigOnTime = DateTime.Now;
|
||||
Boolean bTrgOn = false;
|
||||
//private void Keyence_Trigger(bool bOn)
|
||||
//{
|
||||
|
||||
// if (PUB.flag.get(eVarBool.KEYENCE_TRIGGER) == bOn) return;
|
||||
|
||||
// if (bOn)
|
||||
// cmd = "LON";
|
||||
// else
|
||||
// cmd = "LOFF";
|
||||
|
||||
// if (bOn) LastTrigOnTime = DateTime.Now;
|
||||
|
||||
// string resp = reader.ExecCommand(cmd);
|
||||
// bTrgOn = bOn;
|
||||
// PUB.logKeyence.Add("BARCODE", $"트리거 전송({cmd})");
|
||||
// _isCrevisACQ[1] = bOn;
|
||||
|
||||
// //트리거
|
||||
// PUB.flag.set(eVarBool.KEYENCE_TRIGGER, bOn, "JOB");
|
||||
//}
|
||||
private void SaveImage(string filename)
|
||||
{
|
||||
var fi = new System.IO.FileInfo(filename);
|
||||
var ext = fi.Extension;
|
||||
var nameonly = fi.FullName.Replace(fi.Extension, "");
|
||||
var fiF = new System.IO.FileInfo(nameonly + "F" + ext);
|
||||
var fiR = new System.IO.FileInfo(nameonly + "F" + ext);
|
||||
|
||||
|
||||
if (PUB.keyenceF != null)
|
||||
{
|
||||
var img = this.keyenceviewF.Image;
|
||||
if (img == null) return;
|
||||
using (var newimg = new Bitmap(img.Width, img.Height, img.PixelFormat))
|
||||
{
|
||||
PUB.keyenceR.UpdateBitmap((Bitmap)img, newimg);
|
||||
if (fiF.Directory.Exists == false) fiF.Directory.Create();
|
||||
if (fiF.Exists) fiF.Delete();
|
||||
newimg.Save(fiF.FullName);
|
||||
}
|
||||
}
|
||||
|
||||
if (PUB.keyenceR != null)
|
||||
{
|
||||
var img = this.keyenceviewR.Image;
|
||||
if (img == null) return;
|
||||
using (var newimg = new Bitmap(img.Width, img.Height, img.PixelFormat))
|
||||
{
|
||||
PUB.keyenceR.UpdateBitmap((Bitmap)img, newimg);
|
||||
if (fiR.Directory.Exists == false) fiR.Directory.Create();
|
||||
if (fiR.Exists) fiR.Delete();
|
||||
newimg.Save(fiR.FullName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
71
Handler/Project/RunCode/Device/_Keyence_Rule_ReturnReel.cs
Normal file
71
Handler/Project/RunCode/Device/_Keyence_Rule_ReturnReel.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
///// <summary>
|
||||
///// RQ바코드값 사용 여부
|
||||
///// </summary>
|
||||
///// <param name="vData"></param>
|
||||
//Boolean Process_ReturnReel(string vData)
|
||||
//{
|
||||
// //120326 - return 수량 관련 (오토에서만 사용한다)
|
||||
// var qrbuf = vData.Split(';');
|
||||
// if (vData.EndsWith(";;;") && qrbuf.Length > 4 && VAR.BOOL[eVarBool.Opt_UserQtyRQ]== false)
|
||||
// {
|
||||
// var qrsid = qrbuf[0].Trim();
|
||||
// var qrlot = qrbuf[1].Trim();
|
||||
// var qrqty = qrbuf[2].Trim();
|
||||
// if (double.TryParse(qrqty, out double qtynum) && qrsid.Length == 9 && qrsid.StartsWith("10"))
|
||||
// {
|
||||
// //수량이 맞고 sid 가 101로 들어있는 경우에만 처리한다
|
||||
// PUB.log.Add("리턴릴 임시 바코드로 확인되어 데이터를 사용합니다 값:" + vData);
|
||||
// PUB.log.Add("SID값 변경함 #2 " + PUB.Result.ItemDataC.VisionData.SID + "=>" + qrsid);
|
||||
|
||||
// if (PUB.Result.ItemDataC.VisionData.QTY != qrqty)
|
||||
// {
|
||||
// PUB.AddSystemLog(AppContext.BaseDirectory, "_KEYENCE", $"리턴릴세미형태에서 QTY값을 적용 함({qrqty})");
|
||||
// }
|
||||
// PUB.Result.ItemDataC.VisionData.QTY = qrqty;
|
||||
// PUB.Result.ItemDataC.VisionData.SID = qrsid;
|
||||
// PUB.Result.ItemDataC.VisionData.VLOT = qrlot;
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
// //리턴릴수량추가확인(수동일때에만 사용)
|
||||
// if (vData.StartsWith("RQ"))
|
||||
// {
|
||||
// //리턴릴 바코드는 무조건 적용한다
|
||||
// var rqqtystr = vData.Substring(2);
|
||||
// if (int.TryParse(rqqtystr, out int rqqty))
|
||||
// {
|
||||
// //시스템로기
|
||||
// if (PUB.Result.ItemDataC.VisionData.QTY != rqqtystr || PUB.Result.ItemDataC.VisionData.QTYRQ == false)
|
||||
// {
|
||||
// PUB.AddSystemLog(AppContext.BaseDirectory, "_KEYENCE", $"리턴릴 QTY값 적용({rqqtystr})");
|
||||
|
||||
// //수량
|
||||
// PUB.Result.ItemDataC.VisionData.QTYRQ = true;
|
||||
// PUB.Result.ItemDataC.VisionData.QTY = rqqtystr;
|
||||
// PUB.log.Add("리턴릴 바코드값=" + vData + "을 적용합니다");
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// PUB.log.AddE("리턴릴 바코드값=" + vData + "을 적용 실패");
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// return false;
|
||||
//}
|
||||
}
|
||||
}
|
||||
44
Handler/Project/RunCode/Display/DisplayTextHandler.cs
Normal file
44
Handler/Project/RunCode/Display/DisplayTextHandler.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
delegate void ShowLotTextHandler(string value);
|
||||
|
||||
delegate void UpdateDMTextHandler(string value1);
|
||||
|
||||
//void UpdateResultText(string value1)
|
||||
//{
|
||||
// if (this.lbResult.InvokeRequired)
|
||||
// {
|
||||
// lbResult.BeginInvoke(new UpdateDMTextHandler(UpdateResultText), new object[] { value1 });
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// lbResult.Text = value1;
|
||||
// }
|
||||
//}
|
||||
|
||||
delegate void UpdateLabelTextHandler(Control ctl, string value);
|
||||
void UpdateLabelText(Control ctl, string value)
|
||||
{
|
||||
if (ctl.InvokeRequired)
|
||||
{
|
||||
ctl.BeginInvoke(new UpdateLabelTextHandler(UpdateLabelText), new object[] { ctl, value });
|
||||
}
|
||||
else
|
||||
{
|
||||
ctl.Text = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
22
Handler/Project/RunCode/Display/GetErrorMessage.cs
Normal file
22
Handler/Project/RunCode/Display/GetErrorMessage.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
//using System;
|
||||
//using System.Collections.Generic;
|
||||
//using System.Diagnostics;
|
||||
//using System.Drawing;
|
||||
//using System.IO;
|
||||
//using System.Linq;
|
||||
//using System.Net;
|
||||
//using System.Net.NetworkInformation;
|
||||
//using System.Runtime.Serialization.Formatters.Binary;
|
||||
//using System.Text;
|
||||
//using System.Windows.Forms;
|
||||
//using System.Management;
|
||||
//using COMM;
|
||||
|
||||
|
||||
//namespace Project
|
||||
//{
|
||||
// public static partial class UTIL
|
||||
// {
|
||||
|
||||
// }
|
||||
//}
|
||||
63
Handler/Project/RunCode/Display/_Interval_1min.cs
Normal file
63
Handler/Project/RunCode/Display/_Interval_1min.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
void _Display_Interval_1min()
|
||||
{
|
||||
//리셋카운트
|
||||
AutoResetCount();
|
||||
PUB.CheckFreeSpace();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 환경설정에따른 카운트를 리셋처리한다. 171128
|
||||
/// </summary>
|
||||
void AutoResetCount()
|
||||
{
|
||||
//수량누적시 자동으로 소거하게 되었다
|
||||
//if (COMM.SETTING.Data.datetime_Check_1 && COMM.SETTING.Data.datetime_Reset_1 != "") //오전
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + COMM.SETTING.Data.datetime_Reset_1 + ":00");
|
||||
// DateTime LastClearTime = Pub.counter.;
|
||||
|
||||
// //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함
|
||||
// if (DateTime.Now > SetTime && LastClearTime < SetTime)
|
||||
// {
|
||||
// Pub.log.AddI("Count Reset #1");
|
||||
// Pub.counter.ClearDay();
|
||||
// }
|
||||
// }
|
||||
// catch { }
|
||||
//}
|
||||
|
||||
//if (COMM.SETTING.Data.datetime_Check_2 && COMM.SETTING.Data.datetime_Reset_2 != "") //오후
|
||||
//{
|
||||
// try
|
||||
// {
|
||||
// DateTime SetTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd") + " " + COMM.SETTING.Data.datetime_Reset_2 + ":00");
|
||||
// DateTime LastClearTime = Pub.counter.CountReset;
|
||||
|
||||
// //현재 시간이 클리어대상 시간보다 크고, 마지막으로 클리어한 시간이 지정시간보다 작아야함
|
||||
// if (DateTime.Now > SetTime && LastClearTime < SetTime)
|
||||
// {
|
||||
// Pub.log.AddI("Count Reset #2");
|
||||
// Pub.counter.ClearDay();
|
||||
// }
|
||||
// }
|
||||
// catch { }
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
614
Handler/Project/RunCode/Display/_Interval_250ms.cs
Normal file
614
Handler/Project/RunCode/Display/_Interval_250ms.cs
Normal file
@@ -0,0 +1,614 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
|
||||
void _Display_Interval_250ms()
|
||||
{
|
||||
//타워램프조정
|
||||
//if (COMM.SETTING.Data.Disable_TowerLamp == false) Update_TowerLamp();
|
||||
TowerLamp.Update(PUB.sm.Step);
|
||||
|
||||
//컨베이어가동시간을 추적한다 230926
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor])
|
||||
{
|
||||
////왼쪽컨베이어에 아이템이 존재하는 경우에만 누적
|
||||
//if (DIO.GetIOOutput(eDOName.LEFT_CONV) && VAR.BOOL[eVarBool.LEFT_ITEM_PICKOFF])
|
||||
//{
|
||||
// if (VAR.TIME[eVarBool.LEFT_ITEM_PICKOFF].Year == 1982)
|
||||
// VAR.TIME[eVarBool.LEFT_ITEM_PICKOFF] = DateTime.Now; //시간초기화
|
||||
// else
|
||||
// {
|
||||
// var ts = DateTime.Now - VAR.TIME[eVarBool.LEFT_ITEM_PICKOFF];
|
||||
// VAR.DBL[eVarDBL.LEFT_ITEM_PICKOFF] += ts.TotalSeconds; //경과시간누적
|
||||
// VAR.TIME[eVarBool.LEFT_ITEM_PICKOFF] = DateTime.Now; //시간초기화
|
||||
// }
|
||||
//}
|
||||
|
||||
////오른쪽컨베이어에 아이템이 존재하는 경우에만 누적
|
||||
//if (DIO.GetIOOutput(eDOName.RIGHT_CONV) && VAR.BOOL[eVarBool.RIGT_ITEM_PICKOFF] )
|
||||
//{
|
||||
// if(VAR.TIME[eVarBool.RIGT_ITEM_PICKOFF].Year == 1982)
|
||||
// {
|
||||
// VAR.TIME[eVarBool.RIGT_ITEM_PICKOFF] = DateTime.Now; //시간초기화
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// var ts = DateTime.Now - VAR.TIME[eVarBool.RIGT_ITEM_PICKOFF];
|
||||
// VAR.DBL[eVarDBL.RIGT_ITEM_PICKOFF] += ts.TotalSeconds; //경과시간누적
|
||||
// VAR.TIME[eVarBool.RIGT_ITEM_PICKOFF] = DateTime.Now; //시간초기화
|
||||
// }
|
||||
|
||||
//}
|
||||
|
||||
var t1 = VAR.I32[eVarInt32.LEFT_ITEM_COUNT];
|
||||
var t2 = VAR.I32[eVarInt32.RIGT_ITEM_COUNT];
|
||||
groupBox2.Text = $"바코드({t1:N1}/{t2:N1})";
|
||||
}
|
||||
else
|
||||
{
|
||||
groupBox2.Text = "바코드";
|
||||
}
|
||||
|
||||
groupBox1.Text = $"장비조작({PUB.sm.Loop_ms:N0}ms)";
|
||||
//릴사이즈가 맞지 않으면 깜박인다.
|
||||
if (DIO.getCartSize(1) != eCartSize.None)
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor] == false && DIO.getCartSize(1) != DIO.getCartSize(0))
|
||||
{
|
||||
if (listView21.GetStyle(0, 1).BackColor != Color.Red)
|
||||
{
|
||||
listView21.GetStyle(0, 1).BackColor = Color.Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.GetStyle(0, 1).BackColor = Color.FromArgb(32, 32, 32);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.GetStyle(0, 1).BackColor = Color.FromArgb(32, 32, 32);
|
||||
}
|
||||
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor] == false && DIO.getCartSize(1) != DIO.getCartSize(2))
|
||||
{
|
||||
if (listView21.GetStyle(0, 5).BackColor != Color.Red)
|
||||
{
|
||||
listView21.GetStyle(0, 5).BackColor = Color.Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.GetStyle(0, 5).BackColor = Color.FromArgb(32, 32, 32);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.GetStyle(0, 5).BackColor = Color.FromArgb(32, 32, 32);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//모두 동일하게 흑색한다
|
||||
//lbSize0.BackColor = Color.FromArgb(32, 32, 32);
|
||||
//lbSize1.BackColor = Color.FromArgb(32, 32, 32);
|
||||
//lbSize2.BackColor = Color.FromArgb(32, 32, 32);
|
||||
|
||||
listView21.GetStyle(0, 1).BackColor = Color.FromArgb(32, 32, 32);
|
||||
listView21.GetStyle(0, 3).BackColor = Color.FromArgb(32, 32, 32);
|
||||
listView21.GetStyle(0, 5).BackColor = Color.FromArgb(32, 32, 32);
|
||||
|
||||
listView21.GetStyle(0, 1).ForeColor = Color.White;
|
||||
listView21.GetStyle(0, 3).ForeColor = Color.White;
|
||||
listView21.GetStyle(0, 5).ForeColor = Color.White;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//락정보
|
||||
var l0 = DIO.GetIOOutput(eDOName.CART_MAG0);
|
||||
var l1 = DIO.GetIOOutput(eDOName.CART_MAG1);
|
||||
var l2 = DIO.GetIOOutput(eDOName.CART_MAG2);
|
||||
|
||||
lbLock0.Text = l0 ? "카트 교환" : "카트 없음";
|
||||
lbLock1.Text = l1 ? "카트 교환" : "카트 없음";
|
||||
lbLock2.Text = l2 ? "카트 교환" : "카트 없음";
|
||||
|
||||
var sbVisTitle0 = listView21.GetCell(0, 1);
|
||||
var sbVisTitle2 = listView21.GetCell(0, 5);
|
||||
|
||||
if (PUB.wsL == null || PUB.wsL.Connected == false)
|
||||
{
|
||||
sbVisTitle0.ForeColor = Color.Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
//데이터수신시간에 따른 색상
|
||||
var tswecv = DateTime.Now - VAR.TIME[eVarTime.lastRecvWSL];
|
||||
if(tswecv.TotalSeconds > 5)
|
||||
{
|
||||
sbVisTitle0.ForeColor = Color.HotPink;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_L))
|
||||
sbVisTitle0.ForeColor = Color.Lime;
|
||||
else
|
||||
sbVisTitle0.ForeColor = Color.Magenta;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
if (PUB.wsR == null || PUB.wsR.Connected == false)
|
||||
{
|
||||
sbVisTitle2.ForeColor = Color.Red;
|
||||
}
|
||||
else
|
||||
{
|
||||
var tswecv = DateTime.Now - VAR.TIME[eVarTime.lastRecvWSR];
|
||||
if (tswecv.TotalSeconds > 5)
|
||||
{
|
||||
sbVisTitle2.ForeColor = Color.HotPink;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_R))
|
||||
sbVisTitle2.ForeColor = Color.Lime;
|
||||
else
|
||||
sbVisTitle2.ForeColor = Color.Magenta;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//arLabel18.Text = camliveBusy ? "카메라 (라이브뷰)" : "카메라";
|
||||
|
||||
btStart.Enabled = PUB.flag.get(eVarBool.FG_MOVE_PICKER) == false;
|
||||
btStop.Enabled = PUB.flag.get(eVarBool.FG_MOVE_PICKER) == false;
|
||||
btSetting.Enabled = PUB.flag.get(eVarBool.FG_MOVE_PICKER) == false;
|
||||
//btPickerMove.Visible = (Pub.mot.IsInit && PUB.mot.HasHomeSetOff == true); //피커의 수동 이동 버튼표시여부
|
||||
|
||||
|
||||
var hwcol = 0;
|
||||
if (PUB.keyenceF != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.keyenceF.IsConnect ? (PUB.keyenceF.IsTriggerOn ? "TRIG" : "ON") : "OFF"));
|
||||
|
||||
if (PUB.keyenceF.IsConnect)
|
||||
{
|
||||
if (PUB.keyenceF.IsTriggerOn)
|
||||
{
|
||||
HWState.setValue(1, hwcol, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setValue(1, hwcol, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setValue(1, hwcol, 3);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setTitle(1, hwcol, "SET");
|
||||
HWState.setValue(1, hwcol, 0);
|
||||
}
|
||||
hwcol++;
|
||||
|
||||
if (PUB.keyenceR != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.keyenceR.IsConnect ? (PUB.keyenceR.IsTriggerOn ? "TRIG" : "ON") : "OFF"));
|
||||
|
||||
if (PUB.keyenceR.IsConnect)
|
||||
{
|
||||
if (PUB.keyenceR.IsTriggerOn)
|
||||
{
|
||||
HWState.setValue(1, hwcol, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setValue(1, hwcol, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setValue(1, hwcol, 3);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HWState.setTitle(1, hwcol, "SET");
|
||||
HWState.setValue(1, hwcol, 0);
|
||||
}
|
||||
hwcol++;
|
||||
|
||||
|
||||
if (PUB.wsL != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.wsL.Connected ? "ON" : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.wsL.Connected ? 1 : 3));
|
||||
}
|
||||
|
||||
|
||||
if (PUB.wsR != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.wsR.Connected ? "ON" : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.wsR.Connected ? 1 : 3));
|
||||
}
|
||||
|
||||
|
||||
HWState.setTitle(1, hwcol, (PUB.BarcodeFix.IsOpen() ? AR.SETTING.Data.Barcode_Port : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.BarcodeFix.IsOpen() ? 1 : 3));
|
||||
|
||||
if (PUB.PrinterL != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.PrinterL.IsOpen ? AR.SETTING.Data.PrintL_Port : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.PrinterL.IsOpen ? 1 : 3));
|
||||
}
|
||||
else HWState.setTitle(1, hwcol++, "SET");
|
||||
|
||||
if (PUB.PrinterR != null)
|
||||
{
|
||||
|
||||
HWState.setTitle(1, hwcol, (PUB.PrinterR.IsOpen ? AR.SETTING.Data.PrintR_Port : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.PrinterR.IsOpen ? 1 : 3));
|
||||
}
|
||||
else HWState.setTitle(1, hwcol++, "SET");
|
||||
|
||||
if (PUB.plc != null)
|
||||
{
|
||||
HWState.setTitle(1, hwcol, (PUB.plc.Init ? AR.SETTING.Data.swplc_name : "OFF"));
|
||||
HWState.setValue(1, hwcol++, (ushort)(PUB.plc.Init ? 2 : 1));
|
||||
}
|
||||
else HWState.setTitle(1, hwcol++, "SET");
|
||||
|
||||
HWState.Invalidate();
|
||||
|
||||
IOState.setTitle(0, 0, $"{PUB.sm.Step}"); //this.sbStep.Text = Pub.sm.Step.ToString();
|
||||
IOState.setTitle(0, 9, $"MC({PUB.MCCode}/{AR.SETTING.Data.McName})");
|
||||
IOState.setTitle(1, 0, $"{PUB.sm.Loop_ms.ToString("N1")}ms");// / " + intlockcnt.ToString();io
|
||||
|
||||
IOState.setValue(0, 1, (ushort)(DIO.isSaftyDoorF(2, false) ? 0 : 2));
|
||||
IOState.setValue(0, 2, (ushort)(DIO.isSaftyDoorF(1, false) ? 0 : 2));
|
||||
IOState.setValue(0, 3, (ushort)(DIO.isSaftyDoorF(0, false) ? 0 : 2));
|
||||
|
||||
IOState.setValue(1, 1, (ushort)(DIO.GetIOOutput(eDOName.BUZZER) ? 2 : 0));
|
||||
IOState.setValue(1, 2, (ushort)(DIO.GetIOOutput(eDOName.ROOMLIGHT) ? 1 : 0));
|
||||
IOState.setValue(1, 3, (ushort)(DIO.GetIOInput(eDIName.AIR_DETECT) ? 1 : 0));
|
||||
|
||||
IOState.setValue(0, 4, (ushort)(DIO.GetIOInput(eDIName.PORTL_DET_UP) ? 1 : 0));
|
||||
IOState.setValue(0, 5, (ushort)(DIO.GetIOInput(eDIName.PORTC_DET_UP) ? 1 : 0));
|
||||
IOState.setValue(0, 6, (ushort)(DIO.GetIOInput(eDIName.PORTR_DET_UP) ? 1 : 0));
|
||||
|
||||
IOState.setValue(1, 4, (ushort)(DIO.GetIOInput(eDIName.PORTL_LIM_UP) ? 2 : 0));
|
||||
IOState.setValue(1, 5, (ushort)(DIO.GetIOInput(eDIName.PORTC_LIM_UP) ? 2 : 0));
|
||||
IOState.setValue(1, 6, (ushort)(DIO.GetIOInput(eDIName.PORTR_LIM_UP) ? 2 : 0));
|
||||
|
||||
IOState.setValue(1, 9, (ushort)(PUB.flag.get(eVarBool.FG_KEYENCE_TRIGGER) ? 2 : 0));
|
||||
|
||||
IOState.setValue(0, 10, (ushort)(PUB.flag.get(eVarBool.VS_DETECT_REEL_L) ? 2 : 0)); //reel-left detect
|
||||
IOState.setValue(0, 11, (ushort)(PUB.flag.get(eVarBool.VS_DETECT_REEL_R) ? 2 : 0)); //reel-right detect
|
||||
|
||||
IOState.setValue(1, 10, (ushort)(PUB.flag.get(eVarBool.VS_DETECT_CONV_L) ? 2 : 0)); //conv-left detect
|
||||
IOState.setValue(1, 11, (ushort)(PUB.flag.get(eVarBool.VS_DETECT_CONV_R) ? 2 : 0)); //conv-right detect
|
||||
|
||||
IOState.Invalidate();
|
||||
|
||||
if (PUB.Result.isSetvModel)
|
||||
{
|
||||
var modelVision = PUB.Result.vModel;
|
||||
var modelName = modelVision.Title;
|
||||
var modelNameM = string.Empty;
|
||||
|
||||
if (PUB.Result.isSetmModel) modelNameM = PUB.Result.mModel.Title;
|
||||
if (modelNameM.ToUpper().StartsWith("CONV"))
|
||||
{
|
||||
arLabel1.Text = "CONVEYOR ON";
|
||||
arLabel1.ForeColor = Color.Blue;
|
||||
}
|
||||
else
|
||||
{
|
||||
arLabel1.Text = "CONVEYOR OFF";
|
||||
arLabel1.ForeColor = Color.Red;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//시스템바이패스
|
||||
if (SETTING.Data.SystemBypass)
|
||||
{
|
||||
lbModelName.Text = $"SYSTEM BYPASS";
|
||||
lbModelName.ForeColor = Color.White;
|
||||
lbModelName.BackColor = Color.Blue;
|
||||
lbModelName.BackColor2 = Color.DeepSkyBlue;
|
||||
lbModelName.ShadowColor = Color.DimGray;
|
||||
}
|
||||
else
|
||||
{
|
||||
//바이패스는 색깔을 달리한다.
|
||||
if (modelName.ToUpper().Contains("BYPASS"))
|
||||
{
|
||||
lbModelName.Text = $"{modelName}";
|
||||
lbModelName.ForeColor = Color.DarkGreen;
|
||||
lbModelName.BackColor = Color.Gold;
|
||||
lbModelName.BackColor2 = Color.Yellow;
|
||||
lbModelName.ShadowColor = Color.WhiteSmoke;
|
||||
}
|
||||
else if (modelName.ToUpper().Contains("CONVERT"))
|
||||
{
|
||||
lbModelName.Text = $"{modelName}";
|
||||
lbModelName.ForeColor = Color.DarkBlue;
|
||||
lbModelName.BackColor = Color.Gold;
|
||||
lbModelName.BackColor2 = Color.Yellow;
|
||||
lbModelName.ShadowColor = Color.WhiteSmoke;
|
||||
}
|
||||
else
|
||||
{
|
||||
lbModelName.Text = $"[{VAR.STR[eVarString.JOB_CUSTOMER_CODE]}] {modelName}";
|
||||
lbModelName.ForeColor = Color.Black;
|
||||
lbModelName.BackColor = Color.White;
|
||||
lbModelName.BackColor2 = Color.WhiteSmoke;
|
||||
lbModelName.ShadowColor = Color.DimGray;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
lbModelName.Text = "모델을 선택하세요";
|
||||
lbModelName.ForeColor = Color.Blue;
|
||||
lbModelName.BackColor = Color.Tomato;
|
||||
lbModelName.BackColor2 = Color.Red;
|
||||
lbModelName.ShadowColor = Color.DimGray;
|
||||
}
|
||||
arLabel1.BackColor = lbModelName.BackColor;
|
||||
arLabel1.BackColor2 = lbModelName.BackColor2;
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
//바코드정보표시
|
||||
var row = 1;
|
||||
var col = 1;
|
||||
Class.VisionData visdata = PUB.Result.ItemDataL.VisionData;
|
||||
listView21.SetText(row++, col, visdata.RID);
|
||||
listView21.SetText(row++, col, visdata.SID);
|
||||
listView21.SetText(row++, col, visdata.QTY);
|
||||
listView21.SetText(row++, col, visdata.VNAME);
|
||||
listView21.SetText(row++, col, visdata.VLOT);
|
||||
listView21.SetText(row++, col, visdata.MFGDATE);
|
||||
listView21.SetText(row++, col, visdata.PARTNO);
|
||||
listView21.SetText(row++, col, visdata.ReelSize == eCartSize.None ? "--" : visdata.ReelSize.ToString());
|
||||
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_ENABLE_LEFT) == false)
|
||||
{
|
||||
sbVisTitle0.Text = "DISABLE";
|
||||
sbVisTitle0.BackColor = Color.Orange;
|
||||
sbVisTitle0.BackColor2 = Color.Tomato;
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.SetText(0, col, DIO.getCartSize(0) == eCartSize.None ? "?" : DIO.getCartSize(0).ToString());
|
||||
}
|
||||
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor]) listView21.GetStyle(0, 1).ForeColor = Color.White;
|
||||
else
|
||||
listView21.GetStyle(0, 1).ForeColor = AR.SETTING.Data.Detect_CartL ? Color.White : Color.Red;
|
||||
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor]) listView21.GetStyle(0, 5).ForeColor = Color.White;
|
||||
else
|
||||
listView21.GetStyle(0, 5).ForeColor = AR.SETTING.Data.Detect_CartR ? Color.White : Color.Red;
|
||||
//lbSize0.ForeColor = COMM.SETTING.Data.Detect_CartL ? Color.White : Color.Red;
|
||||
|
||||
listView21.SetText(row, col, visdata.RID2);
|
||||
if (visdata.RID2.isEmpty() == false && visdata.RID.Equals(visdata.RID2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.SID2);
|
||||
if (visdata.SID2.isEmpty() == false && visdata.SID.Equals(visdata.SID2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
if (visdata.QTY2.Equals("0")) listView21.SetText(row, 1, string.Empty);
|
||||
else listView21.SetText(row, col, visdata.QTY2);
|
||||
if (visdata.QTY2.isEmpty() == false && visdata.QTY2.Equals("0") == false && visdata.QTY.Equals(visdata.QTY2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
|
||||
listView21.SetText(row, col, visdata.VNAME2);
|
||||
if (visdata.VNAME2.isEmpty() == false && visdata.VNAME.Equals(visdata.VNAME2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.VLOT2);
|
||||
if (visdata.VLOT2.isEmpty() == false && visdata.VLOT.Equals(visdata.VLOT2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.MFGDATE2);
|
||||
if (visdata.MFGDATE2.isEmpty() == false && visdata.MFGDATE.Equals(visdata.MFGDATE2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.PARTNO2);
|
||||
if (visdata.PARTNO2.isEmpty() == false && visdata.PARTNO.Equals(visdata.PARTNO2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
}
|
||||
catch { }
|
||||
|
||||
try
|
||||
{
|
||||
var visdata = PUB.Result.ItemDataC.VisionData;
|
||||
Color textColor = visdata.Confirm ? Color.Lime : Color.WhiteSmoke;
|
||||
|
||||
var row = 1;
|
||||
var col = 3;
|
||||
this.listView21.SetText(row, col, visdata.RID);
|
||||
if (visdata.RID_Trust)
|
||||
{
|
||||
if (visdata.RIDNew) //new reelid mode
|
||||
{
|
||||
listView21.SetColor(row++, col - 1, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.SetColor(row++, col - 1, 6);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.SetColor(row++, col - 1, 0);
|
||||
}
|
||||
|
||||
if (visdata.SID0.isEmpty())
|
||||
listView21.SetText(row, col, visdata.SID);
|
||||
else
|
||||
listView21.SetText(row, col, visdata.SID + "\n<< " + visdata.SID0);
|
||||
|
||||
listView21.SetColor(row++, col - 1, (ushort)(visdata.SID_Trust ? 6 : 0));
|
||||
|
||||
if (PUB.Result.ItemDataC.VisionData.QTYRQ)
|
||||
{
|
||||
listView21.SetText(row, col, "RQ:" + visdata.QTY);
|
||||
listView21.SetColor(row++, col - 1, 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (visdata.QTY.Equals("0")) listView21.SetText(row, col, string.Empty);
|
||||
else listView21.SetText(row, col, visdata.QTY);
|
||||
listView21.SetColor(row++, col - 1, (ushort)(visdata.QTY_Trust ? 6 : 0));
|
||||
}
|
||||
|
||||
listView21.SetText(row, col, visdata.VNAME); listView21.SetColor(row++, col - 1, (ushort)(visdata.VNAME_Trust ? 6 : 0));
|
||||
listView21.SetText(row, col, visdata.VLOT); listView21.SetColor(row++, col - 1, (ushort)(visdata.VLOT_Trust ? 6 : 0));
|
||||
listView21.SetText(row, col, visdata.MFGDATE); listView21.SetColor(row++, col - 1, (ushort)(visdata.MFGDATE_Trust ? 6 : 0));
|
||||
listView21.SetText(row, col, visdata.PARTNO); listView21.SetColor(row++, col - 1, (ushort)(visdata.PARTNO_Trust ? 6 : 0));
|
||||
|
||||
//lbSize1.Text = DIO.getCartSize(1) == eCartSize.None ? "?" : DIO.getCartSize(1).ToString();
|
||||
listView21.SetText(0, col, DIO.getCartSize(1) == eCartSize.None ? "?" : DIO.getCartSize(1).ToString());
|
||||
listView21.GetStyle(0, col - 1).ForeColor = AR.SETTING.Data.Detect_CartC ? Color.White : Color.Red;
|
||||
|
||||
listView21.SetText(row++, col, visdata.ReelSize == eCartSize.None ? "--" : visdata.ReelSize.ToString());
|
||||
|
||||
//Degree
|
||||
row++; //gridView2.setTitle(row++, 1, visdata.PARTNO);
|
||||
|
||||
//QR
|
||||
row++; //gridView2.setTitle(row++, 1, visdata.PARTNO);
|
||||
|
||||
//바코드수량
|
||||
//listView21.SetText(row, col-1, "BACD");
|
||||
listView21.SetText(row++, col, $"{visdata.barcodelist.Count}");
|
||||
|
||||
listView21.SetText(row, col - 1, "REGEX");
|
||||
listView21.SetText(row++, col, $"{PUB.Result.BCDPattern.Count}");
|
||||
|
||||
row++;//
|
||||
listView21.SetText(row, col - 1, "BATCH");
|
||||
listView21.SetText(row++, col, $"{visdata.BATCH}");
|
||||
|
||||
listView21.SetText(row, col - 1, "MAX");
|
||||
listView21.SetText(row++, col, $"{visdata.QTYMAX}");
|
||||
|
||||
var textcolor = visdata.Confirm ? 7 : 0;
|
||||
var crow = 1;
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
listView21.SetColor(crow++, 3, textcolor);
|
||||
|
||||
//arLabel25.ForeColor = textColor;
|
||||
//listView21.SetColor(2, 1, (visdata.QTYRQ ? 3 : 1));
|
||||
}
|
||||
catch { }
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
var row = 1;
|
||||
var col = 5;
|
||||
Class.VisionData visdata = PUB.Result.ItemDataR.VisionData;
|
||||
listView21.SetText(row++, col, visdata.RID);
|
||||
listView21.SetText(row++, col, visdata.SID);
|
||||
listView21.SetText(row++, col, visdata.QTY);
|
||||
listView21.SetText(row++, col, visdata.VNAME);
|
||||
listView21.SetText(row++, col, visdata.VLOT);
|
||||
listView21.SetText(row++, col, visdata.MFGDATE);
|
||||
listView21.SetText(row++, col, visdata.PARTNO);
|
||||
listView21.SetText(row++, col, visdata.ReelSize == eCartSize.None ? "--" : visdata.ReelSize.ToString());
|
||||
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_ENABLE_RIGHT) == false)
|
||||
{
|
||||
sbVisTitle2.Text = "DISABLE";
|
||||
sbVisTitle2.BackColor = Color.Orange;
|
||||
sbVisTitle2.BackColor2 = Color.Tomato;
|
||||
}
|
||||
else
|
||||
{
|
||||
listView21.SetText(0, col, DIO.getCartSize(2) == eCartSize.None ? "?" : DIO.getCartSize(2).ToString());
|
||||
}
|
||||
|
||||
|
||||
listView21.GetStyle(0, col).ForeColor = AR.SETTING.Data.Detect_CartR ? Color.White : Color.Red;
|
||||
//lbSize2.Text = DIO.getCartSize(2) == eCartSize.None ? "?" : DIO.getCartSize(2).ToString();
|
||||
//lbSize2.ForeColor = COMM.SETTING.Data.Detect_CartR ? Color.White : Color.Red;
|
||||
|
||||
listView21.SetText(row, col, visdata.RID2);
|
||||
if (visdata.RID2.isEmpty() == false && visdata.RID.Equals(visdata.RID2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.SID2);
|
||||
if (visdata.SID2.isEmpty() == false && visdata.SID.Equals(visdata.SID2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
if (visdata.QTY2.Equals("0")) listView21.SetColor(row, col, 0);
|
||||
else listView21.SetText(row, col, visdata.QTY2);
|
||||
if (visdata.QTY2.isEmpty() == false && visdata.QTY2.Equals("0") == false && visdata.QTY.Equals(visdata.QTY2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
|
||||
listView21.SetText(row, col, visdata.VNAME2);
|
||||
if (visdata.VNAME2.isEmpty() == false && visdata.VNAME.Equals(visdata.VNAME2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.VLOT2);
|
||||
if (visdata.VLOT2.isEmpty() == false && visdata.VLOT.Equals(visdata.VLOT2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.MFGDATE2);
|
||||
if (visdata.MFGDATE2.isEmpty() == false && visdata.MFGDATE.Equals(visdata.MFGDATE2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
|
||||
listView21.SetText(row, col, visdata.PARTNO2);
|
||||
if (visdata.PARTNO2.isEmpty() == false && visdata.PARTNO.Equals(visdata.PARTNO2) == false) listView21.SetColor(row++, col - 1, 2);
|
||||
else listView21.SetColor(row++, col - 1, 1);
|
||||
}
|
||||
catch { }
|
||||
|
||||
listView21.Invalidate();
|
||||
listView21.Refresh();
|
||||
|
||||
lbLock0.BackColor = l0 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(32, 32, 32);
|
||||
lbLock0.BackColor2 = l0 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(80, 80, 80);
|
||||
lbLock1.BackColor = l1 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(32, 32, 32);
|
||||
lbLock1.BackColor2 = l1 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(80, 80, 80);
|
||||
lbLock2.BackColor = l2 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(32, 32, 32);
|
||||
lbLock2.BackColor2 = l2 ? Color.FromArgb(0xff, 0x4c, 0x0e) : Color.FromArgb(80, 80, 80);
|
||||
|
||||
//display mesasge
|
||||
UpdateStatusMessage(); //left
|
||||
}
|
||||
}
|
||||
}
|
||||
63
Handler/Project/RunCode/Display/_Interval_500ms.cs
Normal file
63
Handler/Project/RunCode/Display/_Interval_500ms.cs
Normal file
@@ -0,0 +1,63 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
|
||||
void _Display_Interval_500ms()
|
||||
{
|
||||
|
||||
//홈진행중에는 모델쪽을 건드릴수 없게 한다
|
||||
toolStripButton7.Enabled = !PUB.sm.Step.ToString().StartsWith("HOME");
|
||||
//현재시간표시
|
||||
if (PUB.sm.Step == eSMStep.INIT)
|
||||
lbTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
else
|
||||
lbTime.Text = PUB.sm.UpdateTime.ToString("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
//키엔스 데이터를 바로 표시한다.
|
||||
tbBarcodeF.Text = KeyenceBarcodeDataF;
|
||||
tbBarcodeR.Text = KeyenceBarcodeDataR;
|
||||
|
||||
lbCntLeft.Text = $"{VAR.I32[eVarInt32.LPickOfCount]}";
|
||||
lbCntRight.Text = $"{VAR.I32[eVarInt32.RPickOfCount]}";
|
||||
lbCntPicker.Text = $"{VAR.I32[eVarInt32.PickOfCount]}";
|
||||
//lbCntPrnL.Text = $"{PUB.counter.CountPrintL}";
|
||||
//lbCnrPrnR.Text = $"{PUB.counter.CountPrintR}";
|
||||
|
||||
if (AR.SETTING.Data.Enable_SpeedLimit)
|
||||
grpProgress.Text = $"작업 수량(속도제한:{AR.SETTING.Data.LimitSpeed})";
|
||||
else
|
||||
grpProgress.Text = $"작업 수량";
|
||||
|
||||
//display Room Light
|
||||
btLightRoom.BackColor = DIO.GetIOOutput(eDOName.ROOMLIGHT) ? Color.Gold : SystemColors.Control;
|
||||
|
||||
//상태를 DB에 저장한다.
|
||||
EEMStatus.UpdateStatusSQL(PUB.sm.Step);
|
||||
|
||||
//컨베이어 가동시간계싼
|
||||
if(DIO.GetIOOutput(eDOName.LEFT_CONV) && VAR.TIME[eVarTime.CONVL_START].Year != 1982)
|
||||
{
|
||||
var t = (DateTime.Now - VAR.TIME[eVarTime.CONVL_START]).TotalSeconds;
|
||||
if (t > 999) t = 999;
|
||||
VAR.DBL[eVarDBL.CONVL_RUNTIME] = t;
|
||||
}
|
||||
|
||||
if (DIO.GetIOOutput(eDOName.RIGHT_CONV) && VAR.TIME[eVarTime.CONVR_START].Year != 1982)
|
||||
{
|
||||
var t = (DateTime.Now - VAR.TIME[eVarTime.CONVR_START]).TotalSeconds;
|
||||
if (t > 999) t = 999;
|
||||
VAR.DBL[eVarDBL.CONVR_RUNTIME] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
20
Handler/Project/RunCode/Display/_Interval_5min.cs
Normal file
20
Handler/Project/RunCode/Display/_Interval_5min.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
void _Display_Interval_5min()
|
||||
{
|
||||
//남은디스크확인
|
||||
PUB.CheckFreeSpace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
370
Handler/Project/RunCode/Display/_TMDisplay.cs
Normal file
370
Handler/Project/RunCode/Display/_TMDisplay.cs
Normal file
@@ -0,0 +1,370 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime tm500minute = DateTime.Now.AddDays(-1);
|
||||
DateTime tm250minute = DateTime.Now.AddDays(-1);
|
||||
DateTime tm1minute = DateTime.Now.AddDays(-1);
|
||||
DateTime tm5minute = DateTime.Now;
|
||||
Boolean displayOn = false;
|
||||
Boolean needShowSummary = false;
|
||||
|
||||
|
||||
private void _DisplayTimer(object sender, EventArgs e)
|
||||
{
|
||||
if (displayOn == false) displayOn = true;
|
||||
else
|
||||
{
|
||||
PUB.log.AddAT("Display Timer Overlab");// Console.WriteLine("display overlab");
|
||||
return;
|
||||
}
|
||||
|
||||
//lbOnline.Text = COMM.SETTING.Data.OnlineMode ? "ON-LINE" : "OFF-LINE";
|
||||
//lbOnline.ForeColor = COMM.SETTING.Data.OnlineMode ? Color.Black : Color.Red;
|
||||
//toolStripLabel1.Visible = Pub.Result.DryRun;
|
||||
//if(Pub.Result.DryRun)
|
||||
//{
|
||||
// if (toolStripLabel1.ForeColor == Color.Red) toolStripLabel1.ForeColor = Color.Black;
|
||||
// else toolStripLabel1.ForeColor = Color.Red;
|
||||
//}
|
||||
try
|
||||
{
|
||||
UpdateDisplayTimerData();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//작업수량 업데이트
|
||||
UpdateJobCount();
|
||||
|
||||
#region "250ms time 루틴"
|
||||
var ts250 = DateTime.Now - tm250minute;
|
||||
if (ts250.TotalMilliseconds >= 250)
|
||||
{
|
||||
_Display_Interval_250ms();
|
||||
tm250minute = DateTime.Now;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region "500ms time 루틴"
|
||||
var ts500 = DateTime.Now - tm500minute;
|
||||
if (ts500.TotalMilliseconds >= 500)
|
||||
{
|
||||
_Display_Interval_500ms();
|
||||
tm500minute = DateTime.Now;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region retgion"1분 time 루틴"
|
||||
var ts = DateTime.Now - tm1minute;
|
||||
if (ts.TotalMinutes >= 1)
|
||||
{
|
||||
//리셋카운트
|
||||
_Display_Interval_1min();
|
||||
tm1minute = DateTime.Now;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region retgion"5분 time 루틴"
|
||||
ts = DateTime.Now - tm5minute;
|
||||
if (ts.TotalMinutes >= 5)
|
||||
{
|
||||
//남은디스크확인
|
||||
_Display_Interval_5min();
|
||||
tm5minute = DateTime.Now;
|
||||
}
|
||||
#endregion
|
||||
|
||||
displayOn = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void UpdateDisplayTimerData()
|
||||
{
|
||||
if (PUB.sm.Step > eSMStep.INIT &&
|
||||
panTopMenu.Enabled == false) panTopMenu.Enabled = true;
|
||||
|
||||
//쓰레드로인해서 메인에서 진행하게한다. SPS는 메인쓰레드에서 진행 됨
|
||||
//팝을 제거 혹은 표시하는 기능
|
||||
if (PUB.popup.needShow) PUB.popup.showMessage();
|
||||
else if (PUB.popup.needClose) PUB.popup.Visible = false; // .setVision(false)();
|
||||
|
||||
|
||||
|
||||
////업로드화면을 표시해야하느 ㄴ경우
|
||||
if (needShowSummary)
|
||||
{
|
||||
ShowSummary();
|
||||
needShowSummary = false;
|
||||
}
|
||||
|
||||
//시스템 정보를 메인 UI에 표시한다
|
||||
UpdateLoaderDisplay();
|
||||
|
||||
|
||||
}
|
||||
void UpdateJobCount()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void UpdateLoaderDisplay()
|
||||
{
|
||||
hmi1.L_PICK_FW = DIO.GetIOInput(eDIName.L_PICK_FW); //피커의 실린더 전후진 상태
|
||||
hmi1.L_PICK_BW = DIO.GetIOInput(eDIName.L_PICK_BW); //피커의 실린더 전후진 상태
|
||||
hmi1.R_PICK_FW = DIO.GetIOInput(eDIName.R_PICK_FW); //피커의 실린더 전후진 상태
|
||||
hmi1.R_PICK_BW = DIO.GetIOInput(eDIName.R_PICK_BW); //피커의 실린더 전후진 상태
|
||||
|
||||
hmi1.PrintLPICK = DIO.GetIOInput(eDIName.L_PICK_VAC);
|
||||
hmi1.PrintRPICK = DIO.GetIOInput(eDIName.R_PICK_VAC);
|
||||
|
||||
hmi1.arJoystickGroup = PUB.Result.JoystickAxisGroup;
|
||||
hmi1.arJoystickOn = PUB.joystick.IsOpen;
|
||||
|
||||
hmi1.arPortLItemOn = PUB.flag.get(eVarBool.FG_PORTL_ITEMON);
|
||||
hmi1.arPortRItemOn = PUB.flag.get(eVarBool.FG_PORTR_ITEMON);
|
||||
|
||||
hmi1.arPLItemON = PUB.flag.get(eVarBool.FG_PL_ITEMON);
|
||||
hmi1.arPRItemON = PUB.flag.get(eVarBool.FG_PR_ITEMON);
|
||||
|
||||
hmi1.arFGVision0RDY = PUB.flag.get(eVarBool.FG_PRC_VISIONL);
|
||||
hmi1.arFGVision1RDY = false;// PUB.flag.get(eVarBool.RDY_VISION1);
|
||||
hmi1.arFGVision2RDY = PUB.flag.get(eVarBool.FG_PRC_VISIONR);
|
||||
|
||||
hmi1.arFGVision0END = PUB.flag.get(eVarBool.FG_END_VISIONL);
|
||||
hmi1.arFGVision1END = false;// PUB.flag.get(eVarBool.END_VISION1);
|
||||
hmi1.arFGVision2END = PUB.flag.get(eVarBool.FG_END_VISIONR);
|
||||
|
||||
hmi1.arFGPrinter0RDY = PUB.flag.get(eVarBool.FG_RUN_PRINTL);
|
||||
hmi1.arFGPrinter1RDY = PUB.flag.get(eVarBool.FG_RUN_PRINTR);
|
||||
|
||||
hmi1.arFGPrinter0END = PUB.flag.get(eVarBool.FG_OK_PRINTL);
|
||||
hmi1.arFGPrinter1END = PUB.flag.get(eVarBool.FG_OK_PRINTR);
|
||||
|
||||
hmi1.arMagnet0 = DIO.GetIOOutput(eDOName.CART_MAG0);
|
||||
hmi1.arMagnet1 = DIO.GetIOOutput(eDOName.CART_MAG1);
|
||||
hmi1.arMagnet2 = DIO.GetIOOutput(eDOName.CART_MAG2);
|
||||
|
||||
hmi1.arPickerSafeZone = DIO.GetIOInput(eDIName.PICKER_SAFE);
|
||||
|
||||
hmi1.arMotPosNamePX = MOT.GetPosName(eAxis.PX_PICK);
|
||||
hmi1.arMotPosNamePZ = MOT.GetPosName(eAxis.PZ_PICK);
|
||||
hmi1.arMotPosNameLM = MOT.GetPosName(eAxis.PL_MOVE);
|
||||
hmi1.arMotPosNameLZ = MOT.GetPosName(eAxis.PL_UPDN);
|
||||
hmi1.arMotPosNameRM = MOT.GetPosName(eAxis.PR_MOVE);
|
||||
hmi1.arMotPosNameRZ = MOT.GetPosName(eAxis.PR_UPDN);
|
||||
|
||||
hmi1.arMotILockPKX = PUB.iLock[(int)eAxis.PX_PICK].IsEmpty() == false;
|
||||
hmi1.arMotILockPKZ = PUB.iLock[(int)eAxis.PZ_PICK].IsEmpty() == false;
|
||||
hmi1.arMotILockPLM = PUB.iLock[(int)eAxis.PL_MOVE].IsEmpty() == false;
|
||||
hmi1.arMotILockPLZ = PUB.iLock[(int)eAxis.PL_UPDN].IsEmpty() == false;
|
||||
hmi1.arMotILockPRM = PUB.iLock[(int)eAxis.PR_MOVE].IsEmpty() == false;
|
||||
hmi1.arMotILockPRZ = PUB.iLock[(int)eAxis.PR_UPDN].IsEmpty() == false;
|
||||
|
||||
hmi1.arMotILockPRL = PUB.iLockPRL.IsEmpty() == false;
|
||||
hmi1.arMotILockPRR = PUB.iLockPRR.IsEmpty() == false;
|
||||
hmi1.arMotILockVS0 = PUB.iLockVS0.IsEmpty() == false;
|
||||
hmi1.arMotILockVS1 = PUB.iLockVS1.IsEmpty() == false;
|
||||
hmi1.arMotILockVS2 = PUB.iLockVS2.IsEmpty() == false;
|
||||
hmi1.arMotILockCVL = PUB.iLockCVL.IsEmpty() == false;
|
||||
hmi1.arMotILockCVR = PUB.iLockCVR.IsEmpty() == false;
|
||||
|
||||
hmi1.arIsRunning = PUB.sm.isRunning;
|
||||
hmi1.arUnloaderSeq = PUB.Result.UnloaderSeq;
|
||||
|
||||
//연결상태
|
||||
hmi1.arConn_MOT = PUB.mot.IsInit;
|
||||
hmi1.arConn_DIO = PUB.dio.IsInit;
|
||||
hmi1.arAIRDetect = DIO.GetIOInput(eDIName.AIR_DETECT);
|
||||
hmi1.arJobEND = PUB.flag.get(eVarBool.FG_JOB_END);
|
||||
hmi1.arConn_REM = PUB.remocon.IsOpen();
|
||||
|
||||
hmi1.arDI_Emergency = DIO.GetIOInput(eDIName.BUT_EMGF) == true;
|
||||
hmi1.arDI_SaftyOk = DIO.isSaftyDoorF();
|
||||
|
||||
hmi1.arVisionProcessL = PUB.flag.get(eVarBool.FG_PRC_VISIONL);
|
||||
hmi1.arVisionProcessC = false;// PUB.flag.get(eVarBool.RDY_VISION1);
|
||||
hmi1.arVisionProcessR = PUB.flag.get(eVarBool.FG_PRC_VISIONR);
|
||||
|
||||
try
|
||||
{
|
||||
hmi1.arVision_RID = PUB.Result.ItemDataC.VisionData.RID; //200925
|
||||
hmi1.arVision_SID = PUB.Result.ItemDataC.VisionData.SID; //200925
|
||||
hmi1.arVar_Picker[0].PortPos = PUB.Result.ItemDataL.PortPos; //200925
|
||||
}
|
||||
catch { }
|
||||
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
if (PUB.mot != null && PUB.mot.IsInit)
|
||||
{
|
||||
hmi1.arMOT_HSet[i] = PUB.mot.IsHomeSet(i);
|
||||
hmi1.arMOT_Alm[i] = PUB.mot.IsServAlarm(i);
|
||||
hmi1.arMOT_LimUp[i] = PUB.mot.IsLimitP(i);
|
||||
hmi1.arMOT_LimDn[i] = PUB.mot.IsLimitN(i);
|
||||
hmi1.arMOT_Origin[i] = PUB.mot.IsOrg(i);
|
||||
hmi1.arMOT_SVOn[i] = PUB.mot.IsServOn(i);
|
||||
}
|
||||
else
|
||||
{
|
||||
hmi1.arMOT_HSet[i] = false;
|
||||
hmi1.arMOT_Alm[i] = false;
|
||||
hmi1.arMOT_LimUp[i] = false;
|
||||
hmi1.arMOT_LimDn[i] = false;
|
||||
hmi1.arMOT_Origin[i] = false;
|
||||
hmi1.arMOT_SVOn[i] = false;
|
||||
}
|
||||
}
|
||||
|
||||
//포트 리밋센서
|
||||
hmi1.arVar_Port[0].LimitLower = DIO.GetIOInput(eDIName.PORTL_LIM_DN); //front-left
|
||||
hmi1.arVar_Port[0].LimitUpper = DIO.GetIOInput(eDIName.PORTL_LIM_UP);
|
||||
hmi1.arVar_Port[0].DetectUp = DIO.GetIOInput(eDIName.PORTL_DET_UP);
|
||||
hmi1.arVar_Port[0].SaftyErr = !DIO.isSaftyDoorF(0, false);
|
||||
hmi1.arVar_Port[0].reelCount = PUB.counter.CountP0;
|
||||
hmi1.arVar_Port[0].CartSize = (int)DIO.getCartSize(0);
|
||||
|
||||
hmi1.arVar_Port[1].LimitLower = DIO.GetIOInput(eDIName.PORTC_LIM_DN); //front-right
|
||||
hmi1.arVar_Port[1].LimitUpper = DIO.GetIOInput(eDIName.PORTC_LIM_UP);
|
||||
hmi1.arVar_Port[1].DetectUp = DIO.GetIOInput(eDIName.PORTC_DET_UP);
|
||||
hmi1.arVar_Port[1].SaftyErr = !DIO.isSaftyDoorF(1, false);
|
||||
hmi1.arVar_Port[1].reelCount = PUB.counter.CountP1;
|
||||
hmi1.arVar_Port[1].CartSize = (int)DIO.getCartSize(1);
|
||||
|
||||
hmi1.arVar_Port[2].LimitLower = DIO.GetIOInput(eDIName.PORTR_LIM_DN); //front-left
|
||||
hmi1.arVar_Port[2].LimitUpper = DIO.GetIOInput(eDIName.PORTR_LIM_UP);
|
||||
hmi1.arVar_Port[2].DetectUp = DIO.GetIOInput(eDIName.PORTR_DET_UP);
|
||||
hmi1.arVar_Port[2].SaftyErr = !DIO.isSaftyDoorF(2, false);
|
||||
hmi1.arVar_Port[2].reelCount = PUB.counter.CountP2;
|
||||
hmi1.arVar_Port[2].CartSize = (int)DIO.getCartSize(2);
|
||||
|
||||
hmi1.arCountPrint0 = PUB.counter.CountPrintL;
|
||||
hmi1.arCountPrint1 = PUB.counter.CountPrintR;
|
||||
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor])
|
||||
{
|
||||
hmi1.arVar_Port[0].reelCount = VAR.I32[eVarInt32.LEFT_ITEM_COUNT];
|
||||
hmi1.arVar_Port[2].reelCount = VAR.I32[eVarInt32.RIGT_ITEM_COUNT];
|
||||
}
|
||||
|
||||
hmi1.arCountV1 = PUB.counter.CountV1;
|
||||
hmi1.arCountV0 = PUB.counter.CountV0;
|
||||
hmi1.arCountV2 = PUB.counter.CountV2;
|
||||
|
||||
//피커 백큠감지 상태(Front)
|
||||
hmi1.arVar_Picker[0].VacOutput[0] = DIO.GetIOOutput(eDOName.PICK_VAC1);
|
||||
hmi1.arVar_Picker[0].VacOutput[1] = DIO.GetIOOutput(eDOName.PICK_VAC2);
|
||||
hmi1.arVar_Picker[0].VacOutput[2] = DIO.GetIOOutput(eDOName.PICK_VAC3);
|
||||
hmi1.arVar_Picker[0].VacOutput[3] = DIO.GetIOOutput(eDOName.PICK_VAC4);
|
||||
hmi1.arVar_Picker[0].ItemOn = PUB.flag.get(eVarBool.FG_PK_ITEMON);
|
||||
}
|
||||
|
||||
|
||||
Color StatusBackColor = Color.FromArgb(150, 150, 150);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 상태표시라벨의 진행값을 변경 합니다
|
||||
/// </summary>
|
||||
/// <param name="idx"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <param name="max"></param>
|
||||
/// <param name="title"></param>
|
||||
void SetStatusProgress(double value, string title, double max = 0, Color? textColor = null, Color? shadowColor = null)
|
||||
{
|
||||
arCtl.arLabel lbl = lbMsg;//idx == 0 ? lbMsgL : (idx == 1 ? lbMsgC : (idx == 2 ? lbMsgR : lbMsg));
|
||||
|
||||
if (lbl.ProgressEnable == false) lbl.ProgressEnable = true;
|
||||
if (lbl.ProgressValue != value) lbl.ProgressValue = (float)value;
|
||||
if (lbl.Text != title) lbl.Text = title;
|
||||
|
||||
if (max != 0)
|
||||
{
|
||||
if (lbl.ProgressMax != max) lbl.ProgressMax = (float)max;
|
||||
}
|
||||
if (textColor != null)
|
||||
{
|
||||
if (lbl.ProgressForeColor != textColor) lbl.ProgressForeColor = (Color)textColor;
|
||||
}
|
||||
if (shadowColor != null)
|
||||
{
|
||||
if (lbl.ShadowColor != shadowColor) lbl.ShadowColor = (Color)shadowColor;
|
||||
}
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// 상태표시라벨의 메세지를 변경 합니다
|
||||
///// </summary>
|
||||
///// <param name="idx"></param>
|
||||
///// <param name="dispmsg"></param>
|
||||
///// <param name="bColor"></param>
|
||||
///// <param name="bColor2"></param>
|
||||
///// <param name="fcolor"></param>
|
||||
///// <param name="shadow"></param>
|
||||
///// <param name="blank"></param>
|
||||
//void SetStatusMessage(string dispmsg, Color bColor, Color bColor2, Color fcolor, Color? shadow = null, Boolean blank = false)
|
||||
//{
|
||||
// arCtl.arLabel lbl = lbMsg;//idx == 0 ? lbMsgL : (idx == 1 ? lbMsgC : (idx == 2 ? lbMsgR : lbMsg));
|
||||
// if (shadow == null) shadow = Color.Transparent;
|
||||
// if (lbl.ProgressValue != 0 || dispmsg != lbl.Text || lbl.ForeColor != fcolor || lbl.ShadowColor != (Color)shadow || (lbl.BackColor != bColor && lbl.BackColor2 != bColor))
|
||||
// {
|
||||
// lbl.ProgressValue = 0;
|
||||
// lbl.BackColor = bColor;
|
||||
// lbl.BackColor2 = bColor2;
|
||||
// lbl.ForeColor = fcolor;
|
||||
// lbl.ShadowColor = (Color)shadow;
|
||||
// lbl.Text = dispmsg;
|
||||
// if (blank) lbl.Tag = "BLINK";
|
||||
// else lbl.Tag = null;
|
||||
// }
|
||||
//}
|
||||
|
||||
void SetStatusMessage(string dispmsg, Color fcolor, Color backcolor, Color? backColor2 = null, Color? shadow = null, Boolean blank = false)
|
||||
{
|
||||
arCtl.arLabel lbl = lbMsg;//idx == 0 ? lbMsgL : (idx == 1 ? lbMsgC : (idx == 2 ? lbMsgR : lbMsg));
|
||||
|
||||
if (shadow == null) shadow = Color.Transparent;
|
||||
if (backColor2 == null) backColor2 = backcolor;
|
||||
|
||||
var bg1ok = lbl.BackColor == backcolor && lbl.BackColor2 == backColor2;
|
||||
var bg2ok = lbl.BackColor2 == backcolor && lbl.BackColor == backColor2;
|
||||
|
||||
|
||||
if (lbl.ProgressValue != 0 || dispmsg != lbl.Text ||
|
||||
lbl.ForeColor != fcolor || lbl.ShadowColor != (Color)shadow || (bg1ok == false && bg2ok == false))
|
||||
{
|
||||
lbl.ProgressValue = 0;
|
||||
lbl.BackColor = backcolor;
|
||||
lbl.BackColor2 = (Color)backColor2;
|
||||
|
||||
lbl.ForeColor = fcolor;
|
||||
lbl.ShadowColor = (Color)shadow;
|
||||
lbl.Text = dispmsg;
|
||||
if (blank) lbl.Tag = "BLINK";
|
||||
else lbl.Tag = null;
|
||||
}
|
||||
else if (lbl.ProgressEnable)
|
||||
{
|
||||
lbl.ProgressEnable = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
208
Handler/Project/RunCode/Display/_UpdateStatusMessage.cs
Normal file
208
Handler/Project/RunCode/Display/_UpdateStatusMessage.cs
Normal file
@@ -0,0 +1,208 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 상태표시라벨의 메세지 자동 변경
|
||||
/// </summary>
|
||||
/// <param name="idx"></param>
|
||||
void UpdateStatusMessage()
|
||||
{
|
||||
arCtl.arLabel lbl = lbMsg;
|
||||
|
||||
//메세지창이 깜박거려야하는 상황 체크
|
||||
if (lbl.Tag != null && lbl.Tag.ToString() == "BLINK")
|
||||
{
|
||||
var bg1 = lbl.BackColor;
|
||||
var bg2 = lbl.BackColor2;
|
||||
lbl.BackColor = bg2;
|
||||
lbl.BackColor2 = bg1;
|
||||
lbl.Invalidate();
|
||||
}
|
||||
|
||||
if (PUB.sm.Step == eSMStep.INIT)
|
||||
{
|
||||
SetStatusMessage("초기화 작업 중", Color.White, Color.FromArgb(0x38, 0x4d, 0x9d));
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.IDLE)
|
||||
{
|
||||
//각종 IO확인하여 에러메세지 표시한다
|
||||
|
||||
var msg = string.Empty;
|
||||
bool errst = true;
|
||||
if (PUB.mot.IsInit == false) msg = "모션 카드 준비 안됨";
|
||||
else if (PUB.dio.IsInit == false) msg = "I/O 카드 준비 안됨";
|
||||
else if (PUB.dio.HasDIOn == false) msg = "전원 확인 필요 (입력포트 감지 안됨)";
|
||||
else if (PUB.mot.HasServoAlarm == true) msg = "서보 알람 발생";
|
||||
else if (PUB.mot.HasHoming == true) msg = "홈 검색 진행 중";
|
||||
else if (PUB.mot.HasServoOff == true) msg = "서보 OFF 발생";
|
||||
else if (DIO.GetIOOutput(eDOName.SOL_AIR) == false) msg = "AIR 출력 안됨(전면 청색 AIR버튼을 누르세요)";
|
||||
else if (DIO.GetIOInput(eDIName.AIR_DETECT) == false) msg = "AIR 감지 안됨";
|
||||
else if (PUB.mot.HasHomeSetOff == true)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
msg = "피커(X)축을 중앙으로 옮겨주세요 (기능-관리화면)";
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = "홈 검색이 필요 합니다";
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
var limport = new List<string>();
|
||||
if (PUB.mot.HasLimitError == true)
|
||||
{
|
||||
for (int i = 0; i < PUB.system.MotaxisCount; i++)
|
||||
{
|
||||
if (PUB.mot.IsUse(i) == false) continue;
|
||||
if (PUB.mot.IsLimitN(i))
|
||||
{
|
||||
var useOrgSensor = PUB.system_mot.GetUseOrigin;
|
||||
if (useOrgSensor[i] == true) limport.Add(i.ToString());
|
||||
}
|
||||
else if (PUB.mot.IsLimitP(i))
|
||||
limport.Add(i.ToString());
|
||||
else if (PUB.mot.IsLimitSWN(i))
|
||||
limport.Add(i.ToString());
|
||||
else if (PUB.mot.IsLimitSWP(i))
|
||||
limport.Add(i.ToString());
|
||||
}
|
||||
}
|
||||
if (limport.Any())
|
||||
{
|
||||
msg = "서보 LIMIT 알람 발생(Ax:" + string.Join(",", limport) + ")";
|
||||
}
|
||||
else
|
||||
{
|
||||
msg = "작업을 시작 하려면 START를 누르세요";
|
||||
errst = false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (errst)
|
||||
{
|
||||
SetStatusMessage(msg, Color.White, Color.Red, Color.IndianRed, Color.DimGray, blank: true);
|
||||
}
|
||||
else
|
||||
{
|
||||
Color fColor = Color.FromArgb(200, 200, 200);
|
||||
Color bColor1 = Color.DimGray;
|
||||
Color bColor2 = Color.DarkGray;
|
||||
|
||||
SetStatusMessage(msg, Color.Lime, bColor1, bColor2, Color.Black, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if (PUB.sm.Step == eSMStep.WAITSTART)
|
||||
{
|
||||
SetStatusMessage("[시작 대기] ", Color.Gold, Color.FromArgb(50, 50, 50));
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.ERROR)
|
||||
{
|
||||
var msglis = PUB.Result.ResultMessage.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
SetStatusMessage($"{msglis[0]}", Color.White, Color.Red);
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.PAUSE)
|
||||
{
|
||||
SetStatusMessage("[일시 정지] ", Color.Gold, Color.FromArgb(50, 50, 50));
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.HOME_FULL)// || Pub.sm.Step == eSMStep.QHOME)
|
||||
{
|
||||
SetStatusMessage($"전체 모션의 원점을 확인하고 있습니다", Color.White, Color.FromArgb(0x98, 0x79, 0xd0), shadow: Color.DimGray);
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.HOME_DELAY)// || Pub.sm.Step == eSMStep.QHOME)
|
||||
{
|
||||
SetStatusMessage($"잠시만 기다려 주세요(홈 진행 중)", Color.White, Color.FromArgb(0x98, 0x79, 0xd0), shadow: Color.DimGray);
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.HOME_CONFIRM)// || Pub.sm.Step == eSMStep.QHOME)
|
||||
{
|
||||
SetStatusMessage($"홈 작업을 완료 하는 중", Color.White, Color.FromArgb(0x98, 0x79, 0xd0), shadow: Color.DimGray);
|
||||
}
|
||||
else if (PUB.sm.Step == eSMStep.RUN)
|
||||
{
|
||||
|
||||
double cur = PUB.sm.seq.GetTime(PUB.sm.Step).TotalSeconds;
|
||||
double max = AR.SETTING.Data.Timeout_StepMaxTime;
|
||||
string msg = $"진행 중";
|
||||
Color fColor = Color.Gold;
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_JOB_END))
|
||||
{
|
||||
msg = "로더가 비어 있습니다. 잠시 후 작업이 완료 됩니다";
|
||||
cur = max = 0;
|
||||
fColor = Color.Lime;
|
||||
|
||||
}
|
||||
else if (PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO))
|
||||
{
|
||||
msg = "사용자 정보 입력을 기다리고 있습니다";
|
||||
cur = 100;
|
||||
max = 100;
|
||||
}
|
||||
else //if (PUB.flag.get(eVarBool.RDY_VISION1) == true && PUB.flag.get(eVarBool.RDY_PORT_PC) == true && idx == 9)
|
||||
{
|
||||
msg = "작업 중";
|
||||
if (PUB.flag.get(eVarBool.FG_PRC_VISIONL) && PUB.flag.get(eVarBool.FG_END_VISIONL) == false)
|
||||
msg += "(LEFT-QR검증중)";
|
||||
if (PUB.flag.get(eVarBool.FG_PRC_VISIONR) && PUB.flag.get(eVarBool.FG_END_VISIONR) == false)
|
||||
msg += "(RIGHT-QR검증중)";
|
||||
|
||||
//컨베이어 사용모드에서 컨베이어 인터락 검사
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor])
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.R_CONV1) || DIO.GetIOInput(eDIName.R_CONV4))
|
||||
{
|
||||
if (PUB.iLockCVR.IsEmpty() == false)
|
||||
msg += "(우측컨베이어 인터락 해제 대기)";
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.L_CONV1) || DIO.GetIOInput(eDIName.L_CONV4))
|
||||
{
|
||||
if (PUB.iLockCVL.IsEmpty() == false)
|
||||
msg += "(좌측컨베이어 인터락 해제 대기)";
|
||||
}
|
||||
}
|
||||
|
||||
cur = VAR.TIME.RUN((int)eVarTime.LIVEVIEW1).TotalSeconds;
|
||||
max = AR.SETTING.Data.Timeout_VisionProcessL / 1000.0;
|
||||
}
|
||||
//else if (PUB.flag.get(eVarBool.RDY_ZL_PICKON))
|
||||
//{
|
||||
// var ts = DateTime.Now - Pub.GetVarTime(eVarTime.JOB_END);
|
||||
// msg = string.Format("UNLOADER PICK ON #{0}", PUB.sm.seq.Get(step));
|
||||
// cur = Pub.getRunSteptime(0).TotalSeconds;//ts.TotalSeconds;
|
||||
// max = 10;//COMM.SETTING.Data.Timeout_JOBEnd;
|
||||
//}
|
||||
//else if (PUB.mot.IsMotion((int)eAxis.Y_PICKER])
|
||||
//{
|
||||
// msg = string.Format("이동 중");
|
||||
// cur = 0;// Pub.getRunSteptime(0).TotalSeconds;// ts.TotalSeconds;
|
||||
// max = 10;//COMM.SETTING.Data.Timeout_JOBEnd;
|
||||
//}
|
||||
SetStatusProgress(cur, msg, max, fColor, Color.FromArgb(50, 50, 50));
|
||||
}
|
||||
else if (PUB.flag.get(eVarBool.FG_MOVE_PICKER))
|
||||
{
|
||||
SetStatusMessage("X축을 버튼으로 이동 가능 합니다", Color.Black, Color.White);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetStatusMessage("[" + PUB.sm.Step.ToString() + "]", Color.Red, Color.White);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
64
Handler/Project/RunCode/Main/_SM_MAIN_ERROR.cs
Normal file
64
Handler/Project/RunCode/Main/_SM_MAIN_ERROR.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
private void _SM_MAIN_ERROR(Boolean isFirst, eSMStep Step, TimeSpan StepTime)
|
||||
{
|
||||
//모션의 위치를 저장해준다. - 재시작시 변경이 잇다면 오류로 처리한다
|
||||
for (int i = 0; i < PUB.mot.DeviceCount; i++)
|
||||
PUB.Result.PreventMotionPosition[i] = PUB.mot.GetLastCmdPos(i);
|
||||
|
||||
var errorMessage = string.Empty;
|
||||
|
||||
//에러메세지가 있는 경우에만 표시함
|
||||
if (PUB.Result.ResultCode != eResult.NOERROR && PUB.Result.ResultMessage != "")
|
||||
errorMessage += PUB.Result.ResultMessage;
|
||||
|
||||
//에러메세지가 있는 경우에만 표시함
|
||||
if (errorMessage != "")
|
||||
{
|
||||
//사용자 값 입력창에서는 오류를 표시하지않는다
|
||||
if (Step == eSMStep.PAUSE && PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO))
|
||||
PUB.log.Add("바코드정보입력창이라 일시중지 메세지를 표시하지 않음");
|
||||
else
|
||||
PUB.popup.setMessage(errorMessage);
|
||||
}
|
||||
|
||||
|
||||
if (Step == eSMStep.EMERGENCY)
|
||||
{
|
||||
PUB.log.AddE("Enter Emergency Step");
|
||||
}
|
||||
else if (Step == eSMStep.PAUSE)
|
||||
{
|
||||
PUB.log.AddE("Enter Pause Step 1 : " + PUB.Result.ResultMessage);
|
||||
}
|
||||
else
|
||||
{
|
||||
//홈 검색실패로 인해 멈췄다면 모든 축을 멈춘다
|
||||
if (Step == eSMStep.ERROR && PUB.Result.ResultCode == eResult.SAFTY)
|
||||
PUB.mot.MoveStop("홈검색 실패");
|
||||
|
||||
PUB.log.AddE(string.Format("Enter Error Step 1 : {0}", PUB.Result.ResultMessage));
|
||||
}
|
||||
|
||||
//lbMsgR.ProgressEnable = false;
|
||||
|
||||
DIO.SetBuzzer(true);
|
||||
DIO.SetPortMotor(0, eMotDir.CW, false, "ERROR");
|
||||
DIO.SetPortMotor(1, eMotDir.CW, false, "ERROR");
|
||||
DIO.SetPortMotor(2, eMotDir.CW, false, "ERROR");
|
||||
|
||||
//컨베어멈춤
|
||||
DIO.SetOutput(AR.eDOName.LEFT_CONV, false);
|
||||
DIO.SetOutput(AR.eDOName.RIGHT_CONV, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
157
Handler/Project/RunCode/RunSequence/0_RUN_STARTCHK_SW.cs
Normal file
157
Handler/Project/RunCode/RunSequence/0_RUN_STARTCHK_SW.cs
Normal file
@@ -0,0 +1,157 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
async public Task<bool> _SM_RUN_STARTCHKSW(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
var mc = PUB.Result.mModel;
|
||||
var mv = PUB.Result.vModel;
|
||||
|
||||
double free = 0;
|
||||
var savepath = PUB.getSavePath(out free);
|
||||
if (free < 3.0)
|
||||
{
|
||||
string msg = "FREE SPACE ERROR\n" +
|
||||
"디스크 공간(3%)이 부족하여 작업을 진행할 수 없습니다\n" +
|
||||
"저장경로 : {0}\n" +
|
||||
"데이터를 삭제하거나 설정의 삭제주기를 확인하세요";
|
||||
msg = string.Format(msg, AR.SETTING.Data.Path_Data);
|
||||
PUB.popup.setMessage(msg);
|
||||
DIO.SetBuzzer(true);
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (PUB.Result.isSetmModel == false)
|
||||
{
|
||||
string msg = "모션모델이 선택되지 않았습니다\n작업모델의 'MOTION'항목을 확인하세요";
|
||||
PUB.popup.setMessage(msg);
|
||||
DIO.SetBuzzer(true);
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//모션의 모든 위치가 원점이 아니라면 홈 초기화를 요청한다.
|
||||
var initMsg = "";
|
||||
|
||||
if (initMsg != "")
|
||||
{
|
||||
PUB.popup.setMessage(initMsg);
|
||||
DIO.SetBuzzer(true);
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return false;
|
||||
}
|
||||
|
||||
//모델정보가 설정되어있는지 확인
|
||||
if (PUB.Result == null ||
|
||||
PUB.Result.vModel == null ||
|
||||
PUB.Result.vModel.Title.isEmpty())
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELV, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//모션모델자동선택 230823
|
||||
var motionmode = VAR.BOOL[eVarBool.Use_Conveyor] ? "Conveyor" : "Default";
|
||||
if (PUB.SelectModelM(motionmode) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELM, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//모델정보가 설정되어있는지 확인
|
||||
if (PUB.Result == null ||
|
||||
PUB.Result.mModel == null ||
|
||||
PUB.Result.mModel.Title.isEmpty())
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELM, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//ECS데이터확인 230823
|
||||
var conv = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
if (conv)
|
||||
{
|
||||
var sidinfo = await PUB.UpdateSIDInfoByECS();
|
||||
var systembypass = SETTING.Data.SystemBypass;
|
||||
if (systembypass == false && sidinfo.Item1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOECSDATA, eNextStep.ERROR, sidinfo.Item2);
|
||||
return false;
|
||||
}
|
||||
//else if (systembypass == false && sidinfo.Item3 < 1)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOECSDATAACTIVE, eNextStep.ERROR, sidinfo.Item2);
|
||||
// return false;
|
||||
//}
|
||||
}
|
||||
|
||||
//SID변환정보 필요 230823
|
||||
//이값도 테이블에서 실시간으로 조회되므로 미리 불러올 필요 없다
|
||||
|
||||
//사용자추가정보 필요 230823
|
||||
//기존에 사용하던 사용자 추가 정보
|
||||
//ECS정보가 수신되면 기존 TABLE 을 삭제하는 구조이므로 병행할수 없음
|
||||
//데이터는 테이블에서 실시간으로 조 회됨
|
||||
|
||||
//사용자스텝실행
|
||||
if (PUB.flag.get(eVarBool.FG_USERSTEP))
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_USERSTEP, false, "STACHKSW");
|
||||
PUB.log.AddI("작업 시작으로 인해 H/W검사 무시기능을 해제 함");
|
||||
}
|
||||
|
||||
//공용변수초기화
|
||||
PUB.log.Add("공용변수(카운트)값 초기화");
|
||||
VAR.I32.Clear((int)eVarInt32.LPickOfCount);
|
||||
VAR.I32.Clear((int)eVarInt32.LPickOnCount);
|
||||
VAR.I32.Clear((int)eVarInt32.RPickOfCount);
|
||||
VAR.I32.Clear((int)eVarInt32.RPickOnCount);
|
||||
VAR.I32.Clear((int)eVarInt32.PickOfCount);
|
||||
VAR.I32.Clear((int)eVarInt32.PickOnCount);
|
||||
VAR.I32.Clear((int)eVarInt32.PickOnRetry); //221102
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_LEFT, false, "POSREST");
|
||||
PUB.flag.set(eVarBool.FG_RUN_RIGHT, false, "POSREST");
|
||||
|
||||
VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] = false;
|
||||
|
||||
|
||||
PUB.Result.ItemDataL.Clear("START_CHKSW");
|
||||
PUB.Result.ItemDataC.Clear("START_CHKSW");
|
||||
PUB.Result.ItemDataR.Clear("START_CHKSW");
|
||||
|
||||
var modelName = PUB.Result.vModel.Title;
|
||||
PUB.Result.BCDPattern = PUB.GetPatterns(modelName, false);
|
||||
PUB.Result.BCDIgnorePattern = PUB.GetPatterns(modelName, true);
|
||||
PUB.Result.BCDPrintPattern = PUB.GetPrintPatterns();
|
||||
PUB.log.Add($"모델패턴로딩:{PUB.Result.BCDPattern.Count}/{PUB.Result.BCDIgnorePattern.Count}");
|
||||
|
||||
//변환SID SID확인여부데이터 삭제
|
||||
PUB.Result.DTSidConvertEmptyList.Clear();
|
||||
PUB.Result.DTSidConvertMultiList.Clear();
|
||||
|
||||
PUB.Result.JobStartTime = DateTime.Now;
|
||||
warninactivelist.Clear();
|
||||
|
||||
//작업락기능해제
|
||||
LockPK.Set();
|
||||
LockUserL.Set();
|
||||
LockUserR.Set();
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
177
Handler/Project/RunCode/RunSequence/1_RUN_STARTCHK_HW.cs
Normal file
177
Handler/Project/RunCode/RunSequence/1_RUN_STARTCHK_HW.cs
Normal file
@@ -0,0 +1,177 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 장치의 초기화 여부를 우선 체크 한다.
|
||||
/// 장치에 문제가 있는 경우에는 ERROR상황으로 뺀다
|
||||
/// ERROR 상황은 RESET 시 IDLE로 전환된다.
|
||||
/// 복구불가능한 오류 상황이다.
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="isFirst"></param>
|
||||
/// <param name="stepTime"></param>
|
||||
/// <returns></returns>
|
||||
public Boolean _SM_RUN_STARTCHKHW(bool isFirst, TimeSpan stepTime)
|
||||
{
|
||||
var mc = PUB.Result.mModel;
|
||||
var mv = PUB.Result.vModel;
|
||||
|
||||
//최초시작이므로 - 셔틀2의 안전위치 이동 플래그를 OFF해준다.
|
||||
|
||||
//장치초기화 확인
|
||||
if (PUB.mot.IsInit == false || PUB.dio.IsInit == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AZJINIT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//서보 off 상태 확인
|
||||
if (PUB.mot.HasServoOff)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_SVOFF, eNextStep.ERROR);//, msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
//홈 검색완료 체크1
|
||||
if (PUB.mot.HasHomeSetOff)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//air확인
|
||||
if (DIO.GetIOOutput(eDOName.SOL_AIR) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SENSOR, eECode.AIRNOOUT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//카메라초기화체크(초기화가 오래걸려서 쓰레드분리함) - 201229
|
||||
if (VAR.BOOL[eVarBool.Opt_DisableCamera] == false && AR.SETTING.Data.Enable_Unloader_QRValidation && PUB.flag.get(eVarBool.FG_RDY_CAMERA_L) == false && AR.SETTING.Data.Disable_Left == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.CAM_LEFT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (VAR.BOOL[eVarBool.Opt_DisableCamera] == false && AR.SETTING.Data.Enable_Unloader_QRValidation && PUB.flag.get(eVarBool.FG_RDY_CAMERA_R) == false && AR.SETTING.Data.Disable_Right == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.CAM_RIGHT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//안전위치 센서가 안들어와잇으면 오류 처리한다
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.NEED_JOBCANCEL, eNextStep.ERROR, eAxis.PL_MOVE, PUB.mot.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
|
||||
//프린터확인
|
||||
if (PUB.flag.get(eVarBool.FG_INIT_PRINTER) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTER, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//부착 실린더 위치 확인
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.L_CYLUP) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTER_LPRINTER_NOUP, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_CYLUP) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTER_RPRINTER_NOUP, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//부착 실린더 위치 확인
|
||||
if (DIO.GetIOInput(eDIName.L_PICK_BW) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTER_LPICKER_NOBW, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_PICK_BW) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTER_RPICKER_NOBW, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//컨베이어 모드에서 컨베이어에 릴이 감지되면 시작하지 못한다
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor])
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.L_CONV1))
|
||||
{
|
||||
//감지되면 안된다
|
||||
var ssname = $"X{eDIName.L_CONV1}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.LCONVER_REEL_DECTECT_ALL, eNextStep.ERROR, ssname);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DIO.GetIOInput(eDIName.R_CONV1) ||
|
||||
DIO.GetIOInput(eDIName.R_CONV4))
|
||||
{
|
||||
//감지되면 안된다
|
||||
var ssname = $"X{eDIName.R_CONV1}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.RCONVER_REEL_DECTECT_ALL, eNextStep.ERROR, ssname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
////카메라체크
|
||||
//for (int i = 0; i < _isCrevisOpen.Length; i++)
|
||||
//{
|
||||
// if (COMM.SETTING.Data.DisableCamera(i) == true)
|
||||
// {
|
||||
// PUB.log.AddAT($"카메라({i})번 비활성 됨(환경설정)");
|
||||
// }
|
||||
// else if (_isCrevisOpen[i] == false)
|
||||
// {
|
||||
// if (i == 0 && COMM.SETTING.Data.DisableCamera0 == false && COMM.SETTING.Data.Disable_Left == false)
|
||||
// {
|
||||
// PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.VISION_NOCONN, eNextStep.ERROR, i);
|
||||
// return false;
|
||||
// }
|
||||
// if (i == 2 && COMM.SETTING.Data.DisableCamera2 == false && COMM.SETTING.Data.Disable_Right == false)
|
||||
// {
|
||||
// PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.VISION_NOCONN, eNextStep.ERROR, i);
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//트리거 OFF작업
|
||||
WS_Send(eWorkPort.Left, PUB.wsL, "", "OFF", "");
|
||||
WS_Send(eWorkPort.Right, PUB.wsR, "", "OFF", "");
|
||||
|
||||
var systembypassmode = SETTING.Data.SystemBypass;
|
||||
|
||||
//바코드설정업데이트
|
||||
if (systembypassmode == false)
|
||||
{
|
||||
var k1 = PUB.UpLoadBarcodeConfig(PUB.keyenceF);
|
||||
var k2 = PUB.UpLoadBarcodeConfig(PUB.keyenceR);
|
||||
if (k1 == false && k2 == false) //결과확인하도록함 230511
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.CONFIG_KEYENCE, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
1114
Handler/Project/RunCode/RunSequence/2_RUN_ROOT_SEQUENCE.cs
Normal file
1114
Handler/Project/RunCode/RunSequence/2_RUN_ROOT_SEQUENCE.cs
Normal file
File diff suppressed because it is too large
Load Diff
667
Handler/Project/RunCode/RunSequence/3_KEYENCE_READ.cs
Normal file
667
Handler/Project/RunCode/RunSequence/3_KEYENCE_READ.cs
Normal file
@@ -0,0 +1,667 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using Project.Class;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public enum EResultKeyence
|
||||
{
|
||||
Wait = 0,
|
||||
Complete,
|
||||
TimeOut,
|
||||
}
|
||||
public EResultKeyence KEYENCE_READ(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var itemC = PUB.Result.ItemDataC;
|
||||
if (PUB.sm.getNewStep != eSMStep.RUN) return EResultKeyence.Wait;
|
||||
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = PUB.OPT_BYPASS();
|
||||
|
||||
//데이터가 완료되었는지 확인
|
||||
if (itemC.VisionData.Confirm)
|
||||
{
|
||||
PUB.log.AddAT("비젼 데이터 완료로 인해 바코드 메세지를 제거 합니다");
|
||||
itemC.VisionData.bcdMessage.Clear();
|
||||
return EResultKeyence.Complete;
|
||||
}
|
||||
|
||||
//사용자 입력 대기중이면 아에 처리하지 않는다 210203
|
||||
if (PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO) == true)
|
||||
{
|
||||
PUB.WaitMessage[1] = "Wait for User Confirm Interface";
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.Result.DryRun)
|
||||
{
|
||||
PUB.log.Add($"[{target}] DRY-RUN 으로 인한 완료");
|
||||
SetDryrunData();
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.logDbg.Add($"[{target}] 키엔스 읽기 시작");
|
||||
if (PUB.keyenceF != null) PUB.keyenceF.Trigger(true);
|
||||
if (PUB.keyenceR != null) PUB.keyenceR.Trigger(true);
|
||||
}
|
||||
|
||||
VAR.BOOL[eVarBool.Need_UserConfirm_Data] = false;
|
||||
VAR.TIME.Update(eVarTime.KEYENCEWAIT);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//아무것도안함
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 키엔스데이터를 처리해준다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
bool vQtyOK = false;
|
||||
|
||||
//동작중이아니라면 처리하지 않음
|
||||
if (PUB.sm.getNewStep != eSMStep.RUN) return EResultKeyence.Wait;
|
||||
|
||||
//var k1 = UpLoadBarcodeConfig(PUB.keyenceF);
|
||||
|
||||
//바이패스라면 무조건ok한다.
|
||||
var systembypassmode = SETTING.Data.SystemBypass;
|
||||
if (systembypassmode && PUB.flag.get(eVarBool.FG_RDY_PORT_PC))
|
||||
{
|
||||
PUB.Result.ItemDataC.VisionData.SetRID("BP" + DateTime.Now.ToString("yyyyMMddHHmmss"), "bp");
|
||||
PUB.Result.ItemDataC.VisionData.SID = ("100000000");
|
||||
PUB.Result.ItemDataC.VisionData.VNAME = "BYPASS";
|
||||
PUB.Result.ItemDataC.VisionData.MFGDATE = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
PUB.Result.ItemDataC.VisionData.VLOT = "BYPASS";
|
||||
PUB.Result.ItemDataC.VisionData.CUSTCODE = "0000";
|
||||
PUB.Result.ItemDataC.VisionData.CUSTNAME = "BYPASS";
|
||||
PUB.Result.ItemDataC.VisionData.QTY = "10000";
|
||||
PUB.Result.ItemDataC.VisionData.ConfirmUser = true;
|
||||
PUB.Result.ItemDataC.VisionData.PrintPositionData = "1";
|
||||
PUB.Result.ItemDataC.VisionData.PrintPositionCheck = true;
|
||||
return EResultKeyence.Complete;
|
||||
}
|
||||
|
||||
|
||||
//로더정보를 사용자가 처리중이면 동작 안함
|
||||
if (PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO)) return EResultKeyence.TimeOut;
|
||||
|
||||
//데이터 처리 시간을 넘어서면 사용자 확인 창을 띄운다 220621
|
||||
var ts = VAR.TIME.RUN((int)eVarTime.KEYENCEWAIT);
|
||||
if (PUB.flag.get(eVarBool.FG_RDY_PORT_PC) && ts.TotalMilliseconds > AR.SETTING.Data.Timeout_VisionProcessL)
|
||||
{
|
||||
|
||||
//화면업데이트를 종료한다
|
||||
if (PUB.keyenceF != null) PUB.keyenceF.Trigger(false);
|
||||
if (PUB.keyenceR != null) PUB.keyenceR.Trigger(false);
|
||||
|
||||
//이미지저장용 작업시작
|
||||
var tempfileF = System.IO.Path.Combine(UTIL.CurrentPath, "Temp", "Image", DateTime.Now.ToString("yyyMMddHhmmss_fff" + "F.bmp"));
|
||||
var tempfileR = System.IO.Path.Combine(UTIL.CurrentPath, "Temp", "Image", DateTime.Now.ToString("yyyMMddHhmmss_fff" + "R.bmp"));
|
||||
var tempfiF = new System.IO.FileInfo(tempfileF);
|
||||
var tempfiR = new System.IO.FileInfo(tempfileR);
|
||||
if (tempfiF.Directory.Exists == false) tempfiF.Directory.Create();
|
||||
if (tempfiR.Directory.Exists == false) tempfiR.Directory.Create();
|
||||
|
||||
//마지막 사진을 추출한다
|
||||
var CurImageF = PUB.keyenceF.SaveImage(tempfiF.FullName);
|
||||
var CurImageR = false;
|
||||
if (PUB.keyenceR != null) CurImageR = PUB.keyenceR.SaveImage(tempfiR.FullName);
|
||||
if (CurImageF && CurImageR)
|
||||
{
|
||||
itemC.VisionData.SetImage(
|
||||
new Emgu.CV.Mat(tempfiF.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale),
|
||||
new Emgu.CV.Mat(tempfiR.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale));
|
||||
//using (var tempimg = new Emgu.CV.Image<Emgu.CV.Structure.Gray, byte>(tempfi.FullName))
|
||||
//{
|
||||
// itemC.VisionData.SetImage(tempimg);
|
||||
//}
|
||||
}
|
||||
else if (CurImageF)
|
||||
{
|
||||
itemC.VisionData.SetImage(new Emgu.CV.Mat(tempfiF.FullName, Emgu.CV.CvEnum.ImreadModes.Grayscale));
|
||||
//using (var tempimg = new Emgu.CV.Image<Emgu.CV.Structure.Gray, byte>(tempfi.FullName))
|
||||
//{
|
||||
// itemC.VisionData.SetImage(tempimg);
|
||||
//}
|
||||
}
|
||||
PUB.keyenceF.Trigger(true);
|
||||
PUB.keyenceR.Trigger(true);
|
||||
return EResultKeyence.TimeOut;
|
||||
}
|
||||
|
||||
//수량임의 입력의 경우
|
||||
if (VAR.BOOL[eVarBool.Opt_UserQtyRQ])
|
||||
{
|
||||
if (itemC.VisionData.QTYRQ) vQtyOK = true; ////RQ의 값이 들어있으면 성공
|
||||
else vQtyOK = false; //수량임의모드인데 RQ값이 들어있지않으면 자동진행하지 않는다
|
||||
}
|
||||
else
|
||||
{
|
||||
//자동에서는 수량값이 들어있으면 바로 넘어가게한다.
|
||||
vQtyOK = itemC.VisionData.QTY.isEmpty() == false;
|
||||
}
|
||||
|
||||
//커스터머 이름 확인
|
||||
if (OPT_BYPASS == false && (itemC.VisionData.CUSTNAME.isEmpty() && itemC.VisionData.CUSTCODE.isEmpty() == false))
|
||||
{
|
||||
var qta = new DataSet1TableAdapters.QueriesTableAdapter();
|
||||
var custname = qta.GetCustName(itemC.VisionData.CUSTCODE);
|
||||
if (custname.isEmpty() == false)
|
||||
{
|
||||
PUB.log.Add($"New CustName => {custname}");
|
||||
itemC.VisionData.CUSTNAME = custname;
|
||||
}
|
||||
}
|
||||
|
||||
//릴Id 신규부여
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_NewReelID])
|
||||
{
|
||||
if (itemC.VisionData.RIDNew == false && itemC.VisionData.CUSTCODE.isEmpty() == false)
|
||||
{
|
||||
var newid = Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD(itemC.VisionData.CUSTCODE, "4", "A", out string errmsg);
|
||||
if (newid.isEmpty() == false)
|
||||
{
|
||||
//backup origin reel id
|
||||
itemC.VisionData.RID0 = itemC.VisionData.RID;
|
||||
|
||||
//set new reel id
|
||||
itemC.VisionData.SetRID(newid, "SPS:CHKDATACOMPLETE");// = newid;
|
||||
itemC.VisionData.RIDNew = true; //applied new reel id
|
||||
|
||||
//서버의수량업데이트기능이 켜져있다면 해당 값을 제거해준다. (다시 조회되도록 함)
|
||||
if (VAR.BOOL[eVarBool.Opt_ServerQty])
|
||||
{
|
||||
//이미 수량업데이트된 경우이므로 복원시켜준다
|
||||
if (itemC.VisionData.QTY0.isEmpty() == false)
|
||||
{
|
||||
PUB.log.AddAT($"릴아이디 변경으로 인해 수량을 복원합니다({itemC.VisionData.QTY}->{itemC.VisionData.QTY0})");
|
||||
itemC.VisionData.QTY = itemC.VisionData.QTY0;
|
||||
itemC.VisionData.QTY0 = string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var logtime = VAR.TIME.RUN((int)eVarTime.LOG_NEWIDERROR);
|
||||
if (logtime.TotalSeconds >= 3000)
|
||||
{
|
||||
PUB.log.AddAT($"Reel_ID 생성실패 : {errmsg}");
|
||||
VAR.TIME.Update(eVarTime.LOG_NEWIDERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//기본 벤더이름
|
||||
if (OPT_BYPASS == false && PUB.Result.vModel.Def_Vname.isEmpty() == false)
|
||||
{
|
||||
if (itemC.VisionData.VNAME.Equals(PUB.Result.vModel.Def_Vname) == false)
|
||||
{
|
||||
itemC.VisionData.VNAME = PUB.Result.vModel.Def_Vname;
|
||||
itemC.VisionData.VNAME_Trust = true;
|
||||
PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}");
|
||||
}
|
||||
}
|
||||
|
||||
//기본 MFG
|
||||
if (OPT_BYPASS == false && PUB.Result.vModel.Def_MFG.isEmpty() == false)
|
||||
{
|
||||
if (itemC.VisionData.MFGDATE.Equals(PUB.Result.vModel.Def_MFG) == false)
|
||||
{
|
||||
itemC.VisionData.MFGDATE = PUB.Result.vModel.Def_MFG;
|
||||
itemC.VisionData.MFGDATE_Trust = true;
|
||||
PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}");
|
||||
}
|
||||
}
|
||||
|
||||
if (itemC.VisionData.Confirm)
|
||||
{
|
||||
//이미 완료된 데이터
|
||||
if (itemC.VisionData.ConfirmAuto)
|
||||
PUB.log.AddI($"데이터확정완료(자동)로 인한 진행");
|
||||
else if (itemC.VisionData.ConfirmUser)
|
||||
PUB.log.AddI($"데이터확정완료(수동)로 인한 진행");
|
||||
else
|
||||
PUB.log.AddI($"데이터확정완료(BYPASS)로 인한 진행");
|
||||
}
|
||||
else if (itemC.VisionData.QRInputRaw.isEmpty() == false && itemC.VisionData.BATCH.isEmpty() == false)
|
||||
{
|
||||
//ATK STD QR데이터가 입력되었으니 더이상 읽지 않아도 진행하도록 하자
|
||||
//데이터가 부족하다면 바로 채우기 작업을 해야한다
|
||||
CheckDataComplte(itemC, "STD", true);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
else if (vQtyOK &&
|
||||
(OPT_BYPASS || itemC.VisionData.VNAME.isEmpty() == false) &&
|
||||
itemC.VisionData.VLOT.isEmpty() == false &&
|
||||
itemC.VisionData.SID.Length == 9 &&
|
||||
(OPT_BYPASS || itemC.VisionData.MFGDATE.isEmpty() == false) &&
|
||||
itemC.VisionData.PARTNO.isEmpty() == false &&
|
||||
itemC.VisionData.BATCH.isEmpty() == false &&
|
||||
itemC.VisionData.RID.isEmpty() == false)
|
||||
{
|
||||
//모든값이 입력되어 있다면 조건 체크후 진행할 수 있도록 한다
|
||||
//2206211400
|
||||
CheckDataComplte(itemC, "SINGLE", true);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
else
|
||||
{
|
||||
//아직데이터가 완료되지 않았다면
|
||||
//대기시간이 지나면 사용자 확인창을 띄운다
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return EResultKeyence.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Clear(cmdIndex);
|
||||
return EResultKeyence.Complete;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 데이터입력이 완료되었는지 확인 합니다
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <param name="Source"></param>
|
||||
/// <param name="mainjob"></param>
|
||||
void CheckDataComplte(Class.JobData item, string Source, bool mainjob)
|
||||
{
|
||||
Boolean NeedConfirm = false;
|
||||
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
var OPT_BYPASS = SETTING.Data.SystemBypass;// Jobtype == "BP";
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
if (item.VisionData.Confirm)
|
||||
{
|
||||
//사용자에의해 완성된 자료는 완료된 자료이다
|
||||
if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
|
||||
return;
|
||||
}
|
||||
|
||||
//DB정보에서 데이터를 쓸것이 있다면 기록한다
|
||||
|
||||
//이전작업내역에서 데이터를 쓸것이 있다면 기록한다
|
||||
|
||||
//서버의수량업데이트기능
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_ServerQty])
|
||||
{
|
||||
//수량원본이 없는 경우
|
||||
if (item.VisionData.QTY0.isEmpty())
|
||||
{
|
||||
string msg;
|
||||
var cnt = (int)(Amkor.RestfulService.get_stock_count(item.VisionData.RID, out msg));
|
||||
if (cnt > 0)
|
||||
{
|
||||
//새로받은 데이터를 실제 수량에 추가한다
|
||||
item.VisionData.QTY0 = item.VisionData.QTY;
|
||||
item.VisionData.QTY = cnt.ToString();
|
||||
if (mainjob) PUB.log.Add($"서버수량업데이트 RID:{item.VisionData.RID} 구:{item.VisionData.QTY},신:{cnt}");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mainjob) PUB.log.AddE($"수량업데이트 실패 rID:{item.VisionData.RID},Message={msg}");
|
||||
NeedConfirm = true;
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("수량 업데이트 실패");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//수량입력 210708
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_UserQtyRQ])
|
||||
{
|
||||
if (item.VisionData.QTYRQ && item.VisionData.QTY.isEmpty() == false)
|
||||
{
|
||||
//RQ값이 이전 값이 오기도 하니 바코드 목록에서 값을 다시 써준다. 210825
|
||||
var rqBcd = PUB.Result.ItemDataC.VisionData.barcodelist.Where(t => t.Value.Data.StartsWith("RQ")).FirstOrDefault();
|
||||
if (rqBcd.Value != null)
|
||||
{
|
||||
var newqty = rqBcd.Value.Data.Substring(2).Trim();
|
||||
if (mainjob) PUB.log.Add($"수량업데이트(01) {item.VisionData.QTY}->{newqty}");
|
||||
item.VisionData.QTY = newqty;
|
||||
if (mainjob) PUB.log.AddI("수량수동입력상태이나 RQ값이 확인되어 사용자 확인을 하지 않음");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("RQ값 오류 (자동불가)");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("수량 수동 입력 필요");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
//SID 존재여부 확인
|
||||
if (OPT_BYPASS == false && item.VisionData.SID_Trust && VAR.BOOL[eVarBool.Opt_CheckSIDExist])
|
||||
{
|
||||
//ECS목록에 데이터가 업다면 오류로 처리한다
|
||||
var SID = item.VisionData.SID;
|
||||
var MCName = VAR.BOOL[eVarBool.Use_Conveyor] ? "IB" : SETTING.Data.McName;
|
||||
var ta = new DataSet1TableAdapters.QueriesTableAdapter();
|
||||
var exist = ta.CheckSIDExist(MCName, SID) > 0;
|
||||
PUB.log.Add($"SID 존재여부 검사 KEY:{MCName},SID:{item.VisionData.SID},Result={exist}");
|
||||
if (exist == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOSIDINFOFROMDB, eNextStep.PAUSE, SID);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//sid변환기능확인
|
||||
var SIDOK = false;
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert])
|
||||
{
|
||||
//변환된 정보가 없다면 변환을 진행한다
|
||||
if (item.VisionData.SID0.isEmpty() && item.VisionData.SID_Trust && item.VisionData.SID.isEmpty() == false)
|
||||
{
|
||||
//현재SID가 정상 시드라면 변환을 시작한다
|
||||
|
||||
|
||||
//_SM_RUN_VISION_SIDCONV(item);
|
||||
}
|
||||
|
||||
//시드값이 유효한지 확인한다.
|
||||
SIDOK = item.VisionData.SID_Trust && item.VisionData.SID0.isEmpty() == false && item.VisionData.SID.isEmpty() == false;
|
||||
}
|
||||
else SIDOK = item.VisionData.SID_Trust; //시드변환을 사용하지 않으므로 시드값여부에따라 다르다
|
||||
|
||||
//사용자확인이 필요한 옵션이라면 사용한다
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_UserConfim])
|
||||
{
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("사용자 확인 필요");
|
||||
//if (mainjob) PUB.log.Add($"사용자 확인 옵션으로 인해 창을 표시 합니다{Source}");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
//처음작업이면 반드시 확인을 한다
|
||||
if (OPT_BYPASS == false && PUB.Result.JobFirst)
|
||||
{
|
||||
//사용자확인이 필요없는 상태라면 활성화해준다
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
//프린트를 하지 않는다면 처리하지 않는다.
|
||||
if (VAR.BOOL[eVarBool.Opt_DisablePrinter] == false)
|
||||
{
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("첫번째 릴 확인 필요");
|
||||
//if (mainjob) PUB.log.Add($"처음 작업이므로 사용자 확인창을 표시 합니다{Source}");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//변환작업인데 원본 값이 없다.
|
||||
//혹은 변환값과 원본이 같다
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert] && (item.VisionData.SID0.isEmpty() == true || item.VisionData.SID0 == item.VisionData.SID))
|
||||
{
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("SID변환값 확인 필요");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
//프린트위치확인
|
||||
if (item.VisionData.PrintPositionData.isEmpty() == true || item.VisionData.PrintPositionCheck == false)
|
||||
{
|
||||
if (OPT_BYPASS)
|
||||
{
|
||||
//바이패스해야하는 경우라면 프린트위치를 임의로 한다
|
||||
if (item.VisionData.PrintPositionData.isEmpty())
|
||||
{
|
||||
item.VisionData.PrintPositionData = "1";
|
||||
item.VisionData.PrintPositionCheck = true;
|
||||
PUB.log.AddI($"바이패스SID({item.VisionData.SID})로 인해 인쇄위치 임의지정");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//기록된 현재작업의 인쇄위치 정보에서 찾는다 231005
|
||||
if (PUB.Result.PrintPostionList.ContainsKey(item.VisionData.SID))
|
||||
{
|
||||
var preprnpos = PUB.Result.PrintPostionList[item.VisionData.SID];
|
||||
item.VisionData.PrintPositionData = preprnpos;
|
||||
item.VisionData.PrintPositionCheck = true;
|
||||
PUB.log.AddI($"현 작업정보에서 프린트위치 찾음 SID:{item.VisionData.SID},값={preprnpos}");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
//현작업내에서의 정보를 찾아서 적용한다 231005
|
||||
//if (mainjob) PUB.log.AddAT("프린트 위치 결정이 완료되지 않아. 사용자 선택화면을 팝업합니다");
|
||||
if (mainjob) item.VisionData.bcdMessage.Add("부착위치 없음");
|
||||
NeedConfirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//바이패스모드에서 벤더네임이지정(101시드에 벤더네임이 없다)
|
||||
if (OPT_BYPASS)
|
||||
{
|
||||
if (item.VisionData.VNAME_Trust == false)
|
||||
{
|
||||
item.VisionData.VNAME = "BYPASS";
|
||||
item.VisionData.VNAME_Trust = true;
|
||||
}
|
||||
}
|
||||
|
||||
//데이터의 신뢰성을 확인하고 모두 입력되었다면 자동 확정을 진행한다
|
||||
if (item.VisionData.MFGDATE_Trust &&
|
||||
item.VisionData.PARTNO_Trust &&
|
||||
item.VisionData.QTY_Trust &&
|
||||
item.VisionData.RID_Trust &&
|
||||
SIDOK && item.VisionData.VLOT_Trust &&
|
||||
item.VisionData.VNAME_Trust)
|
||||
{
|
||||
//데이터를 확정짓는다 다만 화면을 표시하지 않아야하는 경우에만 처리해준다
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
if (OPT_BYPASS)
|
||||
{
|
||||
PUB.log.Add("데이터가 모두 확인되어 자동 확정을 진행 합니다(bypassmode)");
|
||||
if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
|
||||
item.VisionData.ConfirmBypass = true;
|
||||
}
|
||||
else if (item.VisionData.ConfirmAuto == false)
|
||||
{
|
||||
PUB.log.Add("데이터가 모두 확인되어 자동 확정을 진행 합니다");
|
||||
if (item.VisionData.bcdMessage.Count > 0) item.VisionData.bcdMessage.Clear();
|
||||
item.VisionData.ConfirmAuto = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (item.VisionData.QRInputRaw.isEmpty() == false)
|
||||
{
|
||||
if (NeedConfirm == false)
|
||||
{
|
||||
if (mainjob)
|
||||
{
|
||||
NeedConfirm = true;
|
||||
PUB.log.AddAT($"데이터가 완료되지 않았으나 QR을 읽은 상태이므로 바로 확인창을 띄운다");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//확인창을 띄우기 위해 Timeout 오류를 발생시킨다.
|
||||
VAR.BOOL[eVarBool.Need_UserConfirm_Data] = NeedConfirm;
|
||||
if (NeedConfirm)
|
||||
{
|
||||
if (mainjob)
|
||||
{
|
||||
var newtime = DateTime.Now.AddMilliseconds(-AR.SETTING.Data.Timeout_VisionProcessL);
|
||||
VAR.TIME.Set(eVarTime.KEYENCEWAIT, newtime);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
////ecs on 컨베이어때만 사용한다
|
||||
//bool warndata = false;
|
||||
//if (SETTING.Data.ECSSkip == false && CVMode)
|
||||
//{
|
||||
// //모두 찾은상태에서는 활성화여부를 추가 확인한다.
|
||||
// var sid = item.VisionData.SID;
|
||||
// var bat = item.VisionData.BATCH;
|
||||
|
||||
// //현 시점의 활성화 목록을 가져온다
|
||||
// var activelist = PUB.GetECSActiveSIDList();
|
||||
|
||||
// //해당sid+bat 가 활성화된것인지 확인한다.
|
||||
// bool active = false;
|
||||
// string active_sid = "";
|
||||
// string active_bat = "";
|
||||
// var sidorder = 0;
|
||||
// var sidx = 0;
|
||||
// foreach (var actItem in activelist)
|
||||
// {
|
||||
// if (actItem.Item4)
|
||||
// {
|
||||
// if(active_sid.isEmpty())
|
||||
// {
|
||||
// active_sid = actItem.Item1;
|
||||
// active_bat = actItem.Item2;
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
// if (actItem.Item1.Equals(sid) && actItem.Item2.Equals(bat))
|
||||
// {
|
||||
// active = actItem.Item4;
|
||||
// sidorder = sidx; //순서를 저장한다. 0부터 시작하는값이다.
|
||||
// }
|
||||
// if (actItem.Item3 == SETTING.Data.McName)
|
||||
// sidx += 1;
|
||||
// }
|
||||
|
||||
// //활성화된 sid가 아니다
|
||||
// if (active == false)
|
||||
// {
|
||||
// if (sidorder > 1) //2번째는 무조건 에러
|
||||
// {
|
||||
// PUB.log.AddE($"active sid 아니고 {sidorder + 1}번 항목이므로 오류 처리한다.");
|
||||
// warndata = true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //활성sid의 작업데이터가있으면 ok
|
||||
// var qa = new DataSet1TableAdapters.QueriesTableAdapter();
|
||||
// var existreadat = qa.GetIBResultCountBySIDBatch(DateTime.Now.AddHours(-6), active_sid, active_sid) > 0;
|
||||
|
||||
// //활성sid의 작업데이터가있으면 ok
|
||||
// if (existreadat)
|
||||
// {
|
||||
// PUB.log.AddAT($"active sid 는 아니지만 활성sid({active_sid}{active_sid}) 의 기록이 있어 진행 합니다");
|
||||
// warndata = false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// PUB.log.AddE($"active sid 아니고 활성sid({active_sid}{active_sid}) 의 기록이 없어 진행 불가");
|
||||
// warndata = true;
|
||||
// }
|
||||
// //없으면 ng
|
||||
// }
|
||||
// }
|
||||
|
||||
// //오류발생조건이나, 이미 발생했다면 처리하지 않는다.
|
||||
// if (warndata)
|
||||
// {
|
||||
// if (warninactivelist.Contains(sid + bat) == false)
|
||||
// {
|
||||
// warninactivelist.Add(sid + bat);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// PUB.log.AddAT($"이미 경고한 sid+bqt이므로 넘어갑니다({sid}{bat})");
|
||||
// warndata = false;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//if (warndata)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOECSDATAACTIVE, eNextStep.PAUSE, item.VisionData.SID, item.VisionData.BATCH);
|
||||
// return;
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
if (PUB.Result.ItemDataC.VisionData.ConfirmAuto == false)
|
||||
{
|
||||
PUB.logDbg.Add($"비젼 자동 확정 처리 {Source}");
|
||||
PUB.Result.ItemDataC.VisionData.ConfirmAuto = true;
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
List<string> warninactivelist = new List<string>();
|
||||
private void SetDryrunData()
|
||||
{
|
||||
var item = PUB.Result.ItemDataC;
|
||||
PUB.log.AddAT("드라이런 기본 데이터 입력");
|
||||
if (item.VisionData.QTY.isEmpty()) item.VisionData.QTY = DateTime.Now.ToString("HHmm");
|
||||
if (item.VisionData.MFGDATE.isEmpty()) item.VisionData.MFGDATE = DateTime.Now.ToString("yy-MM-dd");
|
||||
if (item.VisionData.SID.isEmpty()) item.VisionData.SID = "108" + "0" + DateTime.Now.ToString("HH").PadLeft(2, '0') + DateTime.Now.ToString("fff").PadLeft(3, '0');
|
||||
if (item.VisionData.VLOT.isEmpty()) item.VisionData.VLOT = "SUPNAME" + DateTime.Now.ToString("fff");
|
||||
if (item.VisionData.PARTNO.isEmpty()) item.VisionData.PARTNO = "PARTNO" + DateTime.Now.ToString("yyyyMMddHHmmss.fff");
|
||||
if (item.VisionData.RID.isEmpty())
|
||||
{
|
||||
var rid = Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD("1234", "4", "A", out string err);
|
||||
if (rid.isEmpty()) item.VisionData.SetRID("RID" + DateTime.Now.ToString("yyyyMMddHHmmss.fff"), "DRY");
|
||||
else item.VisionData.SetRID(rid, "DRY");
|
||||
}
|
||||
if (item.VisionData.PrintPositionData.isEmpty()) item.VisionData.PrintPositionData = "2";
|
||||
item.VisionData.PrintPositionCheck = true;
|
||||
item.VisionData.ConfirmAuto = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
278
Handler/Project/RunCode/RunSequence/4_PICKER_ON.cs
Normal file
278
Handler/Project/RunCode/RunSequence/4_PICKER_ON.cs
Normal file
@@ -0,0 +1,278 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean PICKER_ON(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var iLockX = PUB.iLock[(int)eAxis.PX_PICK];
|
||||
var iLockZ = PUB.iLock[(int)eAxis.PZ_PICK];
|
||||
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
//option check
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = PUB.OPT_BYPASS();
|
||||
|
||||
//####################################################
|
||||
//### 인터락 확인
|
||||
//####################################################
|
||||
Boolean MotMoveX = PUB.mot.IsMotion((int)eAxis.PX_PICK);
|
||||
Boolean MotMoveZ = PUB.mot.IsMotion((int)eAxis.PZ_PICK);
|
||||
if (iLockX.IsEmpty() == false && MotMoveX)
|
||||
{
|
||||
var locklistX = MOT.GetActiveLockList(eAxis.PX_PICK, iLockX);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)eAxis.PX_PICK);
|
||||
}
|
||||
|
||||
if (iLockZ.IsEmpty() == false && MotMoveZ)
|
||||
{
|
||||
var locklistZ = MOT.GetActiveLockList(eAxis.PZ_PICK, iLockZ);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)eAxis.PZ_PICK);
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"[{target}] 피커 ON 작업시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### ON 위치로 이동
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
var PosZ = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false;
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.log.Add($"[{target}] 피커 ON X,Y 준비위치 확인");
|
||||
DIO.SetPickerVac(true);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 내린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PortRDY = PUB.flag.get(eVarBool.FG_RDY_PORT_PC);
|
||||
if (PortRDY == false) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 내린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
// if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.PICKON);
|
||||
var PosMatch = MOT.getPositionMatch(Pos);
|
||||
//var PortRDY = PUB.flag.get(eVarBool.RDY_PORT_PC);
|
||||
//if (PosMatch==false ) return false;
|
||||
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
VAR.I32[eVarInt32.PickOnCount] += 1;
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, true, funcName);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 올린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, true, funcName);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 프린트부착위치가 상/하가 아니라면 추가적인 회전이 필요하다 - 210207
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var vData = target == eWorkPort.Left ? PUB.Result.ItemDataL.VisionData : PUB.Result.ItemDataR.VisionData;
|
||||
if (vData.PrintPositionData == "4") // 왼쪽찍기
|
||||
{
|
||||
if (vData.ReelSize == eCartSize.Inch7)
|
||||
{
|
||||
vData.NeedCylinderForward = false;
|
||||
double targerPos = 0.0;
|
||||
if (target == eWorkPort.Left) //left printer
|
||||
{
|
||||
vData.PositionAngle = -90; //90도 회전한다
|
||||
}
|
||||
else
|
||||
{
|
||||
vData.PositionAngle = -90;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//13inch
|
||||
vData.NeedCylinderForward = true;
|
||||
if (target == eWorkPort.Left) //left printer
|
||||
{
|
||||
vData.PositionAngle = -180;
|
||||
}
|
||||
else
|
||||
{
|
||||
vData.PositionAngle = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (vData.PrintPositionData == "6") //오른쪽찍기
|
||||
{
|
||||
if (vData.ReelSize == eCartSize.Inch7)
|
||||
{
|
||||
vData.NeedCylinderForward = false;
|
||||
if (target == eWorkPort.Left) //left printer
|
||||
{
|
||||
vData.PositionAngle = 90; //90도 회전한다
|
||||
}
|
||||
else
|
||||
{
|
||||
vData.PositionAngle = 90; //90도 회전한다
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//13inch
|
||||
vData.NeedCylinderForward = true;
|
||||
double targerPos = 0.0;
|
||||
if (target == eWorkPort.Left) //left printer
|
||||
{
|
||||
vData.PositionAngle = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vData.PositionAngle = 180;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
vData.NeedCylinderForward = false; //상하에 붙이는건 실린더를 원위치해야함
|
||||
vData.PositionAngle = 0;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 바코드에의한 자동 회전
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//속도값만 취한다
|
||||
var thpos = MOT.GetPTPos(ePTLoc.READY);
|
||||
|
||||
// Baseangle 값으로 변경 210126 - qr의 각도가잇다면 그것이 기준이됨
|
||||
double baseAngle = 0;
|
||||
string baseSource = "F";
|
||||
var vdata = target == eWorkPort.Left ? PUB.Result.ItemDataL.VisionData : PUB.Result.ItemDataR.VisionData;
|
||||
if (vdata.BaseAngle(out string msg, out Class.KeyenceBarcodeData bcd))
|
||||
{
|
||||
baseAngle = bcd.Angle;
|
||||
baseSource = bcd.barcodeSource; //230504 각도
|
||||
PUB.log.AddI($"[{target}] 각도산출내용:{msg},바코드:{bcd.Data},ID:{vdata.RID}"); //210602
|
||||
}
|
||||
else if (PUB.Result.DryRun)
|
||||
{
|
||||
PUB.log.AddAT($"[{target}] 드라이런으로 인해 각도를 적용하지 않음");
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.log.AddE($"[{target}] base ange error : {msg},ID:{vdata.RID}");
|
||||
}
|
||||
|
||||
var addangle = baseSource == "R" ? SETTING.Data.RearBarcodeRotate : SETTING.Data.FrontBarcodeRotate;
|
||||
var rotAngle = baseAngle + addangle + vdata.PositionAngle;
|
||||
PUB.log.AddI($"[{target}]-소스:{baseSource} 회전값(Base:{baseAngle}+추가:{addangle}+비젼:{vdata.PositionAngle}={rotAngle})");
|
||||
|
||||
int dir = -1;
|
||||
while (true)
|
||||
{
|
||||
if (rotAngle > 360.0)
|
||||
rotAngle = rotAngle - 360.0; //한반퀴 더 도는것은 역 처리한다
|
||||
else break;
|
||||
}
|
||||
//rotAngle += 90; //비젼이 90도 돌아가잇으니 다시 적용필요함 //상단이위로가도록 함
|
||||
if (rotAngle > 180)
|
||||
{
|
||||
rotAngle = 360 - rotAngle;
|
||||
dir = 1;
|
||||
}
|
||||
|
||||
PUB.log.AddI($"[{target}] 회전(최종) [{rotAngle}도,방향:{dir}],RID:{vdata.RID}");
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
PUB.Result.ItemDataL.VisionData.ApplyAngle = rotAngle; //회전각도를 넣는다
|
||||
else
|
||||
PUB.Result.ItemDataR.VisionData.ApplyAngle = rotAngle; //회전각도를 넣는다
|
||||
|
||||
var curtheta = PUB.mot.GetActPos((int)eAxis.Z_THETA);
|
||||
var newPos = curtheta + (dir * rotAngle);
|
||||
PUB.log.Add($"회전전 모터 위치 : {curtheta}, 대상위치:{newPos},속도:{thpos.Speed},가속:{thpos.Acc}");
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
VAR.DBL[(int)eVarDBL.ThetaPositionL] = newPos;
|
||||
else
|
||||
VAR.DBL[(int)eVarDBL.ThetaPositionR] = newPos;
|
||||
|
||||
//if (ByPassMode == false)
|
||||
//{
|
||||
//바이패스에서도 추가 회전을 한다
|
||||
MOT.Move(eAxis.Z_THETA, newPos, thpos.Speed, thpos.Acc, false);
|
||||
//}
|
||||
//else PUB.log.AddAT($"bypass 로 인해 회전을 하지 않습니다");
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
244
Handler/Project/RunCode/RunSequence/4_PICKER_RETRY.cs
Normal file
244
Handler/Project/RunCode/RunSequence/4_PICKER_RETRY.cs
Normal file
@@ -0,0 +1,244 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 키엔스가 실패했을때 재시도 하는 작업이다
|
||||
/// 중앙에서 잡고 79도 틀고, 내려 놓고 피한다
|
||||
/// </summary>
|
||||
/// <param name="target"></param>
|
||||
/// <param name="cmdIndex"></param>
|
||||
/// <returns></returns>
|
||||
public Boolean PICKER_RETRY(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var iLockX = PUB.iLock[(int)eAxis.PX_PICK];
|
||||
var iLockZ = PUB.iLock[(int)eAxis.PZ_PICK];
|
||||
var PickerRetryCount = AR.VAR.I32[(int)eVarInt32.PickOnRetry];
|
||||
//####################################################
|
||||
//### 인터락 확인
|
||||
//####################################################
|
||||
Boolean MotMoveX = PUB.mot.IsMotion((int)eAxis.PX_PICK);
|
||||
Boolean MotMoveZ = PUB.mot.IsMotion((int)eAxis.PZ_PICK);
|
||||
if (iLockX.IsEmpty() == false && MotMoveX)
|
||||
{
|
||||
var locklistX = MOT.GetActiveLockList(eAxis.PX_PICK, iLockX);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)eAxis.PX_PICK);
|
||||
}
|
||||
|
||||
if (iLockZ.IsEmpty() == false && MotMoveZ)
|
||||
{
|
||||
var locklistZ = MOT.GetActiveLockList(eAxis.PZ_PICK, iLockZ);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)eAxis.PZ_PICK);
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"[{target}] 피커 RETRY 작업시작({PickerRetryCount}/{AR.SETTING.Data.RetryPickOnMaxCount})");
|
||||
|
||||
//기존자료를 모두 삭제 한다 221102
|
||||
if (PUB.Result.ItemDataC != null && PUB.Result.ItemDataC.VisionData != null && PUB.Result.ItemDataC.VisionData.barcodelist != null)
|
||||
{
|
||||
lock (PUB.Result.ItemDataC.VisionData.barcodelist)
|
||||
{
|
||||
PUB.Result.ItemDataC.VisionData.Clear(funcName, true);
|
||||
}
|
||||
}
|
||||
|
||||
AR.VAR.BOOL[eVarBool.JOB_PickON_Retry] = true;
|
||||
PUB.mot.ClearPosition((int)eAxis.Z_THETA);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
DIO.SetPickerVac(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z를 먼저 Ready 로 이동
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
DIO.SetPickerVac(true);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### X를 픽온위치로 이동
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockX.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
DIO.SetPickerVac(true);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축 내리기 조건확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PortRDY = PUB.flag.get(eVarBool.FG_RDY_PORT_PC);
|
||||
if (PortRDY == false) return false;
|
||||
DIO.SetPickerVac(true);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 내린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
VAR.I32[eVarInt32.PickOnCount] += 1;
|
||||
//PUB.flag.set(eVarBool.PK_ITEMON, true, funcName);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 100ms 대기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (seqTime.TotalMilliseconds < 100) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 올린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
//PUB.flag.set(eVarBool.PK_ITEMON, true, funcName);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 현재위치에서 79도 회전
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//속도값만 취한다
|
||||
var Pos = MOT.GetPTPos(ePTLoc.READY);
|
||||
Pos.Position = PUB.mot.GetActPos((int)eAxis.Z_THETA) + AR.SETTING.Data.RetryPickOnAngle;
|
||||
VAR.DBL[(int)eVarDBL.ThetaPosition] = Pos.Position;
|
||||
MOT.Move(Pos);
|
||||
//if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 현재위치에서 79도 회전
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//속도값만 취한다
|
||||
var Pos = MOT.GetPTPos(ePTLoc.READY);
|
||||
Pos.Position = VAR.DBL[(int)eVarDBL.ThetaPosition];
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### Z를 pick on 위치로 1/3 지점으로 이동한다
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var PosS = MOT.GetPZPos(ePZLoc.READY);
|
||||
var PosT = MOT.GetPZPos(ePZLoc.PICKON);
|
||||
var offset = (int)(Math.Abs(PosT.Position - PosS.Position) * 0.7f);
|
||||
PosS.Position += offset; //시작위치에서 절반만 이동한다
|
||||
if (MOT.CheckMotionPos(seqTime, PosS, funcName) == false) return false;
|
||||
DIO.SetPickerVac(false); //릴을 내려 놓는다
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 올린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
DIO.SetPickerVac(false); //백큠을 꺼서 원복한다
|
||||
hmi1.arVar_Port[1].AlignReset(); //231013
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 키엔스를 읽어야 하므로 피해준다
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockX.IsEmpty() == false) return false;
|
||||
|
||||
sPositionData Pos;
|
||||
if (target == eWorkPort.Left) Pos = MOT.GetPXPos(ePXLoc.READYL);
|
||||
else Pos = MOT.GetPXPos(ePXLoc.READYR);
|
||||
|
||||
//theta모터 위치 초기화
|
||||
PUB.mot.ClearPosition((int)eAxis.Z_THETA);
|
||||
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.log.AddAT($"###### 재시도 작업 회피 이동 완료({target})");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 비젼데이터를 초기화 해준다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"retry 완료로 비젼데이터를 삭제 합니다");
|
||||
PUB.Result.ItemDataC.VisionData.Clear(funcName, true);
|
||||
AR.VAR.BOOL[eVarBool.JOB_PickON_Retry] = false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//일련번호 초기화 해준다
|
||||
PUB.sm.seq.Clear(cmdIndex);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
458
Handler/Project/RunCode/RunSequence/5_PICKER_OFF.cs
Normal file
458
Handler/Project/RunCode/RunSequence/5_PICKER_OFF.cs
Normal file
@@ -0,0 +1,458 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean PICKER_OFF(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
// var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
//var ByPassMode = Jobtype == "BP";
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
//option check
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = PUB.OPT_BYPASS();
|
||||
|
||||
var iLockX = PUB.iLock[(int)eAxis.PX_PICK];
|
||||
var iLockZ = PUB.iLock[(int)eAxis.PZ_PICK];
|
||||
|
||||
//####################################################
|
||||
//### 인터락 확인
|
||||
//####################################################
|
||||
Boolean MotMoveX = PUB.mot.IsMotion((int)eAxis.PX_PICK);
|
||||
Boolean MotMoveZ = PUB.mot.IsMotion((int)eAxis.PZ_PICK);
|
||||
if (iLockX.IsEmpty() == false && MotMoveX)
|
||||
{
|
||||
var locklistX = MOT.GetActiveLockList(eAxis.PX_PICK, iLockX);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)eAxis.PX_PICK);
|
||||
}
|
||||
|
||||
if (iLockZ.IsEmpty() == false && MotMoveZ)
|
||||
{
|
||||
var locklistZ = MOT.GetActiveLockList(eAxis.PZ_PICK, iLockZ);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)eAxis.PZ_PICK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//컨베이어모드에서는 센서가 감지되면 내려놓지 않게 한다
|
||||
if (CVMode)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.L_CONV1)) return false;
|
||||
if (VAR.I32[eVarInt32.LEFT_ITEM_COUNT] > 0) return false;
|
||||
}
|
||||
else if (target == eWorkPort.Right)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.R_CONV1)) return false;
|
||||
if (VAR.I32[eVarInt32.RIGT_ITEM_COUNT] > 0) return false;
|
||||
}
|
||||
PUB.log.Add($"CVMODE에서 컨베이어 비어있음");
|
||||
}
|
||||
|
||||
PUB.log.Add($"[{target}] 피커 OFF 작업시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Y축안전확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//PUB.log.Add($"[{target}] 프린터 Y축 위치 확인");
|
||||
var Pos = target == eWorkPort.Left ? MOT.GetLMPos(eLMLoc.READY) : MOT.GetRMPos(eRMLoc.READY);
|
||||
if (MOT.getPositionMatch(Pos) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.POSITION_ERROR, eNextStep.PAUSE, "프린터 Y축이 준비위치에 있지 않습니다");
|
||||
return false;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### OFF 위치로 이동
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockX.IsEmpty() == false) return false;
|
||||
sPositionData PosX;
|
||||
if (PUB.flag.get(eVarBool.FG_RUN_LEFT))
|
||||
{
|
||||
PosX = MOT.GetPXPos(ePXLoc.PICKOFFL);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosX = MOT.GetPXPos(ePXLoc.PICKOFFR);
|
||||
}
|
||||
if (MOT.CheckMotionPos(seqTime, PosX, funcName) == false) return false;
|
||||
|
||||
//컨베이어모드라면 컨베이어를 멈추게한다
|
||||
if (CVMode)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
PUB.iLockCVL.set((int)eILockCV.BUSY, true, funcName);
|
||||
else
|
||||
PUB.iLockCVR.set((int)eILockCV.BUSY, true, funcName);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
PUB.iLockCVL.set((int)eILockCV.BUSY, false, funcName);
|
||||
else
|
||||
PUB.iLockCVR.set((int)eILockCV.BUSY, false, funcName);
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
////####################################################
|
||||
////### 프린트부착위치가 상/하가 아니라면 추가적인 회전이 필요하다 - 210207
|
||||
////####################################################
|
||||
//if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
//{
|
||||
// var vData = item.VisionData;
|
||||
// if (vData.PrintPositionData == "4") // 왼쪽찍기
|
||||
// {
|
||||
// if (vData.ReelSize == eCartSize.Inch7)
|
||||
// {
|
||||
// vData.NeedCylinderForward = false;
|
||||
// double targerPos = 0.0;
|
||||
// if (target == eWorkShuttle.Left) //left printer
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 90; //90도 회전한다
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 90;
|
||||
// }
|
||||
|
||||
// //if (vData.ApplyAngle > 180.0) targerPos = vData.ApplyAngle - 180.0;
|
||||
// //else targerPos = vData.ApplyAngle + 180.0;
|
||||
|
||||
// //추가보정
|
||||
// if (targerPos > 360.0) targerPos = targerPos - 360.0;
|
||||
// if (targerPos < -360.0) targerPos = targerPos + 360.0;
|
||||
|
||||
// //지정값대로 추가 회전을 한다
|
||||
// var basePosInfo = MOT.GetPTPos(ePTLoc.READY);
|
||||
// basePosInfo.Position = targerPos;
|
||||
// if (MOT.CheckMotionPos(seqTime, basePosInfo, funcName) == false) return false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //13inch
|
||||
// vData.NeedCylinderForward = true;
|
||||
// double targerPos = 0.0;
|
||||
// if (target == eWorkShuttle.Left) //left printer
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 180; //90도 회전한다
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 0;
|
||||
// }
|
||||
|
||||
// //if (vData.ApplyAngle > 180.0) targerPos = vData.ApplyAngle - 180.0;
|
||||
// //else targerPos = vData.ApplyAngle + 180.0;
|
||||
|
||||
// //추가보정
|
||||
// if (targerPos > 360.0) targerPos = targerPos - 360.0;
|
||||
// if (targerPos < -360.0) targerPos = targerPos + 360.0;
|
||||
|
||||
// //지정값대로 추가 회전을 한다
|
||||
// var basePosInfo = MOT.GetPTPos(ePTLoc.READY);
|
||||
// basePosInfo.Position = targerPos;
|
||||
// if (MOT.CheckMotionPos(seqTime, basePosInfo, funcName) == false) return false;
|
||||
// }
|
||||
|
||||
// }
|
||||
// else if (vData.PrintPositionData == "6") //오른쪽찍기
|
||||
// {
|
||||
// if (vData.ReelSize == eCartSize.Inch7)
|
||||
// {
|
||||
// vData.NeedCylinderForward = false;
|
||||
// double targerPos = 0.0;
|
||||
// if (target == eWorkShuttle.Left) //left printer
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle - 90; //90도 회전한다
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle - 90;
|
||||
// }
|
||||
|
||||
// //if (vData.ApplyAngle > 180.0) targerPos = vData.ApplyAngle - 180.0;
|
||||
// //else targerPos = vData.ApplyAngle + 180.0;
|
||||
|
||||
// //추가보정
|
||||
// if (targerPos > 360.0) targerPos = targerPos - 360.0;
|
||||
// if (targerPos < -360.0) targerPos = targerPos + 360.0;
|
||||
|
||||
// //지정값대로 추가 회전을 한다
|
||||
// var basePosInfo = MOT.GetPTPos(ePTLoc.READY);
|
||||
// basePosInfo.Position = targerPos;
|
||||
// if (MOT.CheckMotionPos(seqTime, basePosInfo, funcName) == false) return false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //13inch
|
||||
// vData.NeedCylinderForward = true;
|
||||
// double targerPos = 0.0;
|
||||
// if (target == eWorkShuttle.Left) //left printer
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 0; //90도 회전한다
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// targerPos = vData.ApplyAngle + 180;
|
||||
// }
|
||||
|
||||
// //if (vData.ApplyAngle > 180.0) targerPos = vData.ApplyAngle - 180.0;
|
||||
// //else targerPos = vData.ApplyAngle + 180.0;
|
||||
|
||||
// //추가보정
|
||||
// if (targerPos > 360.0) targerPos = targerPos - 360.0;
|
||||
// if (targerPos < -360.0) targerPos = targerPos + 360.0;
|
||||
|
||||
// //지정값대로 추가 회전을 한다
|
||||
// var basePosInfo = MOT.GetPTPos(ePTLoc.READY);
|
||||
// basePosInfo.Position = targerPos;
|
||||
// if (MOT.CheckMotionPos(seqTime, basePosInfo, funcName) == false) return false;
|
||||
// }
|
||||
// }
|
||||
// else vData.NeedCylinderForward = false; //상하에 붙이는건 실린더를 원위치해야함
|
||||
// PUB.sm.seq.Update(cmdIndex);
|
||||
// return false;
|
||||
//}
|
||||
|
||||
//####################################################
|
||||
//### 사용자회전적용
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (item.VisionData.ApplyOffset == false)
|
||||
{
|
||||
//적용옵셋
|
||||
var OffsetAngle = target == eWorkPort.Left ? AR.SETTING.Data.AngleOffsetL : AR.SETTING.Data.AngleOffsetR;
|
||||
if (OffsetAngle != 0f)
|
||||
{
|
||||
if (OPT_BYPASS == true || OPT_PrinterOff)
|
||||
{
|
||||
PUB.log.AddAT($"bypass 로 인해 추가 회전을 하지 않습니다");
|
||||
}
|
||||
else
|
||||
{
|
||||
//모터회전
|
||||
//var thpos = MOT.GetPTPos(ePTLoc.READY); //적용할 속도값용
|
||||
//MOT.Move(eAxis.Z_THETA, OffsetAngle, thpos.Speed, thpos.Acc, true);
|
||||
MOT.Rotation(OffsetAngle, funcName);
|
||||
|
||||
double theta = 0;
|
||||
if (target == eWorkPort.Left) theta = VAR.DBL[(int)eVarDBL.ThetaPositionL];
|
||||
else theta = VAR.DBL[(int)eVarDBL.ThetaPositionR];
|
||||
|
||||
//값을 누적시켜준다
|
||||
item.VisionData.ApplyAngle += OffsetAngle;
|
||||
|
||||
if (target == eWorkPort.Left) VAR.DBL[(int)eVarDBL.ThetaPositionL] = theta + OffsetAngle;
|
||||
else VAR.DBL[(int)eVarDBL.ThetaPositionR] = theta + OffsetAngle;
|
||||
|
||||
if (AR.SETTING.Data.Log_Debug)
|
||||
PUB.logDbg.Add($"[{target}] 모션 추가회전 :{OffsetAngle}");
|
||||
}
|
||||
|
||||
}
|
||||
item.VisionData.ApplyOffset = true;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 회전축 완료 확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_BYPASS == false && OPT_PrinterOff == false)
|
||||
{
|
||||
var Theta = target == eWorkPort.Left ? VAR.DBL[(int)eVarDBL.ThetaPositionL] : VAR.DBL[(int)eVarDBL.ThetaPositionR];
|
||||
var Pos = MOT.GetPTPos(ePTLoc.READY);
|
||||
Pos.Position = Theta;
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName, false) == false) return false;
|
||||
PUB.log.Add($"[{target}] 회전축 확인 완료 위치:{Theta},모터값:{PUB.mot.GetActPos((int)eAxis.Z_THETA)} => 위치초기화함");
|
||||
PUB.mot.ClearPosition((int)eAxis.Z_THETA);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 포트상태확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
// if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var PortRDY = target == eWorkPort.Left ? PUB.flag.get(eVarBool.FG_RDY_PORT_PL) : PUB.flag.get(eVarBool.FG_RDY_PORT_PR);
|
||||
if (PortRDY == false) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 내린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
// if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
|
||||
//컨베어모드라면 센서에 감지되는 것이 없어야 한다
|
||||
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Use_Conveyor])
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
//컨베이어가 움직이고 있다면 단순 대기한다
|
||||
if (DIO.GetIOOutput(eDOName.LEFT_CONV) == false)
|
||||
{
|
||||
//놓일위치에서 센서가 감지되었다
|
||||
if (DIO.GetIOInput(eDIName.L_CONV1))
|
||||
{
|
||||
var ssname = $"X{eDIName.L_CONV1}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.LCONVER_REEL_DECTECT_IN, eNextStep.PAUSE, ssname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (seqTime.TotalSeconds > 10)
|
||||
{
|
||||
var ssname = $"Y{eDOName.LEFT_CONV}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.LCONVER_MOVING, eNextStep.PAUSE, ssname);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//컨베이어가 움직이고 있다면 단순 대기한다
|
||||
if (DIO.GetIOOutput(eDOName.RIGHT_CONV) == false)
|
||||
{
|
||||
//놓일위치에서 센서가 감지되었다
|
||||
if (DIO.GetIOInput(eDIName.R_CONV1))
|
||||
{
|
||||
var ssname = $"X{eDIName.R_CONV1}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.RCONVER_REEL_DECTECT_IN, eNextStep.PAUSE, ssname);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (seqTime.TotalSeconds > 10)
|
||||
{
|
||||
var ssname = $"Y{eDOName.RIGHT_CONV}";
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.RCONVER_MOVING, eNextStep.PAUSE, ssname);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var fg = target == eWorkPort.Left ? eVarBool.FG_RUN_LEFT : eVarBool.FG_RUN_RIGHT;
|
||||
var Loc = target == eWorkPort.Left ? ePZLoc.PICKOFFL : ePZLoc.PICKOFFR;
|
||||
var Pos = MOT.GetPZPos(Loc);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 진공파기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
DIO.SetPickerVac(false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z축을 올린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
// if (iLockX.IsEmpty() == false) return false;
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, false, funcName);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
IncCount(1, 1);
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (AR.SETTING.Data.Disable_PortL == false && AR.SETTING.Data.Disable_Left == false)
|
||||
{
|
||||
hmi1.arVar_Port[0].AlignReset();
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AR.SETTING.Data.Disable_PortR == false && AR.SETTING.Data.Disable_Right == false)
|
||||
{
|
||||
hmi1.arVar_Port[2].AlignReset();
|
||||
}
|
||||
}
|
||||
VAR.I32[eVarInt32.PickOfCount] += 1;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
247
Handler/Project/RunCode/RunSequence/6.PRINT.cs
Normal file
247
Handler/Project/RunCode/RunSequence/6.PRINT.cs
Normal file
@@ -0,0 +1,247 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean PRINTER(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
var Printer = target == eWorkPort.Left ? PUB.PrinterL : PUB.PrinterR;
|
||||
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
//option check
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = PUB.OPT_BYPASS();
|
||||
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"[{target}] 프린트 작업 시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 프린트 모션 위치 확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
sPositionData PosY, PosZ;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
PosY = MOT.GetLMPos(eLMLoc.READY);
|
||||
PosZ = MOT.GetLZPos(eLZLoc.PICKON);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosY = MOT.GetRMPos(eRMLoc.READY);
|
||||
PosZ = MOT.GetRZPos(eRZLoc.PICKON);
|
||||
}
|
||||
|
||||
if (MOT.CheckMotionPos(seqTime, PosY, funcName) == false) return false;
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false;
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 인쇄데이터 확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (item.VisionData.RID.isEmpty())
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPRINTLDATA, eNextStep.PAUSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPRINTRDATA, eNextStep.PAUSE);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 인쇄데이터전송
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
string zpl, qrdata;
|
||||
zpl = Printer.makeZPL_210908(new Class.Reel
|
||||
{
|
||||
sid = item.VisionData.SID,
|
||||
lot = item.VisionData.VLOT,
|
||||
manu = item.VisionData.VNAME,
|
||||
qty = item.VisionData.QTY.isEmpty() ? -1 : int.Parse(item.VisionData.QTY),
|
||||
id = item.VisionData.RID,
|
||||
mfg = item.VisionData.MFGDATE,
|
||||
partnum = item.VisionData.PARTNO,
|
||||
}, AR.SETTING.Data.DrawOutbox, out qrdata);
|
||||
item.VisionData.ZPL = zpl;
|
||||
item.VisionData.PrintQRData = qrdata;
|
||||
|
||||
PUB.log.Add("PRINT", $"[{target}] 프린트");//QR=" + item.VisionData.QRData);
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
var prn = Printer.Print(zpl);
|
||||
//PUB.PrintSend(true, zpl); //PUB.PrintL.Write(zpl);
|
||||
if (prn == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTL, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.counter.CountPrintL += 1;
|
||||
item.PrintTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var prn = Printer.Print(zpl);
|
||||
//PUB.PrintSend(false, zpl); //PUB.PrintR.Write(zpl);
|
||||
|
||||
|
||||
if (prn == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.PRINTR, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.counter.CountPrintR += 1;
|
||||
item.PrintTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
else PUB.log.AddAT($"[{target}] 프린터 기능 OFF(bypass or model or setting)");
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 잠시대기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var WaitMS = target == eWorkPort.Left ? AR.SETTING.Data.PrintLWaitMS : AR.SETTING.Data.PrintRWaitMS;
|
||||
if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < WaitMS) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 위쪽흡기 ON
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
DIO.SetPrintLVac(ePrintVac.inhalation);
|
||||
}
|
||||
else
|
||||
{
|
||||
DIO.SetPrintRVac(ePrintVac.inhalation);
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 잠시대기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < 100) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 아래쪽 블로우
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false && SETTING.Data.Disable_BottomAirBlow == false)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
DIO.SetPrintLAir(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
DIO.SetPrintRAir(true);
|
||||
}
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 잠시대기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false && seqTime.TotalMilliseconds < 100) return false;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 장비기술데이터저장
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"6.PRINT : EE-SAVE");
|
||||
SaveData_EE(item, (target == eWorkPort.Left ? "L" : "R"), "","printer");
|
||||
//RefreshList(); //목록업데이트
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### spare
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
224
Handler/Project/RunCode/RunSequence/7_PRINTER_ON.cs
Normal file
224
Handler/Project/RunCode/RunSequence/7_PRINTER_ON.cs
Normal file
@@ -0,0 +1,224 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean PRINTER_ON(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
var Printer = target == eWorkPort.Left ? PUB.PrinterL : PUB.PrinterR;
|
||||
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
//var ByPassMode = Jobtype == "BP";
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
//option check
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = PUB.OPT_BYPASS();
|
||||
//####################################################
|
||||
//### 인터락 확인
|
||||
//####################################################
|
||||
Boolean MotMoveM, MotMoveZ;
|
||||
AR.CInterLock iLockM, iLockZ;
|
||||
eAxis axisM = target == eWorkPort.Left ? eAxis.PL_MOVE : eAxis.PR_MOVE;
|
||||
eAxis axisZ = target == eWorkPort.Left ? eAxis.PL_UPDN : eAxis.PR_UPDN;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
MotMoveM = PUB.mot.IsMotion((int)eAxis.PL_MOVE);
|
||||
MotMoveZ = PUB.mot.IsMotion((int)eAxis.PL_UPDN);
|
||||
iLockM = PUB.iLock[(int)eAxis.PL_MOVE];
|
||||
iLockZ = PUB.iLock[(int)eAxis.PL_UPDN];
|
||||
}
|
||||
else
|
||||
{
|
||||
MotMoveM = PUB.mot.IsMotion((int)eAxis.PR_MOVE);
|
||||
MotMoveZ = PUB.mot.IsMotion((int)eAxis.PR_UPDN);
|
||||
iLockM = PUB.iLock[(int)eAxis.PR_MOVE];
|
||||
iLockZ = PUB.iLock[(int)eAxis.PR_UPDN];
|
||||
}
|
||||
|
||||
if (iLockM.IsEmpty() == false && MotMoveM)
|
||||
{
|
||||
var locklistX = MOT.GetActiveLockList(axisM, iLockM);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)axisM);
|
||||
}
|
||||
|
||||
if (iLockZ.IsEmpty() == false && MotMoveZ)
|
||||
{
|
||||
var locklistZ = MOT.GetActiveLockList(axisZ, iLockZ);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)axisZ);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"[{target}] 프린트 ON 작업 시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 종이감지확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var 용지감지센서 = target == eWorkPort.Left ? eDIName.L_PICK_VAC : eDIName.R_PICK_VAC;
|
||||
var 용지감지기능 = target == eWorkPort.Left ? AR.SETTING.Data.Detect_PrintL : AR.SETTING.Data.Detect_PrintR;
|
||||
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (용지감지기능 == false)
|
||||
{
|
||||
if (seqTime.TotalMilliseconds < 100) return false;
|
||||
PUB.log.AddAT($"[{target}] 용지감지기능 OFF(3초후 진행)");
|
||||
}
|
||||
else
|
||||
{
|
||||
var ioresult = DIO.checkDigitalO(용지감지센서, seqTime, true, 0, false);
|
||||
if (ioresult == eNormalResult.Error)
|
||||
{
|
||||
var errCode = target == eWorkPort.Left ? eECode.NO_PAPER_DETECT_L : eECode.NO_PAPER_DETECT_R;
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, errCode, eNextStep.PAUSE, 용지감지센서);
|
||||
return false;
|
||||
}
|
||||
else if (ioresult == eNormalResult.False) return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z올리기(slow)
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
if (OPT_BYPASS == false)
|
||||
{
|
||||
if (seqTime.TotalMilliseconds < 3000) return false;
|
||||
sPositionData PosZ;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
PosZ = MOT.GetLZPos(eLZLoc.PICKON);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosZ = MOT.GetRZPos(eRZLoc.PICKON);
|
||||
}
|
||||
PosZ.Position -= 10;
|
||||
if (PosZ.Position < 1) PosZ.Position = 1;
|
||||
PosZ.Speed = 5;
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false;
|
||||
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 종이감지확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
var 용지감지센서 = target == eWorkPort.Left ? eDIName.L_PICK_VAC : eDIName.R_PICK_VAC;
|
||||
var 용지감지기능 = target == eWorkPort.Left ? AR.SETTING.Data.Detect_PrintL : AR.SETTING.Data.Detect_PrintR;
|
||||
|
||||
if (용지감지기능 == false)
|
||||
{
|
||||
if (seqTime.TotalMilliseconds < 100) return false;
|
||||
PUB.log.AddAT($"[{target}] 용지감지기능 OFF(3초후 진행)");
|
||||
}
|
||||
else
|
||||
{
|
||||
var ioresult = DIO.checkDigitalO(용지감지센서, seqTime, true, 0, false);
|
||||
if (ioresult == eNormalResult.Error)
|
||||
{
|
||||
var errCode = target == eWorkPort.Left ? eECode.NO_PAPER_DETECT_L : eECode.NO_PAPER_DETECT_R;
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, errCode, eNextStep.PAUSE, 용지감지센서);
|
||||
return false;
|
||||
}
|
||||
else if (ioresult == eNormalResult.False) return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### Z올리기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
if (OPT_BYPASS == false)
|
||||
{
|
||||
sPositionData PosZ;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
PosZ = MOT.GetLZPos(eLZLoc.READY);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosZ = MOT.GetRZPos(eRZLoc.READY);
|
||||
}
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, funcName) == false) return false;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//air off
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
DIO.SetPrintLAir(false);
|
||||
if (OPT_BYPASS == false)
|
||||
VAR.I32[eVarInt32.LPickOnCount] += 1;
|
||||
PUB.flag.set(eVarBool.FG_PL_ITEMON, true, funcName);
|
||||
}
|
||||
else
|
||||
{
|
||||
DIO.SetPrintRAir(false);
|
||||
if (OPT_BYPASS == false)
|
||||
VAR.I32[eVarInt32.RPickOnCount] += 1;
|
||||
PUB.flag.set(eVarBool.FG_PR_ITEMON, true, funcName);
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
574
Handler/Project/RunCode/RunSequence/8_PRINTER_OFF.cs
Normal file
574
Handler/Project/RunCode/RunSequence/8_PRINTER_OFF.cs
Normal file
@@ -0,0 +1,574 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean PRINTER_OFF(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
//option check
|
||||
var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
//var OPT_BYPASS = PUB.OPT_BYPASS(target);
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 인터락 확인
|
||||
//####################################################
|
||||
Boolean MotMoveM, MotMoveZ;
|
||||
AR.CInterLock iLockM, iLockZ;
|
||||
eAxis axisM = target == eWorkPort.Left ? eAxis.PL_MOVE : eAxis.PR_MOVE;
|
||||
eAxis axisZ = target == eWorkPort.Left ? eAxis.PL_UPDN : eAxis.PR_UPDN;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
MotMoveM = PUB.mot.IsMotion((int)eAxis.PL_MOVE);
|
||||
MotMoveZ = PUB.mot.IsMotion((int)eAxis.PL_UPDN);
|
||||
iLockM = PUB.iLock[(int)eAxis.PL_MOVE];
|
||||
iLockZ = PUB.iLock[(int)eAxis.PL_UPDN];
|
||||
}
|
||||
else
|
||||
{
|
||||
MotMoveM = PUB.mot.IsMotion((int)eAxis.PR_MOVE);
|
||||
MotMoveZ = PUB.mot.IsMotion((int)eAxis.PR_UPDN);
|
||||
iLockM = PUB.iLock[(int)eAxis.PR_MOVE];
|
||||
iLockZ = PUB.iLock[(int)eAxis.PR_UPDN];
|
||||
}
|
||||
|
||||
if (iLockM.IsEmpty() == false && MotMoveM)
|
||||
{
|
||||
var locklistX = MOT.GetActiveLockList(axisM, iLockM);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistX) + ")", (int)axisM);
|
||||
}
|
||||
|
||||
if (iLockZ.IsEmpty() == false && MotMoveZ)
|
||||
{
|
||||
var locklistZ = MOT.GetActiveLockList(axisZ, iLockZ);
|
||||
PUB.mot.MoveStop("ILock(" + string.Join(",", locklistZ) + ")", (int)axisZ);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//PUB.log.Add($"[{target}] 프린트 OFF 작업 시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 피커Y축 위치 확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PosX = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
var OffX = MOT.getPositionOffset(PosX);
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (OffX < -1) return false; //충돌조건이므로 Y축을 움직이면 안된다
|
||||
}
|
||||
else
|
||||
{
|
||||
if (OffX > 1) return false;//충돌조건이므로 Y축을 움직이면 안된다
|
||||
}
|
||||
|
||||
//PUB.log.Add($"[{target}] 프린트 OFF 작업 시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### 프린터Z축 위치 확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
sPositionData Pos;
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
Pos = MOT.GetLZPos(eLZLoc.READY);
|
||||
}
|
||||
else
|
||||
{
|
||||
Pos = MOT.GetRZPos(eRZLoc.READY);
|
||||
}
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
|
||||
//PUB.log.Add($"[{target}] 프린트 OFF 작업 시작");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//### Y이동
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
sPositionData Pos;
|
||||
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
//릴크기없으면 오류
|
||||
var reelSize = item.VisionData.ReelSize;
|
||||
if (reelSize == eCartSize.None)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOREELSIZE, eNextStep.PAUSE, target);
|
||||
return false;
|
||||
}
|
||||
|
||||
//부착위치
|
||||
var PrintPutPos = item.VisionData.GetPrintPutPosition();
|
||||
if (PrintPutPos == ePrintPutPos.None)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOPUTPOSITION, eNextStep.PAUSE, target);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
//위에 찍을지 아래에 찍을지 위치를 결정한다
|
||||
if (reelSize == eCartSize.Inch13)
|
||||
{
|
||||
if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetLMPos(eLMLoc.PRINTM13);
|
||||
else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetLMPos(eLMLoc.PRINTL13);
|
||||
else Pos = MOT.GetLMPos(eLMLoc.PRINTH13);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetLMPos(eLMLoc.PRINTM07);
|
||||
else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetLMPos(eLMLoc.PRINTL07);
|
||||
else Pos = MOT.GetLMPos(eLMLoc.PRINTH07);
|
||||
}
|
||||
}
|
||||
else //Right Move
|
||||
{
|
||||
//위에 찍을지 아래에 찍을지 위치를 결정한다
|
||||
if (reelSize == eCartSize.Inch13)
|
||||
{
|
||||
if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetRMPos(eRMLoc.PRINTM13);
|
||||
else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetRMPos(eRMLoc.PRINTL13);
|
||||
else Pos = MOT.GetRMPos(eRMLoc.PRINTH13);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PrintPutPos == ePrintPutPos.Middle) Pos = MOT.GetRMPos(eRMLoc.PRINTM07);
|
||||
else if (PrintPutPos == ePrintPutPos.Bottom) Pos = MOT.GetRMPos(eRMLoc.PRINTL07);
|
||||
else Pos = MOT.GetRMPos(eRMLoc.PRINTH07);
|
||||
}
|
||||
}
|
||||
|
||||
if (iLockM.IsEmpty() == false) return false;
|
||||
//if (iLockZ.IsEmpty() == false) return false;
|
||||
|
||||
//위치오류확인
|
||||
if (Pos.isError == false)
|
||||
{
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.POSITION_ERROR, eNextStep.PAUSE, "PRINTPOS");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 실린더 전/후진 상태를 전환한다 -- 210207
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
var Cylinder = item.VisionData.NeedCylinderForward;
|
||||
if (Cylinder == true)
|
||||
{
|
||||
//전진이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, true);
|
||||
else
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, true);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//전진이 필요하지 않다.
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
else
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 카트모드에서는 추가 실린더 down 해야한다 230809
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
//전진이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetOutput(eDOName.L_CYLDN, true);
|
||||
else
|
||||
DIO.SetOutput(eDOName.R_CYLDN, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
else
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 카트상태확인
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
eVarBool fg = target == eWorkPort.Left ? eVarBool.FG_RDY_PORT_PL : eVarBool.FG_RDY_PORT_PR;
|
||||
if (PUB.flag.get(fg) == false) return false;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 실린더상태확인 -- 210207
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
var Cylinder = item.VisionData.NeedCylinderForward;
|
||||
if (Cylinder == true)
|
||||
{
|
||||
//전진이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_FW, seqTime, true) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_FW, seqTime, true) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//전진이 필요하지 않다.
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 피커 down 실린더상태확인 -- 230809
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false && SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
//전진이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLDN, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NODOWN) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLDN, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NODOWN) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z값을 내린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
sPositionData Pos;
|
||||
if (target == eWorkPort.Left)
|
||||
Pos = MOT.GetLZPos(eLZLoc.PICKOFF);
|
||||
else
|
||||
Pos = MOT.GetRZPos(eRZLoc.PICKOFF);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 진공파기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
DIO.SetPrintLVac(ePrintVac.exhaust);
|
||||
}
|
||||
else
|
||||
{
|
||||
DIO.SetPrintRVac(ePrintVac.exhaust);
|
||||
}
|
||||
}
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
VAR.BOOL[eVarBool.LEFT_ITEM_PICKOFF] = true;
|
||||
VAR.TIME[eVarTime.LEFT_ITEM_PICKOFF] = DateTime.Now;
|
||||
VAR.DBL[eVarDBL.LEFT_ITEM_PICKOFF] = 0;
|
||||
VAR.I32[eVarInt32.LEFT_ITEM_COUNT] += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.BOOL[eVarBool.RIGT_ITEM_PICKOFF] = true;
|
||||
VAR.TIME[eVarTime.RIGT_ITEM_PICKOFF] = DateTime.Now;
|
||||
VAR.DBL[eVarDBL.RIGT_ITEM_PICKOFF] = 0;
|
||||
VAR.I32[eVarInt32.RIGT_ITEM_COUNT] += 1;
|
||||
}
|
||||
PUB.log.Add($"[{target}] 릴을 내려놓습니다");
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 잠시대기
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (seqTime.TotalMilliseconds < AR.SETTING.Data.PrintVacOffPurgeMS) return false;
|
||||
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 저속으로올린다
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
sPositionData Pos;
|
||||
if (target == eWorkPort.Left)
|
||||
Pos = MOT.GetLZPos(eLZLoc.PICKOFF);
|
||||
else
|
||||
Pos = MOT.GetRZPos(eRZLoc.PICKOFF);
|
||||
Pos.Position -= 30;
|
||||
Pos.Speed = 30;
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 카트모드에서는 추가 실린더 down 해야한다 230809
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//if (ByPassMode == false)
|
||||
//{
|
||||
// if (CVMode == false)
|
||||
//{
|
||||
//전진이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
else
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
//}
|
||||
// }
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### Z값 대기위치로
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (iLockZ.IsEmpty() == false) return false;
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
sPositionData Pos;
|
||||
if (target == eWorkPort.Left)
|
||||
Pos = MOT.GetLZPos(eLZLoc.READY);
|
||||
else
|
||||
Pos = MOT.GetRZPos(eRZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, funcName) == false) return false;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### AIR해제
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
DIO.SetPrintLVac(ePrintVac.off);
|
||||
else
|
||||
DIO.SetPrintRVac(ePrintVac.off);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 실린더 복귀 확인 -- 230809
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
//상승이 필요하다
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NOUP) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NOUP) != eNormalResult.True)
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_VAC, seqTime, false) != eNormalResult.True) return false;
|
||||
VAR.I32[eVarInt32.LPickOfCount] += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_VAC, seqTime, false) != eNormalResult.True) return false;
|
||||
VAR.I32[eVarInt32.RPickOfCount] += 1;
|
||||
}
|
||||
//PUB.log.AddAT($"용지 떨어짐 확인 필요");
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_PL_ITEMON, false, funcName);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_PR_ITEMON, false, funcName);
|
||||
}
|
||||
|
||||
//프린터 사용여부 확인
|
||||
if (OPT_PrinterOff == false)
|
||||
{
|
||||
item.PrintAttach = true;
|
||||
item.Attachtime = DateTime.Now;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
146
Handler/Project/RunCode/RunSequence/90_SaveData.cs
Normal file
146
Handler/Project/RunCode/RunSequence/90_SaveData.cs
Normal file
@@ -0,0 +1,146 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
delegate void savedataeehandler(Class.JobData item, string Loc, string inboundok, string reason);
|
||||
|
||||
public void SaveData_EE(Class.JobData item, string Loc, string inboundok, string reason)
|
||||
{
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
//이자료를 복사해서 데이터를 넘겨줘야한다.
|
||||
var a = new Class.JobData(999);
|
||||
item.CopyTo(ref a);
|
||||
this.BeginInvoke(new savedataeehandler(SaveData_EE), a, Loc, inboundok, reason);
|
||||
return;
|
||||
}
|
||||
|
||||
var retval = false;
|
||||
if (AR.SETTING.Data.OnlineMode == false)
|
||||
{
|
||||
PUB.log.AddAT($"[SAVE-EE] 오프라인으로 저장 하지 않음");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
DateTime savestart = DateTime.Now;
|
||||
try
|
||||
{
|
||||
var save_month = DateTime.Now.ToString("YY") + DateTime.Now.Month.ToString("X");
|
||||
var save_sn = string.Empty;
|
||||
if (item.VisionData.RID.Length == 15)
|
||||
{
|
||||
save_month = item.VisionData.RID.Substring(8, 3); //21A 식으로 년도와 월이 나온다
|
||||
save_sn = item.VisionData.RID.Substring(item.VisionData.RID.Length - 4); //뒷에서 4자리 끊는다
|
||||
}
|
||||
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
|
||||
//var ByPassMode = Jobtype == "BP";
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
//option check
|
||||
//var OPT_PrinterOff = PUB.OPT_PRINTEROFF(target);
|
||||
//var OPT_CameraOff = PUB.OPT_CAMERA(target);
|
||||
var OPT_BYPASS = SETTING.Data.SystemBypass;// PUB.OPT_BYPASS(target);
|
||||
|
||||
|
||||
using (var taResult = new DataSet1TableAdapters.Component_Reel_ResultTableAdapter())
|
||||
{
|
||||
//QTY 0값은 없을 수도있다(해당 값은 서버조회여부에다라 다르다)
|
||||
int? qtyorg = null;
|
||||
if (int.TryParse(item.VisionData.QTY0, out int vqty0))
|
||||
qtyorg = vqty0;
|
||||
string remark = string.Empty;
|
||||
if (item.VisionData.ConfirmAuto) remark = "[자동]" + remark; //자동확인문구
|
||||
else if (item.VisionData.ConfirmUser) remark = "[확인]" + remark; //사용자 확인데이터 비고에 추가
|
||||
if (OPT_BYPASS) remark = "(BYPASS)" + remark;
|
||||
|
||||
DataSet1.Component_Reel_ResultRow newdr = this.dataSet1.Component_Reel_Result.Where(t => t.JGUID.Equals(item.guid)).FirstOrDefault();
|
||||
if (newdr == null) newdr = this.dataSet1.Component_Reel_Result.NewComponent_Reel_ResultRow();
|
||||
//else newdr = dt.Rows[0] as DataSet1.Component_Reel_ResultRow;
|
||||
|
||||
if (item.JobStart.Year != 1982) newdr.STIME = item.JobStart;
|
||||
else newdr.STIME = DateTime.Now;
|
||||
|
||||
if (item.JobEnd.Year != 1982) newdr.ETIME = item.JobEnd;
|
||||
if (item.PrintTime.Year != 1982) newdr.PTIME = item.PrintTime;
|
||||
|
||||
newdr.ATIME = item.Attachtime;
|
||||
newdr.PDATE = save_month;
|
||||
newdr.JTYPE = PUB.Result.vModel.Title;// PUB.Result.JobType2;
|
||||
if (newdr.JTYPE.Length > 10) newdr.JTYPE = newdr.JTYPE.Substring(0, 9);
|
||||
|
||||
newdr.SID = item.VisionData.SID;
|
||||
newdr.SID0 = item.VisionData.SID0;
|
||||
newdr.RID = item.VisionData.RID;
|
||||
newdr.RID0 = item.VisionData.RID0;
|
||||
newdr.RSN = save_sn;
|
||||
newdr.QR = item.VisionData.PrintQRData;
|
||||
newdr.ZPL = item.VisionData.ZPL;
|
||||
newdr.POS = item.VisionData.PrintPositionData;
|
||||
newdr.LOC = Loc;
|
||||
newdr.ANGLE = item.VisionData.ApplyAngle;
|
||||
if (int.TryParse(item.VisionData.QTY, out int oqty))
|
||||
newdr.QTY = oqty;
|
||||
else
|
||||
newdr.QTY = 0;
|
||||
|
||||
newdr.MFGDATE = item.VisionData.MFGDATE;//210326 날짜도 추가함
|
||||
if (qtyorg != null) newdr.QTY0 = (int)qtyorg;
|
||||
newdr.VNAME = item.VisionData.VNAME;
|
||||
newdr.VLOT = item.VisionData.VLOT; ///210326
|
||||
newdr.PRNATTACH = item.PrintAttach;
|
||||
newdr.PRNVALID = item.PrintQRValid;
|
||||
newdr.REMARK = remark;
|
||||
if (inboundok.isEmpty() == false) newdr.iNBOUND = inboundok;//230622
|
||||
newdr.MC = AR.SETTING.Data.McName;
|
||||
newdr.PARTNO = item.VisionData.PARTNO;
|
||||
newdr.CUSTCODE = item.VisionData.CUSTCODE;
|
||||
newdr.MCN = item.VisionData.MCN;
|
||||
newdr.target = item.VisionData.Target;
|
||||
|
||||
//220921 - batch qtymax
|
||||
newdr.BATCH = item.VisionData.BATCH;
|
||||
if (int.TryParse(item.VisionData.QTYMAX, out int qtymax))
|
||||
newdr.qtymax = qtymax;
|
||||
else newdr.qtymax = -1;
|
||||
|
||||
|
||||
|
||||
//new mode
|
||||
if (newdr.RowState == System.Data.DataRowState.Detached)
|
||||
{
|
||||
newdr.GUID = PUB.Result.guid; //220921
|
||||
newdr.JGUID = item.guid;
|
||||
newdr.wdate = DateTime.Now;
|
||||
this.dataSet1.Component_Reel_Result.AddComponent_Reel_ResultRow(newdr);
|
||||
}
|
||||
else newdr.EndEdit();
|
||||
|
||||
var cnt = ta.Update(newdr);
|
||||
newdr.AcceptChanges();
|
||||
if (cnt == 0) PUB.log.AddE("Save Error");
|
||||
}
|
||||
|
||||
retval = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE($"[EE-SAVE] {ex.Message}");
|
||||
retval = false;
|
||||
}
|
||||
|
||||
var ts = DateTime.Now - savestart;
|
||||
PUB.log.AddI($"data save time : {ts.TotalSeconds:N2}");
|
||||
|
||||
ListFormmatData();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
175
Handler/Project/RunCode/RunSequence/9_QRValid.cs
Normal file
175
Handler/Project/RunCode/RunSequence/9_QRValid.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean QR_VALIDATION(eWorkPort target, eSMStep cmdIndex)
|
||||
{
|
||||
UInt16 idx = 1;
|
||||
var mv = PUB.Result.vModel;
|
||||
var mc = PUB.Result.mModel;
|
||||
var funcName = System.Reflection.MethodBase.GetCurrentMethod().Name;
|
||||
var seqTime = PUB.sm.seq.GetTime(cmdIndex);
|
||||
var msgType = (Class.eStatusMesage)target;
|
||||
var item = target == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
var WS = target == eWorkPort.Left ? PUB.wsL : PUB.wsR;
|
||||
|
||||
//####################################################
|
||||
//### 작업시작
|
||||
//####################################################
|
||||
var CIDX = PUB.sm.seq.Get(cmdIndex);
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//작업 플래그 설정
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
VAR.BOOL[eVarBool.VisionL_Retry] = false;
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONL, false, funcName);
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONL, true, funcName);
|
||||
//PUB.iLockCVL.set((int)eILockCV.VISION, true, funcName);
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.BOOL[eVarBool.VisionR_Retry] = false;
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONR, false, funcName);
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONR, true, funcName);
|
||||
//PUB.iLockCVR.set((int)eILockCV.VISION, true, funcName);
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//카메라 트리거 전송
|
||||
var sendok = WS_Send(target, WS, item.guid, "TRIG", item.VisionData.PrintQRData);
|
||||
PUB.log.Add($"바코드트리거전송({target}) = {sendok}");
|
||||
if(sendok==false) //230512 전송실패시 오류로 한다
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.VISION_TRIGERROR, eNextStep.PAUSE);
|
||||
return false;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
//####################################################
|
||||
//### 수신된 바코드 값을 기다린다.
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//타임아웃시간을 넘어서면 오류처리한다
|
||||
if (seqTime.TotalMilliseconds >= AR.SETTING.Data.Timeout_VisionProcessU)
|
||||
{
|
||||
//
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.VisionL_Retry] == false)
|
||||
{
|
||||
PUB.log.AddAT("비젼(L) 1회 실패로 재 시도 합니다");
|
||||
VAR.BOOL[eVarBool.VisionL_Retry] = true;
|
||||
PUB.sm.seq.Update(cmdIndex, -1);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (item.VisionData.RID2.isEmpty() == false && item.VisionData.MatchValidation == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.QRDATAMISSMATCHL, eNextStep.PAUSE, target, item.VisionData.RID, item.VisionData.RID2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.VISION_NORECV, eNextStep.PAUSE, target);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.VisionR_Retry] == false)
|
||||
{
|
||||
PUB.log.AddAT("비젼(R) 1회 실패로 재 시도 합니다");
|
||||
VAR.BOOL[eVarBool.VisionR_Retry] = true;
|
||||
PUB.sm.seq.Update(cmdIndex, -1);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (item.VisionData.RID2.isEmpty() == false && item.VisionData.MatchValidation == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.QRDATAMISSMATCHR, eNextStep.PAUSE, target, item.VisionData.RID, item.VisionData.RID2);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.VISION_NORECV, eNextStep.PAUSE, target);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex, -1); // 재시작시 트리거 전송할 수 있게 위로 옮김
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//타임아웃되지 않은 조건
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_END_VISIONL)) //종료신호가 설정되어있다면 완료된 경우다
|
||||
{
|
||||
PUB.log.AddI($"{target} 비젼 종료 신호로 인해 완료 처리 합니다");
|
||||
item.PrintQRValid = true;
|
||||
}
|
||||
else if (PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false) //사용자가 취소했다면 넘어간다
|
||||
{
|
||||
PUB.log.AddAT($"{target} 사용자 취소로 QR검증을 넘김");
|
||||
item.PrintQRValid = false;
|
||||
}
|
||||
else return false; //아직 완료전이므로 리턴한다
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_END_VISIONR))
|
||||
{
|
||||
PUB.log.AddI($"{target} 비젼 종료 신호로 인해 완료 처리 합니다");
|
||||
item.PrintQRValid = true;
|
||||
}
|
||||
else if (PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false) //사용자가 취소했다면 넘어간다
|
||||
{
|
||||
PUB.log.AddAT($"{target} 사용자 취소로 QR검증을 넘김");
|
||||
item.PrintQRValid = false;
|
||||
}
|
||||
else return false; //아직 완료전이므로 리턴한다
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//####################################################
|
||||
//###
|
||||
//####################################################
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
PUB.log.Add($"{target} 비젼 검증 완료(결과:{item.PrintQRValid})");
|
||||
|
||||
if (target == eWorkPort.Left)
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONL, false, funcName);
|
||||
else
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONR, false, funcName);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
324
Handler/Project/RunCode/RunSequence/_RUN_MOT_PORT.cs
Normal file
324
Handler/Project/RunCode/RunSequence/_RUN_MOT_PORT.cs
Normal file
@@ -0,0 +1,324 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 로더용 포트 조작
|
||||
/// </summary>
|
||||
/// <param name="idx"></param>
|
||||
/// <param name="isFirst"></param>
|
||||
/// <param name="StepTime"></param>
|
||||
void _SM_RUN_MOT_PORT(int idx, Boolean isFirst, TimeSpan StepTime)
|
||||
{
|
||||
//포트 비활성 체크
|
||||
eVarBool FG_RDY_PORT;
|
||||
eDIName DI_LIMUP, DI_DETUP;
|
||||
eDOName DO_PORTRUN;
|
||||
Boolean PORT_DISABLE;
|
||||
|
||||
//인덱스에 맞는 플래그와 DI값 설정
|
||||
if (idx == 0)
|
||||
{
|
||||
PORT_DISABLE = AR.SETTING.Data.Disable_PortL || AR.SETTING.Data.Disable_Left;
|
||||
FG_RDY_PORT = eVarBool.FG_RDY_PORT_PL; DI_DETUP = eDIName.PORTL_DET_UP;
|
||||
DI_LIMUP = eDIName.PORTL_LIM_UP; DO_PORTRUN = eDOName.PORTL_MOT_RUN;
|
||||
}
|
||||
else if (idx == 1)
|
||||
{
|
||||
PORT_DISABLE = AR.SETTING.Data.Disable_PortC;
|
||||
FG_RDY_PORT = eVarBool.FG_RDY_PORT_PC; DI_DETUP = eDIName.PORTC_DET_UP;
|
||||
DI_LIMUP = eDIName.PORTC_LIM_UP; DO_PORTRUN = eDOName.PORTC_MOT_RUN;
|
||||
}
|
||||
else
|
||||
{
|
||||
PORT_DISABLE = AR.SETTING.Data.Disable_PortR || AR.SETTING.Data.Disable_Right;
|
||||
FG_RDY_PORT = eVarBool.FG_RDY_PORT_PR; DI_DETUP = eDIName.PORTR_DET_UP;
|
||||
DI_LIMUP = eDIName.PORTR_LIM_UP; DO_PORTRUN = eDOName.PORTR_MOT_RUN;
|
||||
}
|
||||
|
||||
//포트가 비활성화되어있다면 DETECT ON하고 , LIMIT는 해제한다 -201224
|
||||
if (PORT_DISABLE)
|
||||
{
|
||||
if (PUB.flag.get(FG_RDY_PORT) == false)
|
||||
PUB.flag.set(FG_RDY_PORT, true, "DISABLE PORT");
|
||||
this.hmi1.arVar_Port[idx].AlignOK = 1;
|
||||
hmi1.arVar_Port[idx].errorCount = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//비활성화(좌/우 기능사용여부확인)
|
||||
//if (idx == 0 && COMM.SETTING.Data.Disable_Left == true)
|
||||
//{
|
||||
// this.hmi1.arVar_Port[idx].AlignOK = 1;
|
||||
// return;
|
||||
//}
|
||||
//else if (idx == 2 && COMM.SETTING.Data.Disable_Right == true)
|
||||
//{
|
||||
// this.hmi1.arVar_Port[idx].AlignOK = 1;
|
||||
// return;
|
||||
//}
|
||||
|
||||
|
||||
//오류가 일정횟수 발생하면 RDY를 풀어준다(이경우에는 오류처리를 해서 알림을 해야할듯함!)
|
||||
if (hmi1.arVar_Port[idx].errorCount > 5)
|
||||
{
|
||||
if (hmi1.arVar_Port[idx].AlignOK != 1) hmi1.arVar_Port[idx].AlignOK = 1;
|
||||
if (PUB.flag.get(FG_RDY_PORT) == true) PUB.flag.set(FG_RDY_PORT, false, "RUN_MOT_P");
|
||||
return;
|
||||
}
|
||||
|
||||
//동작중에 X가 pICK 위치에 있다면. Z축이 홈인지 체크한다.
|
||||
if (PUB.sm.Step == eSMStep.RUN)
|
||||
{
|
||||
var PKZ_UNSAFE = MOT.getPositionOffset(eAxis.PZ_PICK, MOT.GetPZPos(ePZLoc.READY).Position) > 2;
|
||||
//var PKX_POS = MOT.GetPKX_PosName();
|
||||
var BSTOP = false;
|
||||
|
||||
//Z축이 Ready 위치보다 낮게 있다면 멈추게한다
|
||||
if (idx == 0 && MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFL)) && PKZ_UNSAFE) BSTOP = true;
|
||||
else if (idx == 1 && MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKON)) && PKZ_UNSAFE) BSTOP = true;
|
||||
else if (idx == 2 && MOT.getPositionMatch(MOT.GetPXPos(ePXLoc.PICKOFFR)) && PKZ_UNSAFE) BSTOP = true;
|
||||
if (BSTOP)
|
||||
{
|
||||
if (DIO.GetIOOutput(DO_PORTRUN) == true) DIO.SetPortMotor(idx, eMotDir.CCW, false, "Z-NOTREADY");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var PORTALIGN_OK = hmi1.arVar_Port[idx].AlignOK;
|
||||
if (PORTALIGN_OK != 1) //align이 진행되지 않았다면 align을 잡기위해 처리를 해줘야한다
|
||||
{
|
||||
if (idx != 1)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
//안전센서동작여부 확인
|
||||
var BSafty = DIO.isSaftyDoorF(idx, true);
|
||||
|
||||
//안전이 확보된 경우에만 얼라인 ok를한다 - 임시로 해제를 한다? 상단리밋에 걸리것을 처리안하려는 코드인듯!
|
||||
//if (isPortDetUp(idx) == false && isPortLimUP(idx) == true && BSafty == true) PORTALIGN_OK = 1;
|
||||
|
||||
if (PORTALIGN_OK == 0) //얼라인이 완료되지 않은상태라면 모터 하강
|
||||
{
|
||||
//모터하강시작시간
|
||||
PUB.Result.PortAlignTime[idx] = DateTime.Now.Ticks;
|
||||
|
||||
//리밋이 감지된 상태에서 작업하는거면 좀더 오래 내린다
|
||||
//if (isPortLimUP(idx))
|
||||
//{
|
||||
if (idx == 1) PUB.Result.PortAlignWaitSec[idx] = AR.SETTING.Data.PortAlignDownTimeL;
|
||||
else PUB.Result.PortAlignWaitSec[idx] = AR.SETTING.Data.PortAlignDownTimeU;
|
||||
|
||||
//좌우측음 좀 덜 내려간다
|
||||
//}
|
||||
//else Pub.Result.PortAlignWaitSec[idx] = 1.2f;
|
||||
//Pub.Result.PortAlignWaitSec[idx] -= 1.0f; //1초제거 210108
|
||||
|
||||
//모터하강
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CCW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CCW, false, "하강전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CCW, true, "얼라인(DN)");
|
||||
|
||||
//하강검사시작
|
||||
hmi1.arVar_Port[idx].AlignOK = 2;
|
||||
//Pub.log.AddAT($"포트({idx}) 얼라인(DOWN) 작업 시작");
|
||||
|
||||
//포트가 이제 안정화하지 않았으니 안정화를 풀어준다
|
||||
PUB.flag.set(FG_RDY_PORT, false, "MOT_PORT_ALIGNSTART");
|
||||
}
|
||||
else if (PORTALIGN_OK == 2) //하강해서 찾는중
|
||||
{
|
||||
//자재감지센서가 감지안되고 일정시간이 지나면 정방향으로 전환한다
|
||||
if (isPortDetUp(idx) == false)
|
||||
{
|
||||
var waitSec = PUB.Result.PortAlignWaitSec[idx];
|
||||
var ts = new TimeSpan(DateTime.Now.Ticks - PUB.Result.PortAlignTime[idx]);
|
||||
if (ts.TotalSeconds >= waitSec)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, false, "상승전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, true, "얼라인(UP)");
|
||||
hmi1.arVar_Port[idx].AlignOK = 9; //올린다
|
||||
//Pub.log.AddAT($"포트({idx}) 얼라인(UP) 작업 시작");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//하강하는데 자재가 감지되고있네? - 하강상태가이면 하강한다
|
||||
if (DIO.GetIOOutput(DO_PORTRUN) == false)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CCW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CCW, false, "하강전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CCW, true, "얼라인(DN)");
|
||||
PUB.log.Add("PORT", "포트를 강제로 하강 합니다");
|
||||
}
|
||||
|
||||
//자재가 감지되면 시간을 다시 초기화해서 충분히 내려가도록 한다 210402
|
||||
PUB.Result.PortAlignTime[idx] = DateTime.Now.Ticks;
|
||||
}
|
||||
|
||||
//하단 리밋에 걸렷다면 반전시켜준다. 200708
|
||||
if (isPortLimDN(idx) == true)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, false, "리밋전환전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, true, "얼라인(LIM)");
|
||||
hmi1.arVar_Port[idx].AlignOK = 9;
|
||||
//Pub.log.AddAT($"포트({idx}) 얼라인(UP-LIM) 작업 시작");
|
||||
}
|
||||
}
|
||||
else if (PORTALIGN_OK == 9) //상승해서 찾는중
|
||||
{
|
||||
if (isPortDetUp(idx) || isPortLimUP(idx))
|
||||
{
|
||||
hmi1.arVar_Port[idx].AlignOK = 1; //정렬완료로처리
|
||||
//Pub.log.AddAT($"포트({idx}) 얼라인 작업 완료");
|
||||
}
|
||||
else if (isPortDetUp(idx) == false || isPortLimUP(idx) == false)
|
||||
{
|
||||
//둘다 켜지 않은 상태에서 모터가 멈춰있다면 올려준다
|
||||
if (DIO.GetIOOutput(DO_PORTRUN) == false)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, false, "강제상승전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, true, "MOT_PORT");
|
||||
PUB.log.Add("PORT", "강제 상승(9에서 멈춰있음)");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (PORTALIGN_OK == 1)
|
||||
{
|
||||
//정렬완료로처리 - 201229
|
||||
hmi1.arVar_Port[idx].AlignOK = 1;
|
||||
}
|
||||
else
|
||||
hmi1.arVar_Port[idx].AlignOK = 0; //알수없는 상태이므로 처음부터 시작하게 한다
|
||||
}
|
||||
else
|
||||
{
|
||||
//여기코드는 PORT ALIGN 이 완료된상태(=1) 일 때 동작하는 코드이다
|
||||
if (PUB.flag.get(FG_RDY_PORT) == false)
|
||||
{
|
||||
if(idx != 1)
|
||||
{
|
||||
|
||||
}
|
||||
if (hmi1.arVar_Port[idx].errorCount > 5)
|
||||
{
|
||||
//5회이상 오류 발생햇으니 처리하지 않음
|
||||
}
|
||||
else if (isPortLimUP(idx) == true)
|
||||
{
|
||||
//상단 리밋이 확인됨(자재가 없는 경우임)
|
||||
if (idx != 1)
|
||||
{
|
||||
//언로더 포트는 리밋에 걸리더라도 사용해야한다(놓는것은 가능 함)
|
||||
//최초 상태에서는 반드시 이 상태가 된다
|
||||
PUB.flag.set(FG_RDY_PORT, true, "MOT_PORT_UNLOADER ON");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isPortDetUp(idx))
|
||||
{
|
||||
PUB.flag.set(FG_RDY_PORT, true, "MOT_PORT_UNLOADER ON");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (isPortDetUp(idx) == true)
|
||||
{
|
||||
//자재감지가 완료되었다?
|
||||
PUB.flag.set(FG_RDY_PORT, true, "RUN_MOT_P");
|
||||
}
|
||||
else
|
||||
{
|
||||
//모터를 올리는 작업을 진행해서 P-LIMIT를 찾아야 한다
|
||||
Boolean runMot = DIO.GetPortMotorDir(idx) == eMotDir.CCW;
|
||||
if (runMot == false)
|
||||
{
|
||||
if (DIO.GetIOOutput(DO_PORTRUN) == false) runMot = true;
|
||||
}
|
||||
if (runMot)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, false, "얼라인(#1)전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, true, "얼라인(#1)");
|
||||
}
|
||||
}
|
||||
}
|
||||
else //포트가 준비되면 아무것도 안한다
|
||||
{
|
||||
//LIMIT이 들어와있는데 DETECT 센서도 들어와 있다면 다시 얼라인 잡게한다.
|
||||
if (DIO.GetIOInput(DI_LIMUP) == true)
|
||||
{
|
||||
//언로더포트 0,2번은 Ready 를 풀지 않는다.
|
||||
//그것은 P-LIM 상태라도 작업이 가능해야 한다
|
||||
if (idx == 1)
|
||||
{
|
||||
if (isPortDetUp(idx) == false)
|
||||
PUB.flag.set(FG_RDY_PORT, false, "RUN_MOT_P");
|
||||
}
|
||||
}
|
||||
|
||||
//자재가 감지되지 않았는데. LIMIT 가 아니라면 up을 시켜준다.
|
||||
if (DIO.GetIOInput(DI_DETUP) == false && DIO.GetIOInput(DI_LIMUP) == false)
|
||||
{
|
||||
//RDY를 해제 해준다
|
||||
PUB.flag.set(FG_RDY_PORT, false, "RUN_MOT_P");
|
||||
|
||||
if (DIO.GetIOOutput(DO_PORTRUN) == false)
|
||||
{
|
||||
if (DIO.GetPortMotorDir(idx) != eMotDir.CW && DIO.GetPortMotorRun(idx) == true)
|
||||
{
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, false, "얼라인(#2)전멈춤");
|
||||
System.Threading.Thread.Sleep(100);
|
||||
}
|
||||
|
||||
DIO.SetPortMotor(idx, eMotDir.CW, true, "얼라인(#2)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (idx == 0)
|
||||
PUB.sm.seq.UpdateTime(eSMStep.RUN_COM_PT0);
|
||||
else if (idx == 1)
|
||||
PUB.sm.seq.UpdateTime(eSMStep.RUN_COM_PT1);
|
||||
else
|
||||
PUB.sm.seq.UpdateTime(eSMStep.RUN_COM_PT2);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
127
Handler/Project/RunCode/StateMachine/_Events.cs
Normal file
127
Handler/Project/RunCode/StateMachine/_Events.cs
Normal file
@@ -0,0 +1,127 @@
|
||||
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
|
||||
{
|
||||
|
||||
private void SM_StateProgress(object sender, AR.StateMachine.StateProgressEventArgs e)
|
||||
{
|
||||
arCtl.arLabel lbl = lbMsg;
|
||||
|
||||
lbl.BeginInvoke(new Action(() =>
|
||||
{
|
||||
var title = e.Message;
|
||||
var max = e.MaxProgress;
|
||||
var value = e.Progress;
|
||||
|
||||
|
||||
if (lbl.ProgressEnable == false) lbl.ProgressEnable = true;
|
||||
if (lbl.ProgressValue != value) lbl.ProgressValue = (float)value;
|
||||
if (lbl.Text != title) lbl.Text = title;
|
||||
|
||||
if (max != 0)
|
||||
{
|
||||
if (lbl.ProgressMax != max) lbl.ProgressMax = (float)max;
|
||||
}
|
||||
if (e.ForeColor != null)
|
||||
{
|
||||
if (lbl.ProgressForeColor != e.ForeColor) lbl.ProgressForeColor = (Color)e.ForeColor;
|
||||
}
|
||||
if (e.ShadowColor != null)
|
||||
{
|
||||
if (lbl.ShadowColor != e.ShadowColor) lbl.ShadowColor = (Color)e.ShadowColor;
|
||||
}
|
||||
if (e.ProgressBackColor1 != null)
|
||||
{
|
||||
if (lbl.ProgressColor1 != e.ProgressBackColor1) lbl.ProgressColor1 = (Color)e.ProgressBackColor1;
|
||||
}
|
||||
if (e.ProgressBackColor2 != null)
|
||||
{
|
||||
if (lbl.ProgressColor2 != e.ProgressBackColor2) lbl.ProgressColor1 = (Color)e.ProgressBackColor2;
|
||||
}
|
||||
|
||||
if (e.BackColor1 != null)
|
||||
{
|
||||
if (lbl.BackColor != e.BackColor1) lbl.BackColor = (Color)e.BackColor1;
|
||||
}
|
||||
if (e.BackColor2 != null)
|
||||
{
|
||||
if (lbl.BackColor2 != e.BackColor2) lbl.BackColor2 = (Color)e.BackColor2;
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private void SM_StepCompleted(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.Add($"스텝완료({PUB.sm.Step})");
|
||||
|
||||
//초기화가 완료되면 컨트롤 글자를 변경 해준다.
|
||||
if (PUB.sm.Step == eSMStep.INIT)
|
||||
SM_InitControl(null, null);
|
||||
|
||||
}
|
||||
|
||||
private void SM_StepStarted(object sender, EventArgs e)
|
||||
{
|
||||
switch (PUB.sm.Step)
|
||||
{
|
||||
case eSMStep.IDLE:
|
||||
|
||||
//IDLE의 시작작업이 완료되었다면 각 버튼을 사용할 수 있도록 한다
|
||||
this.Invoke(new Action(() =>
|
||||
{
|
||||
btStart.Enabled = true;
|
||||
btStop.Enabled = true;
|
||||
btReset.Enabled = true;
|
||||
}));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SM_InitControl(object sender, EventArgs e)
|
||||
{
|
||||
//작업시작전 컨트롤 초기화 코드
|
||||
var mc = PUB.Result.mModel;
|
||||
var mv = PUB.Result.vModel;
|
||||
|
||||
this.Invoke(new Action(() =>
|
||||
{
|
||||
|
||||
//진행 중 표시되는 상태값 초기화
|
||||
lbCntRight.ProgressValue = 0;
|
||||
lbCntRight.Text = "--";
|
||||
lbCntLeft.Text = "--";
|
||||
}));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SM_Message(object sender, StateMachine.StateMachineMessageEventArgs e)
|
||||
{
|
||||
//상태머신에서 발생한 메세지
|
||||
PUB.log.Add(e.Header, e.Message);
|
||||
}
|
||||
|
||||
|
||||
void SM_StepChanged(object sender, StateMachine.StepChangeEventArgs e)
|
||||
{
|
||||
var o = (eSMStep)e.Old;
|
||||
var n = (eSMStep)e.New;
|
||||
PUB.log.AddI($"스텝전환({o} >> {n})");
|
||||
|
||||
//230313
|
||||
EEMStatus.AddStatusSQL(n);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
246
Handler/Project/RunCode/StateMachine/_Loop.cs
Normal file
246
Handler/Project/RunCode/StateMachine/_Loop.cs
Normal file
@@ -0,0 +1,246 @@
|
||||
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($"정의되지 않은 STEP({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();
|
||||
}
|
||||
|
||||
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($"다음 명령이 구현되지 않았습니다 {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("사용자스텝(자동) 실행완료 대기상태전환");
|
||||
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개씩 삭제함
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
122
Handler/Project/RunCode/StateMachine/_SM_DIO.cs
Normal file
122
Handler/Project/RunCode/StateMachine/_SM_DIO.cs
Normal file
@@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
private void Dio_IOValueChanged(object sender, arDev.DIO.IOValueEventArgs e)
|
||||
{
|
||||
if (e.Direction == arDev.DIO.eIOPINDIR.INPUT)
|
||||
{
|
||||
var diPin = DIO.Pin.input.Where(t=>t.terminalno == e.ArrIDX).FirstOrDefault();
|
||||
if(diPin == null)
|
||||
{
|
||||
PUB.log.AddE($"DI INDEX:{e.ArrIDX} 에 해당하는 터미널 대상이 없습니다");
|
||||
}
|
||||
else
|
||||
{
|
||||
var pin = (eDIName)diPin.idx;
|
||||
if (AR.SETTING.Data.Log_DI)
|
||||
{
|
||||
PUB.log.Add("DIO", String.Format("DI:IDX={0},DIR={1},VAL={2},NM={3}", e.ArrIDX, e.Direction, e.NewValue, diPin));
|
||||
}
|
||||
var value = DIO.GetIOInput(pin);
|
||||
_DIO_INPUT_VALUE_CHANGED(pin, value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var doPin = DIO.Pin.output.Where(t => t.terminalno == e.ArrIDX).FirstOrDefault();
|
||||
if (doPin == null)
|
||||
{
|
||||
PUB.log.AddE($"DO INDEX:{e.ArrIDX} 에 해당하는 터미널 대상이 없습니다");
|
||||
}
|
||||
else
|
||||
{
|
||||
var pin = (eDOName)doPin.idx;
|
||||
|
||||
if (AR.SETTING.Data.Log_DO)
|
||||
{
|
||||
//타워램프는 제외하낟.
|
||||
if (e.ArrIDX != (byte)eDOName.TWR_GRNF &&
|
||||
e.ArrIDX != (byte)eDOName.TWR_REDF &&
|
||||
e.ArrIDX != (byte)eDOName.TWR_YELF &&
|
||||
e.ArrIDX != (byte)eDOName.BUT_STARTF &&
|
||||
e.ArrIDX != (byte)eDOName.BUT_STOPF &&
|
||||
e.ArrIDX != (byte)eDOName.BUT_RESETF)
|
||||
PUB.log.Add("DIO", String.Format("DO:IDX={0},DIR={1},VAL={2}", e.ArrIDX, e.Direction, e.NewValue));
|
||||
}
|
||||
_DIO_OUTPUT_VALUE_CHANGED(pin, e.NewValue);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void _DIO_IOMessage(object sender, arDev.DIO.MessageEventArgs e)
|
||||
{
|
||||
if (e.IsError)
|
||||
{
|
||||
if (e.Message.ToLower().IndexOf("inposi") != -1 || e.Message.ToLower().IndexOf("동일위치") != -1)
|
||||
{
|
||||
PUB.log.AddAT("DIO:" + e.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.log.AddE("DIO:" + e.Message);
|
||||
}
|
||||
}
|
||||
else PUB.log.Add("DIO:" + e.Message);
|
||||
}
|
||||
|
||||
//void IO_SaftySensor_Changed(eDIName pin, eFlag flag, eVar_Date varDt_On, eVar_Date varDt_Off, bool value)
|
||||
//{
|
||||
// //안전센서는 일정 시간 동작하는것을 체크한다
|
||||
// Pub.log.AddAT(string.Format("{0} Sensor : {1}", pin, value));
|
||||
// if (value) Pub.Var_dateTime[(int)varDt_On] = DateTime.Now;
|
||||
// else Pub.Var_dateTime[(int)varDt_Off] = DateTime.Now;
|
||||
//}
|
||||
|
||||
void IncCount(int seq, int port, int value = 1)
|
||||
{
|
||||
if (PUB.counter.DateStr != DateTime.Now.ToShortDateString())
|
||||
{
|
||||
if (port == 0) PUB.counter.CountDP1 = value;
|
||||
if (port == 1) PUB.counter.CountDP2 = value;
|
||||
if (port == 2) PUB.counter.CountDP3 = value;
|
||||
if (port == 3) PUB.counter.CountDP4 = value;
|
||||
PUB.counter.DateStr = DateTime.Now.ToShortDateString();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (port == 0) PUB.counter.CountDP1 += value;
|
||||
if (port == 1) PUB.counter.CountDP2 += value;
|
||||
if (port == 2) PUB.counter.CountDP3 += value;
|
||||
if (port == 3) PUB.counter.CountDP4 += value;
|
||||
}
|
||||
|
||||
|
||||
//각 포트별 수량은 차수별 작업이므로 차수가 변경되면 리셋됨
|
||||
//리셋되는 코드 필요함
|
||||
if (port == 0) PUB.counter.CountP0 += value;
|
||||
if (port == 1) PUB.counter.CountP1 += value;
|
||||
if (port == 2) PUB.counter.CountP2 += value;
|
||||
if (port == 3) PUB.counter.CountPrintR += value;
|
||||
else
|
||||
{
|
||||
PUB.log.AddAT(string.Format("[{0}] 미지정 포트이므로 수량 증가 불가", seq));
|
||||
}
|
||||
|
||||
//Pub.log.AddI("수량정보가 저장 되었습니다");
|
||||
PUB.counter.Save();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
43
Handler/Project/RunCode/StateMachine/_SM_RUN.cs
Normal file
43
Handler/Project/RunCode/StateMachine/_SM_RUN.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
#region "Common Utility"
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 지정된 시간만큼 대기하며 완료되면 true를 반환합니다.
|
||||
/// </summary>
|
||||
/// <param name="time"></param>
|
||||
/// <returns></returns>
|
||||
Boolean WaitForSeconds(eWaitType wait, double timems)
|
||||
{
|
||||
var idx = (byte)wait;
|
||||
if (PUB.Result.WaitForVar[idx] == null || PUB.Result.WaitForVar[idx].Year == 1982)
|
||||
{
|
||||
PUB.Result.WaitForVar[idx] = PUB.Result.WaitForVar[idx] = DateTime.Now;
|
||||
//Pub.log.Add(string.Format("Wait for [{0}], Wait Time:{1}ms", wait, timems));
|
||||
}
|
||||
var ts = DateTime.Now - PUB.Result.WaitForVar[idx];
|
||||
if (ts.TotalSeconds >= timems) return true;
|
||||
else return false;
|
||||
}
|
||||
|
||||
void ResetWaitForSeconds(eWaitType wait)
|
||||
{
|
||||
var idx = (byte)wait;
|
||||
PUB.Result.WaitForVar[idx] = DateTime.Parse("1982-11-23");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}//cvass
|
||||
}
|
||||
330
Handler/Project/RunCode/StateMachine/_SPS.cs
Normal file
330
Handler/Project/RunCode/StateMachine/_SPS.cs
Normal file
@@ -0,0 +1,330 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
void SM_SPS(object sender, EventArgs e)
|
||||
{
|
||||
//명령어 가져오기 7:3개의 데이터 확인
|
||||
if (PUB.plc != null && PUB.plc.Init)
|
||||
{
|
||||
if (PUB.plc.ReadBytes(0, 16, out byte[] plcbuffer))
|
||||
{
|
||||
//내부버퍼에 상태를 기록한다
|
||||
Array.Copy(plcbuffer, 0, PUB.swPLCBuffer, 0, plcbuffer.Length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//인터락설정(공용)
|
||||
Set_InterLock();
|
||||
|
||||
//230905
|
||||
hmi1.CVLeftBusy = PUB.iLockCVL.get((int)eILockCV.BUSY);
|
||||
hmi1.CVLeftReady = PUB.iLockCVL.get((int)eILockCV.EXTBUSY);
|
||||
hmi1.CVRightBusy = PUB.iLockCVR.get((int)eILockCV.BUSY);
|
||||
hmi1.CVRightReady = PUB.iLockCVR.get((int)eILockCV.EXTBUSY);
|
||||
|
||||
|
||||
//XMOVE 시에 RESET 키를 이용한 장치 초기화 작업
|
||||
if (PUB.sm.Step == eSMStep.IDLE)
|
||||
if (PUB.mot.HasHomeSetOff == true)
|
||||
if (DIO.GetIOInput(eDIName.BUT_RESETF) == true)
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == true)
|
||||
if (PUB.Result.ResetButtonDownTime.Year != 1982)
|
||||
if ((DateTime.Now - PUB.Result.ResetButtonDownTime).TotalSeconds >= 5)
|
||||
Func_sw_initialize();
|
||||
|
||||
//비상정지체크
|
||||
if (PUB.dio.IsInit == true)
|
||||
{
|
||||
if (DIO.IsEmergencyOn() == true)
|
||||
{
|
||||
//모터에 비상정지신호를 바로 전송한다
|
||||
//Util_DO.SetMotEmergency(true);
|
||||
DIO.SetMotPowerOn(false);
|
||||
DIO.SetMotEmergency(true);
|
||||
if (PUB.sm.Step > eSMStep.IDLE)
|
||||
{
|
||||
string EmgButtonState = string.Empty;
|
||||
if (DIO.GetIOInput(eDIName.BUT_EMGF)) EmgButtonState = "EMG-FRONT";
|
||||
|
||||
if (PUB.sm.Step != eSMStep.EMERGENCY &&
|
||||
PUB.sm.getNewStep != eSMStep.EMERGENCY)
|
||||
{
|
||||
PUB.mot.MoveStop("EmgBut", true); //모든 축 강제정지 (물리시그널에 의해 미리 정지 된 상태임)
|
||||
|
||||
//비상상태가 아니라면 비상으로 전환해준다.
|
||||
|
||||
PUB.Result.ResultCode = eResult.EMERGENCY;
|
||||
PUB.Result.ResultMessage = string.Format("EMERGENCY\n" +
|
||||
"비상정지 버튼({0})이 눌렸습니다\n" +
|
||||
"모든 모션이 강제 정지 합니다\n" +
|
||||
"비상 정지 버튼을 확인 한 후 시스템을 초기화 하세요", EmgButtonState);
|
||||
|
||||
PUB.log.AddI("SPS:Reserve Emergency Step");
|
||||
PUB.sm.SetNewStep(eSMStep.EMERGENCY);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//이머전시가 해제되었으므로 파워를 복원한다.
|
||||
DIO.SetMotPowerOn(true);
|
||||
DIO.SetMotEmergency(false);
|
||||
}
|
||||
}
|
||||
|
||||
//룸조명(자동)
|
||||
if (PUB.dio.IsInit)
|
||||
Func_AutoRoomLight();
|
||||
|
||||
//AIR공급중단체크 - Sensitive 에 작동시간을 직접 입력했다(delay time)
|
||||
//if (Pub.dio.IsInit)
|
||||
//Func_CheckAirOffCondition();
|
||||
|
||||
//부저확인
|
||||
if (PUB.dio.IsInit)
|
||||
Func_BuzzerControl();
|
||||
|
||||
//충돌검사()
|
||||
if (PUB.dio.IsInit && PUB.mot.IsInit)
|
||||
CheckCollision();
|
||||
|
||||
//포트의 UP/DN 모터
|
||||
PortZMotorAutoOff();
|
||||
|
||||
PortMagnet();
|
||||
|
||||
//바코드동작처리 - 210103
|
||||
//var qrdatas1 = ProcessBarcodeQue(0);
|
||||
//var qrdatas2 = ProcessBarcodeQue(2);
|
||||
|
||||
////왼쪽비젼에서 데이터가 있었다
|
||||
//if (qrdatas1.Count > 0)
|
||||
//{
|
||||
// if (PUB.flag.get(eVarBool.PRC_VISIONL) == false)
|
||||
// {
|
||||
// PUB.log.AddAT("비젼(L) READY가 아니므로 처리하지 않음");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //처리가 완료되지 않은경우엠ㄴ 사용한다.
|
||||
// if (PUB.flag.get(eVarBool.END_VISIONL) == false)
|
||||
// RecvQRProcess(qrdatas1, eWorkPort.Left);
|
||||
// else PUB.log.AddAT("비젼(L) 이전작업이 완료되어 처리하지 않음");
|
||||
// }
|
||||
//}
|
||||
////오른쪽비젼에서 데이터가 있었다
|
||||
//if (qrdatas2.Count > 0)
|
||||
//{
|
||||
// if (PUB.flag.get(eVarBool.PRC_VISIONR) == false)
|
||||
// {
|
||||
// PUB.log.AddAT("비젼(R) READY가 아니므로 처리하지 않음");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// //비젼처리가 완료되지 않은경우에만 사용한다
|
||||
// if (PUB.flag.get(eVarBool.END_VISIONR) == false)
|
||||
// RecvQRProcess(qrdatas2, eWorkPort.Right);
|
||||
// else PUB.log.AddAT("비젼(R) 이전작업이 완료되어 처리하지 않음");
|
||||
// }
|
||||
|
||||
//}
|
||||
//}
|
||||
|
||||
|
||||
//동작중에 데이터가 reset 되는 코드 임시로 모니터링한다.
|
||||
if (PUB.sm.Step != eSMStep.IDLE && PUB.sm.Step != eSMStep.HOME_FULL && PUB.sm.Step != eSMStep.HOME_QUICK)
|
||||
{
|
||||
var currid = PUB.Result.ItemDataC.VisionData.RID;
|
||||
if (currid.Equals(lastridv1) == false)
|
||||
{
|
||||
PUB.AddDebugLog("[SPS] RID값 변경 감지 :" + currid);
|
||||
lastridv1 = currid;
|
||||
}
|
||||
}
|
||||
|
||||
//process barcode
|
||||
BarcodeProcess();
|
||||
}
|
||||
string lastridv1 = string.Empty;
|
||||
|
||||
|
||||
|
||||
System.Diagnostics.Stopwatch UnloaderWatch = new System.Diagnostics.Stopwatch();
|
||||
|
||||
void PortMagnet()
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET0) && DIO.GetIOOutput(eDOName.CART_MAG0) == false)
|
||||
{
|
||||
var ts = DateTime.Now - VAR.TIME[(int)eVarTime.MAGNET0];
|
||||
if (ts.TotalMilliseconds > AR.SETTING.Data.WaitTime_Magnet0)
|
||||
{
|
||||
DIO.SetPortMagnet(0, true); //Util_DO.SetOutput(eDOName.CART_MAG0, true);
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET0, false, "SPS-MAGON");
|
||||
}
|
||||
}
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET0) == true && DIO.GetIOOutput(eDOName.CART_MAG0) == true)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET0, false, "SPS-MAGOFF");
|
||||
}
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET1) && DIO.GetIOOutput(eDOName.CART_MAG1) == false)
|
||||
{
|
||||
var ts = DateTime.Now - VAR.TIME[(int)eVarTime.MAGNET1];
|
||||
if (ts.TotalMilliseconds > AR.SETTING.Data.WaitTime_Magnet1)
|
||||
{
|
||||
DIO.SetPortMagnet(1, true); // Util_DO.SetOutput(eDOName.CART_MAG1, true);
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET1, false, "SPS-MAGON");
|
||||
}
|
||||
}
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET1) == true && DIO.GetIOOutput(eDOName.CART_MAG1) == true)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET1, false, "SPS-MAGOFF");
|
||||
}
|
||||
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET2) && DIO.GetIOOutput(eDOName.CART_MAG2) == false)
|
||||
{
|
||||
var ts = DateTime.Now - VAR.TIME[(int)eVarTime.MAGNET2];
|
||||
if (ts.TotalMilliseconds > AR.SETTING.Data.WaitTime_Magnet2)
|
||||
{
|
||||
DIO.SetPortMagnet(2, true); // Util_DO.SetOutput(eDOName.CART_MAG2, true);
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET2, false, "SPS-MAGON");
|
||||
}
|
||||
}
|
||||
if (PUB.flag.get(eVarBool.FG_WAT_MAGNET2) == true && DIO.GetIOOutput(eDOName.CART_MAG2) == true)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_WAT_MAGNET2, false, "SPS-MAGOFF");
|
||||
}
|
||||
}
|
||||
|
||||
int intlockcnt = 0;
|
||||
|
||||
/// <summary>
|
||||
/// 이 기능은 DIO 에서도 처리된다. - 해당 위치가 더 빠를듯 하여 ,그곳에서도 처리되고 이곳에서도 추가 처리를 한다
|
||||
/// </summary>
|
||||
private void PortZMotorAutoOff()
|
||||
{
|
||||
//dir 이 켜져있다면 Up/ 꺼져있다면 down
|
||||
var P0DirUp = DIO.GetPortMotorDir(0) == eMotDir.CW;
|
||||
var P1DirUp = DIO.GetPortMotorDir(1) == eMotDir.CW;
|
||||
var P2DirUp = DIO.GetPortMotorDir(2) == eMotDir.CW;
|
||||
|
||||
var P0Run = DIO.GetIOOutput(eDOName.PORTL_MOT_RUN);
|
||||
var P1Run = DIO.GetIOOutput(eDOName.PORTC_MOT_RUN);
|
||||
var P2Run = DIO.GetIOOutput(eDOName.PORTR_MOT_RUN);
|
||||
|
||||
var P0LimUp = DIO.GetIOInput(eDIName.PORTL_LIM_UP);
|
||||
var P1LimUp = DIO.GetIOInput(eDIName.PORTC_LIM_UP);
|
||||
var P2LimUp = DIO.GetIOInput(eDIName.PORTR_LIM_UP);
|
||||
|
||||
var P0DetUp = DIO.GetIOInput(eDIName.PORTL_DET_UP);
|
||||
var P1DetUp = DIO.GetIOInput(eDIName.PORTC_DET_UP);
|
||||
var P2DetUp = DIO.GetIOInput(eDIName.PORTR_DET_UP);
|
||||
|
||||
var P0LimDn = DIO.GetIOInput(eDIName.PORTL_LIM_DN);
|
||||
var P1LimDn = DIO.GetIOInput(eDIName.PORTC_LIM_DN);
|
||||
var P2LimDn = DIO.GetIOInput(eDIName.PORTR_LIM_DN);
|
||||
|
||||
//현재 출력중이고, 상단이 켜져있는데 상단 센서가 들어와잇다면 OFF 한다
|
||||
if (P0Run && P0DirUp && (P0LimUp || P0DetUp)) DIO.SetPortMotor(0, eMotDir.CCW, false, "SPS");
|
||||
if (P1Run && P1DirUp && (P1LimUp || P1DetUp)) DIO.SetPortMotor(1, eMotDir.CCW, false, "SPS");
|
||||
if (P2Run && P2DirUp && (P2LimUp || P2DetUp)) DIO.SetPortMotor(2, eMotDir.CCW, false, "SPS");
|
||||
|
||||
//현재 출력중이고, 하단이 켜져있는데. 하단 센서가 들어와 있다면 Off 한다
|
||||
if (P0Run && P0DirUp == false && P0LimDn) DIO.SetPortMotor(0, eMotDir.CW, false, "SPS");
|
||||
if (P1Run && P1DirUp == false && P1LimDn) DIO.SetPortMotor(1, eMotDir.CW, false, "SPS");
|
||||
if (P2Run && P2DirUp == false && P2LimDn) DIO.SetPortMotor(2, eMotDir.CW, false, "SPS");
|
||||
|
||||
//작업이 종료되어서 포트가 내려가고 있다면 5초뒤에 멈춘다 - 210405
|
||||
if (PUB.flag.get(eVarBool.FG_PORT1_ENDDOWN) && AR.SETTING.Data.Port1FisnishDownTime > 0)
|
||||
{
|
||||
var runtime = DateTime.Now - VAR.TIME[(int)eVarTime.PORT1];
|
||||
if (runtime.TotalMilliseconds >= AR.SETTING.Data.Port1FisnishDownTime)
|
||||
{
|
||||
if (P1Run && PUB.sm.isRunning == false && DIO.GetPortMotorDir(1) == eMotDir.CCW)
|
||||
{
|
||||
DIO.SetPortMotor(1, eMotDir.CW, false, "SPS");
|
||||
}
|
||||
PUB.flag.set(eVarBool.FG_PORT1_ENDDOWN, false, "SPS");
|
||||
VAR.TIME.Update(eVarTime.PORT1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DateTime CollCheckTime = DateTime.Now;
|
||||
private void CheckCollision()
|
||||
{
|
||||
//충돌검검사 (홈 이 완료안된 모터에는 처리하지 않는다)
|
||||
if (PUB.sm.Step != eSMStep.RUN || PUB.sm.getNewStep != eSMStep.RUN) return;
|
||||
|
||||
//초당 20번 검사하게 함
|
||||
var ts = DateTime.Now - CollCheckTime;
|
||||
if (ts.TotalMilliseconds < 50) return;
|
||||
|
||||
|
||||
|
||||
//현재 시간으로 설정
|
||||
CollCheckTime = DateTime.Now;
|
||||
}
|
||||
|
||||
private void Func_AutoRoomLight()
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_AutoLight == false) return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void Func_BuzzerControl()
|
||||
{
|
||||
//if (AR.SETTING.Data.Disable_Buzzer == false) return;
|
||||
if (PUB.BuzzerTime.Year == 1982) return; //시간설정이없으면 out
|
||||
if (DIO.GetIOOutput(eDOName.BUZZER) == false) return; //부저가 꺼져있다면 out
|
||||
if (AR.SETTING.Data.buzz_run_ms != 0) //시간이 설정된 경우에만 작동190509
|
||||
{
|
||||
if (PUB.BuzzerTime.Year == 1982) PUB.BuzzerTime = DateTime.Now;
|
||||
else
|
||||
{
|
||||
var ts = DateTime.Now - PUB.BuzzerTime;
|
||||
if (ts.TotalMilliseconds >= AR.SETTING.Data.buzz_run_ms) //지정시간이 초과된경우에만 OFF
|
||||
{
|
||||
PUB.log.Add("Auto Buzzer Off by SPS");
|
||||
DIO.SetBuzzer(false); //지정시간초과로 부저를 OFF 한다.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//void Func_CheckAirOffCondition()
|
||||
//{
|
||||
// if (Pub.sm.Step < eSMStep.IDLE) return;
|
||||
|
||||
// //181226
|
||||
// var airSw = Util_DO.GetIOInput(eDIName.BUT_AIRF);
|
||||
// if (airSw == true && AirOff == true && AirOffStart.Year != 1982)
|
||||
// {
|
||||
// //스위치가 눌려져있고, 눌린 시간이 설정되어 있는 경우
|
||||
// //스위치 ON 시간을 계산한다
|
||||
// var ts = DateTime.Now - AirOffStart;
|
||||
// if (ts.TotalMilliseconds >= COMM.SETTING.Data.AirOFFTimer)
|
||||
// {
|
||||
// Util_DO.SetAIR(false);
|
||||
// AirOff = false;
|
||||
// AirOffStart = DateTime.Parse("1982-11-23");
|
||||
// Pub.log.AddAT("AIR OFF by User");
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
850
Handler/Project/RunCode/StateMachine/_SPS_BarcodeProcess.cs
Normal file
850
Handler/Project/RunCode/StateMachine/_SPS_BarcodeProcess.cs
Normal file
@@ -0,0 +1,850 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
Tuple<int, List<string>> BarcodeRegExProcess(
|
||||
List<Class.RegexPattern> patterns,
|
||||
List<Class.RegexPattern> patternsEx,
|
||||
Class.VisionData vdata, string barcodeSymbol,
|
||||
string bcd, out bool IgnoreBarcode, out bool findregex)
|
||||
{
|
||||
//var patterns = PUB.Result.BCDPattern;
|
||||
IgnoreBarcode = false;
|
||||
findregex = false;
|
||||
|
||||
//get : same symbol data
|
||||
List<Class.RegexPattern> pats;
|
||||
if (patterns != null)
|
||||
{
|
||||
if (barcodeSymbol.isEmpty() == false) pats = patterns.Where(t => t.IsEnable == true && (string.IsNullOrEmpty(t.Symbol) || t.Symbol == barcodeSymbol)).OrderBy(t => t.Seq).ToList();
|
||||
else pats = patterns.Where(t => t.IsEnable == true).OrderBy(t => t.Seq).ToList();
|
||||
}
|
||||
else pats = new List<Class.RegexPattern>();
|
||||
|
||||
|
||||
List<Class.RegexPattern> patsEx;
|
||||
if (patternsEx == null) patsEx = new List<Class.RegexPattern>();
|
||||
else
|
||||
{
|
||||
if (barcodeSymbol.isEmpty() == false) patsEx = patternsEx.Where(t => string.IsNullOrEmpty(t.Symbol) || t.Symbol == barcodeSymbol).OrderBy(t => t.Seq).ToList();
|
||||
else patsEx = patternsEx.Where(t => t.IsEnable == true).OrderBy(t => t.Seq).ToList();
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (pats.Any() == false)
|
||||
{
|
||||
PUB.log.AddAT($"등록된 패턴이 없습니다(SYM={barcodeSymbol})");
|
||||
return new Tuple<int, List<string>>(0, new List<string>());
|
||||
}
|
||||
|
||||
//모델정보의 허용 심볼인지 확인한다 221017
|
||||
var vm = PUB.Result.vModel;
|
||||
if (vm != null)
|
||||
{
|
||||
if (vm.BCD_DM == false && barcodeSymbol == "2")
|
||||
{
|
||||
PUB.log.AddAT($"모델(DM)에서 비활성:{bcd}");
|
||||
IgnoreBarcode = true;
|
||||
return new Tuple<int, List<string>>(0, new List<string>());
|
||||
}
|
||||
else if (vm.BCD_1D == false && (barcodeSymbol == "6" || barcodeSymbol == "11"))
|
||||
{
|
||||
PUB.log.AddAT($"모델(1D)에서 비활성:{bcd}");
|
||||
IgnoreBarcode = true;
|
||||
return new Tuple<int, List<string>>(0, new List<string>());
|
||||
}
|
||||
else if (vm.BCD_QR == false && (barcodeSymbol == "1"))
|
||||
{
|
||||
PUB.log.AddAT($"모델(QR)에서 비활성:{bcd}");
|
||||
IgnoreBarcode = true;
|
||||
return new Tuple<int, List<string>>(0, new List<string>());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//이 바코드가 무시바코드에 있는지 먼저 검사한다 220718
|
||||
foreach (var pt in patsEx)
|
||||
{
|
||||
//skip disable item
|
||||
if (pt.IsEnable == false) continue;
|
||||
|
||||
//check regex
|
||||
var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
|
||||
if (regx.IsMatch(bcd))
|
||||
{
|
||||
PUB.log.Add($"무시바코드:{bcd},PAT:{pt.Pattern},SYM:{pt.Symbol}");
|
||||
IgnoreBarcode = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (IgnoreBarcode)
|
||||
{
|
||||
return new Tuple<int, List<string>>(0, new List<string>());
|
||||
}
|
||||
|
||||
|
||||
|
||||
var ValueApplyCount = 0;
|
||||
ValueApplyCount = 0;
|
||||
List<string> list = new List<string>();
|
||||
findregex = false;
|
||||
foreach (var pt in pats)
|
||||
{
|
||||
//skip disable item
|
||||
if (pt.IsEnable == false) continue;
|
||||
|
||||
var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
|
||||
if (regx.IsMatch(bcd))
|
||||
{
|
||||
findregex = true;
|
||||
//find data
|
||||
var matchs = regx.Matches(bcd);
|
||||
foreach (System.Text.RegularExpressions.Match mat in matchs)
|
||||
{
|
||||
|
||||
if (vdata == null) ValueApplyCount += 1;
|
||||
else
|
||||
{
|
||||
foreach (var matchdata in pt.Groups)
|
||||
{
|
||||
if (matchdata.GroupNo <= mat.Groups.Count)
|
||||
{
|
||||
var data = mat.Groups[matchdata.GroupNo];
|
||||
if (PUB.SetBCDValue(vdata, matchdata.TargetPos, data.Value, pt.IsTrust))
|
||||
ValueApplyCount += 1;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (vdata != null && pt.IsAmkStd)// && bcdObj.barcodeSymbol == "1")
|
||||
{
|
||||
vdata.QRInputRaw = bcd;
|
||||
}
|
||||
|
||||
if (vdata != null)
|
||||
PUB.log.AddI($"[{pt.Description}]=>{bcd}");
|
||||
|
||||
list.Add(pt.Customer + "|" + pt.Description);
|
||||
}
|
||||
else
|
||||
{
|
||||
//PUB.log.AddAT($"(X)Match ({pt.Pattern}) Data={bcd}");
|
||||
}
|
||||
}
|
||||
return new Tuple<int, List<string>>(ValueApplyCount, list);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// barcod eprocess
|
||||
/// </summary>
|
||||
void BarcodeProcess()
|
||||
{
|
||||
//coffee
|
||||
//get regexpress patterns
|
||||
var patterns = PUB.Result.BCDPattern;
|
||||
var itemC = PUB.Result.ItemDataC;
|
||||
var vdata = itemC.VisionData;
|
||||
|
||||
//No Run - Confirm Data
|
||||
if (vdata.Confirm) return;
|
||||
var vm = PUB.Result.vModel;
|
||||
|
||||
lock (vdata.barcodelist)
|
||||
{
|
||||
foreach (var item in vdata.barcodelist)
|
||||
{
|
||||
//var src = item.Value.barcodeSource;
|
||||
var bcd = item.Value.Data;
|
||||
var bcdObj = item.Value;
|
||||
|
||||
//already checked
|
||||
if (bcdObj.RegExConfirm) continue;
|
||||
|
||||
var ValueApplyCount = BarcodeRegExProcess(PUB.Result.BCDPattern, PUB.Result.BCDIgnorePattern, vdata, bcdObj.barcodeSymbol, bcd, out bool IgnoreBcd, out bool findregex);
|
||||
bcdObj.Ignore = IgnoreBcd;
|
||||
|
||||
//기타바코드 무시기능 적용 221018
|
||||
if (vm != null && vm.IgnoreOtherBarcode == true && findregex == false)
|
||||
bcdObj.Ignore = true;
|
||||
|
||||
bcdObj.RefExApply = (ValueApplyCount?.Item1 ?? 0) > 0;
|
||||
bcdObj.RegExConfirm = true;
|
||||
}
|
||||
}
|
||||
|
||||
//assign customer code - fixed data
|
||||
if (vdata.CUSTCODE.isEmpty() && VAR.STR[eVarString.JOB_CUSTOMER_CODE].isEmpty() == false)
|
||||
{
|
||||
vdata.CUSTCODE = VAR.STR[eVarString.JOB_CUSTOMER_CODE];
|
||||
PUB.log.Add($"Cutomer Code 고정값 사용 : {vdata.CUSTCODE}");
|
||||
}
|
||||
|
||||
//SiD CONVERT
|
||||
if (VAR.BOOL[eVarBool.Opt_SIDConvert])
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_WAIT_LOADERINFO) == false && VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] == false)
|
||||
{
|
||||
//원본시드(sid0)가 비어있는데 sid과 확정되었다면 변환작업을 진행한다
|
||||
if (vdata.SID0.isEmpty() && vdata.SID.isEmpty() == false && vdata.SID_Trust)
|
||||
{
|
||||
//이 sid가 존재여부확인 후 없는 sid라면 더이상 처리하지 않는다 230510
|
||||
if (PUB.Result.DTSidConvertEmptyList.Contains(vdata.SID))
|
||||
{
|
||||
//존재하지 않는 SID로 이미 확인되었다
|
||||
}
|
||||
else if (PUB.Result.DTSidConvertMultiList.Contains(vdata.SID))
|
||||
{
|
||||
//다중sid로 인해 처리하지 않는다
|
||||
}
|
||||
else
|
||||
{
|
||||
var newsid = PUB.SIDCovert(vdata.SID, "SPS_BarcodeProcess", out bool converr);
|
||||
if (converr)
|
||||
{
|
||||
if (PUB.sm.Step == eSMStep.RUN)
|
||||
PUB.log.AddE(newsid);
|
||||
}
|
||||
else
|
||||
{
|
||||
vdata.SID0 = vdata.SID;
|
||||
vdata.SID = newsid;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//정규식혹은 바코드 룰에 의해 데이터가 바뀌었더라도 모델 기준으로 진행한다
|
||||
if (PUB.Result.vModel.Def_Vname.isEmpty() == false)
|
||||
{
|
||||
if (itemC.VisionData.VNAME.Equals(PUB.Result.vModel.Def_Vname) == false)
|
||||
{
|
||||
itemC.VisionData.VNAME = PUB.Result.vModel.Def_Vname.Trim();
|
||||
itemC.VisionData.VNAME_Trust = true;
|
||||
PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}");
|
||||
}
|
||||
}
|
||||
if (PUB.Result.vModel.Def_MFG.isEmpty() == false)
|
||||
{
|
||||
if (itemC.VisionData.MFGDATE.Equals(PUB.Result.vModel.Def_MFG) == false)
|
||||
{
|
||||
itemC.VisionData.MFGDATE = PUB.Result.vModel.Def_MFG.Trim();
|
||||
itemC.VisionData.MFGDATE_Trust = true;
|
||||
PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////New ReelID
|
||||
/// this process run ( 3_keyence_read.cs )
|
||||
//if (VAR.BOOL[eVarBool.Opt_NewReelID) && PUB.sm.isRunning)
|
||||
//{
|
||||
// if (vdata.temp_custcode.Length == 4 && vdata.RID0.isEmpty() && vdata.RIDNew == false)
|
||||
// {
|
||||
// //backup old reel id
|
||||
// vdata.RID0 = vdata.RID;
|
||||
// vdata.RIDNew = true;
|
||||
|
||||
// var newid = Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD(vdata.temp_custcode, "4", "A", out string err);
|
||||
// if (newid.isEmpty() == false)
|
||||
// {
|
||||
// //remain original reel id
|
||||
// vdata.SetRID( newid,"SPS");
|
||||
// PUB.log.AddI($"New REELID:{newid}");
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//릴ID 신규발행
|
||||
if (PUB.sm.Step == eSMStep.RUN && vdata.CUSTCODE.isEmpty() == false && vdata.SID.isEmpty() == false)
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.Opt_NewReelID])
|
||||
{
|
||||
if (itemC.VisionData.RIDNew == false && itemC.VisionData.CUSTCODE.isEmpty() == false)
|
||||
{
|
||||
var newid = Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD(itemC.VisionData.CUSTCODE, "4", "A", out string errmsg);
|
||||
if (newid.isEmpty() == false)
|
||||
{
|
||||
//backup origin reel id
|
||||
itemC.VisionData.RID0 = itemC.VisionData.RID;
|
||||
|
||||
//set new reel id
|
||||
itemC.VisionData.SetRID(newid, "SPS:CHKDATACOMPLETE");// = newid;
|
||||
itemC.VisionData.RIDNew = true; //applied new reel id
|
||||
|
||||
//서버의수량업데이트기능이 켜져있다면 해당 값을 제거해준다. (다시 조회되도록 함)
|
||||
if (VAR.BOOL[eVarBool.Opt_ServerQty])
|
||||
{
|
||||
//이미 수량업데이트된 경우이므로 복원시켜준다
|
||||
if (itemC.VisionData.QTY0.isEmpty() == false)
|
||||
{
|
||||
PUB.log.AddAT($"릴아이디 변경으로 인해 수량을 복원합니다({itemC.VisionData.QTY}->{itemC.VisionData.QTY0})");
|
||||
itemC.VisionData.QTY = itemC.VisionData.QTY0;
|
||||
itemC.VisionData.QTY0 = string.Empty;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var logtime = VAR.TIME.RUN((int)eVarTime.LOG_NEWIDERROR);
|
||||
if (logtime.TotalSeconds >= 3000)
|
||||
{
|
||||
PUB.log.AddAT($"Reel_ID 생성실패 : {errmsg}");
|
||||
VAR.TIME.Update(eVarTime.LOG_NEWIDERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//바코드가 변경된 경우이다, 자동채우기 기능이 있다면 사용한다
|
||||
bool NewBarcodeUpdated = false;
|
||||
if (VAR.BOOL[eVarBool.Opt_ApplySIDInfo] && vdata.BarcodeTouched == true)
|
||||
{
|
||||
Boolean Apply = true;
|
||||
|
||||
//select columns
|
||||
List<string> fields = new List<string>();
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CustCode");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PartNo");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("PrintPosition");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VenderName");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("batch"); //220921
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Apply_qty] && (vdata.SID_Trust == false || vdata.QTYMAX.isEmpty())) fields.Add("qtymax"); //220921
|
||||
fields.Add("attach"); //231026
|
||||
|
||||
//where coluns
|
||||
List<string> wheres = new List<string>();
|
||||
//wheres.Add($"MC='{COMM.SETTING.Data.McName}");
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Where_CustCode])
|
||||
{
|
||||
if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CustCode='{vdata.CUSTCODE}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Where_PartNo])
|
||||
{
|
||||
if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PartNo='{vdata.PARTNO}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Where_SID])
|
||||
{
|
||||
//if sid convert logic
|
||||
if (VAR.BOOL[eVarBool.Opt_SIDConvert])
|
||||
{
|
||||
if (vdata.SID_Trust && vdata.SID0.isEmpty() == false && vdata.SID.isEmpty() == false)
|
||||
wheres.Add($"SID='{vdata.SID}'");
|
||||
else Apply = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
|
||||
else Apply = false;
|
||||
}
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Where_VLOT]) //221013
|
||||
{
|
||||
if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false)
|
||||
wheres.Add($"(VenderLot like '{vdata.VLOT}' or VenderLot like '%,{vdata.VLOT}' or VenderLot like '{vdata.VLOT},%' or VenderLot like '%,{vdata.VLOT},%')");
|
||||
else Apply = false;
|
||||
}
|
||||
|
||||
if (VAR.BOOL[eVarBool.Opt_SID_Where_MC]) //231006
|
||||
{
|
||||
wheres.Add($"attach='{AR.SETTING.Data.McName}'");
|
||||
}
|
||||
|
||||
//if query data . no error
|
||||
if (Apply && fields.Count > 0 && wheres.Count > 0)
|
||||
{
|
||||
|
||||
var mcname = SETTING.Data.McName;
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor]) mcname = PUB.MCCode;
|
||||
|
||||
var SQL = "select top 1 " + string.Join(",", fields) +
|
||||
" from Component_Reel_SID_Information WITH(NOLOCK)" +
|
||||
" where mc='" + mcname + "' and " + string.Join(" and ", wheres) +
|
||||
" order by wdate desc";
|
||||
|
||||
var SQLC = "select count(*)" +
|
||||
" from Component_Reel_SID_Information WITH(NOLOCK)" +
|
||||
" where mc='" + mcname + "' and " + string.Join(" and ", wheres);
|
||||
|
||||
if (PUB.Result.ItemDataC.VisionData.LastQueryString.Equals(SQL))
|
||||
{
|
||||
//같은 쿼리이므로 처리하지 않는다
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
PUB.log.Add($"DATABAES : SID INFORMATIION QUERY");
|
||||
PUB.log.Add(SQL);
|
||||
var CS = Properties.Settings.Default.CS;
|
||||
var CN = new System.Data.SqlClient.SqlConnection(CS);
|
||||
var CMD = new System.Data.SqlClient.SqlCommand(SQL, CN);
|
||||
if (CN.State == System.Data.ConnectionState.Closed) CN.Open();
|
||||
|
||||
//데이터가 중복으로 존재하는지 확인한다. 231006
|
||||
CMD.CommandText = SQLC;
|
||||
var cnt = int.Parse(CMD.ExecuteScalar().ToString());
|
||||
if (cnt == 1)
|
||||
{
|
||||
CMD.CommandText = SQL;
|
||||
var DAR = CMD.ExecuteReader();
|
||||
while (DAR.Read())
|
||||
{
|
||||
//loop select columns
|
||||
for (int i = 0; i < fields.Count; i++)
|
||||
{
|
||||
var colName = fields[i];
|
||||
var v = DAR[colName];
|
||||
if (v != null)
|
||||
{
|
||||
var vStr = v.ToString().RemoveNoneASCII().Trim();
|
||||
if (vStr.isEmpty()) continue;
|
||||
|
||||
//O_Trust == false)) fields.Add("PartNo");
|
||||
//ields.Add("PrintPosition");
|
||||
//ta.VNAME.isEmpty())) fields.Add("VenderName");
|
||||
//Empty())) fields.Add("SID");
|
||||
|
||||
//value is not empty
|
||||
if (colName == "CustCode")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.CUSTCODE}=>{vStr}");
|
||||
vdata.CUSTCODE = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "PartNo")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.PARTNO}=>{vStr}");
|
||||
vdata.PARTNO = vStr;
|
||||
vdata.PARTNO_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "PrintPosition")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.PrintPositionData}=>{vStr}");
|
||||
vdata.PrintPositionData = vStr;
|
||||
vdata.PrintPositionCheck = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VenderName")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.VNAME}=>{vStr}");
|
||||
vdata.VNAME = vStr;
|
||||
vdata.VNAME_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VenderLot")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.VLOT}=>{vStr}");
|
||||
vdata.VLOT = vStr;
|
||||
vdata.VLOT_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "SID")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.SID}=>{vStr}");
|
||||
vdata.SID = vStr;
|
||||
vdata.SID_Trust = vdata.SID.Length == 9;
|
||||
if (vStr.Length != 9)
|
||||
{
|
||||
PUB.log.AddE($"DB SID LEN ERROR:{vStr},LEN={vStr.Length}");
|
||||
}
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "batch")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.BATCH}=>{vStr}");
|
||||
vdata.BATCH = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "qtymax")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.BATCH}=>{vStr}");
|
||||
vdata.QTYMAX = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName.ToLower() == "attach")
|
||||
{
|
||||
PUB.log.Add($"attach [{colName}] {vdata.Target}=>{vStr}");
|
||||
vdata.Target = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DAR.Close();
|
||||
}
|
||||
CMD.Dispose();
|
||||
if (CN.State == System.Data.ConnectionState.Open) CN.Close();
|
||||
CN.Dispose();
|
||||
PUB.Result.ItemDataC.VisionData.LastQueryString = SQL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (VAR.BOOL[eVarBool.Opt_ApplySIDConv] && vdata.BarcodeTouched == true)
|
||||
{
|
||||
Boolean Apply = true;
|
||||
|
||||
//select columns
|
||||
List<string> fields = new List<string>();
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CustCode");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PartNo");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("PrintPosition");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VenderName");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_Batch] && (vdata.SID_Trust == false || vdata.BATCH.isEmpty())) fields.Add("batch"); //220921
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Apply_QtyMax] && (vdata.SID_Trust == false || vdata.QTYMAX.isEmpty())) fields.Add("qtymax"); //220921
|
||||
|
||||
|
||||
//where coluns
|
||||
List<string> wheres = new List<string>();
|
||||
//wheres.Add($"MC='{COMM.SETTING.Data.McName}");
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Where_CustCode])
|
||||
{
|
||||
if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CustCode='{vdata.CUSTCODE}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Where_PartNo])
|
||||
{
|
||||
if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PartNo='{vdata.PARTNO}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Where_SID])
|
||||
{
|
||||
//if sid convert logic
|
||||
if (VAR.BOOL[eVarBool.Opt_SIDConvert])
|
||||
{
|
||||
if (vdata.SID_Trust && vdata.SID0.isEmpty() == false && vdata.SID.isEmpty() == false)
|
||||
wheres.Add($"SIDTo='{vdata.SID}'");
|
||||
else Apply = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SIDTo='{vdata.SID}'");
|
||||
else Apply = false;
|
||||
}
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Conv_Where_VLOT]) //221013
|
||||
{
|
||||
if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false)
|
||||
wheres.Add($"(VenderLot like '{vdata.VLOT}' or VenderLot like '%,{vdata.VLOT}' or VenderLot like '{vdata.VLOT},%' or VenderLot like '%,{vdata.VLOT},%')");
|
||||
else Apply = false;
|
||||
}
|
||||
|
||||
//if (VAR.BOOL[eVarBool.Opt_Conv_Where_MC]) //231006
|
||||
//{
|
||||
// wheres.Add($"attach='{AR.SETTING.Data.McName}'");
|
||||
//}
|
||||
|
||||
//if query data . no error
|
||||
if (Apply && fields.Count > 0 && wheres.Count > 0)
|
||||
{
|
||||
|
||||
var mcname = SETTING.Data.McName;
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor]) mcname = PUB.MCCode;
|
||||
|
||||
var SQL = "select top 1 " + string.Join(",", fields) +
|
||||
" from Component_Reel_SID_Convert WITH(NOLOCK)" +
|
||||
" where " + string.Join(" and ", wheres) +
|
||||
" order by wdate desc";
|
||||
|
||||
var SQLC = "select count(*)" +
|
||||
" from Component_Reel_SID_Convert WITH(NOLOCK)" +
|
||||
" where " + string.Join(" and ", wheres);
|
||||
|
||||
if (PUB.Result.ItemDataC.VisionData.LastQueryString.Equals(SQL))
|
||||
{
|
||||
//같은 쿼리이므로 처리하지 않는다
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
PUB.log.Add($"DATABAES : SID(CONV) INFORMATIION QUERY");
|
||||
PUB.log.Add(SQL);
|
||||
var CS = Properties.Settings.Default.CS;
|
||||
var CN = new System.Data.SqlClient.SqlConnection(CS);
|
||||
var CMD = new System.Data.SqlClient.SqlCommand(SQL, CN);
|
||||
if (CN.State == System.Data.ConnectionState.Closed) CN.Open();
|
||||
|
||||
//데이터가 중복으로 존재하는지 확인한다. 231006
|
||||
CMD.CommandText = SQLC;
|
||||
var cnt = int.Parse(CMD.ExecuteScalar().ToString());
|
||||
if (cnt == 1)
|
||||
{
|
||||
CMD.CommandText = SQL;
|
||||
var DAR = CMD.ExecuteReader();
|
||||
while (DAR.Read())
|
||||
{
|
||||
//loop select columns
|
||||
for (int i = 0; i < fields.Count; i++)
|
||||
{
|
||||
var colName = fields[i];
|
||||
var v = DAR[colName];
|
||||
if (v != null)
|
||||
{
|
||||
var vStr = v.ToString().RemoveNoneASCII().Trim();
|
||||
if (vStr.isEmpty()) continue;
|
||||
|
||||
//O_Trust == false)) fields.Add("PartNo");
|
||||
//ields.Add("PrintPosition");
|
||||
//ta.VNAME.isEmpty())) fields.Add("VenderName");
|
||||
//Empty())) fields.Add("SID");
|
||||
|
||||
//value is not empty
|
||||
if (colName == "CustCode")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.CUSTCODE}=>{vStr}");
|
||||
vdata.CUSTCODE = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "PartNo")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.PARTNO}=>{vStr}");
|
||||
vdata.PARTNO = vStr;
|
||||
vdata.PARTNO_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "PrintPosition")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.PrintPositionData}=>{vStr}");
|
||||
vdata.PrintPositionData = vStr;
|
||||
vdata.PrintPositionCheck = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VenderName")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.VNAME}=>{vStr}");
|
||||
vdata.VNAME = vStr;
|
||||
vdata.VNAME_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VenderLot")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.VLOT}=>{vStr}");
|
||||
vdata.VLOT = vStr;
|
||||
vdata.VLOT_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "SID")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.SID}=>{vStr}");
|
||||
vdata.SID = vStr;
|
||||
vdata.SID_Trust = vdata.SID.Length == 9;
|
||||
if (vStr.Length != 9)
|
||||
{
|
||||
PUB.log.AddE($"DB SID LEN ERROR:{vStr},LEN={vStr.Length}");
|
||||
}
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "batch")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.BATCH}=>{vStr}");
|
||||
vdata.BATCH = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "qtymax")
|
||||
{
|
||||
PUB.log.Add($"AUP [{colName}] {vdata.BATCH}=>{vStr}");
|
||||
vdata.QTYMAX = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName.ToLower() == "attach")
|
||||
{
|
||||
PUB.log.Add($"attach [{colName}] {vdata.Target}=>{vStr}");
|
||||
vdata.Target = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DAR.Close();
|
||||
}
|
||||
CMD.Dispose();
|
||||
if (CN.State == System.Data.ConnectionState.Open) CN.Close();
|
||||
CN.Dispose();
|
||||
PUB.Result.ItemDataC.VisionData.LastQueryString = SQL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//기존 작업에서 데이터를 찾아서 쓴다
|
||||
if (VAR.BOOL[eVarBool.Opt_ApplyJobInfo] && vdata.BarcodeTouched == true)
|
||||
{
|
||||
Boolean Apply = true;
|
||||
|
||||
//select columns
|
||||
List<string> fields = new List<string>();
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Apply_CustCode] && vdata.CUSTCODE.isEmpty()) fields.Add("CUSTCODE");
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Apply_PartNo] && (vdata.PARTNO.isEmpty() || vdata.PARTNO_Trust == false)) fields.Add("PARTNO");
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Apply_PrintPos] && vdata.PrintPositionData.isEmpty()) fields.Add("POS");
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Apply_VenderName] && (vdata.VNAME_Trust == false || vdata.VNAME.isEmpty())) fields.Add("VNAME");
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Apply_SID] && (vdata.SID_Trust == false || vdata.SID.isEmpty())) fields.Add("SID");
|
||||
|
||||
//where coluns
|
||||
List<string> wheres = new List<string>();
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Where_CustCode])
|
||||
{
|
||||
if (vdata.CUSTCODE.isEmpty() == false) wheres.Add($"CUSTCODE='{vdata.CUSTCODE}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Where_PartNo])
|
||||
{
|
||||
if (vdata.PARTNO_Trust && vdata.PARTNO.isEmpty() == false) wheres.Add($"PARTNO='{vdata.PARTNO}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Where_SID])
|
||||
{
|
||||
if (vdata.SID_Trust && vdata.SID.isEmpty() == false) wheres.Add($"SID='{vdata.SID}'");
|
||||
else Apply = false;
|
||||
}
|
||||
if (VAR.BOOL[eVarBool.Opt_Job_Where_VLOT])
|
||||
{
|
||||
if (vdata.VLOT_Trust && vdata.VLOT.isEmpty() == false) wheres.Add($"VenderLot='{vdata.VLOT}'");
|
||||
else Apply = false;
|
||||
}
|
||||
|
||||
//if query data . no error
|
||||
if (Apply && fields.Count > 0 && wheres.Count > 0)
|
||||
{
|
||||
PUB.log.Add($"DATABAES : RESULT QUERY");
|
||||
|
||||
var SQL = "select top 1 " + string.Join(",", fields) +
|
||||
" from Component_Reel_Result WITH(NOLOCK) " +
|
||||
$" where mc = '{AR.SETTING.Data.McName}'" +
|
||||
$" and prnattach = 1 and stime >= '{DateTime.Now.AddHours(-3).ToString("yyyy-MM-dd HH:mm:ss")}'" +
|
||||
$" and " + string.Join(" and ", wheres) +
|
||||
$" order by wdate desc";
|
||||
|
||||
// var SQLC = "select count(*) " +
|
||||
//" from Component_Reel_Result WITH(NOLOCK) " +
|
||||
//$" where mc = '{AR.SETTING.Data.McName}'" +
|
||||
//$" and prnattach = 1 and stime >= '{DateTime.Now.AddHours(-3).ToString("yyyy-MM-dd HH:mm:ss")}'" +
|
||||
//$" and " + string.Join(" and ", wheres) +
|
||||
//$" order by wdate desc";
|
||||
|
||||
var CS = Properties.Settings.Default.CS;
|
||||
var CN = new System.Data.SqlClient.SqlConnection(CS);
|
||||
var CMD = new System.Data.SqlClient.SqlCommand(SQL, CN);
|
||||
if (CN.State == System.Data.ConnectionState.Closed) CN.Open();
|
||||
|
||||
var DAR = CMD.ExecuteReader();
|
||||
while (DAR.Read())
|
||||
{
|
||||
//loop select columns
|
||||
for (int i = 0; i < fields.Count; i++)
|
||||
{
|
||||
var colName = fields[i];
|
||||
var v = DAR[colName];
|
||||
if (v != null)
|
||||
{
|
||||
var vStr = v.ToString().RemoveNoneASCII().Trim();
|
||||
if (vStr.isEmpty()) continue;
|
||||
|
||||
//O_Trust == false)) fields.Add("PartNo");
|
||||
//ields.Add("PrintPosition");
|
||||
//ta.VNAME.isEmpty())) fields.Add("VenderName");
|
||||
//Empty())) fields.Add("SID");
|
||||
|
||||
//value is not empty
|
||||
if (colName == "CUSTCODE")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.CUSTCODE}=>{vStr}");
|
||||
vdata.CUSTCODE = vStr;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "PARTNO")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.PARTNO}=>{vStr}");
|
||||
vdata.PARTNO = vStr;
|
||||
vdata.PARTNO_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "POS")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.PrintPositionData}=>{vStr}");
|
||||
vdata.PrintPositionData = vStr;
|
||||
vdata.PrintPositionCheck = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VNAME")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.VNAME}=>{vStr}");
|
||||
vdata.VNAME = vStr;
|
||||
vdata.VNAME_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "VenderLot")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.VLOT}=>{vStr}");
|
||||
vdata.VLOT = vStr;
|
||||
vdata.VLOT_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
else if (colName == "SID")
|
||||
{
|
||||
PUB.log.Add($"JUP [{colName}] {vdata.SID}=>{vStr}");
|
||||
vdata.SID = vStr;
|
||||
vdata.SID_Trust = true;
|
||||
NewBarcodeUpdated = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DAR.Close();
|
||||
|
||||
CMD.Dispose();
|
||||
if (CN.State == System.Data.ConnectionState.Open) CN.Close();
|
||||
CN.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
if (PUB.sm.Step == eSMStep.RUN)
|
||||
{
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
if (itemC.VisionData.VNAME.isEmpty() == false &&
|
||||
itemC.VisionData.VLOT.isEmpty() == false &&
|
||||
itemC.VisionData.SID.Length == 9 &&
|
||||
itemC.VisionData.MFGDATE.isEmpty() == false &&
|
||||
(itemC.VisionData.PARTNO.isEmpty() == false) &&
|
||||
itemC.VisionData.BATCH.isEmpty() == false &&
|
||||
itemC.VisionData.RID.isEmpty() == false)
|
||||
{
|
||||
//모든값이 입력되어 있다면 조건 체크후 진행할 수 있도록 한다
|
||||
CheckDataComplte(itemC, "SPS-BARCODEPROCESS", false); //2206211400
|
||||
}
|
||||
//CheckDataComplte(PUB.Result.ItemDataC, "SPS-BARCODEPROCESS");
|
||||
}
|
||||
|
||||
//바코드 처리 여부 변경
|
||||
if (vdata.BarcodeTouched == true && NewBarcodeUpdated == false)
|
||||
{
|
||||
vdata.BarcodeTouched = false;
|
||||
var a = PUB.Result.ItemDataC.VisionData.BarcodeTouched;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
149
Handler/Project/RunCode/StateMachine/_SPS_RecvQRProcess.cs
Normal file
149
Handler/Project/RunCode/StateMachine/_SPS_RecvQRProcess.cs
Normal file
@@ -0,0 +1,149 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
bool RecvQRProcess(List<string> qrdatas, eWorkPort vIdx)
|
||||
{
|
||||
//데이터가없으면 처리하지 않는다.
|
||||
if (qrdatas == null || qrdatas.Count < 1) return false;
|
||||
|
||||
bool FindData = false;
|
||||
var idata = vIdx == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;
|
||||
|
||||
//표준바코드라면 그 값을 표시해준다
|
||||
var patterns = PUB.Result.BCDPattern;
|
||||
|
||||
foreach (var datas in qrdatas)
|
||||
{
|
||||
//원본자료를 체크한다
|
||||
if (datas.Equals(idata.VisionData.PrintQRData))
|
||||
{
|
||||
//인쇄한 자료와 동일한 자료이다
|
||||
FindData = true;
|
||||
}
|
||||
|
||||
//표준 바코드 형태만 취한다
|
||||
var pats = patterns.Where(t => t.IsAmkStd && t.IsEnable).OrderBy(t => t.Seq).ToList();
|
||||
if (pats.Any())
|
||||
{
|
||||
//패턴을 확인하여 값을 표시해준다
|
||||
//var ValueApplyCount = 0;
|
||||
foreach (var pt in pats)
|
||||
{
|
||||
var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
|
||||
if (regx.IsMatch(datas)) //패턴이 일치하다면 이것만 사용한다
|
||||
{
|
||||
//find data
|
||||
var matchs = regx.Matches(datas);
|
||||
foreach (System.Text.RegularExpressions.Match mat in matchs)
|
||||
{
|
||||
foreach (var matchdata in pt.Groups)
|
||||
{
|
||||
if (matchdata.GroupNo <= mat.Groups.Count)
|
||||
{
|
||||
var data = mat.Groups[matchdata.GroupNo];
|
||||
switch (matchdata.TargetPos.ToUpper())
|
||||
{
|
||||
case "SID":
|
||||
idata.VisionData.SID2 = data.Value;
|
||||
break;
|
||||
case "RID":
|
||||
idata.VisionData.RID2 = data.Value;
|
||||
break;
|
||||
case "VLOT":
|
||||
idata.VisionData.VLOT2 = data.Value;
|
||||
break;
|
||||
case "VNAME":
|
||||
idata.VisionData.VNAME2 = data.Value;
|
||||
break;
|
||||
case "MFG":
|
||||
idata.VisionData.MFGDATE2 = data.Value;
|
||||
break;
|
||||
case "QTY":
|
||||
idata.VisionData.QTY2 = data.Value;
|
||||
break;
|
||||
case "PART":
|
||||
idata.VisionData.PARTNO2 = data.Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//var bcdData = new StdLabelPrint.CAmkorSTDBarcode(datas);
|
||||
//PUB.Result.ItemData[vIdx].VisionData.QTY2 = bcdData.QTY.ToString();
|
||||
//PUB.Result.ItemData[vIdx].VisionData.RID2 = bcdData.RID;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.SID2 = bcdData.SID;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.VLOT2 = bcdData.VLOT;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.VNAME2 = bcdData.VENDERNAME;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.MFGDATE2 = bcdData.MFGDate;//.ToString("yyyyMMdd");
|
||||
//PUB.Result.ItemData[vIdx].VisionData.PARTNO2 = bcdData.PARTNO;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.Ready = true;
|
||||
////Pub.Result.ItemData[vIdx].VisionData.ETime = DateTime.Now;
|
||||
////Pub.Result.ItemData[vIdx].VisionData.Angle = 5;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.Complete = true;
|
||||
//PUB.log.Add("BARCODE", $"{vIdx}바코드 읽기 성공 ID:{bcdData.RID},QTY:{bcdData.QTY}");
|
||||
|
||||
////데이터를 읽었으며, 검증기능이 켜져있다면 검증을한다
|
||||
//if (FindData) break;
|
||||
}
|
||||
|
||||
//자료는 있었지만 바코드검증이 실패된 경우이다
|
||||
//타임아웃까지 기다리지 않고 바로 오류처리를 한다.
|
||||
if (FindData == true)
|
||||
{
|
||||
//데이터를 찾았다면 완료처리를 해준다
|
||||
idata.VisionData.Complete = true;
|
||||
//PUB.Result.ItemData[vIdx].VisionData.Complete = true;
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
//else
|
||||
//{
|
||||
// var item = Pub.Result.ItemData[vIdx];
|
||||
// var tsGrab = DateTime.Now - Pub.GetVarTime(VAR_LIVEVIEW);
|
||||
// var timeoutVision = vIdx == 1 ? COMM.SETTING.Data.Timeout_VisionProcessL : COMM.SETTING.Data.Timeout_VisionProcessU;
|
||||
// if (tsGrab.TotalMilliseconds >= timeoutVision)
|
||||
// {
|
||||
// //다음 바코드가 있다면 추가 진행을 위해서 남겨준다
|
||||
// _SM_SAVEIMAGE(vIdx, DateTime.Now, "Images(QRValid)");
|
||||
|
||||
|
||||
// WS_Send((idx == 0 ? 0 : 1), Pub.wsL, Pub.Result.ItemData[idx].guid, "OFF");
|
||||
|
||||
|
||||
// var barcodepos = vIdx == 0 ? "LEFT" : "RIGHT";
|
||||
// Pub.log.AddE("(" + barcodepos + ")바코드를 검증했지만 일치하지 않습니다");
|
||||
// Pub.Result.SetResultMessage(eResult.OPERATION, eECode.BARCODEVALIDERR, eNextStep.pause,
|
||||
// vIdx, Pub.Result.ItemData[vIdx].VisionData.RID, Pub.Result.ItemData[vIdx].VisionData.RID2,
|
||||
// Pub.Result.ItemData[vIdx].VisionData.QTY, Pub.Result.ItemData[vIdx].VisionData.QTY2,
|
||||
// Pub.Result.ItemData[vIdx].VisionData.SID, Pub.Result.ItemData[vIdx].VisionData.SID2,
|
||||
// Pub.Result.ItemData[vIdx].VisionData.MFGDATE, Pub.Result.ItemData[vIdx].VisionData.MFGDATE2,
|
||||
// barcodepos);
|
||||
// return;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
49
Handler/Project/RunCode/Step/_STEP_FINISH.cs
Normal file
49
Handler/Project/RunCode/Step/_STEP_FINISH.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
public void _STEP_FINISH_START(eSMStep step)
|
||||
{
|
||||
//포트1번을 아래로 이동한다(모든포트를 내린다)
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "FINISH"); //210326
|
||||
|
||||
var cvMODE = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
if(cvMODE==false)
|
||||
{
|
||||
if (AR.SETTING.Data.Disable_Left == false) DIO.SetPortMotor(0, eMotDir.CCW, true, "FINISH"); //210326
|
||||
if (AR.SETTING.Data.Disable_Right == false) DIO.SetPortMotor(2, eMotDir.CCW, true, "FINISH"); //210326
|
||||
}
|
||||
|
||||
//picker move to center
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
var PosX = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
MOT.Move(PosX);
|
||||
}
|
||||
|
||||
PUB.Result.JobEndTime = DateTime.Now;
|
||||
|
||||
//컨베어OFF
|
||||
DIO.SetOutput(eDOName.LEFT_CONV, false);
|
||||
DIO.SetOutput(eDOName.RIGHT_CONV, false);
|
||||
|
||||
DIO.SetBuzzer(true, AR.SETTING.Data.Force_JobEndBuzzer);
|
||||
PUB.log.AddI("작업이 완료되었습니다");
|
||||
needShowSummary = true;
|
||||
}
|
||||
|
||||
public StepResult _STEP_FINISH(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
150
Handler/Project/RunCode/Step/_STEP_HOME_CONFIRM.cs
Normal file
150
Handler/Project/RunCode/Step/_STEP_HOME_CONFIRM.cs
Normal file
@@ -0,0 +1,150 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_HOME_CONFIRM_START(eSMStep step)
|
||||
{
|
||||
PUB.sm.seq.Clear(step);
|
||||
}
|
||||
|
||||
public StepResult _STEP_HOME_CONFIRM(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
byte idx = 1;
|
||||
var cmdIndex = step;
|
||||
if (PUB.sm.seq.Get(cmdIndex) < idx) PUB.sm.seq.Set(cmdIndex, idx);
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
// 전체 홈 시간을 체크한다.
|
||||
if (stepTime.TotalSeconds >= AR.SETTING.Data.Timeout_HomeSearch)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.TIMEOUT, eECode.HOME_TIMEOUT, eNextStep.NOTHING, AR.SETTING.Data.Timeout_HomeSearch); //, eECode.(eResult.HomeTimeout,msg ,false);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
//모든축의 완료여부 확인
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
if (
|
||||
PUB.mot.IsHomeSet((short)eAxis.PX_PICK) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PZ_PICK) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.Z_THETA) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_UPDN))
|
||||
{
|
||||
//완료처리
|
||||
hmi1.Scean = UIControl.HMI.eScean.Nomal;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//X축을 안전위치로 보낸다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
Pos.Speed = 200;
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "HOME_SEARCH", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//자재를 들고 있는가(왼쪽)
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (DIO.isVacOKL() > 0)
|
||||
{
|
||||
//로더에 다시 놓아야 한다
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#6") == false) return 0;
|
||||
|
||||
//피커의Z축은 가져오는 위치에서 +10mm 에서 처리한다
|
||||
var PosZ = MOT.GetPZPos(ePZLoc.PICKON);
|
||||
PosZ.Position -= 60;
|
||||
|
||||
//theta 는 0으로 원복한다
|
||||
if (MOT.CheckMotionPos(eAxis.Z_THETA, seqTime, 0, 400, 1000, 1000, "QUICK") == false) return 0;
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, "QUICK") == false) return 0;
|
||||
|
||||
//진공끈다(진공이꺼지면 감지 센서도 같이 꺼진다 - 이 프로젝트에는 감지 센서가 없고 , 출력센서를 그대로 감지로 이용한다)
|
||||
DIO.SetPickerVac(false, true);
|
||||
|
||||
//로더의 얼라인을 해제해준다.
|
||||
hmi1.arVar_Port[1].AlignReset();// = 0; loader1.arVar_Port[1].errorCount = 0;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//피커 Z축 정렬 후 Y축을 준비위치로 옮긴다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosZ = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosZ, "#7") == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//중앙포트(로더)를 아래로 내림
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//if (DIO.GetIOInput(eDIName.PORTC_LIM_UP) == true)
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "FINISH", true); //210326
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//연관플래그 소거
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
PUB.Result.Clear("home");
|
||||
FlagClear(false);
|
||||
|
||||
//트리거 OFF작업
|
||||
WS_Send(eWorkPort.Left, PUB.wsL, "", "OFF","");
|
||||
WS_Send(eWorkPort.Right, PUB.wsR, "", "OFF","");
|
||||
|
||||
//컨베어off
|
||||
DIO.SetOutput(eDOName.LEFT_CONV, false);
|
||||
DIO.SetOutput(eDOName.RIGHT_CONV, false);
|
||||
|
||||
if (PUB.keyenceF != null && PUB.keyenceF.IsConnect)
|
||||
PUB.keyenceF.Trigger(false);
|
||||
if (PUB.keyenceR != null && PUB.keyenceR.IsConnect)
|
||||
PUB.keyenceR.Trigger(false);
|
||||
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
}
|
||||
}
|
||||
55
Handler/Project/RunCode/Step/_STEP_HOME_DELAY.cs
Normal file
55
Handler/Project/RunCode/Step/_STEP_HOME_DELAY.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using AR;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
public void _STEP_HOME_DELAY_START(eSMStep step)
|
||||
{
|
||||
//각 파트의 초기 값을 설정해준다.
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
//홈이완료되었으므로 3초정도 기다려준다.
|
||||
PUB.log.AddAT("홈 완료 확정을 위한 타이머 시작");
|
||||
HomeSuccessTime = DateTime.Now;
|
||||
}
|
||||
|
||||
public StepResult _STEP_HOME_DELAY(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
var tsHome = DateTime.Now - HomeSuccessTime;
|
||||
if (tsHome.TotalSeconds >= 3.0)
|
||||
{
|
||||
if (PUB.mot.HasMoving == false)
|
||||
{
|
||||
//모든축의 위치를 0으로 한다
|
||||
//Pub.mot.ClearPosition();
|
||||
|
||||
//각 파트의 초기 값을 설정해준다.
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
PUB.flag.set(eVarBool.FG_USERSTEP, false, "SM_HOME");
|
||||
PUB.log.AddI("홈 작업 완료로 인해 홈 검증 코드로 이동함");
|
||||
|
||||
HomeChkTime = DateTime.Now;
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
}
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
564
Handler/Project/RunCode/Step/_STEP_HOME_FULL.cs
Normal file
564
Handler/Project/RunCode/Step/_STEP_HOME_FULL.cs
Normal file
@@ -0,0 +1,564 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Project.Commands;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public void _STEP_HOME_FULL_START(eSMStep step)
|
||||
{
|
||||
//ClearBarcode();
|
||||
//Pub.popup.needClose = true; // Pub.popup.CloseAll();
|
||||
|
||||
//181225
|
||||
if (PUB.dio.IsInit)
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
if (PUB.mot.IsInit)
|
||||
{
|
||||
//알람클리어작업
|
||||
if (PUB.mot.HasServoAlarm)
|
||||
{
|
||||
PUB.mot.SetAlarmClearOn();
|
||||
System.Threading.Thread.Sleep(200);
|
||||
PUB.mot.SetAlarmClearOff();
|
||||
}
|
||||
}
|
||||
|
||||
HomeSuccessTime = DateTime.Parse("1982-11-23");
|
||||
|
||||
|
||||
//홈모드로 전환
|
||||
hmi1.Scean = UIControl.HMI.eScean.MotHome;
|
||||
hmi1.arHomeProgress[0] = 0;
|
||||
hmi1.arHomeProgress[1] = 0;
|
||||
hmi1.arHomeProgress[2] = 0;
|
||||
hmi1.arHomeProgress[3] = 0;
|
||||
hmi1.arHomeProgress[4] = 0;
|
||||
hmi1.arHomeProgress[5] = 0;
|
||||
hmi1.arHomeProgress[6] = 0;
|
||||
|
||||
//실린더 상태 복귀
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
}
|
||||
public StepResult _STEP_HOME_FULL(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//전체 홈 시간을 체크한다.
|
||||
if (stepTime.TotalSeconds >= AR.SETTING.Data.Timeout_HomeSearch)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.TIMEOUT, eECode.HOME_TIMEOUT, eNextStep.NOTHING, AR.SETTING.Data.Timeout_HomeSearch); //, eECode.(eResult.HomeTimeout,msg ,false);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(false) == false)
|
||||
{
|
||||
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
int idx = 1;
|
||||
var cmdIndex = step;
|
||||
|
||||
//Check X Safty Area
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//안전위치 센서가 안들어와잇으면 오류 처리한다
|
||||
if (DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOTX_SAFETY,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
|
||||
//포트 모두내리기(221013 - 박형철)
|
||||
if (VAR.BOOL[eVarBool.Use_Conveyor] == false && AR.SETTING.Data.Disable_HomePortDown == false)
|
||||
{
|
||||
DIO.SetPortMotor(0, eMotDir.CCW, true, "HOME");
|
||||
DIO.SetPortMotor(1, eMotDir.CCW, true, "HOME");
|
||||
DIO.SetPortMotor(2, eMotDir.CCW, true, "HOME");
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//홈 설정여부플래그 OFF
|
||||
for (int i = 0; i < PUB.mot.DeviceCount; i++)
|
||||
{
|
||||
if (PUB.mot.IsUse(i) == false) continue;
|
||||
PUB.mot.SetHomeSet(i, false);
|
||||
}
|
||||
|
||||
//부저 OFF
|
||||
DIO.SetBuzzer(false);
|
||||
|
||||
//프린터부착헤드 후진
|
||||
if (DIO.GetIOInput(eDIName.L_PICK_BW) == false)
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
|
||||
if (DIO.GetIOInput(eDIName.R_PICK_BW) == false)
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
|
||||
|
||||
if (DIO.GetIOInput(eDIName.L_CYLUP) == false)
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
|
||||
if (DIO.GetIOInput(eDIName.R_CYLUP) == false)
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커실린더 상승
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_LCYL_NOUP) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true, timeoutcode: eECode.PICKER_RCYL_NOUP) != eNormalResult.True) return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 부착헤드 후진 검사
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//프린터부착헤드 후진
|
||||
if (DIO.GetIOInput(eDIName.L_PICK_BW) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPICKER_NOBW, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_PICK_BW) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPICKER_NOBW, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 부착헤드 후진 검사
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//프린터부착헤드 후진
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
if (DIO.GetIOInput(eDIName.L_CYLUP) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPRINTER_NOUP, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_CYLUP) == false)
|
||||
{
|
||||
if (stepTime.TotalSeconds > 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPRINTER_NOUP, eNextStep.PAUSE);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//전진이 들어와 있다면 오류 로한다
|
||||
if (DIO.GetIOInput(eDIName.L_CYLDN))
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_LPRINTER_NOUP, eNextStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (DIO.GetIOInput(eDIName.R_CYLDN))
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.PRINTER_RPRINTER_NOUP, eNextStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
}
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//피커의 Z축을 우선 진행
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PZ_PICK);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_UPDN, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PZ_PICK) == false && PUB.mot.IsLimitN((short)eAxis.PZ_PICK) == false && PUB.mot.IsOrg((short)eAxis.PZ_PICK) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터의 Z축을 먼저 한다 221013
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_UPDN);
|
||||
var rlt2 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_UPDN);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) == false && PUB.mot.IsLimitN((short)eAxis.PL_UPDN) == false && PUB.mot.IsOrg((short)eAxis.PL_UPDN) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//Z축 안전위치 대기
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PR_UPDN) == false && PUB.mot.IsLimitN((short)eAxis.PR_UPDN) == false && PUB.mot.IsOrg((short)eAxis.PR_UPDN) == false)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//각 프린터의 Y,Z 축의 홈을 진행한다.
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//유효성 검사를 하지 않는다.. 하게되면 오류남 201208
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_MOVE, false);
|
||||
var rlt2 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_MOVE, false);
|
||||
//var rlt3 = MOT.Home("RUN_SAFTY_HOME", eAxis.PL_UPDN, false);
|
||||
//var rlt4 = MOT.Home("RUN_SAFTY_HOME", eAxis.PR_UPDN, false);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PL_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
if (rlt2 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PR_MOVE, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
//if (rlt3 == false)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
// eECode.MOT_HSEARCH,
|
||||
// eNextStep.ERROR,
|
||||
// eAxis.PL_UPDN, PUB.mot.ErrorMessage);
|
||||
// return StepResult.Error;
|
||||
//}
|
||||
//if (rlt4 == false)
|
||||
//{
|
||||
// PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
// eECode.MOT_HSEARCH,
|
||||
// eNextStep.ERROR,
|
||||
// eAxis.PR_UPDN, PUB.mot.ErrorMessage);
|
||||
// return StepResult.Error;
|
||||
//}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터축의 Y,Z축이 완료되기를 기다린다.
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PL_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_MOVE) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PL_UPDN) &&
|
||||
PUB.mot.IsHomeSet((short)eAxis.PR_UPDN))
|
||||
{
|
||||
//현재위치를 0으로 설정한다.
|
||||
PUB.mot.ClearPosition((int)eAxis.PL_MOVE);
|
||||
PUB.mot.ClearPosition((int)eAxis.PR_MOVE);
|
||||
|
||||
//var p1 = MOT.GetLMPos(eLMLoc.READY);
|
||||
//MOT.Move(eAxis.PL_MOVE, p1.Position, 200, 500, false, false, false);
|
||||
|
||||
//var p2 = MOT.GetRMPos(eRMLoc.READY);
|
||||
//p2.Speed = 100;
|
||||
//MOT.Move(eAxis.PR_MOVE, p2.Position, 200, 500, false, false, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//실린더를OFF한다 - 210207
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//실린더 OFF 확인 - 210207
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//IO가 완료되지 안항ㅆ다면 대기한다
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//프린터 move 축 안전지대로이동
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PosLM = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosRM = MOT.GetRMPos(eRMLoc.READY);
|
||||
PosLM.Speed = 200;
|
||||
PosRM.Speed = 200;
|
||||
MOT.Move((eAxis)PosLM.Axis, PosLM.Position, PosLM.Speed, PosLM.Acc, false, false, false);
|
||||
MOT.Move((eAxis)PosRM.Axis, PosRM.Position, PosRM.Speed, PosRM.Acc, false, false, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 move 축 안전지대로이동
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var PosLM = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosRM = MOT.GetRMPos(eRMLoc.READY);
|
||||
PosLM.Speed = 250;
|
||||
PosRM.Speed = 250;
|
||||
if (MOT.CheckMotionPos(seqTime, PosLM, "MOT_HOME", false) == false) return StepResult.Wait;
|
||||
if (MOT.CheckMotionPos(seqTime, PosRM, "MOT_HOME", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//Theta 홈
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//회전축은 잡지 않는다
|
||||
PUB.mot.SetHomeSet((int)eAxis.Z_THETA, true);
|
||||
PUB.mot.ClearPosition((int)eAxis.Z_THETA);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커-X축 홈
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
var rlt1 = MOT.Home("RUN_SAFTY_HOME", eAxis.PX_PICK, false);
|
||||
if (rlt1 == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PX_PICK, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//모든축의 완료여부 확인
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
if (PUB.mot.IsHomeSet((short)eAxis.PX_PICK))
|
||||
{
|
||||
//완료처리
|
||||
PUB.mot.ClearPosition((int)eAxis.PX_PICK);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//X축 값 초기화확인
|
||||
if (PUB.sm.seq.Get(cmdIndex) == idx++)
|
||||
{
|
||||
//모든축이 완료되었다면 완료처리를 한다.
|
||||
var ts = PUB.sm.seq.GetTime(cmdIndex);
|
||||
if (ts.TotalSeconds >= 5)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION,
|
||||
eECode.MOT_HSEARCH,
|
||||
eNextStep.ERROR,
|
||||
eAxis.PX_PICK, PUB.mot.ErrorMessage);
|
||||
return StepResult.Error;
|
||||
}
|
||||
else
|
||||
{
|
||||
var XPos = PUB.mot.GetActPos((int)eAxis.PX_PICK);
|
||||
if (Math.Abs(XPos) <= 0.1 && PUB.mot.IsMotion((int)eAxis.PX_PICK) == false)
|
||||
{
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
}
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//완료됨
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
FlagClear(true);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_DELAY);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
void FlagClear(bool ClearItemOn)
|
||||
{
|
||||
PUB.log.AddAT($"플래그초기화({ClearItemOn})");
|
||||
//연관플래그 소거
|
||||
if (ClearItemOn)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PL_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PR_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PORTL_ITEMON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PORTR_ITEMON, false, "POSRESET");
|
||||
}
|
||||
|
||||
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTR, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PC, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT0, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT2, false, "POSRESET");
|
||||
//PUB.flag.set(eVarBool.SCR_JOBFINISH, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONR, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONL, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONR, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_LPICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_CMD_YP_RPICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_LPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_RPICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PZ_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLM_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRM_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLM_PICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRM_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLZ_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRZ_PICKOF, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PLZ_PICKON, false, "POSRESET");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRZ_PICKON, false, "POSRESET");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RUN_LEFT, false, "POSREST");
|
||||
PUB.flag.set(eVarBool.FG_RUN_RIGHT, false, "POSREST");
|
||||
//VAR.BOOL[eVarBool.JOB_BYPASS_LEFT] = false;
|
||||
//VAR.BOOL[eVarBool.JOB_BYPASS_RIGHT] = false;
|
||||
//VAR.STR[eVarString.JOB_BYPASS_SID] = string.Empty;
|
||||
//VAR.STR[eVarString.JOB_TYPE] = string.Empty;
|
||||
|
||||
//retry소거 230510
|
||||
VAR.BOOL[eVarBool.JOB_PickON_Retry] = false;
|
||||
VAR.BOOL[eVarBool.VisionL_Retry] = false;
|
||||
VAR.BOOL[eVarBool.VisionR_Retry] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyence] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyenceL] = false;
|
||||
VAR.BOOL[eVarBool.wait_for_keyenceR] = false;
|
||||
VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] = false;
|
||||
|
||||
//busy 플래그 제거
|
||||
PUB.iLockCVL.set((int)eILockCV.BUSY, false, "POSREST");
|
||||
PUB.iLockCVR.set((int)eILockCV.BUSY, false, "POSREST");
|
||||
PUB.iLockCVL.set((int)eILockCV.VISION, false, "POSREST");
|
||||
PUB.iLockCVR.set((int)eILockCV.VISION, false, "POSREST");
|
||||
|
||||
VAR.I32[eVarInt32.RIGT_ITEM_COUNT] = 0;
|
||||
VAR.I32[eVarInt32.LEFT_ITEM_COUNT] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
215
Handler/Project/RunCode/Step/_STEP_HOME_QUICK.cs
Normal file
215
Handler/Project/RunCode/Step/_STEP_HOME_QUICK.cs
Normal file
@@ -0,0 +1,215 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Project.Commands;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{//홈 맞춰
|
||||
|
||||
public void _STEP_HOME_QUICK_START(eSMStep step)
|
||||
{
|
||||
|
||||
|
||||
//모든 홈이 되어야 가능하다
|
||||
if (PUB.mot.IsInit && PUB.mot.HasHomeSetOff == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIO.IsEmergencyOn() == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.EMERGENCY, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIO.isSaftyDoorF() == false || DIO.isSaftyDoorR() == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.DOORSAFTY, eNextStep.ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//실린더 상태 복귀
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
}
|
||||
|
||||
CommandBuffer cmds = new CommandBuffer();
|
||||
|
||||
public StepResult _STEP_HOME_QUICK(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
|
||||
byte idx = 1;
|
||||
var cmdIndex = eSMStep.HOME_QUICK;
|
||||
if (PUB.sm.seq.Get(step) < idx) PUB.sm.seq.Set(cmdIndex, idx);
|
||||
|
||||
//사용자 스텝처리가 아닌경우에만 동작 중지를 검사 한다
|
||||
//중단조건 검사는 0번 축에만 동작하게 한다
|
||||
if (PUB.flag.get(eVarBool.FG_USERSTEP) == false && CheckPauseCondition(true) == false)
|
||||
{
|
||||
//가동불가 조건 확인
|
||||
if (PUB.Result.ResultCode == eResult.EMERGENCY)
|
||||
PUB.sm.SetNewStep(eSMStep.ERROR);
|
||||
else
|
||||
PUB.sm.SetNewStep(eSMStep.PAUSE);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//동작상태가 아니라면 처리하지 않는다.
|
||||
var userStep = PUB.flag.get(eVarBool.FG_USERSTEP);
|
||||
|
||||
|
||||
//*********************
|
||||
//** 하드웨어 조건 확인
|
||||
//*********************
|
||||
if (CheckHomeProcess_HW_Available(true) == false)
|
||||
{
|
||||
return StepResult.Error;
|
||||
}
|
||||
|
||||
//시작정보
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//210415
|
||||
if (DIO.GetPortMotorDir(0) == eMotDir.CW) DIO.SetPortMotor(0, eMotDir.CW, false, "POSRESET");
|
||||
if (DIO.GetPortMotorDir(1) == eMotDir.CW) DIO.SetPortMotor(1, eMotDir.CW, false, "POSRESET");
|
||||
if (DIO.GetPortMotorDir(2) == eMotDir.CW) DIO.SetPortMotor(2, eMotDir.CW, false, "POSRESET");
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//피커 Z축을 0으로 이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPZPos(ePZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#7") == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커 Y축을 안전지대로 이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var Pos = MOT.GetPXPos(ePXLoc.PICKON);
|
||||
if (MOT.CheckMotionPos(seqTime, Pos, "#7", false) == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//PRINT-Z축을 0으로이동한다
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var spdinfo = MOT.GetLZPos(eLZLoc.READY);
|
||||
MOT.Move(eAxis.PL_UPDN, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
spdinfo = MOT.GetRZPos(eRZLoc.READY);
|
||||
MOT.Move(eAxis.PR_UPDN, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//PRINT-Z축 완료대기
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosL = MOT.GetLZPos(eLZLoc.READY);
|
||||
var PosR = MOT.GetRZPos(eRZLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosL, "#7", false) == false) return StepResult.Wait;
|
||||
if (MOT.CheckMotionPos(seqTime, PosR, "#8", false) == false) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//피커실린더 상승
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.L_CYLDN, false);
|
||||
DIO.SetOutput(eDOName.R_CYLDN, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_PickerCylinder)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_CYLUP, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_CYLUP, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
}
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//프린터부착헤드 후진
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
DIO.SetOutput(eDOName.PRINTL_FWD, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_FWD, false);
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터헤드후진 확인
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
if (DIO.checkDigitalO(eDIName.L_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
if (DIO.checkDigitalO(eDIName.R_PICK_BW, seqTime, true) != eNormalResult.True) return StepResult.Wait;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
|
||||
//프린터 Y축 이동
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var spdinfo = MOT.GetLMPos(eLMLoc.READY);
|
||||
MOT.Move(eAxis.PL_MOVE, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
spdinfo = MOT.GetRMPos(eRMLoc.READY);
|
||||
MOT.Move(eAxis.PR_MOVE, spdinfo.Position, spdinfo.Speed, spdinfo.Acc, false, true, false);
|
||||
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//프린터 Y축 완료대기
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
var PosL = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PosR = MOT.GetRMPos(eRMLoc.READY);
|
||||
if (MOT.CheckMotionPos(seqTime, PosL, "#7") == false) return 0;
|
||||
if (MOT.CheckMotionPos(seqTime, PosR, "#8") == false) return 0;
|
||||
PUB.sm.seq.Update(cmdIndex);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//연관플래그 소거
|
||||
if (PUB.sm.seq.Get(step) == idx++)
|
||||
{
|
||||
//진공상태를 초기화 해준다.
|
||||
DIO.SetPrintLVac(ePrintVac.off, true);
|
||||
DIO.SetPrintRVac(ePrintVac.off, true);
|
||||
DIO.SetOutput(eDOName.PRINTL_AIRON, false);
|
||||
DIO.SetOutput(eDOName.PRINTR_AIRON, false);
|
||||
|
||||
FlagClear(true);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
PUB.sm.seq.Clear(step);
|
||||
PUB.sm.SetNewStep(eSMStep.HOME_CONFIRM);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Handler/Project/RunCode/Step/_STEP_IDLE.cs
Normal file
82
Handler/Project/RunCode/Step/_STEP_IDLE.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
DateTime IdleStartTime = DateTime.Now;
|
||||
bool IdleSleep = false;
|
||||
|
||||
public void _STEP_IDLE_START(eSMStep step)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_USERSTEP, false, "SM_IDLE");
|
||||
|
||||
//lbMsgR.ProgressEnable = false;
|
||||
IdleStartTime = DateTime.Now;
|
||||
|
||||
//초기화완료되면 버튼을 활성화한다
|
||||
if (PUB.sm.getOldStep == eSMStep.INIT)
|
||||
{
|
||||
this.BeginInvoke(new Action(() =>
|
||||
{
|
||||
panTopMenu.Enabled = true;
|
||||
btStart.Enabled = true;
|
||||
btStop.Enabled = true;
|
||||
btReset.Enabled = true;
|
||||
}));
|
||||
|
||||
//Pub.sm.setNewStep(eSMStep.XMOVE); //홈을 위해서 바로 이동 모션으로 가게한다
|
||||
if (PUB.mot.HasHomeSetOff == true && DIO.GetIOInput(eDIName.PICKER_SAFE) == false)
|
||||
{
|
||||
//피커의 이동이 필요한 상황
|
||||
this.BeginInvoke(new Action(() => { btManage.PerformClick(); }));
|
||||
}
|
||||
else
|
||||
{
|
||||
//리셋이 필요한 상황
|
||||
if (AR.SETTING.Data.OnlineMode == true)
|
||||
this.BeginInvoke(new Action(() => { btMReset.PerformClick(); }));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public StepResult _STEP_IDLE(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
//대기상태에서 조명 자동으로 끄기
|
||||
if (IdleSleep == false && IdleStartTime.Year != 1982)
|
||||
{
|
||||
var ts = DateTime.Now - IdleStartTime;
|
||||
if (ts.TotalMinutes > AR.SETTING.Data.AutoOffRoomLightMin)
|
||||
{
|
||||
PUB.log.Add("대기상태 전환으로 인해 조명을 끕니다");
|
||||
IdleSleep = true;
|
||||
DIO.SetRoomLight(false);
|
||||
}
|
||||
}
|
||||
|
||||
//자동소거기능
|
||||
if (AR.SETTING.Data.AutoDeleteDay > 0)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_MINSPACE) == true)
|
||||
{
|
||||
var ts = DateTime.Now - lastDeleteTime;
|
||||
if (ts.TotalSeconds > 1)
|
||||
{
|
||||
//파일을 찾아서 소거한다.
|
||||
var delpath = System.IO.Path.Combine(AR.SETTING.Data.Path_Data, "Images");
|
||||
if (delpath != "") DeleteFile(delpath);
|
||||
|
||||
lastDeleteTime = DateTime.Now;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return StepResult.Wait;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
200
Handler/Project/RunCode/Step/_STEP_INIT.cs
Normal file
200
Handler/Project/RunCode/Step/_STEP_INIT.cs
Normal file
@@ -0,0 +1,200 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using Microsoft.Owin.Hosting;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
//Int32[] _hDevice = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _width = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _height = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _stride = new Int32[] { 0, 0, 0 };
|
||||
//Int32[] _bufferSize = new Int32[] { 0, 0, 0 };
|
||||
//Boolean[] _isCrevisOpen = new bool[] { false, false, false };
|
||||
//Boolean[] _isCrevisACQ = new bool[] { false, false, false };
|
||||
// IntPtr[] _pImage = new IntPtr[] { IntPtr.Zero, IntPtr.Zero, IntPtr.Zero };
|
||||
|
||||
public void _STEP_INIT_START(eSMStep step)
|
||||
{
|
||||
|
||||
int progress = 0;
|
||||
var ProgressMax = 13;
|
||||
Color fColor = Color.DarkViolet;
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "Motion Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
if (PUB.mot.Init() == false)
|
||||
{
|
||||
PUB.log.AddE(string.Format("MOT INIT ERROR : {0}", PUB.mot.ErrorMessage));
|
||||
PUB.log.AddE("모션 초기화 오류로 잠시 후 다시 시도합니다");
|
||||
System.Threading.Thread.Sleep(1000);
|
||||
if (PUB.mot.Init() == false)
|
||||
{
|
||||
PUB.log.AddE("모션 초기화 재시도 실패" + PUB.mot.ErrorMessage);
|
||||
}
|
||||
}
|
||||
_SM_RUN_INIT_MOTION();
|
||||
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "DIO Initialize", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
if (PUB.dio.Init())
|
||||
{
|
||||
DIO.InitDIOSensitive();
|
||||
PUB.log.Add("DIO RUN MONITOR");
|
||||
PUB.dio.RunMonitor();
|
||||
|
||||
|
||||
//포트동작을 멈춘다
|
||||
DIO.SetPortMotor(0, eMotDir.CW, false, "init");
|
||||
DIO.SetPortMotor(1, eMotDir.CW, false, "init");
|
||||
DIO.SetPortMotor(2, eMotDir.CW, false, "init");
|
||||
}
|
||||
else PUB.log.AddE(string.Format("DIO INIT ERROR : {0}", PUB.dio.ErrorMessage));
|
||||
TowerLamp.Init(PUB.dio,
|
||||
DIO.Pin[eDOName.TWR_REDF].terminalno,
|
||||
DIO.Pin[eDOName.TWR_GRNF].terminalno,
|
||||
DIO.Pin[eDOName.TWR_YELF].terminalno);
|
||||
|
||||
TowerLamp.Enable = !SETTING.Data.Disable_TowerLamp;
|
||||
|
||||
PUB.sm.RaiseStateProgress(++progress, "Set DIO Names", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
_SM_RUN_INIT_SETDIONAME();
|
||||
|
||||
PUB.log.AddI("모션 초기화 플래그 설정완료");
|
||||
PUB.flag.set(eVarBool.FG_INIT_MOTIO, true, "INIT");
|
||||
|
||||
//230504
|
||||
hmi1.SetDIO(PUB.dio);
|
||||
hmi1.SetMOT(PUB.mot);
|
||||
|
||||
//남은 공간
|
||||
PUB.sm.RaiseStateProgress(++progress, "공간 확인", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
CheckFreeSpace(); //181225
|
||||
|
||||
//모델자동선택 181206
|
||||
PUB.sm.RaiseStateProgress(++progress, "이전모델 확인", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
|
||||
//
|
||||
if (PUB.uSetting.LastModelV != "") PUB.SelectModelV(PUB.uSetting.LastModelV, false);
|
||||
var motionmodel = PUB.uSetting.LastModelM;
|
||||
if (motionmodel.isEmpty()) motionmodel = PUB.Result.vModel.Motion;
|
||||
if (motionmodel.ToUpper().StartsWith("CONV")) PUB.flag.set(eVarBool.Use_Conveyor, true, "load");
|
||||
else PUB.flag.set(eVarBool.Use_Conveyor, false, "load");
|
||||
PUB.SelectModelM(motionmodel, false);
|
||||
|
||||
//프린터설정
|
||||
PUB.sm.RaiseStateProgress(++progress, "프린터설정", ProgressMax, fColor); System.Threading.Thread.Sleep(5);
|
||||
PUB.PrinterL = new Device.SATOPrinterAPI();
|
||||
PUB.PrinterL.PortName = AR.SETTING.Data.PrintL_Port;
|
||||
PUB.PrinterL.BaudRate = AR.SETTING.Data.PrintL_Baud;
|
||||
|
||||
PUB.PrinterR = new Device.SATOPrinterAPI();
|
||||
PUB.PrinterR.PortName = AR.SETTING.Data.PrintR_Port;
|
||||
PUB.PrinterR.BaudRate = AR.SETTING.Data.PrintR_Baud;
|
||||
|
||||
PUB.flag.set(eVarBool.FG_INIT_PRINTER, true, "INIT");
|
||||
PUB.sm.RaiseStateProgress(ProgressMax, "초기화 완료", ProgressMax, Color.Gold); System.Threading.Thread.Sleep(5);
|
||||
PUB.log.Add("init finish");
|
||||
|
||||
//조명 ON
|
||||
DIO.SetRoomLight(true);
|
||||
|
||||
|
||||
// Start OWIN host
|
||||
var baseAddress = "http://*:9001";
|
||||
WebApp.Start<OWIN.Startup>(url: baseAddress);
|
||||
PUB.log.AddI($"호스팅서비스ON : {baseAddress}");
|
||||
|
||||
}
|
||||
|
||||
public StepResult _STEP_INIT(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
PUB.sm.SetNewStep(eSMStep.IDLE);
|
||||
return StepResult.Complete;
|
||||
}
|
||||
|
||||
public void _SM_RUN_INIT_SETDIONAME()
|
||||
{
|
||||
//DIO 이름설정
|
||||
Console.WriteLine("## SET DI NAME ##");
|
||||
for (int i = 0; i < PUB.dio.GetDICount; i++)
|
||||
{
|
||||
var name = Enum.GetName(typeof(eDIName), i);
|
||||
Console.WriteLine($"[{i}] {name}");
|
||||
PUB.dio.SetDIName(i, name);
|
||||
}
|
||||
Console.WriteLine("## SET DO NAME ##");
|
||||
for (int i = 0; i < PUB.dio.GetDOCount; i++)
|
||||
{
|
||||
var name = Enum.GetName(typeof(eDOName), i);
|
||||
Console.WriteLine($"[{i}] {name}");
|
||||
PUB.dio.SetDOName(i, name);
|
||||
}
|
||||
|
||||
//Console.WriteLine("## SET FLAG NAME ##");
|
||||
//for (int i = 0; i < PUB.flag.Length; i++)
|
||||
//{
|
||||
// var name = Enum.GetName(typeof(eFlag), i);
|
||||
// PUB.flag.Name[i] = name;
|
||||
// Console.WriteLine($"[{i}] {name}");
|
||||
//}
|
||||
}
|
||||
|
||||
private void _SM_RUN_INIT_MOTION()
|
||||
{
|
||||
PUB.mot.SetAlarmClearOn();
|
||||
System.Threading.Thread.Sleep(5);
|
||||
PUB.mot.SetAlarmClearOff();
|
||||
|
||||
//7개의 축을 사용한다
|
||||
for (int i = 0; i < PUB.system.MotaxisCount; i++)
|
||||
{
|
||||
//설정파일이 있다면 불러온다
|
||||
var file = System.IO.Path.Combine(UTIL.CurrentPath, "Model", "axis" + i.ToString() + ".motaxt");
|
||||
if (System.IO.File.Exists(file) == false)
|
||||
{
|
||||
PUB.log.AddAT($"모션({i}) 설정파일 없음!!");
|
||||
PUB.mot.InitAxis(i, file);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.mot.InitAxis((short)i, file) == false)
|
||||
PUB.log.AddE("모션 설정 실패 축:" + i.ToString());
|
||||
else
|
||||
PUB.log.AddI($"모션({i}) 설정 완료");
|
||||
}
|
||||
}
|
||||
|
||||
//EStop Disable
|
||||
PUB.mot.SetEStopEnable(0, false);
|
||||
PUB.mot.SetEStopEnable(1, false);
|
||||
PUB.mot.SetEStopEnable(2, false);
|
||||
PUB.mot.SetEStopEnable(3, false);
|
||||
PUB.mot.SetEStopEnable(4, false);
|
||||
PUB.mot.SetEStopEnable(5, false);
|
||||
PUB.mot.SetEStopEnable(6, false);
|
||||
|
||||
//softlimit 적용 - 201214
|
||||
UpdateSoftLimit();
|
||||
|
||||
//PUB.mot.[(short)eAxis.Z_PICKER] = true;
|
||||
//PUB.mot.useBrake[(short)eAxis.PL_UPDN] = true;
|
||||
//PUB.mot.useBrake[(short)eAxis.PR_UPDN] = true;
|
||||
|
||||
if (PUB.mot.IsInit)
|
||||
{
|
||||
PUB.log.Add("MOT RUN MONITOR");
|
||||
PUB.mot.RunMonitor();
|
||||
PUB.log.AddAT("ALL SERVO ON");
|
||||
PUB.mot.SetServOn(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
328
Handler/Project/RunCode/Step/_STEP_RUN.cs
Normal file
328
Handler/Project/RunCode/Step/_STEP_RUN.cs
Normal file
@@ -0,0 +1,328 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
//System.Threading.ManualResetEvent LockLL = new System.Threading.ManualResetEvent(true);
|
||||
//System.Threading.ManualResetEvent LockLR = new System.Threading.ManualResetEvent(true);
|
||||
|
||||
System.Threading.ManualResetEvent LockPK = new System.Threading.ManualResetEvent(true);
|
||||
|
||||
System.Threading.ManualResetEvent LockUserL = new System.Threading.ManualResetEvent(true);
|
||||
System.Threading.ManualResetEvent LockUserR = new System.Threading.ManualResetEvent(true);
|
||||
|
||||
|
||||
async public void _STEP_RUN_START(eSMStep step)
|
||||
{
|
||||
|
||||
//새로시작하면 포트 얼라인을 해제 해준다
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PL, false, "SM_RUN");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PC, false, "SM_RUN");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PORT_PR, false, "SM_RUN");
|
||||
|
||||
//작업완료기준시간 초기화
|
||||
if (PUB.flag.get(eVarBool.FG_JOB_END) == true) VAR.TIME.Update(eVarTime.JOB_END);
|
||||
|
||||
//라이브뷰시간 초기화
|
||||
VAR.TIME.Update(eVarTime.LIVEVIEW0);
|
||||
VAR.TIME.Update(eVarTime.LIVEVIEW1);
|
||||
VAR.TIME.Update(eVarTime.LIVEVIEW2);
|
||||
|
||||
//룸조명과, 타워램프 ON 한다 - 210402
|
||||
//COMM.SETTING.Data.Disable_RoomLight = false;
|
||||
//COMM.SETTING.Data.Disable_TowerLamp = false;
|
||||
|
||||
//얼라인상태 초기화
|
||||
hmi1.arVar_Port[1].AlignReset();
|
||||
hmi1.Scean = UIControl.HMI.eScean.Nomal;
|
||||
//loader1.arVar_Port.ToList().ForEach(t => t.AlignReset());
|
||||
|
||||
//daycount 초기화
|
||||
if (PUB.counter.DateStr != DateTime.Now.ToString("yyyy-MM-dd"))
|
||||
{
|
||||
PUB.counter.ClearDay();
|
||||
PUB.counter.DateStr = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
PUB.counter.Save();
|
||||
}
|
||||
|
||||
|
||||
//키엔스 시작시간을 초기화한다.
|
||||
VAR.TIME.Update(eVarTime.KEYENCEWAIT);
|
||||
|
||||
//조명켜기 - 201228
|
||||
DIO.SetRoomLight(true); //조명은 켜는 것으로 한다 221107
|
||||
|
||||
//각스텝의 시작변수 초기화한다.
|
||||
PUB.sm.seq.ClearTime();//.ClearRunStepSeqTime();
|
||||
|
||||
//대기메세지소거
|
||||
PUB.WaitMessage = new string[] { "", "", "", "", "", "", "", "", "", "", "" };
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_PRC_VISIONL) && PUB.flag.get(eVarBool.FG_END_VISIONL) == false)
|
||||
{
|
||||
//작업을 재시작하면 카메라 트리거를 다시 보낸다
|
||||
WS_Send(eWorkPort.Left, PUB.wsL, PUB.Result.ItemDataL.guid, "TRIG", PUB.Result.ItemDataL.VisionData.PrintQRData);
|
||||
}
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_PRC_VISIONR) && PUB.flag.get(eVarBool.FG_END_VISIONR) == false)
|
||||
{
|
||||
//Pub.Result.ItemData[2].Clear("[0] RUN FIRST");
|
||||
WS_Send(eWorkPort.Right, PUB.wsR, PUB.Result.ItemDataR.guid, "TRIG", PUB.Result.ItemDataR.VisionData.PrintQRData);
|
||||
}
|
||||
|
||||
//재시작할때에는 이것이 동작하면 안됨
|
||||
if (PUB.sm.getOldStep == eSMStep.IDLE)
|
||||
{
|
||||
//인쇄용지감지상태 초기화
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_WAIT_PAPERDETECTR, false, "");
|
||||
|
||||
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_PRC_VISIONR, false, "");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_END_VISIONR, false, "");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_OK_PRINTR, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RUN_PRINTR, false, "");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKON, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_LPICKOF, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_RPICKOF, false, "");
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT0, false, "");
|
||||
PUB.flag.set(eVarBool.FG_SET_DATA_PORT2, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITL, false, "");
|
||||
PUB.flag.set(eVarBool.FG_RDY_PX_PICKONWAITR, false, "");
|
||||
|
||||
PUB.flag.set(eVarBool.FG_PORTL_ITEMON, false, "");
|
||||
PUB.flag.set(eVarBool.FG_PORTR_ITEMON, false, "");
|
||||
|
||||
//PUB.flag.set(eVarBool.INPUT_LEFT, false, "SM_RUN");
|
||||
|
||||
//step seq 를 모두 소거해준다
|
||||
PUB.sm.seq.Clear(eSMStep.RUN_PICK_RETRY);
|
||||
|
||||
//자료를 소거한다.
|
||||
//PUB.Result.Clear("RUN_START");
|
||||
//PUB.Result.JobStartTime = DateTime.Now; //200728
|
||||
|
||||
//신규실행이므로 작업차수별 수량을 초기화해준다
|
||||
PUB.counter.ClearP(); //200711
|
||||
|
||||
PUB.flag.set(eVarBool.FG_JOB_END, false, "SM_RUN");
|
||||
|
||||
PUB.sm.seq.Clear(eSMStep.RUN_ROOT_SEQUENCE_L);
|
||||
PUB.sm.seq.Clear(eSMStep.RUN_ROOT_SEQUENCE_R);
|
||||
|
||||
if (await _SM_RUN_STARTCHKSW(true, new TimeSpan(0)) == false) return;
|
||||
if (_SM_RUN_STARTCHKHW(true, new TimeSpan(0)) == false) return;
|
||||
|
||||
//plc의 SID 데이터를 갱신하도록 한다
|
||||
PUB.Result.ClearAllSID = true;
|
||||
PUB.log.AddI("*** 신규 작업이 시작 되었습니다 ***");
|
||||
//PUB.flag.set(eVarBool.RDY_VISION1, true, "JOB START"); //최초 시작시에는 1번 비젼이 동작하게 한다
|
||||
|
||||
//새로시작할때에는 이 값을 초기화 해준다.
|
||||
PUB.Result.LastSIDFrom = string.Empty;
|
||||
PUB.Result.LastSIDTo = string.Empty;
|
||||
//Pub.Result.LastSID103_2 = string.Empty;
|
||||
PUB.Result.LastSIDCnt = -1;
|
||||
PUB.Result.LastVName = string.Empty;
|
||||
|
||||
|
||||
//릴아디이 221107
|
||||
VAR.STR[eVarString.PrePick_ReelIDNew] = string.Empty;
|
||||
VAR.STR[eVarString.PrePick_ReelIDOld] = string.Empty;
|
||||
VAR.STR[eVarString.PrePick_ReelIDTarget] = string.Empty;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (VAR.BOOL[eVarBool.wait_for_keyence])
|
||||
{
|
||||
PUB.log.Add($"바코드수신대기중이었으므로 기존 값을 삭제 합니다(CONF={PUB.Result.ItemDataC.VisionData.Confirm},ID:{PUB.Result.ItemDataC.VisionData.RID})");
|
||||
PUB.Result.ItemDataC.VisionData.Clear("RESTART", true);
|
||||
}
|
||||
PUB.log.AddI("*** 작업이 재시작 되었습니다 ***");
|
||||
}
|
||||
}
|
||||
|
||||
public StepResult _STEP_RUN(eSMStep step, TimeSpan stepTime, TimeSpan seqTime)
|
||||
{
|
||||
if (PUB.popup.needClose)
|
||||
{
|
||||
System.Threading.Thread.Sleep(10); //팝업이 닫힐때까지 기다린다.
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//사용자 스텝처리가 아닌경우에만 동작 중지를 검사 한다
|
||||
//중단조건 검사는 0번 축에만 동작하게 한다
|
||||
//if (PUB.flag.get(eVarBool.UserStepCheck) == false)
|
||||
//{
|
||||
// return false;
|
||||
//}
|
||||
|
||||
if (CheckSystemRunCondition() == false)
|
||||
{
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
//동작상태가 아니라면 처리하지 않는다.
|
||||
if (PUB.sm.Step == eSMStep.RUN && PUB.sm.getNewStep == eSMStep.RUN)
|
||||
{
|
||||
var RStepisFirst = runStepisFirst[0];
|
||||
|
||||
//릴포트 제어
|
||||
_SM_RUN_MOT_PORT(0, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT0));
|
||||
_SM_RUN_MOT_PORT(1, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT1));
|
||||
_SM_RUN_MOT_PORT(2, false, PUB.sm.seq.GetTime(eSMStep.RUN_COM_PT2));
|
||||
|
||||
//컨베어 상시동작 - 230503
|
||||
Boolean cvl = PUB.iLockCVL.IsEmpty();
|
||||
Boolean cvr = PUB.iLockCVR.IsEmpty();
|
||||
DIO.SetOutput(eDOName.LEFT_CONV, cvl);
|
||||
DIO.SetOutput(eDOName.RIGHT_CONV, cvr);
|
||||
|
||||
//왼쪽작업
|
||||
if (PUB.flag.get(eVarBool.FG_ENABLE_LEFT))
|
||||
{
|
||||
_RUN_ROOT_SEQUENCE(eWorkPort.Left, eSMStep.RUN_ROOT_SEQUENCE_L);
|
||||
}
|
||||
|
||||
//오른쪽작업
|
||||
if (PUB.flag.get(eVarBool.FG_ENABLE_RIGHT))
|
||||
{
|
||||
_RUN_ROOT_SEQUENCE(eWorkPort.Right, eSMStep.RUN_ROOT_SEQUENCE_R);
|
||||
}
|
||||
|
||||
//작업완료조건확인
|
||||
var PLReady = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PRReady = MOT.GetRMPos(eRMLoc.READY);
|
||||
|
||||
//최종이벤트시간에서 10초이상 기다려준다 230504
|
||||
var tsEventTime = VAR.TIME.RUN((int)eVarTime.JOBEVENT);
|
||||
|
||||
//컨베이어모드
|
||||
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
|
||||
|
||||
if (tsEventTime.TotalSeconds > 10 &&
|
||||
stepTime.TotalSeconds > 5.0 &&
|
||||
DIO.isSaftyDoorF(false) == true &&
|
||||
PUB.flag.get(eVarBool.FG_PK_ITEMON) == false &&
|
||||
PUB.flag.get(eVarBool.FG_PL_ITEMON) == false &&
|
||||
PUB.flag.get(eVarBool.FG_PR_ITEMON) == false &&
|
||||
|
||||
//신규로 추가된 컨베이어 센서이다
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.L_CONV1) == false) &&
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.L_CONV3) == false) &&
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.L_CONV4) == false) &&
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.R_CONV1) == false) &&
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.R_CONV3) == false) &&
|
||||
(CVMode == false || DIO.GetIOInput(eDIName.R_CONV4) == false) &&
|
||||
|
||||
//작업진행중 확인
|
||||
PUB.flag.get(eVarBool.FG_BUSY_LEFT) == false &&
|
||||
PUB.flag.get(eVarBool.FG_BUSY_RIGHT) == false &&
|
||||
|
||||
//비전처리중 확인
|
||||
//PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false &&
|
||||
//PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false &&
|
||||
|
||||
//모든 모터는 멈춰있어야 한다
|
||||
PUB.mot.HasMoving == false && //피커는 중앙에 있어야 한다
|
||||
|
||||
//좌,우측 프린터 Y축이 정위치에 있어야 한다
|
||||
MOT.getPositionMatch(PLReady) &&
|
||||
MOT.getPositionMatch(PRReady) &&
|
||||
|
||||
isPortDetUp(1) == false &&
|
||||
isPortLimUP(1) &&
|
||||
|
||||
//드라이런 중에는 완료하지 않는다
|
||||
PUB.Result.DryRun == false)
|
||||
{
|
||||
|
||||
if (PUB.flag.get(eVarBool.FG_JOB_END) == false)
|
||||
{
|
||||
PUB.log.AddAT("작업완료조건실행");
|
||||
VAR.TIME.Update(eVarTime.JOB_END);
|
||||
PUB.flag.set(eVarBool.FG_JOB_END, true, "SM_RUN");
|
||||
}
|
||||
else
|
||||
{
|
||||
//10초가 지나면 최조 완료로 한다
|
||||
var ts = VAR.TIME.RUN((int)eVarTime.JOB_END);
|
||||
if (ts.TotalSeconds >= AR.SETTING.Data.Timeout_JOBEnd)
|
||||
{
|
||||
PUB.Result.JobEndTime = DateTime.Now;
|
||||
PUB.log.AddI($"작업완료 상태로 전환합니다(대기시간:{AR.SETTING.Data.Timeout_JOBEnd}초)");
|
||||
PUB.sm.SetNewStep(eSMStep.FINISH);
|
||||
PUB.flag.set(eVarBool.FG_JOB_END, false, "SM_RUN:FINISH");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//이조건일때에는 job_End 가 없어야한다
|
||||
if (PUB.flag.get(eVarBool.FG_JOB_END) == true)
|
||||
{
|
||||
PUB.log.AddI("작업완료조건 해제");
|
||||
PUB.flag.set(eVarBool.FG_JOB_END, false, "run");
|
||||
|
||||
//메인메세지를 제거 해준다.
|
||||
PUB.StatusMessage.set(Class.eStatusMesage.Main, string.Empty);
|
||||
}
|
||||
}
|
||||
}
|
||||
return StepResult.Wait;
|
||||
}
|
||||
|
||||
public Boolean CheckSystemRunCondition()
|
||||
{
|
||||
if (PUB.mot.IsInit == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AZJINIT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (PUB.dio.IsInit == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.AZJINIT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (PUB.mot.HasHomeSetOff == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.HARDWARE, eECode.MOT_HSET, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (PUB.Result.vModel == null || PUB.Result.vModel.Title.isEmpty())
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELV, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
if (PUB.Result.mModel == null || PUB.Result.mModel.Title.isEmpty())
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SETUP, eECode.NOMODELM, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DIO.isSaftyDoorF() == false || DIO.isSaftyDoorR() == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.DOORSAFTY, eNextStep.PAUSE);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
492
Handler/Project/RunCode/_01_Input_Events.cs
Normal file
492
Handler/Project/RunCode/_01_Input_Events.cs
Normal file
@@ -0,0 +1,492 @@
|
||||
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("안전센서 검출로 인해 PORT_READY(L)를 해제 합니다");
|
||||
}
|
||||
|
||||
//도어가 열리면 포트를 멈춘다 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("도어열림으로 인해 프린터L Z축을 올립니다");
|
||||
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("도어열림으로 인해 프린터R Z축을 올립니다");
|
||||
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("도어닫힘으로 인해 프린터L Z축을 내립니다");
|
||||
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("도어닫힘으로 인해 프린터R Z축을 내립니다");
|
||||
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("에어 컴");
|
||||
}
|
||||
else
|
||||
{
|
||||
DIO.SetAIR(!curState);
|
||||
PUB.log.AddAT("에어 끔");
|
||||
}
|
||||
}
|
||||
//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.CART_MAG0) == true)
|
||||
{
|
||||
DIO.SetPortMagnet(0, false);
|
||||
PUB.log.Add("좌측 포트의 마그넷 OFF");
|
||||
}
|
||||
}
|
||||
else if (pin == eDIName.PORTC_LIM_DN)
|
||||
{
|
||||
//좌측포트의 하단부리밋센서가 검출될경우 마그넷이 on 되어있다면 off한다.
|
||||
if (DIO.GetIOInput(eDIName.PORTC_LIM_DN) == true && DIO.GetIOOutput(eDOName.CART_MAG1) == true)
|
||||
{
|
||||
DIO.SetPortMagnet(1, false);
|
||||
PUB.log.Add("중앙 포트의 마그넷 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.CART_MAG2) == true)
|
||||
{
|
||||
DIO.SetPortMagnet(2, false);
|
||||
PUB.log.Add("우측 포트의 마그넷 OFF");
|
||||
}
|
||||
}
|
||||
else if (pin == eDIName.L_CONV3)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
if (value)
|
||||
{
|
||||
if(VAR.I32[eVarInt32.LEFT_ITEM_COUNT] > 0)
|
||||
{
|
||||
VAR.I32[eVarInt32.LEFT_ITEM_COUNT] -= 1;//= false; //해제
|
||||
PUB.log.AddAT($"left 버퍼 수량 감소");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else if (pin == eDIName.R_CONV3)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
if (value)
|
||||
{
|
||||
if (VAR.I32[eVarInt32.RIGT_ITEM_COUNT] > 0)
|
||||
{
|
||||
VAR.I32[eVarInt32.RIGT_ITEM_COUNT] -= 1;//= false; //해제
|
||||
PUB.log.AddAT($"right 버퍼 수량 감소");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
98
Handler/Project/RunCode/_02_Output_Events.cs
Normal file
98
Handler/Project/RunCode/_02_Output_Events.cs
Normal file
@@ -0,0 +1,98 @@
|
||||
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_OUTPUT_VALUE_CHANGED(eDOName pin, Boolean value)
|
||||
{
|
||||
if (pin == eDOName.PORTL_MOT_RUN)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
hmi1.arVar_Port[0].MotorRun = value;
|
||||
}
|
||||
else if (pin == eDOName.PORTC_MOT_RUN)
|
||||
{
|
||||
//VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
hmi1.arVar_Port[1].MotorRun = value;
|
||||
}
|
||||
else if (pin == eDOName.PORTR_MOT_RUN)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
hmi1.arVar_Port[2].MotorRun = value;
|
||||
}
|
||||
|
||||
else if (pin == eDOName.PORTL_MOT_DIR)
|
||||
{
|
||||
|
||||
hmi1.arVar_Port[0].MotorDir = !value;
|
||||
}
|
||||
else if (pin == eDOName.PORTC_MOT_DIR)
|
||||
hmi1.arVar_Port[1].MotorDir = !value;
|
||||
else if (pin == eDOName.PORTR_MOT_DIR)
|
||||
{
|
||||
|
||||
hmi1.arVar_Port[2].MotorDir = !value;
|
||||
}
|
||||
|
||||
//피커 백큠 동작 상태(front)
|
||||
//else if (pin == eDOName.PICK_VAC1) loader1.arVar_Picker[0].VacOutput[0] = value;
|
||||
//else if (pin == eDOName.PICK_VAC2) loader1.arVar_Picker[0].VacOutput[1] = value;
|
||||
//else if (pin == eDOName.PICK_VAC3) loader1.arVar_Picker[0].VacOutput[2] = value;
|
||||
//else if (pin == eDOName.PICK_VAC4) loader1.arVar_Picker[0].VacOutput[3] = value;
|
||||
|
||||
//출력상태에 따라서 버튼의 LED를 켠다
|
||||
else if (pin == eDOName.SOL_AIR)
|
||||
{
|
||||
DIO.SetOutput(eDOName.BUT_AIRF, value);
|
||||
|
||||
if (value == false)
|
||||
PUB.flag.set(eVarBool.FG_PK_ITEMON, false, "DO");
|
||||
hmi1.arDIAir = value; //AIR상태를 표시
|
||||
}
|
||||
else if (pin == eDOName.LEFT_CONV)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
if (value)
|
||||
{
|
||||
VAR.TIME[eVarTime.CONVL_START] = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.TIME[eVarTime.CONVL_START] = new DateTime(1982, 11, 23);
|
||||
VAR.DBL[eVarDBL.CONVL_RUNTIME] = 0;
|
||||
}
|
||||
|
||||
PUB.log.Add($"LEFT_CONV : {value}");
|
||||
}
|
||||
else if (pin == eDOName.RIGHT_CONV)
|
||||
{
|
||||
VAR.TIME[(int)eVarTime.JOBEVENT] = DateTime.Now;
|
||||
PUB.log.Add($"RIGHT_CONV : {value}");
|
||||
if (value)
|
||||
{
|
||||
VAR.TIME[eVarTime.CONVR_START] = DateTime.Now;
|
||||
}
|
||||
else
|
||||
{
|
||||
VAR.TIME[eVarTime.CONVR_START] = new DateTime(1982, 11, 23);
|
||||
VAR.DBL[eVarDBL.CONVR_RUNTIME] = 0;
|
||||
}
|
||||
|
||||
}
|
||||
else if (pin == eDOName.BUZZER)
|
||||
{
|
||||
if (value)
|
||||
PUB.BuzzerTime = DateTime.Now;
|
||||
else
|
||||
PUB.BuzzerTime = new DateTime(1982, 11, 23);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
153
Handler/Project/RunCode/_03_Interlock_Events.cs
Normal file
153
Handler/Project/RunCode/_03_Interlock_Events.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using arDev;
|
||||
using AR;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
void Set_InterLock()
|
||||
{
|
||||
if (PUB.sm.Step < eSMStep.IDLE) return;
|
||||
intlockcnt += 1;
|
||||
|
||||
var CurrentSaftyDoor = DIO.isSaftyDoorF();//도어안전
|
||||
var CurrentSaftyArea = true; //안전영역
|
||||
var bEmg = DIO.IsEmergencyOn(); //비상정지
|
||||
var bHSet = PUB.mot.IsInit && PUB.mot.HasHomeSetOff; //홈 설정이 완료되었는지 확인한다
|
||||
|
||||
PUB.flag.set(eVarBool.FG_DOORSAFTY, CurrentSaftyDoor, "COMMINTERLOCK");
|
||||
PUB.flag.set(eVarBool.FG_AREASAFTY, CurrentSaftyArea, "COMMINTERLOCK");
|
||||
|
||||
for (int i = 0; i < PUB.iLock.Length; i++)
|
||||
{
|
||||
PUB.iLock[i].set((int)eILock.EMG, bEmg, "COMMINTERLOCK");
|
||||
PUB.iLock[i].set((int)eILock.DOOR, !CurrentSaftyDoor, "COMMINTERLOCK");
|
||||
if (i < 7)
|
||||
{
|
||||
PUB.iLock[i].set((int)eILock.HOMESET, bHSet, "COMMINTERLOCK");
|
||||
}
|
||||
}
|
||||
|
||||
//피커의 Z축이 움직이는 동안에는 Y축을 움직이지 못하게 한다
|
||||
PUB.iLock[(int)eAxis.PX_PICK].set((int)eILock.ZMOVE, PUB.mot.IsMotion((int)eAxis.PZ_PICK), "COMMINTERLOCK");
|
||||
PUB.iLock[(int)eAxis.PL_MOVE].set((int)eILock.ZMOVE, PUB.mot.IsMotion((int)eAxis.PL_UPDN), "COMMINTERLOCK");
|
||||
PUB.iLock[(int)eAxis.PR_MOVE].set((int)eILock.ZMOVE, PUB.mot.IsMotion((int)eAxis.PR_UPDN), "COMMINTERLOCK");
|
||||
|
||||
//피커의 Y축이 움직이는 동안에는 Z축을 움직이지 못하게 한다
|
||||
PUB.iLock[(int)eAxis.PZ_PICK].set((int)eILock.XMOVE, PUB.mot.IsMotion((int)eAxis.PX_PICK), "COMMINTERLOCK");
|
||||
|
||||
//외부컨베어 신호 인터락설정 (출구쪽센서가 인식되지 않았다면 멈추지 않는다)
|
||||
var cvLBusy = (DIO.GetIOInput(eDIName.L_CONV4) && DIO.GetIOInput(eDIName.L_EXT_READY) == false);
|
||||
var cvRBusy = (DIO.GetIOInput(eDIName.R_CONV4) && DIO.GetIOInput(eDIName.R_EXT_READY) == false);
|
||||
PUB.iLockCVL.set((int)eILockCV.EXTBUSY, cvLBusy, "COMMINTERLOCK");
|
||||
PUB.iLockCVR.set((int)eILockCV.EXTBUSY, cvRBusy, "COMMINTERLOCK");
|
||||
|
||||
//축을 사용하지 않는경우
|
||||
PUB.iLockCVL.set((int)eILockCV.DISABLE, SETTING.Data.Disable_Left, "COMMINTERLOCK");
|
||||
PUB.iLockCVR.set((int)eILockCV.DISABLE, SETTING.Data.Disable_Right, "COMMINTERLOCK");
|
||||
|
||||
//카트모드에서
|
||||
PUB.iLockCVL.set((int)eILockCV.CARTMODE, !VAR.BOOL[eVarBool.Use_Conveyor], "COMMINTERLOCK");
|
||||
PUB.iLockCVR.set((int)eILockCV.CARTMODE, !VAR.BOOL[eVarBool.Use_Conveyor], "COMMINTERLOCK");
|
||||
|
||||
|
||||
//포트가동상태에따라서 비젼인터락
|
||||
PUB.iLockVS0.set((int)eILockVS0.PORTRDY, !PUB.flag.get(eVarBool.FG_RDY_PORT_PL), "COMMINTERLOCK");
|
||||
if (PUB.Result.DryRun == true)
|
||||
PUB.iLockVS1.set((int)eILockVS1.PORTRDY, false, "COMMINTERLOCK");
|
||||
else
|
||||
PUB.iLockVS1.set((int)eILockVS1.PORTRDY, !PUB.flag.get(eVarBool.FG_RDY_PORT_PC), "COMMINTERLOCK");
|
||||
PUB.iLockVS2.set((int)eILockVS2.PORTRDY, !PUB.flag.get(eVarBool.FG_RDY_PORT_PR), "COMMINTERLOCK");
|
||||
|
||||
//위치관련 인터락은 MODEL이 설정 되어있어야하며, MOTION도 정상이어야 한다
|
||||
if (PUB.mot.IsInit && PUB.Result.mModel.isSet)
|
||||
{
|
||||
//if (PUB.LockModel.WaitOne(1) == true)
|
||||
{
|
||||
//PUB.LockModel.Reset();
|
||||
|
||||
//피커의 X축에 따라서 비젼의 촬영가능여부가 결정된다
|
||||
PUB.iLockVS0.set((int)eILockVS0.PKXPOS, DIO.GetIOInput(eDIName.PICKER_SAFE) == false && MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON)) < -2, "COMMINTERLOCK");
|
||||
if (MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.READYL)) <= 2 || MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.READYR)) >= -2)
|
||||
PUB.iLockVS1.set((int)eILockVS1.PKXPOS, false, "COMMINTERLOCK");
|
||||
else
|
||||
PUB.iLockVS1.set((int)eILockVS1.PKXPOS, true, "COMMINTERLOCK");
|
||||
PUB.iLockVS2.set((int)eILockVS2.PKXPOS, DIO.GetIOInput(eDIName.PICKER_SAFE) == false && MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON)) > 2, "COMMINTERLOCK");
|
||||
|
||||
//프린터Y축 위치에 따른 비젼촬영여부(기준위치보다 낮게 있다면 촬영이 안된다)
|
||||
var PLMCmdPos = MOT.GetLMPos(eLMLoc.READY);
|
||||
var PRMCmdPos = MOT.GetRMPos(eRMLoc.READY);
|
||||
PUB.iLockVS0.set((int)eILockVS0.PRNYPOS, (MOT.getPositionOffset(PLMCmdPos) < -5), "COMMINTERLOCK");
|
||||
PUB.iLockVS2.set((int)eILockVS2.PRNYPOS, (MOT.getPositionOffset(PRMCmdPos) < -5), "COMMINTERLOCK");
|
||||
|
||||
//피커의Z축이 안전위치가 아니면 Y축을 움직이지 않는다
|
||||
var PKZ_POS_ERR = MOT.getPositionOffset(MOT.GetPZPos(ePZLoc.READY)) > 2;
|
||||
PUB.iLock[(int)eAxis.PX_PICK].set((int)eILock.Z_POS, PKZ_POS_ERR, "COMMINTERLOCK");
|
||||
|
||||
PKZ_POS_ERR = (DIO.GetIOInput(eDIName.PICKER_SAFE) == false && MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON)) <= 2);
|
||||
PUB.iLock[(int)eAxis.PL_MOVE].set((int)eILock.X_POS, PKZ_POS_ERR, "COMMINTERLOCK"); ;
|
||||
|
||||
PKZ_POS_ERR = (DIO.GetIOInput(eDIName.PICKER_SAFE) == false && MOT.getPositionOffset(MOT.GetPXPos(ePXLoc.PICKON)) >= 2);
|
||||
PUB.iLock[(int)eAxis.PR_MOVE].set((int)eILock.X_POS, PKZ_POS_ERR, "COMMINTERLOCK");
|
||||
|
||||
//프린터Z축 안전위치가 아니면 Y축을 멈춘다
|
||||
var PLZ_POS_ERR = MOT.getPositionOffset(MOT.GetLZPos(eLZLoc.READY)) > 2.0;
|
||||
var PRZ_POS_ERR = MOT.getPositionOffset(MOT.GetRZPos(eRZLoc.READY)) > 2.0;
|
||||
PUB.iLock[(int)eAxis.PL_MOVE].set((int)eILock.PZ_POS, PLZ_POS_ERR, "COMMINTERLOCK");
|
||||
PUB.iLock[(int)eAxis.PR_MOVE].set((int)eILock.PZ_POS, PRZ_POS_ERR, "COMMINTERLOCK");
|
||||
|
||||
//실린더가 전진해 잇다면 이동하지 않아야 한다 - 210207
|
||||
var PLZ_CYL_FW = !DIO.GetIOInput(eDIName.L_PICK_BW);
|
||||
var PRZ_CYL_FW = !DIO.GetIOInput(eDIName.R_PICK_BW);
|
||||
PUB.iLock[(int)eAxis.PL_MOVE].set((int)eILock.CYL_FORWARD, PLZ_CYL_FW, "COMMINTERLOCK");
|
||||
PUB.iLock[(int)eAxis.PR_MOVE].set((int)eILock.CYL_FORWARD, PRZ_CYL_FW, "COMMINTERLOCK");
|
||||
|
||||
//프린터Y축 안전위치가 아니면 Z축을 멈춘다
|
||||
var PLM_YPOS_READY = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.READY)); //MOT.GetPLM_PosName();
|
||||
var PRM_YPOS_READY = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.READY)); //MOT.GetPRM_PosName();
|
||||
|
||||
var PLM_YPOS_H07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH07));
|
||||
var PLM_YPOS_M07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM07));
|
||||
var PLM_YPOS_L07 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL07));
|
||||
var PLM_YPOS_H13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTH13));
|
||||
var PLM_YPOS_M13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTM13));
|
||||
var PLM_YPOS_L13 = MOT.getPositionMatch(MOT.GetLMPos(eLMLoc.PRINTL13));
|
||||
|
||||
var PRM_YPOS_H07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH07));
|
||||
var PRM_YPOS_M07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM07));
|
||||
var PRM_YPOS_L07 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL07));
|
||||
var PRM_YPOS_H13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTH13));
|
||||
var PRM_YPOS_M13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTM13));
|
||||
var PRM_YPOS_L13 = MOT.getPositionMatch(MOT.GetRMPos(eRMLoc.PRINTL13));
|
||||
|
||||
|
||||
var 좌측대기옵셋 = MOT.getPositionOffset(MOT.GetLMPos(eLMLoc.READY));
|
||||
var 우측대기옵셋 = MOT.getPositionOffset(MOT.GetRMPos(eRMLoc.READY));
|
||||
var 좌측대기인정 = (좌측대기옵셋 >= (AR.SETTING.Data.MoveYForPaperVaccumeValue - 0.5) && 좌측대기옵셋 <= 0.5);
|
||||
var 우측대기인정 = (우측대기옵셋 >= (AR.SETTING.Data.MoveYForPaperVaccumeValue - 0.5) && 좌측대기옵셋 <= 0.5);
|
||||
|
||||
var PLM_POS_ERR = !(좌측대기인정 || PLM_YPOS_READY || PLM_YPOS_H07 || PLM_YPOS_M07 || PLM_YPOS_L07 || PLM_YPOS_H13 || PLM_YPOS_M13 || PLM_YPOS_L13);
|
||||
var PRM_POS_ERR = !(우측대기인정 || PRM_YPOS_READY || PRM_YPOS_H07 || PRM_YPOS_M07 || PRM_YPOS_L07 || PRM_YPOS_H13 || PRM_YPOS_M13 || PRM_YPOS_L13);
|
||||
|
||||
PUB.iLock[(int)eAxis.PL_UPDN].set((int)eILock.PY_POS, PLM_POS_ERR, "COMMINTERLOCK");
|
||||
PUB.iLock[(int)eAxis.PR_UPDN].set((int)eILock.PY_POS, PRM_POS_ERR, "COMMINTERLOCK");
|
||||
|
||||
//PUB.LockModel.Set();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//모션사용불능은 그냥 해제한다
|
||||
//Pub.LockPRL.set((int)eILockPRL.PYPOS, false, "COMMINTERLOCK");
|
||||
//Pub.LockPRL.set((int)eILockPRR.PYPOS, false, "COMMINTERLOCK");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
106
Handler/Project/RunCode/_04_Flag_Events.cs
Normal file
106
Handler/Project/RunCode/_04_Flag_Events.cs
Normal file
@@ -0,0 +1,106 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using AR;
|
||||
using arDev;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
void Lock_ValueChanged(object sender, AR.InterfaceValueEventArgs e)
|
||||
{
|
||||
|
||||
//인터락플래그 변경 이벤트
|
||||
var iL = sender as AR.CInterLock;
|
||||
var tagstr = (iL.Tag == null ? string.Empty : iL.Tag.ToString());
|
||||
var fgstr = $"[{e.ArrIDX}]";
|
||||
|
||||
if (tagstr == "PKX") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PKZ") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PKT") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PLM") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PLZ") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PRM") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PRZ") fgstr = ((eILock)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PRL") fgstr = ((eILockPRL)e.ArrIDX).ToString();
|
||||
else if (tagstr == "PRR") fgstr = ((eILockPRR)e.ArrIDX).ToString();
|
||||
else if (tagstr == "VS0") fgstr = ((eILockVS0)e.ArrIDX).ToString();
|
||||
else if (tagstr == "VS1") fgstr = ((eILockVS1)e.ArrIDX).ToString();
|
||||
else if (tagstr == "VS2") fgstr = ((eILockVS2)e.ArrIDX).ToString();
|
||||
|
||||
else if (tagstr == "CVL") fgstr = ((eILockCV)e.ArrIDX).ToString();
|
||||
else if (tagstr == "CVR") fgstr = ((eILockCV)e.ArrIDX).ToString();
|
||||
|
||||
//else fgstr = "?";
|
||||
|
||||
//최초생성시에는 값을 표시한다
|
||||
if (PUB.sm.Step >= eSMStep.IDLE && PUB.sm.Step != eSMStep.HOME_FULL)
|
||||
{
|
||||
if (e.NewOn)
|
||||
{
|
||||
if (tagstr == "PKX" && PUB.mot.IsMotion(0) == true)
|
||||
{
|
||||
Console.WriteLine("ㅠㅠ");
|
||||
}
|
||||
if (AR.SETTING.Data.Log_ILock)
|
||||
PUB.log.Add(string.Format("[IL-ON:{2}] {0}:{1}", fgstr, e.Reason, tagstr));
|
||||
if (AR.SETTING.Data.Enable_Log_ILock)
|
||||
PUB.logILock.Add("ON", $"{fgstr}:{e.Reason}");
|
||||
}
|
||||
else if (e.NewOff)
|
||||
{
|
||||
if (AR.SETTING.Data.Log_ILock)
|
||||
PUB.log.Add(string.Format("[IL-OF:{2}] {0}:{1}", fgstr, e.Reason, tagstr));
|
||||
if (AR.SETTING.Data.Enable_Log_ILock)
|
||||
PUB.logILock.Add("OF", $"{fgstr}:{e.Reason}");
|
||||
}
|
||||
|
||||
var logmsg = "#### ILOCK(" + tagstr + ")변경 : " + fgstr + "(" + e.ArrIDX.ToString() + ") 값:" + e.NewValue.ToString() + ",사유:" + e.Reason;
|
||||
|
||||
//ILOck 로그에 기록
|
||||
if (AR.SETTING.Data.Enable_Log_ILock) PUB.logILock.Add(logmsg);
|
||||
|
||||
//메인로그에 기록
|
||||
if (AR.SETTING.Data.Log_ILock) PUB.log.Add(logmsg);
|
||||
}
|
||||
|
||||
}
|
||||
private void Flag_ValueChanged(object sender, VarData<bool>.ValueEventArgs e)
|
||||
{
|
||||
var fg = (eVarBool)e.Idx;
|
||||
|
||||
if (fg == eVarBool.FG_PK_ITEMON)
|
||||
{
|
||||
// Pub.log.AddAT(string.Format("[FLAG:{0}] : {1}", fg, e.NewValue));
|
||||
hmi1.arVar_Picker[0].ItemOn = e.Value;
|
||||
}
|
||||
|
||||
else if (fg == eVarBool.FG_RDY_PZ_LPICKOF) hmi1.arFG_RDY_YP_FPICKOF = e.Value;
|
||||
else if (fg == eVarBool.FG_RDY_PZ_RPICKOF) hmi1.arFG_RDY_YP_RPICKOF = e.Value;
|
||||
else if (fg == eVarBool.FG_CMD_YP_LPICKON) hmi1.arFG_CMD_YP_FPICKON = e.Value;
|
||||
else if (fg == eVarBool.FG_CMD_YP_RPICKON) hmi1.arFG_CMD_YP_RPICKON = e.Value;
|
||||
|
||||
else if (fg == eVarBool.FG_MINSPACE) hmi1.arFlag_Minspace = e.Value;
|
||||
|
||||
|
||||
hmi1.arVar_Port[0].Ready = PUB.flag.get(eVarBool.FG_RDY_PORT_PL);
|
||||
hmi1.arVar_Port[1].Ready = PUB.flag.get(eVarBool.FG_RDY_PORT_PC);
|
||||
hmi1.arVar_Port[2].Ready = PUB.flag.get(eVarBool.FG_RDY_PORT_PR);
|
||||
|
||||
if (PUB.sm.Step >= eSMStep.IDLE && PUB.sm.Step != eSMStep.HOME_FULL)
|
||||
{
|
||||
var logmsg = string.Format("[{0}] {1} : {2} => {3}", e.Idx, fg, e.Value, e.Message);
|
||||
//ILOck 로그에 기록
|
||||
if (AR.SETTING.Data.Enable_Log_Flag) PUB.logFlag.Add(logmsg);
|
||||
|
||||
//메인로그에 기록
|
||||
if (AR.SETTING.Data.Log_flag) PUB.log.Add(logmsg);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
152
Handler/Project/RunCode/_97_Utility.cs
Normal file
152
Handler/Project/RunCode/_97_Utility.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using AR;
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
Dialog.fFinishJob fsum = null;
|
||||
void HideSummary()
|
||||
{
|
||||
if (this.InvokeRequired)
|
||||
{
|
||||
this.BeginInvoke(new MethodInvoker(HideSummary), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (fsum != null)
|
||||
{
|
||||
if (fsum.IsDisposed == false && fsum.Disposing == false)
|
||||
{
|
||||
fsum.Close();
|
||||
fsum.Dispose();
|
||||
}
|
||||
fsum = null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
void ShowSummary()
|
||||
{
|
||||
if (fsum == null || fsum.IsDisposed || fsum.Disposing == true)
|
||||
{
|
||||
fsum = new Dialog.fFinishJob();
|
||||
fsum.FormClosed += (s1, e1) =>
|
||||
{
|
||||
//해당 폼이 닫힐때 처리한다.
|
||||
if (PUB.sm.Step == eSMStep.FINISH)
|
||||
{
|
||||
//완료상때일때 닫으면
|
||||
Run_MotionPositionReset();
|
||||
}
|
||||
};
|
||||
fsum.Show();
|
||||
}
|
||||
else
|
||||
{
|
||||
fsum.Show();
|
||||
fsum.Activate();
|
||||
}
|
||||
}
|
||||
|
||||
void UserStepWait(eWorkPort target)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_USERSTEP))
|
||||
{
|
||||
if (target == eWorkPort.Left)
|
||||
{
|
||||
if (LockUserL.WaitOne(1))
|
||||
LockUserL.Reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LockUserR.WaitOne(1))
|
||||
LockUserR.Reset();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// user step 상황에서 자동으로 멈추게 합니다.
|
||||
/// </summary>
|
||||
void UserStepRun(eWorkPort target)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_USERSTEP))
|
||||
{
|
||||
if (target == eWorkPort.Right)
|
||||
{
|
||||
if (LockUserL.WaitOne(1) == false)
|
||||
LockUserL.Set();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LockUserR.WaitOne(1) == false)
|
||||
LockUserR.Set();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 홈작업이 진행 가능한지 하드웨어 상태를 확인한다.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
bool CheckHomeProcess_HW_Available(Boolean needHomeSet)
|
||||
{
|
||||
//모션이 초기화되지 않았다면 오류로 한다
|
||||
if (PUB.mot.IsInit == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.AZJINIT, eNextStep.NOTHING);
|
||||
return false;
|
||||
}
|
||||
|
||||
//모든 홈이 되어야 가능하다
|
||||
if (needHomeSet)
|
||||
{
|
||||
if (PUB.mot.IsInit && PUB.mot.HasHomeSetOff == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//안전센서가 작동했다면 중지한다.
|
||||
if (DIO.isSaftyDoorF(true) == false || DIO.isSaftyDoorR() == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SAFTY, eECode.DOORSAFTY, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//모션모델이 반드시 설정되어있어야 한다
|
||||
if (PUB.Result.isSetmModel == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.NOMODELM, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
//AIR확인
|
||||
if (DIO.GetIOOutput(eDOName.SOL_AIR) == false)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SENSOR, eECode.AIRNOOUT, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 비상정지 확인
|
||||
if (DIO.IsEmergencyOn() == true)
|
||||
{
|
||||
PUB.Result.SetResultMessage(eResult.SAFTY, eECode.EMERGENCY, eNextStep.ERROR);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
13
Handler/Project/RunCode/_99_System_Shutdown.cs
Normal file
13
Handler/Project/RunCode/_99_System_Shutdown.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
46
Handler/Project/RunCode/_Close.cs
Normal file
46
Handler/Project/RunCode/_Close.cs
Normal file
@@ -0,0 +1,46 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
/// <summary>
|
||||
/// 프로그램을 닫을때 1회 실행되는 함수
|
||||
/// </summary>
|
||||
private void _Close_Start()
|
||||
{
|
||||
//연결체크용 쓰레드 종료
|
||||
bRunConnection = false;
|
||||
this.thConnection.Abort();
|
||||
|
||||
|
||||
//Light off 220714
|
||||
DIO.SetRoomLight(false, true);
|
||||
|
||||
//Pub.dio.SetOutput((int)eDOName.ABRUN, false); //stop mgz loader a/c motor
|
||||
PUB.log.Add("Program Close");
|
||||
PUB.LogFlush();
|
||||
|
||||
//키엔트추가 210114
|
||||
|
||||
if(PUB.keyenceF != null)
|
||||
{
|
||||
PUB.keyenceF.ExecCommand("QUIT");
|
||||
PUB.keyenceF.Dispose();
|
||||
}
|
||||
if(PUB.keyenceR != null)
|
||||
{
|
||||
PUB.keyenceR.ExecCommand("QUIT");
|
||||
PUB.keyenceR.Dispose();
|
||||
}
|
||||
|
||||
PUB.dio.StopMonitor();
|
||||
PUB.mot.StopMonitor();
|
||||
PUB.sm.Stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Handler/Project/RunCode/_Motion.cs
Normal file
83
Handler/Project/RunCode/_Motion.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
public Boolean[] DisableMotion;
|
||||
private void Mot_PositionChanged(object sender, arDev.MOT.PositionChangeEventArgs e)
|
||||
{
|
||||
eAxis mot = (eAxis)e.Axis;
|
||||
if (mot == eAxis.PX_PICK)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//모터 위치가 변경되면 로더 컨트롤에 입력한다
|
||||
hmi1.arMotorPosition[e.Axis] = e.Actual;
|
||||
}
|
||||
|
||||
void mot_StatusChanged(object sender, arDev.MOT.StatusChangeEventArags e)
|
||||
{
|
||||
if (e.Axis >= PUB.system.MotaxisCount) return;
|
||||
if (e.Status == arDev.MOT.MOTION_STATUS.SERVOALARM) hmi1.arMOT_Alm[e.Axis] = e.Value;
|
||||
else if (e.Status == arDev.MOT.MOTION_STATUS.LIMITN) hmi1.arMOT_LimDn[e.Axis] = e.Value;
|
||||
else if (e.Status == arDev.MOT.MOTION_STATUS.LIMITP) hmi1.arMOT_LimUp[e.Axis] = e.Value;
|
||||
else if (e.Status == arDev.MOT.MOTION_STATUS.ORIGIN) hmi1.arMOT_Origin[e.Axis] = e.Value;
|
||||
else if (e.Status == arDev.MOT.MOTION_STATUS.SERVROON) hmi1.arMOT_SVOn[e.Axis] = e.Value;
|
||||
}
|
||||
|
||||
private void Mot_EndStatusChanged(object sender, arDev.MOT.EndStatusChangeEventArgs e)
|
||||
{
|
||||
if (AR.SETTING.Data.Enable_Log_MotStopReason == false) return; //210112
|
||||
|
||||
var bitstatus = Convert.ToString(e.Value, 2).PadLeft(16, '0');
|
||||
List<FS_END_STATUS> lst = new List<FS_END_STATUS>();
|
||||
for (byte i = 0; i < 15; i++)
|
||||
{
|
||||
var offset = (ushort)(Math.Pow(2, i));
|
||||
if ((e.Value & offset) > 0) lst.Add((FS_END_STATUS)offset);
|
||||
}
|
||||
|
||||
var reason = string.Join(",", lst);
|
||||
PUB.log.Add("MOT", $"모터정지사유({e.Axis}):{reason}:bit={bitstatus}");
|
||||
}
|
||||
|
||||
|
||||
void mot_HomeStatusChanged(object sender, arDev.MOT.HomeStatusChangeEventArgs e)
|
||||
{
|
||||
if (PUB.sm.Step == eSMStep.HOME_FULL)
|
||||
{
|
||||
hmi1.arHomeProgress[e.Axis] = e.Progress;
|
||||
if (e.NewStatus == arDev.MOT.HOME_RESULT.HOME_ERR_NOT_DETECT)
|
||||
{
|
||||
//홈 검색시 오류가 발생했다 사용자에게 알림을 해야 함
|
||||
PUB.Result.SetResultMessage(eResult.MOTION, eECode.MOT_HSET, eNextStep.ERROR, e.Axis);
|
||||
}
|
||||
else if (e.NewStatus == arDev.MOT.HOME_RESULT.HOME_SUCCESS)
|
||||
{
|
||||
PUB.log.AddI(string.Format("홈 검색이 완료되었습니다 축:{0}", e.Axis));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void mot_Message(object sender, arDev.MOT.MessageEventArgs e)
|
||||
{
|
||||
if (e.IsError)
|
||||
{
|
||||
if (e.Message.IndexOf("동일위치") != -1 || e.Message.IndexOf("inposition") != -1)
|
||||
{ // Pub.log.AddAT("MOT:" + e.Message);
|
||||
}
|
||||
else PUB.log.AddE("MOT:" + e.Message);
|
||||
}
|
||||
|
||||
else PUB.log.Add("MOT:" + e.Message);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
202
Handler/Project/RunCode/_SM_RUN.cs
Normal file
202
Handler/Project/RunCode/_SM_RUN.cs
Normal file
@@ -0,0 +1,202 @@
|
||||
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("안전문제", true);
|
||||
|
||||
if (DIO.isSaftyDoorF(0, false) == false) DIO.SetPortMotor(0, eMotDir.CW, false, "안전오류");
|
||||
if (DIO.isSaftyDoorF(1, false) == false) DIO.SetPortMotor(1, eMotDir.CW, false, "안전오류");
|
||||
if (DIO.isSaftyDoorF(2, false) == false) DIO.SetPortMotor(2, eMotDir.CW, false, "안전오류");
|
||||
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("포트번호는(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("포트번호는(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("포트번호는(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
|
||||
}
|
||||
382
Handler/Project/RunCode/_Vision.cs
Normal file
382
Handler/Project/RunCode/_Vision.cs
Normal file
@@ -0,0 +1,382 @@
|
||||
using Emgu.CV;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using WatsonWebsocket;
|
||||
using AR;
|
||||
|
||||
namespace Project
|
||||
{
|
||||
public partial class FMain
|
||||
{
|
||||
//DateTime lastRecvWSL = new DateTime(1982, 11, 23);
|
||||
//DateTime lastRecvWSR = new DateTime(1982, 11, 23);
|
||||
string lastBarcodeRawL = string.Empty;
|
||||
string lastBarcodeRawR = string.Empty;
|
||||
|
||||
|
||||
void AttachCameraEventL()
|
||||
{
|
||||
//크레비스오픈 - 210203
|
||||
//PUB.log.Add("카메라 이벤트 생성");
|
||||
PUB.wsL.MessageReceived += Ws_DataArrivalL;
|
||||
PUB.wsL.ServerConnected += Ws_ConnectedL;
|
||||
PUB.wsL.ServerDisconnected += Ws_DisconnectedL;
|
||||
}
|
||||
void DetachCameraEventL()
|
||||
{
|
||||
//크레비스오픈 - 210203
|
||||
//PUB.log.Add("카메라 이벤트 해제");
|
||||
PUB.wsL.MessageReceived -= Ws_DataArrivalL;
|
||||
PUB.wsL.ServerConnected -= Ws_ConnectedL;
|
||||
PUB.wsL.ServerDisconnected -= Ws_DisconnectedL;
|
||||
|
||||
}
|
||||
void AttachCameraEventR()
|
||||
{
|
||||
//크레비스오픈 - 210203
|
||||
//if (COMM.SETTING.Data.Log_CameraConn) PUB.log.Add("카메라 이벤트 생성");
|
||||
PUB.wsR.MessageReceived += Ws_DataArrivalR;
|
||||
PUB.wsR.ServerConnected += Ws_ConnectedR;
|
||||
PUB.wsR.ServerDisconnected += Ws_DisconnectedR;
|
||||
}
|
||||
void DetachCameraEventR()
|
||||
{
|
||||
//크레비스오픈 - 210203
|
||||
//if (COMM.SETTING.Data.Log_CameraConn) PUB.log.Add("카메라 이벤트 해제");
|
||||
PUB.wsR.MessageReceived -= Ws_DataArrivalR;
|
||||
PUB.wsR.ServerConnected -= Ws_ConnectedR;
|
||||
PUB.wsR.ServerDisconnected -= Ws_DisconnectedR;
|
||||
}
|
||||
private void Ws_DisconnectedL(object sender, EventArgs e)
|
||||
{
|
||||
var ws = sender as WatsonWebsocket.WatsonWsClient;
|
||||
PUB.log.AddAT("카메라L 접속 종료");
|
||||
//_isCrevisOpen[0] = false;
|
||||
PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, false, "DISC");
|
||||
}
|
||||
|
||||
private void Ws_ConnectedL(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.AddAT("카메라L 접속 성공");
|
||||
//_isCrevisOpen[0] = true;
|
||||
}
|
||||
private void Ws_DisconnectedR(object sender, EventArgs e)
|
||||
{
|
||||
var ws = sender as WatsonWebsocket.WatsonWsClient;
|
||||
PUB.log.AddAT("카메라R 접속 종료");
|
||||
//_isCrevisOpen[2] = false;
|
||||
PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, false, "DISC");
|
||||
}
|
||||
|
||||
private void Ws_ConnectedR(object sender, EventArgs e)
|
||||
{
|
||||
PUB.log.AddAT("카메라R 접속 성공");
|
||||
//_isCrevisOpen[2] = true;
|
||||
}
|
||||
|
||||
private void Ws_DataArrivalL(object sender, MessageReceivedEventArgs e)
|
||||
{
|
||||
Ws_DataArrival(0, sender as WatsonWsClient, e);
|
||||
}
|
||||
private void Ws_DataArrivalR(object sender, MessageReceivedEventArgs e)
|
||||
{
|
||||
Ws_DataArrival(1, sender as WatsonWsClient, e);
|
||||
}
|
||||
|
||||
private void Ws_DataArrival(int idx, WatsonWsClient ws, MessageReceivedEventArgs e)
|
||||
{
|
||||
//throw new NotImplementedException();
|
||||
var data = Encoding.UTF8.GetString(e.Data);// Pub.ws.Get<String>();
|
||||
if (idx == 0) VAR.TIME[eVarTime.lastRecvWSL] = DateTime.Now;
|
||||
else VAR.TIME[eVarTime.lastRecvWSR] = DateTime.Now;
|
||||
|
||||
|
||||
|
||||
if (data.Contains("\"command\":\"status"))
|
||||
{
|
||||
//PUB.logVision.Add($"[{idx}]상태메세지수신");
|
||||
//PUB.logVision.Flush();
|
||||
try
|
||||
{
|
||||
var jsondata = JObject.Parse(data);
|
||||
var msgdata = new
|
||||
{
|
||||
command = jsondata.Value<String>("command"),
|
||||
camera = jsondata.Value<String>("camera"),
|
||||
live = jsondata.Value<String>("live"),
|
||||
stream = jsondata.Value<String>("stream"),
|
||||
listen = jsondata.Value<String>("listen"),
|
||||
trig = jsondata.Value<String>("trig"),
|
||||
license = jsondata.Value<String>("license"),
|
||||
reel = jsondata.Value<String>("reel"),
|
||||
conv = jsondata.Value<String>("conv"),
|
||||
};
|
||||
|
||||
if (idx == 0)
|
||||
{
|
||||
PUB.flag.set(eVarBool.VS_DETECT_REEL_L, (msgdata.reel == "1"), "WS");
|
||||
PUB.flag.set(eVarBool.VS_DETECT_CONV_L, (msgdata.conv == "1"), "WS");
|
||||
}
|
||||
else
|
||||
{
|
||||
PUB.flag.set(eVarBool.VS_DETECT_REEL_R, (msgdata.reel == "1"), "WS");
|
||||
PUB.flag.set(eVarBool.VS_DETECT_CONV_R, (msgdata.conv == "1"), "WS");
|
||||
}
|
||||
|
||||
|
||||
if (msgdata.license == "1" && msgdata.camera == "1")
|
||||
{
|
||||
if (idx == 0)
|
||||
{
|
||||
if(PUB.flag.get(eVarBool.FG_RDY_CAMERA_L)==false)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, true, "WEBSOCKET");
|
||||
PUB.log.Add("왼쪽카메라 준비 완료");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_RDY_CAMERA_R) == false)
|
||||
{
|
||||
PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, true, "WEBSOCKET");
|
||||
PUB.log.Add("오른쪽카메라 준비 완료");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (idx == 0) PUB.flag.set(eVarBool.FG_RDY_CAMERA_L, false, "WEBSOCKET");
|
||||
else PUB.flag.set(eVarBool.FG_RDY_CAMERA_R, false, "WEBSOCKET");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE("상태메시지 분석실패: " + ex.Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//처리가능한 상황에서만 큐에 데이터를 넣는다
|
||||
if (idx == 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONL) == false)
|
||||
{
|
||||
PUB.log.AddAT("(좌)측 비젼 검증상태가 아니므로 바코드 데이터 삭제\n" + data);
|
||||
return;
|
||||
}
|
||||
if (idx != 0 && PUB.flag.get(eVarBool.FG_PRC_VISIONR) == false)
|
||||
{
|
||||
PUB.log.AddAT("(우)측 비젼 검증상태가 아니므로 바코드 데이터 삭제\n" + data);
|
||||
return;
|
||||
}
|
||||
|
||||
PUB.log.Add($"QR검증({(idx == 0 ? "L" : "R")})수신: " + data);
|
||||
var guid = idx == 0 ? PUB.Result.ItemDataL.guid : PUB.Result.ItemDataR.guid;
|
||||
|
||||
//BarcodeParsing(idx, guid, data, "WS");
|
||||
var qrDataList = ProcessRecvBarcodeData(idx, data);
|
||||
if (qrDataList.Count > 0) //바코드데이터가 존재 했다
|
||||
{
|
||||
//처리가 완료되지 않은경우엠ㄴ 사용한다.
|
||||
if (idx == 0)
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_END_VISIONL) == false)
|
||||
{
|
||||
var Complete = RecvQRProcess(qrDataList, eWorkPort.Left);
|
||||
if (Complete) PUB.flag.set(eVarBool.FG_END_VISIONL, true, "DATA_ARRIVAL");
|
||||
}
|
||||
else PUB.log.AddAT("비젼(L) 이전작업이 완료되어 처리하지 않음");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (PUB.flag.get(eVarBool.FG_END_VISIONR) == false)
|
||||
{
|
||||
var Complete = RecvQRProcess(qrDataList, eWorkPort.Right);
|
||||
if (Complete) PUB.flag.set(eVarBool.FG_END_VISIONR, true, "DATA_ARRIVAL");
|
||||
}
|
||||
else PUB.log.AddAT("비젼(R) 이전작업이 완료되어 처리하지 않음");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//바코드 원본의 데이터큐
|
||||
//ConcurrentQueue<string> BarcodeQueL = new ConcurrentQueue<string>();
|
||||
//ConcurrentQueue<string> BarcodeQueR = new ConcurrentQueue<string>();
|
||||
|
||||
//bool BarcodeParsing(int idx, string guid, string jsonstr, string source, Boolean force = false)
|
||||
//{
|
||||
|
||||
// //값이있다면 바코드 큐에 집어 넣는다.
|
||||
// if (idx == 0)
|
||||
// {
|
||||
// lastBarcodeRawL = jsonstr;
|
||||
// lock (BarcodeQueL)
|
||||
// BarcodeQueL.Enqueue(jsonstr);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// lastBarcodeRawR = jsonstr;
|
||||
// lock (BarcodeQueR)
|
||||
// BarcodeQueR.Enqueue(jsonstr);
|
||||
// }
|
||||
|
||||
// return true;
|
||||
//}
|
||||
|
||||
//DateTime WSLLastRecv = DateTime.Now;
|
||||
//DateTime WSRLastRecv = DateTime.Now;
|
||||
bool WS_Send(eWorkPort idx, WatsonWebsocket.WatsonWsClient ws, string guid, string cmd,string data)
|
||||
{
|
||||
if (ws == null) return false;
|
||||
|
||||
//데이터 생성
|
||||
var msg = new
|
||||
{
|
||||
guid = guid,
|
||||
command = cmd,
|
||||
data = data
|
||||
};
|
||||
|
||||
var json = Newtonsoft.Json.JsonConvert.SerializeObject(msg);
|
||||
Boolean sendok = false;
|
||||
try
|
||||
{
|
||||
//PUB.log.Add($"전송({idx}),ID:{guid},명령:{cmd}");
|
||||
ws.SendAsync(json);
|
||||
sendok = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE($"전송{idx}실패{ex.Message}");
|
||||
sendok = false;
|
||||
}
|
||||
|
||||
if (sendok == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (idx == 0) CameraConTimeL = DateTime.Now;
|
||||
else CameraConTimeR = DateTime.Now;
|
||||
|
||||
if(ws != null)
|
||||
{
|
||||
PUB.log.AddAT($"전송{idx} 실패로 소켓을 닫습니다");
|
||||
ws.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.log.AddE($"소켓{idx} 종료 실패:{ex.Message}");
|
||||
}
|
||||
}
|
||||
return sendok;
|
||||
}
|
||||
|
||||
//System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch();
|
||||
//System.Diagnostics.Stopwatch wat0 = new System.Diagnostics.Stopwatch();
|
||||
//System.Diagnostics.Stopwatch wat1 = new System.Diagnostics.Stopwatch();
|
||||
//System.Diagnostics.Stopwatch wat2 = new System.Diagnostics.Stopwatch();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 바코드큐에있는 데이터를 분석하고 시작한다.
|
||||
/// </summary>
|
||||
/// <param name="Idx"></param>
|
||||
/// <param name="Process"></param>
|
||||
/// <returns></returns>
|
||||
List<string> ProcessRecvBarcodeData(int vIdx, string JsonStr)
|
||||
{
|
||||
//PUB.logVision.Add($"[{vIdx}]ProcessBarcodeQue");
|
||||
//PUB.logVision.Flush();
|
||||
List<string> retval = new List<string>();
|
||||
|
||||
if (JsonStr.isEmpty())
|
||||
{
|
||||
PUB.log.AddE("바코드 수신값(JSON) 이 없어 진행할 수 없습니다");
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (vIdx == 0)
|
||||
lastBarcodeRawL = JsonStr;
|
||||
else
|
||||
lastBarcodeRawR = JsonStr;
|
||||
|
||||
try
|
||||
{
|
||||
//모델에서 고정값을 입력한게 있다면 그것을 사용한다
|
||||
var itemC = PUB.Result.ItemDataC;
|
||||
if (itemC.VisionData.VNAME.isEmpty() && PUB.Result.vModel.Def_Vname.isEmpty() == false)
|
||||
{
|
||||
itemC.VisionData.VNAME = PUB.Result.vModel.Def_Vname;
|
||||
itemC.VisionData.VNAME_Trust = true;
|
||||
PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}");
|
||||
}
|
||||
if (itemC.VisionData.MFGDATE.isEmpty() && PUB.Result.vModel.Def_MFG.isEmpty() == false)
|
||||
{
|
||||
itemC.VisionData.MFGDATE = PUB.Result.vModel.Def_MFG;
|
||||
itemC.VisionData.MFGDATE_Trust = true;
|
||||
PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}");
|
||||
}
|
||||
|
||||
var jsondata = JObject.Parse(JsonStr);
|
||||
var msgdata = new
|
||||
{
|
||||
guid = jsondata.Value<String>("guid"),
|
||||
command = jsondata.Value<String>("command"),
|
||||
data = jsondata.Value<String>("data[]"),
|
||||
time = jsondata.Value<String>("time"),
|
||||
file = jsondata.Value<String>("file")
|
||||
};
|
||||
|
||||
var datas = jsondata.GetValue("data");
|
||||
if (datas.Type == JTokenType.String)
|
||||
{
|
||||
var bcdstr = datas.ToString();
|
||||
|
||||
//새로운 바코드라면 추가한다
|
||||
if (retval.Contains(bcdstr) == false)
|
||||
retval.Add(bcdstr);
|
||||
}
|
||||
else
|
||||
{
|
||||
//데이터가 배열로 들어있는 경우이다
|
||||
foreach (var data in datas)
|
||||
{
|
||||
var dataarr = new
|
||||
{
|
||||
barcode = data.ToString()
|
||||
};
|
||||
if (dataarr.barcode.isEmpty()) continue;
|
||||
if (retval.Contains(dataarr.barcode) == false)
|
||||
retval.Add(dataarr.barcode);
|
||||
}
|
||||
}
|
||||
|
||||
//입력된 바코드 데이터를 확인한다.
|
||||
//각 데이터는 아래처럼 변수에 추가를 해줘야ㅏ한ㄷ.ㅏ
|
||||
//ImageProcessResult[vIdx].Add(item.data);
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PUB.logVision.Add($"카메라(${vIdx}) ProcessBarcodeQue 실패{ex.Message}"); PUB.logVision.Flush();
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user