using AR; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Project { public class CResult { public enum eInspectResult { NG = 0, OK, ERROR, NOTSET = 9, } public UInt64 OptionValue = 0; public UInt64 OptionValueData = 0; public List BCDPattern; public List BCDIgnorePattern; public DateTime ResetButtonDownTime = DateTime.Now; public Boolean ClearAllSID = false; public Class.CHistorySIDRef SIDReference; //SIDLIST받은 내역 public List OUTHistory; //출고포트 처리내역 public DataSet1.SIDHistoryDataTable SIDHistory; //sID별 rid 전체 목록 차수별로만 저장된다 public DataSet1.K4EE_Component_Reel_SID_ConvertDataTable DTSidConvert; public List DTSidConvertEmptyList; public List DTSidConvertMultiList; public DSList dsList; public ModelInfoM mModel; //모션 모델 public ModelInfoV vModel; //작업 모델 /// /// 아이템의 정보가 담겨있다 (0:왼쪽,1:비젼,2:오른쪽) /// public Class.JobData ItemDataL = new Class.JobData(0); public Class.JobData ItemDataC = new Class.JobData(1); public Class.JobData ItemDataR = new Class.JobData(2); public Guid guid = new Guid(); public string JobType2 = string.Empty; public Boolean JobFirst { get { return VAR.I32[(int)eVarInt32.PickOnCount] == 0; } } public Boolean DryRun { get { if (string.IsNullOrEmpty(JobType2)) return false; else return JobType2.ToUpper() == "DRY"; } } public int OverLoadCountF { get; set; } public int OverLoadCountR { get; set; } public UIControl.CItem UnloaderItem = null; public DateTime LastExtInputTime = DateTime.Parse("1982-11-23"); public DateTime LastOutTime = DateTime.Parse("1982-11-23"); public Single[] PortAlignWaitSec = new float[] { 0, 0, 0, 0 }; public long[] PortAlignTime = new long[] { 0, 0, 0, 0 }; public byte UnloaderSeq = 0; public DateTime UnloaderSeqTime; public DateTime UnloaderSendtime = DateTime.Parse("1982-11-23"); /// /// 로딩에 사용하는 포트번호 (자동 판단됨) /// public int LoadPortIndex = -1; /// /// 로딩시에 사용한 포트의 번호(이 값으로 수량기록 위치를 결정) /// public int LoadPickIndex = -1; /// /// 최종 할당된 언로딩 포트번호(1~8) /// public int UnloadPortNo = -1; public byte LiveViewseq = 0; public string AcceptBcd = string.Empty; public DateTime AcceptBcdTime = DateTime.Now; public string AcceptSid = string.Empty; //작업정보 public eInspectResult Result; //작업결과가 저장됨 public eResult ResultCode; public eECode ResultErrorCode; public string ResultMessage; public string LastSIDFrom = string.Empty;//101 = string.Empty; public string LastSIDTo = string.Empty; // 103 = string.Empty; //public string LastSID103_2 = string.Empty; public string LastVName = string.Empty; public int LastSIDCnt = 0; public Dictionary PrintPostionList = null; //작업정보(시간) public DateTime JobStartTime = DateTime.Parse("1982-11-23"); public DateTime JobEndTime = DateTime.Parse("1982-11-23"); public TimeSpan JobRunTime() { if (JobStartTime.Year == 1982) return new TimeSpan(0); if (JobEndTime.Year == 1982) return DateTime.Now - JobStartTime; else return JobEndTime - JobStartTime; } /// /// RUN -> Pause(Wait Start)모드 전환시 저장할 모터의 위치값 /// 조그모드등으로 좌표를 옴길때의 기준 좌표 /// 이 좌표값에서 현재 모션값에 변화가 있으면 프로그램에서는 오류로 처리하게 됨 /// public double[] PreventMotionPosition = new double[8]; #region "SetResultMessage" public void SetResultMessage(eResult code, eECode err, eNextStep systempause, params object[] args) { var rltMsg = PUB.GetResultCodeMessage(code); var codeMSg = $"[E{(int)err}] ";// + Util.GetResultCodeMessage(code); if (err == eECode.MESSAGE_ERROR) { codeMSg = $"[{rltMsg} ERROR MESSAGE]\n"; } else if (err == eECode.MESSAGE_INFO) { codeMSg = $"[{rltMsg} INFORMATION]\n"; } var erMsg = PUB.GetErrorMessage(err, args); var msg = codeMSg + erMsg; this.ResultCode = code; this.ResultErrorCode = err; this.ResultMessage = msg; if (systempause == eNextStep.PAUSENOMESAGE) this.ResultMessage = string.Empty; //210129 PUB.log.AddE(msg); if (systempause == eNextStep.PAUSE) PUB.sm.SetNewStep(eSMStep.PAUSE); else if (systempause == eNextStep.PAUSENOMESAGE) PUB.sm.SetNewStep(eSMStep.PAUSE); else if (systempause == eNextStep.ERROR) PUB.sm.SetNewStep(eSMStep.ERROR); } public void SetResultTimeOutMessage(eDOName pinName, Boolean checkState, eNextStep systemPause) { var pindef = DIO.Pin[pinName]; if (checkState) SetResultMessage(eResult.SENSOR, eECode.DOON, systemPause, pindef.terminalno, pindef.name); else SetResultMessage(eResult.SENSOR, eECode.DOOFF, systemPause, pindef.terminalno, pindef.name); } public void SetResultTimeOutMessage(eDIName pinName, Boolean checkState, eNextStep systemPause) { var pindef = DIO.Pin[pinName]; if (checkState) SetResultMessage(eResult.SENSOR, eECode.DION, systemPause, pindef.terminalno, pindef.name); else SetResultMessage(eResult.SENSOR, eECode.DIOFF, systemPause, pindef.terminalno, pindef.name); } public void SetResultTimeOutMessage(eAxis motAxis, eECode ecode, eNextStep systemPause, string source, double targetpos, string message) { SetResultMessage(eResult.TIMEOUT, ecode, systemPause, motAxis, source, targetpos, message); } public void SetResultTimeOutMessage(eECode ecode, eNextStep systemPause, params object[] args) { SetResultMessage(eResult.TIMEOUT, ecode, systemPause, args); } #endregion public DateTime[] diCheckTime = new DateTime[256]; public DateTime[] doCheckTime = new DateTime[256]; public Boolean isError { get; set; } public int retry = 0; public DateTime retryTime; public DateTime[] WaitForVar = new DateTime[255]; public int ABCount = 0; public bool AutoReelOut = false; public CResult() { mModel = new ModelInfoM(); vModel = new ModelInfoV(); SIDReference = new Class.CHistorySIDRef(); SIDHistory = new DataSet1.SIDHistoryDataTable(); BCDPattern = new List(); OUTHistory = new List(); this.Clear("Result ctor"); dsList = new DSList(); LoadListDB(); //230509 if(DTSidConvert != null) DTSidConvert.Dispose(); DTSidConvert = new DataSet1.K4EE_Component_Reel_SID_ConvertDataTable(); DTSidConvertEmptyList = new List(); DTSidConvertMultiList = new List(); } public void SaveListDB() { var finame = System.IO.Path.Combine(UTIL.CurrentPath, "Data", "SavaedList.xml"); var fi = new System.IO.FileInfo(finame); if (fi.Directory.Exists == false) fi.Directory.Create(); this.dsList.WriteXml(fi.FullName); PUB.log.Add("Pre-list DB saved " + fi.FullName); } public void LoadListDB() { var finame = System.IO.Path.Combine(UTIL.CurrentPath, "Data", "SavaedList.xml"); var fi = new System.IO.FileInfo(finame); if (fi.Directory.Exists == false) fi.Directory.Create(); if (fi.Exists) { this.dsList.ReadXml(fi.FullName); PUB.log.Add("Pre-list DB loaded " + fi.FullName); } } ///// ///// 입력한 sid 가 원본에 존재하지 않으면 -1을 존재하면 입력된 수량을 반환합니다 ///// ///// ///// //public int ExistSIDReferenceCheck(string sid) //{ // var dr = PUB.Result.SIDReference.Items.Where(t => t.sid.EndsWith(sid)).FirstOrDefault(); // if (dr == null) return -1; // else return dr.kpc; //} //public void ClearHistory() //{ // //this.JObHistory.Clear(); // this.SIDReference.Clear(); // PUB.log.AddI("Clear History"); //} public void ClearOutPort() { OUTHistory.Clear(); } public void Clear(string Reason) { this.guid = Guid.NewGuid(); //프린트위치를 별도로 저장하고 있는다(나중에 추가 활용한다) 231005 if (PrintPostionList == null) PrintPostionList = new Dictionary(); else PrintPostionList.Clear(); ItemDataL.Clear(Reason); ItemDataC.Clear(Reason); ItemDataR.Clear(Reason); OverLoadCountF = 0; OverLoadCountR = 0; ClearOutPort(); LoadPortIndex = -1; if (PUB.sm != null) PUB.sm.seq.ClearTime(); isError = false; ABCount = 0; ///기다림용 변수모듬 for (int i = 0; i < WaitForVar.Length; i++) WaitForVar[i] = DateTime.Parse("1982-11-23"); //조그모드시 모션이동 감지용 저장 변수 for (int i = 0; i < 6; i++) PreventMotionPosition[i] = 0.0; //JobStartTime = DateTime.Parse("1982-11-23"); //JobEndTime = DateTime.Parse("1982-11-23"); //LastOutTime = DateTime.Parse("1982-11-23"); Result = eInspectResult.NOTSET; ResultCode = eResult.NOERROR; ResultMessage = string.Empty; //시간정보값을 초기화함 for (int i = 0; i < 2; i++) ClearTime(i); PUB.log.Add("Result data initialized"); } public void ClearTime(int shutIdx) { //JobStartTime = DateTime.Parse("1982-11-23"); //JobEndTime = DateTime.Parse("1982-11-23"); Result = eInspectResult.NOTSET; ResultCode = eResult.NOERROR; ResultMessage = string.Empty; PUB.log.Add("Result(Clear Time)"); } public Boolean isSetmModel { get { if (PUB.Result.mModel == null || PUB.Result.mModel.idx == -1 || PUB.Result.mModel.Title.isEmpty()) return false; else return true; } } public Boolean isSetvModel { get { if (PUB.Result.vModel == null || PUB.Result.vModel.idx == -1 || PUB.Result.vModel.Title.isEmpty()) return false; else return true; } } //public string getErrorMessage(eResult rlt, eECode err, params object[] args) //{ // switch (err) // { // case eECode.RIDDUPL: // return string.Format( // "좌측 언로더에 사용되었던 REEL ID 입니다\n" + // "바코드 오류 가능성이 있습니다\n" + // "좌측 릴의 바코드를 확인하시기 바랍니다\n" + // "작업을 계속할 수 없습니다. 취소 후 다시 시도하세요\n{0}", args); // case eECode.RIDDUPR: // return string.Format( // "우측 언로더에 사용되었던 REEL ID 입니다\n" + // "바코드 오류 가능성이 있습니다\n" + // "우측 릴의 바코드를 확인하시기 바랍니다\n" + // "작업을 계속할 수 없습니다. 취소 후 다시 시도하세요\n{0}", args); // case eECode.BARCODEVALIDERR: // return string.Format("바코드 데이터 검증 실패\n" + // "인쇄전 데이터와 인쇄후 데이터가 일치하지 않습니다\n" + // "ID(O) : {1}\n" + // "ID(N) : {2}\n" + // "SID : {5}->{6}\n" + // "QTY : {3}->{4}\n" + // "DATE : {7}->{8}\n" + // "Index : {0}", args); // case eECode.MOTX_SAFETY: // return string.Format("PICKER-X 축이 안전위치에 없습니다\n1. 조그를 이용하여 중앙으로 이동 합니다\n2.홈 작업을 다시 실행합니다", args); // case eECode.NOERROR: // return string.Format("오류가 없습니다", args); // case eECode.PORTOVERLOAD: // return string.Format("PORT OVERLOAD\n위치 : {0}\n" + // "너무 많은 양이 적재 되었습니다\n" + "상단 LIMIT 센서에 걸리지 않게 적재하세요", args); // case eECode.EMERGENCY: // return string.Format("비상정지 버튼을 확인하세요\n" + // "버튼 : F{0}\n" + // "메인전원이 OFF 된 경우에도 이 메세지가 표시 됩니다\n" + // "메인전원은 모니터 하단 AIR버튼 좌측에 있습니다" // , DIO.GetIOInput(eDIName.BUT_EMGF)); // case eECode.NOMODELM: // return "모션모델이 선택되지 않았습니다\n" + // "상단 메뉴 [모션모델]에서 사용할 모델을 선택하세요"; // case eECode.NOMODELV: // return "작업모델이 선택되지 않았습니다\n" + // "상단 메뉴 [작업모델]에서 사용할 모델을 선택하세요"; // case eECode.CARTERROR: // return string.Format("언로더 카트가 없거나 크기 정보가 일치하지 않습니다\n좌측:{0}, 로더:{1}, 우측:{2}", args); // case eECode.CARTL: // return string.Format("왼쪽(UNLOAD) 포트에 카트가 감지되지 않습니다\n카트를 장착하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.CARTC: // return string.Format("중앙(LOAD) 포트에 카트가 감지되지 않습니다\n카트를 장착하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.CARTR: // return string.Format("오른쪽(UNLOAD) 포트에 카트가 감지되지 않습니다\n카트를 장착하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.CARTLMATCH: // return string.Format("왼쪽(UNLOAD) 카트와 피커의 릴 크기가 일치하지 않습니다\n카트크기를 확인 하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.CARTCMATCH: // return string.Format("중앙(LOAD) 카트와 피커의 릴 크기가 일치하지 않습니다\n카트크기를 확인 하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.CARTRMATCH: // return string.Format("오른쪽(UNLOAD) 카트와 피커의 릴 크기가 일치하지 않습니다\n카트크기를 확인 하세요\n카트크기 : {0}, 릴크기:{1}", args); // case eECode.NOREELSIZE: // return string.Format("왼쪽포트에 놓을 릴의 크기정보가 없습니다\n프로그램 오류입니다\n개발자에게 해당 메세지를 전달하세요\n" + // "장치 초기화를 진행 한 후 다시 시도하세요"); // case eECode.VISION_NOCONN: // return string.Format("카메라({0}) 연결 안됨", args); // case eECode.INCOMPLETE_LOADERDATA: // return string.Format("로더 바코드 필수값을 읽지 못했습니다", args); // case eECode.CAM_NOBARCODEU: // return string.Format("언로더({0}) 바코드를 읽지 못했습니다", args); // case eECode.HOME_TIMEOUT: // return string.Format("홈 진행이 완료되지 않고 있습니다\n" + // "오류가 발생했다면 '홈' 작업을 다시 진행하세요\n" + // "대기시간 : {0}초", args); // case eECode.DOORSAFTY: // return string.Format("포트 안전센서가 감지 되었습니다\n" + // "안전센서를 확인한 후 다시 시도하세요\n", args); // case eECode.AIRNOOUT: // return "AIR 공급이 차단 되어 있습니다.\n" + // "전면의 AIR 버튼을 누르세요\n" + // "공급이 되지 않으면 메인 전원 을 확인하세요\n" + // "메인 전원은 AIR 버튼 좌측에 있습니다" + // "메인 전원 공급 실패시 장비 후면의 차단기를 확인하세요"; // case eECode.DOOFF: // var pinoOf = (eDOName)args[0]; // return string.Format("출력이 OFF 되지 않았습니다.\n" + // "포트설명 : {0}\n" + // "포트번호 : {1} ({2})", DIO.getPinDescription(pinoOf), (int)pinoOf, Enum.GetName(typeof(eDOPin), pinoOf)); // case eECode.DOON: // var pinoOn = (eDOName)args[0]; // return string.Format("출력이 ON 되지 않았습니다.\n" + // "포트설명 : {0}\n" + // "포트번호 : {1} ({2})", DIO.getPinDescription(pinoOn), (int)pinoOn, Enum.GetName(typeof(eDOPin), pinoOn)); // case eECode.DIOFF: // var piniOf = (eDIName)args[0]; // return string.Format("입력이 OFF 되지 않았습니다.\n" + // "포트설명 : {0}\n" + // "포트번호 : {1} ({2})", DIO.getPinDescription(piniOf), (int)piniOf, Enum.GetName(typeof(eDIPin), piniOf)); // case eECode.DION: // var piniOn = (eDIName)args[0]; // return string.Format("입력이 ON 되지 않았습니다.\n" + // "포트설명 : {0}\n" + // "포트번호 : {1} ({2})", DIO.getPinDescription(piniOn), (int)piniOn, Enum.GetName(typeof(eDIPin), piniOn)); // case eECode.AZJINIT: // return string.Format("DIO 혹은 모션카드가 초기화 되지 않았습니다.\n" + // "DIO : {0}\n" + // "MOTION : {1}\n" + // "해당 카드는 본체 내부 PCI 슬롯에 장착 된 장비 입니다\n" + // "EzConfig AXT 프로그램으로 카드 상태를 확인하세요", // PUB.dio.IsInit, PUB.mot.IsInit); // case eECode.MOT_HSET: // var msg = "모션의 HOME 검색이 완료되지 않았습니다"; // for (int i = 0; i < 6; i++) // { // if (PUB.mot.IsUse(i) == false) continue; // var axis = (eAxis)i; // var stat = PUB.mot.IsHomeSet(i); // if (stat == false) msg += string.Format("\n[{0}] {1} : {2}", i, axis, stat); // } // msg += "\n장치 초기화를 실행하세요"; // return msg; // case eECode.MOT_SVOFF: // var msgsv = "모션 중 SERVO-OFF 된 축이 있습니다"; // for (int i = 0; i < 6; i++) // { // if (PUB.mot.IsUse(i) == false) continue; // var axis = (eAxis)i; // var stat = PUB.mot.IsServOn(i); // if (stat == false) msgsv += string.Format("\n[{0}] {1} : {2}", i, axis, stat); // } // msgsv += "\nRESET을 누른 후 '모션설정' 화면에서 확인합니다"; // return msgsv; // case eECode.MOT_HSEARCH: // return string.Format("모션의 홈 검색이 실패되었습니다\n" + // "축 : {0}\n" + // "메세지 : {1}", args); // case eECode.MOT_CMD: // var axisNo = (int)((eAxis)args[0]); // var axisSrc = args[1].ToString(); // return string.Format("모션축 명령이 실패 되었습니다\n축 : {0}\n" + // "현재위치 : {2}\n" + // "명령위치 : {3}\n" + // "소스 : {1}", axisNo, axisSrc, PUB.mot.GetActPos(axisNo), PUB.mot.GetActPos(axisNo)); // //case eECode.timeout_step: // // return string.Format("스텝당 최대 실행 시간이 초과 되었습니다.\n" + // // "스텝 : {0}\n" + // // "최대동작시간 : " + COMM.SETTING.Data.Timeout_StepMaxTime.ToString(), args); // case eECode.USER_STOP: // return "'일시정지' 버튼 눌림\n" + // "사용자에 의해 작동이 중지 되었습니다\n" + // "'RESET' -> 'START'로 작업을 계속할 수 있습니다"; // case eECode.CAM_RIGHT: // return "우측카메라가 사용가능한 상태가 아닙니다.\n" + // "신규 실행시에는 초기화 완료까지 기다려 주세요"; // case eECode.CAM_LEFT: // return "좌측카메라가 사용가능한 상태가 아닙니다.\n" + // "신규 실행시에는 초기화 완료까지 기다려 주세요"; // default: // return err.ToString(); // } //} //public string getResultCodeMessage(eResult rltCode) //{ // //별도 메세지처리없이 그대로 노출한다 // return rltCode.ToString().ToUpper(); //} } }