프로젝트 구조 개선 및 README.md 추가

- UIControl 프로젝트 구조 변경 (CapCleaningControl → Sub/UIControl)
- arAjinextek 라이브러리 통합 및 구조 개선
- 새로운 arAjinextek_Union 프로젝트 추가
- 솔루션 파일에 README.md 추가
- QR 모드에서 WMS RCV 태그 인식 기능 강화
- 데이터베이스 스키마 업데이트 및 관련 클래스 수정
- 프린터 및 바코드 장치 연동 로직 개선

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
ChiKyun Kim
2025-08-07 08:35:56 +09:00
parent c17296101a
commit 9a7d1d27c7
140 changed files with 4203 additions and 6791 deletions

View File

@@ -88,7 +88,7 @@ namespace Project
if (PUB.sm.seq.Get(cmdIndex) == idx++)
{
bool vQtyOK = false;
var vdata = itemC.VisionData;
//동작중이아니라면 처리하지 않음
if (PUB.sm.getNewStep != eSMStep.RUN) return EResultKeyence.Wait;
@@ -98,17 +98,17 @@ namespace Project
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;
vdata.VisionData.SetRID("BP" + DateTime.Now.ToString("yyyyMMddHHmmss"), "bp");
vdata.VisionData.SID = ("100000000");
vdata.VisionData.VNAME = "BYPASS";
vdata.VisionData.MFGDATE = DateTime.Now.ToString("yyyy-MM-dd");
vdata.VisionData.VLOT = "BYPASS";
vdata.VisionData.CUSTCODE = "0000";
vdata.VisionData.CUSTNAME = "BYPASS";
vdata.VisionData.QTY = "10000";
vdata.VisionData.ConfirmUser = true;
vdata.VisionData.PrintPositionData = "1";
vdata.VisionData.PrintPositionCheck = true;
return EResultKeyence.Complete;
}
@@ -184,6 +184,160 @@ namespace Project
}
}
//기본 벤더이름
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}");
}
}
//옵션설정에 따른 외부데이터 가져오기 작업
bool NewBarcodeUpdated = false;
//SID정보테이블에서 정보 추출
if (VAR.BOOL[eVarBool.Opt_ApplySIDInfo] && vdata.BarcodeDirty == 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 K4EE_Component_Reel_SID_Information WITH(NOLOCK)" +
" where mc='" + mcname + "' and " + string.Join(" and ", wheres) +
" order by wdate desc";
var SQLC = "select count(*)" +
" from K4EE_Component_Reel_SID_Information WITH(NOLOCK)" +
" where mc='" + mcname + "' and " + string.Join(" and ", wheres);
if (PUB.Result.ItemDataC.VisionData.LastQueryStringSID.Equals(SQL) == false)
{
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;
if (PUB.UpdateSIDInfoData(ref vdata, colName, vStr)) NewBarcodeUpdated = true;
}
}
}
DAR.Close();
}
CMD.Dispose();
if (CN.State == System.Data.ConnectionState.Open) CN.Close();
CN.Dispose();
PUB.Result.ItemDataC.VisionData.LastQueryStringSID = SQL;
}
}
}
//WMS정보테이블에서 정보 추출
//SID변환정보에서 정보 추출
//기존 작업내역에서 정보 추출
if (itemC.VisionData.BarcodeDirty == true && NewBarcodeUpdated == false)
{
itemC.VisionData.BarcodeDirty = false;
}
//릴Id 신규부여
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_NewReelID])
{
@@ -223,28 +377,8 @@ namespace Project
}
}
//기본 벤더이름
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)
{
//이미 완료된 데이터
@@ -313,7 +447,7 @@ namespace Project
//var Jobtype = VAR.STR[eVarString.JOB_TYPE];
var OPT_BYPASS = SETTING.Data.SystemBypass;// Jobtype == "BP";
var CVMode = VAR.BOOL[eVarBool.Use_Conveyor];
var CustomerCode = VAR.STR[eVarString.JOB_CUSTOMER_CODE];
if (item.VisionData.Confirm)
{
//사용자에의해 완성된 자료는 완료된 자료이다
@@ -325,15 +459,22 @@ namespace Project
//이전작업내역에서 데이터를 쓸것이 있다면 기록한다
//Customer Code
if (OPT_BYPASS == false && item.VisionData.CUSTCODE.isEmpty() && CustomerCode.isEmpty() == false)
{
item.VisionData.CUSTCODE = CustomerCode;
PUB.log.Add($"[FIX] CUSTOMER CODE => {CustomerCode}");
}
//서버의수량업데이트기능
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_ServerQty])
{
//수량원본이 없는 경우
if (item.VisionData.QTY0.isEmpty())
{
string msg= "서버 수량 업데이트 기능은 WMS에 적용되지 않음, 필요한 경우 개발자 컨택";
string msg = "서버 수량 업데이트 기능은 WMS에 적용되지 않음, 필요한 경우 개발자 컨택";
var cnt = 0;// (int)(Amkor.RestfulService.get_stock_count(item.VisionData.RID, out msg));
if(mainjob)
if (mainjob)
{
PUB.log.AddE("서버 수량 업데이트 기능은 WMS에 적용되지 않음, 필요한 경우 개발자 컨택");
}
@@ -387,8 +528,8 @@ namespace Project
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}");
var exist = ta.CheckSIDExist(SID) > 0;
PUB.log.Add($"SID Exist Check SID:{item.VisionData.SID},Result={exist}");
if (exist == false)
{
PUB.Result.SetResultMessage(eResult.OPERATION, eECode.NOSIDINFOFROMDB, eNextStep.PAUSE, SID);
@@ -398,21 +539,39 @@ namespace Project
//sid변환기능확인
var SIDOK = false;
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert])
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_SIDConvert] && VAR.BOOL[eVarBool.JOB_Empty_SIDConvertInfo] == false)
{
//변환된 정보가 없다면 변환을 진행한다
//변환된 정보가 없다면 변환을 진행한다
if (item.VisionData.SID0.isEmpty() && item.VisionData.SID_Trust && item.VisionData.SID.isEmpty() == false)
{
//현재SID가 정상 시드라면 변환을 시작한다
//_SM_RUN_VISION_SIDCONV(item);
//이 sid가 존재여부확인 후 없는 sid라면 더이상 처리하지 않는다 230510
if (PUB.Result.DTSidConvertEmptyList.Contains(item.VisionData.SID))
{
//존재하지 않는 SID로 이미 확인되었다
}
else if (PUB.Result.DTSidConvertMultiList.Contains(item.VisionData.SID))
{
//다중sid로 인해 처리하지 않는다
}
else
{
var newsid = PUB.SIDCovert(item.VisionData.SID, "SPS_BarcodeProcess", out bool converr);
if (converr)
{
if (PUB.sm.Step == eSMStep.RUN)
PUB.log.AddE(newsid);
}
else
{
item.VisionData.SID0 = item.VisionData.SID; //기존자료를 0으로 백업한다
item.VisionData.SID = newsid; //신규 SID를 기록
}
}
}
//시드값이 유효한지 확인한다.
SIDOK = item.VisionData.SID_Trust && item.VisionData.SID0.isEmpty() == false && item.VisionData.SID.isEmpty() == false;
}
else SIDOK = item.VisionData.SID_Trust; //시드변환을 사용하지 않으므로 시드값여부에따라 다르다
else SIDOK = (item.VisionData.SID_Trust && item.VisionData.SID.isEmpty() == false); //시드변환을 사용하지 않으므로 시드값여부에따라 다르다
//사용자확인이 필요한 옵션이라면 사용한다
if (OPT_BYPASS == false && VAR.BOOL[eVarBool.Opt_UserConfim])
@@ -420,7 +579,6 @@ namespace Project
if (NeedConfirm == false)
{
if (mainjob) item.VisionData.bcdMessage.Add("사용자 확인 필요");
//if (mainjob) PUB.log.Add($"사용자 확인 옵션으로 인해 창을 표시 합니다{Source}");
NeedConfirm = true;
}
}
@@ -435,7 +593,6 @@ namespace Project
if (VAR.BOOL[eVarBool.Opt_DisablePrinter] == false)
{
if (mainjob) item.VisionData.bcdMessage.Add("첫번째 릴 확인 필요");
//if (mainjob) PUB.log.Add($"처음 작업이므로 사용자 확인창을 표시 합니다{Source}");
NeedConfirm = true;
}
}
@@ -475,17 +632,12 @@ namespace Project
item.VisionData.PrintPositionCheck = true;
PUB.log.AddI($"현 작업정보에서 프린트위치 찾음 SID:{item.VisionData.SID},값={preprnpos}");
}
else
else if (NeedConfirm == false)
{
if (NeedConfirm == false)
{
//현작업내에서의 정보를 찾아서 적용한다 231005
//if (mainjob) PUB.log.AddAT("프린트 위치 결정이 완료되지 않아. 사용자 선택화면을 팝업합니다");
if (mainjob) item.VisionData.bcdMessage.Add("부착위치 없음");
NeedConfirm = true;
}
//현작업내에서의 정보를 찾아서 적용한다 231005
if (mainjob) item.VisionData.bcdMessage.Add("부착위치 없음");
NeedConfirm = true;
}
}
}
@@ -504,6 +656,7 @@ namespace Project
item.VisionData.PARTNO_Trust &&
item.VisionData.QTY_Trust &&
item.VisionData.RID_Trust &&
item.VisionData.SID_Trust &&
SIDOK && item.VisionData.VLOT_Trust &&
item.VisionData.VNAME_Trust)
{
@@ -546,103 +699,10 @@ namespace Project
VAR.TIME.Set(eVarTime.KEYENCEWAIT, newtime);
}
}
else
else if (PUB.Result.ItemDataC.VisionData.ConfirmAuto == false)
{
////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;
}
//}
PUB.logDbg.Add($"비젼 자동 확정 처리 {Source}");
PUB.Result.ItemDataC.VisionData.ConfirmAuto = true;
}
}