Initial commit
This commit is contained in:
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;
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user