Files
ATV_STDLabelAttach/Handler/Project/RunCode/RunSequence/3_KEYENCE_READ.cs
2025-08-06 10:05:24 +09:00

671 lines
32 KiB
C#

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 && itemC.VisionData.SID.isEmpty() == false)
{
var newid = PUB.MakeNewREELID(itemC.VisionData.SID);// Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD(itemC.VisionData.CUSTCODE, "4", "A", out string errmsg);
if (newid.success == true)
{
//backup origin reel id
itemC.VisionData.RID0 = itemC.VisionData.RID;
//set new reel id
itemC.VisionData.SetRID(newid.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 생성실패 : {newid.message}");
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= "서버 수량 업데이트 기능은 WMS에 적용되지 않음, 필요한 경우 개발자 컨택";
var cnt = 0;// (int)(Amkor.RestfulService.get_stock_count(item.VisionData.RID, out msg));
if(mainjob)
{
PUB.log.AddE("서버 수량 업데이트 기능은 WMS에 적용되지 않음, 필요한 경우 개발자 컨택");
}
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 newid = PUB.MakeNewREELID(item.VisionData.SID);// Amkor.RestfulService.Allocation_Unique_ReelID_AmkorSTD("1234", "4", "A", out string err);
if (newid.success == false) item.VisionData.SetRID("RID" + DateTime.Now.ToString("yyyyMMddHHmmss.fff"), "DRY");
else item.VisionData.SetRID(newid.newid, "DRY");
}
if (item.VisionData.PrintPositionData.isEmpty()) item.VisionData.PrintPositionData = "2";
item.VisionData.PrintPositionCheck = true;
item.VisionData.ConfirmAuto = true;
}
}
}