diff --git a/AuroraDevices/AuroraLaserScanner/Scanner.cs b/AuroraDevices/AuroraLaserScanner/Scanner.cs index 2c64c7d..c36ae29 100644 --- a/AuroraDevices/AuroraLaserScanner/Scanner.cs +++ b/AuroraDevices/AuroraLaserScanner/Scanner.cs @@ -37,9 +37,7 @@ namespace AuroraLaserScanner Config = config as ScannerConfig; if (IsSimul) { _scannerObj = new ScannerSimul(); - //return E1.OK; - } - else if (Config.Type == eRTCType.RTC5) { + } else if (Config.Type == eRTCType.RTC5) { _scannerObj = new ScannerRTC5(); } else if (Config.Type == eRTCType.RTC6) { _scannerObj = new ScannerRTC6(); diff --git a/Machines/ILSOS_ACW_H52A/RMS/EDC.cs b/Machines/ILSOS_ACW_H52A/RMS/EDC.cs index fa01259..71f8564 100644 --- a/Machines/ILSOS_ACW_H52A/RMS/EDC.cs +++ b/Machines/ILSOS_ACW_H52A/RMS/EDC.cs @@ -35,7 +35,7 @@ namespace ILSOS_ACW_H52A.RMS string strLaserCenterPower = Status.GetProcessingWeldingData().LaserPowerCore; string strMarkSpeed = Status.GetProcessingWeldingData().MarkSpeed; string strFocalLength = Status.GetProcessingWeldingData().FocalLength; - string strJigNo = Status.GetProcessingWeldingData().WeldingJigNo; + string strJigNo = Status.GetProcessingWeldingData().JigNo; string strLaserPowerByLBAD = Status.GetProcessingWeldingData().LaserPowerByLBAD; diff --git a/Machines/ILSOS_ACW_H52A/Sequences/SeqAutoRunACWH52A.cs b/Machines/ILSOS_ACW_H52A/Sequences/SeqAutoRunACWH52A.cs index 0001779..df711fb 100644 --- a/Machines/ILSOS_ACW_H52A/Sequences/SeqAutoRunACWH52A.cs +++ b/Machines/ILSOS_ACW_H52A/Sequences/SeqAutoRunACWH52A.cs @@ -871,7 +871,7 @@ namespace ILSOS_ACW_H52A.Sequences Status.GetProcessingWeldingData().LaserPowerCore = laserParam.LaserPower1.ToString(); Status.GetProcessingWeldingData().MarkSpeed = laserParam.MarkSpeed.ToString(); Status.GetProcessingWeldingData().FocalLength = (_PLC.ReadDWord((int)eWordInput.PLC_WELDING_FOCAL_LENGTH).data / 1000f).ToString(); - Status.GetProcessingWeldingData().WeldingJigNo = _WeldingJigNo.ToString(); + Status.GetProcessingWeldingData().JigNo = _WeldingJigNo.ToString(); } } @@ -1131,7 +1131,7 @@ namespace ILSOS_ACW_H52A.Sequences Status.GetProcessingWeldingData().RecipeNo = _RecipeNo; Status.GetProcessingWeldingData().LaserPowerByLBAD = _LaserPowerByLBAD.ToString(); - Status.GetProcessingWeldingData().WeldingJigNo = _CompletedJigNo.ToString(); + Status.GetProcessingWeldingData().JigNo = _CompletedJigNo.ToString(); } private SequenceActionResult SetReportCellResult_SeqParams(SequenceContext context, string id, SequenceActionResult param) diff --git a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs index 9493d82..9873965 100644 --- a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs +++ b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs @@ -121,7 +121,7 @@ namespace ILSOS_CCW_H52A.Data InnerCellInfo.LaserPowerRing = data.LaserPowerRing; InnerCellInfo.MarkSpeed = data.MarkSpeed; InnerCellInfo.FocalLength = data.FocalLength; - InnerCellInfo.WeldingJigNo = data.WeldingJigNo; + InnerCellInfo.JigNo = data.JigNo; InnerCellInfo.LaserPowerByLBAD = data.LaserPowerByLBAD; InnerCellInfo.CheckCanExist = data.CheckCanExist; InnerCellInfo.CheckScannerListEnd = data.CheckScannerListEnd; diff --git a/Machines/ILSOS_CCW_H52A/Device/Scanner/ScannerCCWH52A.cs b/Machines/ILSOS_CCW_H52A/Device/Scanner/ScannerCCWH52A.cs index acfeda4..2b2d71f 100644 --- a/Machines/ILSOS_CCW_H52A/Device/Scanner/ScannerCCWH52A.cs +++ b/Machines/ILSOS_CCW_H52A/Device/Scanner/ScannerCCWH52A.cs @@ -31,7 +31,7 @@ namespace ILSOS_CCW_H52A.Device if (ret == E1.OK && IsSimul) { if (_plc == null) { _plc = Application.Current.AuroraEnv().DeviceManager[CommonDeviceIds.PLCDevice] as PLCControllerCCWH52A; - return E2.ABORTED; + //return E2.ABORTED; } // 값의 동기화가 필요해서 추가 함 diff --git a/Machines/ILSOS_CCW_H52A/RMS/EDC.cs b/Machines/ILSOS_CCW_H52A/RMS/EDC.cs index 2557b1a..123e375 100644 --- a/Machines/ILSOS_CCW_H52A/RMS/EDC.cs +++ b/Machines/ILSOS_CCW_H52A/RMS/EDC.cs @@ -35,7 +35,7 @@ namespace ILSOS_CCW_H52A.RMS string strLaserCenterPower = Status.GetProcessingWeldingData().LaserPowerCore; string strMarkSpeed = Status.GetProcessingWeldingData().MarkSpeed; string strFocalLength = Status.GetProcessingWeldingData().FocalLength; - string strJigNo = Status.GetProcessingWeldingData().WeldingJigNo; + string strJigNo = Status.GetProcessingWeldingData().JigNo; string strLaserPowerByLBAD = Status.GetProcessingWeldingData().LaserPowerByLBAD; diff --git a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs index 24fc6a8..9613c9e 100644 --- a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs +++ b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs @@ -267,12 +267,14 @@ namespace ILSOS_CCW_H52A.Sequences _SystemParameter = context.GetSetting(CommonSettingIds.SystemParameter); InitDev(context); - if (!CheckDeviceReady(context)) { + if (!CheckDeviceReady(context)) + { //Check Device Log.E("The devices are not active."); return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_DeviceNotReady); } - if (InitSequenceVariable(context) == false) { + if (InitSequenceVariable(context) == false) + { return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_InitVariableError); } Thread.Sleep(1); // 부하 방지 @@ -304,7 +306,8 @@ namespace ILSOS_CCW_H52A.Sequences //Device Init _Scanner = context.GetLaserScanner(); _Laser = context.GetLaser(); - if (_InitParam.UseStream) { + if (_InitParam.UseStream) + { _StreamLightLBAD = new StreamLightLBAD(); _StreamLightLBAD._Client = context.GetStreamLightClient(); _StreamLightLBAD._Sub = context.GetStreamLightSub(); @@ -321,14 +324,17 @@ namespace ILSOS_CCW_H52A.Sequences { List deviceListToCheck = new List() { CommonDeviceIds.Scanner, CommonDeviceIds.Laser, CommonDeviceIds.PLCDevice, CommonDeviceIds.IODevice }; - if (_InitParam.UseStream) { + if (_InitParam.UseStream) + { deviceListToCheck.Add(CommonServiceIds.StreamLightLBADClient); deviceListToCheck.Add(CommonServiceIds.StreamLightLBADSub); } bool isAllDeviceActivated = true; - foreach (string item in deviceListToCheck) { - if (!context.Devices[item].IsActivated) { + foreach (string item in deviceListToCheck) + { + if (!context.Devices[item].IsActivated) + { isAllDeviceActivated = isAllDeviceActivated && false; } } @@ -355,26 +361,32 @@ namespace ILSOS_CCW_H52A.Sequences //InitAutoRunBit(); // LBAD Initialize // LBAD 는 server 이기 때문에, 만약 끊어졌으면 다시 접속이 필요함 - if (_SystemParameter.BypassModeLBAD == false) { - if (!_StreamLightLBAD._Client.IsActivated) { + if (_SystemParameter.BypassModeLBAD == false) + { + if (!_StreamLightLBAD._Client.IsActivated) + { int ret = _StreamLightLBAD._Client.Activate(); Thread.Sleep(500); - if (ret != E1.OK) { + if (ret != E1.OK) + { Log.E($"StreamLightClient activate failed"); return (int)InitErrorList.LBAD_CLIENT_ACTIVATE_FAILED; } } - if (_StreamLightLBAD._Sub.IsActivated == false) { + if (_StreamLightLBAD._Sub.IsActivated == false) + { int ret = _StreamLightLBAD._Sub.Activate(); Thread.Sleep(500); - if (ret != E1.OK) { + if (ret != E1.OK) + { Log.E($"StreamLightSub activate failed"); return (int)InitErrorList.LBAD_SUB_ACTIVATE_FAILED; } } _StreamLightLBAD.Initialize(); - if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_On) == false) { + if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_On) == false) + { Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null")); //return false; } @@ -384,32 +396,40 @@ namespace ILSOS_CCW_H52A.Sequences _Laser.PilotLaserOff(); _Laser.LaserOn(); Thread.Sleep(500); - if (!_Laser.GetLaserReady()) { + if (!_Laser.GetLaserReady()) + { Log.E("ERROR Initialize Laser"); return (int)InitErrorList.LASER_INIT_ERROR; } // Scanner Initialize - if (_Scanner.GetModulationMode()) { + if (_Scanner.GetModulationMode()) + { _ModulationMode = true; } - else { + else + { _ModulationMode = false; } ///// AutoRun Bit가 OFF인 경우 - if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_STATUS).data == false) { + if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_STATUS).data == false) + { // AutoRun Request 상태 체크 - if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_REQ).data == false) { + if (_PLC.ReadBit((int)eBitInput.PLC_AUTO_REQ).data == false) + { Log.E(string.Format("ERROR Initialize PLC, PLC Alarm ON")); // AutoRun Request와 AutoRun Bit 모두 OFF인 경우, PLC 측에서 Alarm 발생함. return (int)InitErrorList.PLC_ALARM; - } else { + } + else + { Log.E(string.Format("ERROR Initialize PLC, Bit Off PLC_AUTO_STATUS")); // AutoRun Request가 ON인데 AutoRun Bit 모두 OFF인 경우, PLC에서 AutoRun Bit를 켜지 않음. return (int)InitErrorList.PLC_AUTORUN_BIT_OFF; } } // Marking On The Flying Off - if (_Scanner.Config.UseMarkingOnTheFly == false) { + if (_Scanner.Config.UseMarkingOnTheFly == false) + { Log.E("ERROR Config Setting : Scanner Marking on the fly (OFF)"); return (int)InitErrorList.MOTF_OFF; } @@ -451,9 +471,11 @@ namespace ILSOS_CCW_H52A.Sequences // 큐 잔류 셀 보존 — DrainCellInfoQueue 전에 선행 (Prefetch2 다음 지그 기준) // Prefetch2.JigNo가 확정값이므로 다음 지그 = (JigNo % 16) + 1 로 신뢰성 있게 계산 - if (_CellScheduler.Prefetch2 != null && _CellScheduler.Prefetch2.JigNo > 0) { + if (_CellScheduler.Prefetch2 != null && _CellScheduler.Prefetch2.JigNo > 0) + { int nextJigNo = (_CellScheduler.Prefetch2.JigNo % ProcessManager.RotaryJigCount) + 1; - if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var qCell)) { + if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var qCell)) + { _CellScheduler.SaveQueueEntry(qCell.LotId, qCell.CellId, nextJigNo); Log.I($"[QueueSave] Jig{nextJigNo} 큐 잔류 셀 보존 >> CellId({qCell.CellId})"); } @@ -480,26 +502,32 @@ namespace ILSOS_CCW_H52A.Sequences private double GetRotaryCurrentPosition() { - try { + try + { //double finalValue = Convert.ToDouble(_plc.GetLongAIValue("PLC_CURRENT_POS_1") / 100000f); double finalValue = Convert.ToDouble(_PLC.ReadDWord((int)eWordInput.PLC_CURRENT_POS_1).data / 100000f); finalValue += _Scanner.Config.RotaryEncoderOffset; - if (360.0 <= finalValue) { - while (360.0 <= finalValue) { + if (360.0 <= finalValue) + { + while (360.0 <= finalValue) + { finalValue -= 360.0; } } - else if (finalValue < 0) { - while (finalValue < 0) { + else if (finalValue < 0) + { + while (finalValue < 0) + { finalValue += 360.0; } } return finalValue; } - catch { + catch + { return -9999.9999; } } @@ -517,13 +545,14 @@ namespace ILSOS_CCW_H52A.Sequences double anglePerOneJig = 360 / (double)rotaryJigCount; //double로 바꿔서 계산해야 22가 아닌 22.5로 anglePerOneJig가 계산됨 25.08.02 weldingCount = (int)((rotaryAngleOffset + anglePerOneJig / 2) / anglePerOneJig); // _WeldingCount = 0, 1, 2, ... - weldingJigNo = (int)(weldingCount % rotaryJigCount) + 1; // _WeldingJigNo = 1, 2, ... , 12 + weldingJigNo = (int)(weldingCount % rotaryJigCount); // _WeldingJigNo = 1, 2, ... , 12 Log.I($"Angle Per One Jig : {anglePerOneJig}"); } private string CheckInitCondition(SequenceContext context, string id, ICollection branches, SequenceActionResult param) { - if (!CheckCondition(context)) { + if (!CheckCondition(context)) + { //AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_AutoRun_CheckInitCondition); Log.E("Condition is not in state to start sequence."); context.PutValue(ContextKey.KEY_SEQUENCE_RESULT, false); @@ -550,7 +579,8 @@ namespace ILSOS_CCW_H52A.Sequences // LoadList가 0보다 크면 다음 시퀀스 진행해야 함 WaitContinue: var ret = context.RetryUntilSuccess(() => _Scanner.LoadList(_WeldingScannerListNo) > 0, int.MaxValue, 10, true); - if (ret == E2.TIMEOUT) { + if (ret == E2.TIMEOUT) + { Log.E("TIMEOUT_Scanner_LoadList : 600시간 Run"); goto WaitContinue; } @@ -567,25 +597,31 @@ namespace ILSOS_CCW_H52A.Sequences // 원본 코드의 InputScannerList[(listNo-1)]과 동일 대상이다. // 예열 구간: iter 1~2(Pf1=null) → 통과. iter 3~: Pf1=Jig1 → 실제 처리. var jigComplete = _CellScheduler.Prefetch1; - if (jigComplete == null) { + if (jigComplete == null) + { Log.I($"[Warmup] ScannerList {_WeldingCount}: pipeline not ready, skip complete check"); return SequenceAction.Ok(); } - if (!CheckInsideWeldPosition(jigComplete.StartAngle)) { + if (!CheckInsideWeldPosition(jigComplete.StartAngle)) + { // IsCanExist=false(공 지그)는 리스트 실행은 하지만 용접이 없으므로 // 엔코더 범위를 벗어나도 에러가 아님 - if (jigComplete.IsCanExist) { + if (jigComplete.IsCanExist) + { Log.I("ERR_SCANNER_LIST_PROCESSING_TIMEOVER"); return SequenceAction.Error(); } return SequenceAction.Ok(); } - else { - if (jigComplete.IsCanExist) { + else + { + if (jigComplete.IsCanExist) + { #region 용접 시간, 엔코더 측정/기록 double elaspedTime = _Scanner.GetTime(); - if (jigComplete.WeldComplete) { + if (jigComplete.WeldComplete) + { jigComplete.WeldEndTime = DateTime.Now; jigComplete.WeldingSpanTime = TimeSpan.FromSeconds(elaspedTime); TimeSpan weldInterval = jigComplete.WeldEndTime - _prevWeldEndTime; @@ -599,21 +635,25 @@ namespace ILSOS_CCW_H52A.Sequences jigComplete.WeldingSpanTime.TotalMilliseconds, weldInterval.TotalSeconds)); - if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + jigComplete.JigNo - 1).data) { + if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + jigComplete.JigNo - 1).data) + { _PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + jigComplete.JigNo - 1, true); Log.I(string.Format($"PC_WELD_COMPLETE_{jigComplete.JigNo} -> true)")); } - if (_SystemParameter.LastResetTime < DateTime.Now.Date) { + if (_SystemParameter.LastResetTime < DateTime.Now.Date) + { _SystemParameter.LastResetTime = DateTime.Now.Date; Log.I($"Today Count Reset. {_SystemParameter.TodayProductCount} -> 0"); _SystemParameter.TodayProductCount = 0; } - if (_SystemParameter.TodayProductCount < uint.MaxValue) { + if (_SystemParameter.TodayProductCount < uint.MaxValue) + { _SystemParameter.TodayProductCount++; } - if (_SystemParameter.TotalProductCount < uint.MaxValue) { + if (_SystemParameter.TotalProductCount < uint.MaxValue) + { _SystemParameter.TotalProductCount++; } @@ -625,25 +665,18 @@ namespace ILSOS_CCW_H52A.Sequences // 보고 데이터는 스케줄러의 ActiveReportSlot(Complete 또는 PendingComplete)에서 읽음 var report = _CellScheduler.ActiveReportSlot; - if (report != null) { + if (report != null) + { Status.GetProcessingWeldingData().LotId = report.LotId; Status.GetProcessingWeldingData().CellId = report.CellId; Status.GetProcessingWeldingData().WeldingStartTime = report.WeldStartTime; Status.GetProcessingWeldingData().WeldingEndTime = report.WeldEndTime; Status.GetProcessingWeldingData().WeldingSpanTimeMilliseconds = report.WeldingSpanTime.TotalMilliseconds.ToString(); - Status.GetProcessingWeldingData().WeldingJigNo = report.JigNo.ToString(); - Status.GetProcessingWeldingData().APD.UpdateHeadNo(report.JigNo.ToString()); + Status.GetProcessingWeldingData().JigNo = report.JigNo.ToString(); + SaveCellAPD(); } - SaveCellAPD(); } - //if (_SystemParameter.BypassModeLBAD == false) { - // if (_StreamLightLBAD.SendWeldingStop() == false) { - // Log.I(string.Format($"[LBAD Interface]SendWeldingStop null")); - // //return null; - // } - //} - UtilUnit.logUnit.SetLog(LogUnit.eLogType.PRODUCT, MethodBase.GetCurrentMethod().Name, "UPDATE_WELDING_TIME;" + jigComplete.WeldingSpanTime.TotalMilliseconds); UtilUnit.logUnit.SetLog(LogUnit.eLogType.PRODUCT, MethodBase.GetCurrentMethod().Name, "UPDATE_PRODUCT_COUNT;" + jigComplete.WeldEndTime.ToString("yyyy-MM-dd HH:mm:ss")); @@ -657,7 +690,8 @@ namespace ILSOS_CCW_H52A.Sequences Log.I(string.Format("Encoder start : {0:F4}, end : {1:F4}, vel : {2:F2}", startEncoderCount, endEncoderCount, angularVelocity)); #endregion #region 스캐너 리스트 Record 파일 기록 - if (_Scanner.Config.UseRecordSignal) { + if (_Scanner.Config.UseRecordSignal) + { String RecordFileName = _RecipeManager.ActivatedRecipe().Name + "_Jig#" + jigComplete.JigNo.ToString(); string DataFilePath = ProjectUtil.GetDataLogSetting().GetFilePath_ScannerRecordLog(RecordFileName, true); _Scanner.SaveRecord(DataFilePath); @@ -683,6 +717,7 @@ namespace ILSOS_CCW_H52A.Sequences /// 지나갔으면 True public bool CheckInsideWeldPosition(double startAngle) { + return true; double encoderX, currentAngle; _Scanner.GetEncoder(out encoderX, out currentAngle, true); @@ -690,7 +725,8 @@ namespace ILSOS_CCW_H52A.Sequences if (0 < startAngle && currentAngle < 0) return false; - if (startAngle <= currentAngle && currentAngle < startAngle + 45) { + if (startAngle <= currentAngle && currentAngle < startAngle + 45) + { Log.I(string.Format("Current encoder check OK, startAngle : {0}, currentAngle : {1})", startAngle, currentAngle)); return true; } @@ -741,7 +777,8 @@ namespace ILSOS_CCW_H52A.Sequences bool canExist; // 지그 용접 수행 여부 확인 - if (UsePlcShotThemAll) { + if (UsePlcShotThemAll) + { canExist = true; Log.I("Settings - PLC : Shot Them All Mode"); } @@ -765,26 +802,35 @@ namespace ILSOS_CCW_H52A.Sequences // 복원 우선: 정지 전 업로드됐으나 로터리 감속·정지로 용접 미완된 셀 정보 복원. // canExist=false 지그도 TryRestoreCell을 호출하여 슬롯 소비(폐기) — 이후 오염 방지. (string LotId, string CellId) recvInfo = (string.Empty, string.Empty); - if (_CellScheduler.TryRestoreCell(_WeldingJigNo, out var rLot, out var rCell)) { - if (canExist) { + if (_CellScheduler.TryRestoreCell(_WeldingJigNo, out var rLot, out var rCell)) + { + if (canExist) + { recvInfo.LotId = rLot; recvInfo.CellId = rCell; Log.I($"[PendingRestore] Jig{_WeldingJigNo} 셀 복원 >> CellId({rCell})"); } - else { + else + { Log.W($"[PendingRestore] Jig{_WeldingJigNo} canExist=false, 복원 데이터 폐기 >> CellId({rCell})"); } } - else if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var cell)) { - if (canExist) { + else if (ProcessManager.Instance.ReceivedCellInfoQueue.TryDequeue(out var cell)) + { + if (canExist) + { recvInfo.LotId = cell.LotId; recvInfo.CellId = cell.CellId; - } else { + } + else + { // 앞공정 NG 셀: CellTracker는 투입 시 이미 스캔했으므로 큐에서 소비 후 폐기. // 소비하지 않으면 다음 정상 셀이 이 NG 데이터를 가져가 정합성 붕괴. Log.W($"[NG Skip] Jig{_WeldingJigNo} canExist=false, 큐 데이터 폐기 >> CellId({cell.CellId})"); } - } else { + } + else + { if (canExist) Log.E($"[QueueEmpty] Jig{_WeldingJigNo} canExist=true 이지만 큐가 비어있음"); @@ -797,25 +843,28 @@ namespace ILSOS_CCW_H52A.Sequences _CellScheduler.Prefetch2.CellId = recvInfo.CellId; Status.GetProcessingWeldingData().WorkLotId = recvInfo.LotId; Status.GetProcessingWeldingData().WorkCellId = recvInfo.CellId; - Status.GetProcessingWeldingData().WeldingJigNo = _WeldingJigNo.ToString(); + Status.GetProcessingWeldingData().WorkJigNo = _WeldingJigNo.ToString(); if (_CellScheduler.Prefetch2 != null) Log.I($"Prefetch2 >> CellId({_CellScheduler.Prefetch2.CellId}) [CanExist({_CellScheduler.Prefetch2.IsCanExist})] [JigNo({_CellScheduler.Prefetch2.JigNo})] " + $"[ListNo({_CellScheduler.Prefetch2.ListNo})] [WeldingCount({_CellScheduler.Prefetch2.WeldingCount})]" + $"[StartAngle(Y)({_CellScheduler.Prefetch2.StartAngle})]"); - if(_CellScheduler.Prefetch1 != null) + if (_CellScheduler.Prefetch1 != null) Log.I($"Prefetch1 >> CellId({_CellScheduler.Prefetch1.CellId}) [CanExist({_CellScheduler.Prefetch1.IsCanExist})] [JigNo({_CellScheduler.Prefetch1.JigNo})] " + $"[ListNo({_CellScheduler.Prefetch1.ListNo})] [WeldingCount({_CellScheduler.Prefetch1.WeldingCount})]" + $"[StartAngle(Y)({_CellScheduler.Prefetch1.StartAngle})]"); - if (canExist) { + if (canExist) + { #region 용접할 Objects 선택 - if (_WeldingJigNo - 1 < _ScannerCanvasUserCtrl.Model.Layers.Length) { + if (_WeldingJigNo - 1 < _ScannerCanvasUserCtrl.Model.Layers.Length) + { _SelectedDrawObjectList = _ScannerCanvasUserCtrl.Model.Layers[_WeldingJigNo - 1].Objects; Log.I(string.Format("Page 불러오기 : [{0}])", _WeldingJigNo - 1)); } - else { + else + { _SelectedDrawObjectList = _ScannerCanvasUserCtrl.Model.Layers[0].Objects; Log.I(string.Format("Page 불러오기 : [0])")); } @@ -823,7 +872,8 @@ namespace ILSOS_CCW_H52A.Sequences return SEQ_SET_PARAMS_UPLOAD_WELDING_LIST_SEQ; } - else { + else + { return SEQ_EXECUTE_WELDING; } #endregion @@ -861,7 +911,8 @@ namespace ILSOS_CCW_H52A.Sequences // 1.2. 계산된 시작각도가 이미 지나버렸으면 알람 발생 필요 // 1.3. Overflow가 나는 숫자라면, 보상할 것. - if (sectionStartAngle > encoderAllowedMaxDegree) { + if (sectionStartAngle > encoderAllowedMaxDegree) + { sectionStartAngle -= encoderAllowedMaxDegree - encoderAllowedMinDegree; _EncoderOverflowCount++; } @@ -873,6 +924,7 @@ namespace ILSOS_CCW_H52A.Sequences public bool GetRotaryCanExist(int jigNo) { + return true; if (jigNo <= _RotaryJigCount) return _PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + (jigNo - 1)).data; else @@ -882,7 +934,8 @@ namespace ILSOS_CCW_H52A.Sequences private SequenceActionResult SetUploadWeldingList_SeqParams(SequenceContext context, string id, SequenceActionResult param) { //현재 시퀀스에서 LoadList를 해주기 때문에 Sub 시퀀스에 IncludeListStartEnd를 false로 넘겨줘야 함 - SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() { + SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() + { NeedSetLaserTiming = _ModulationMode, IncludeListStartEnd = false, CellMeasureCenterOffsetX = 0, @@ -898,7 +951,8 @@ namespace ILSOS_CCW_H52A.Sequences private SequenceActionResult GetUploadWeldingList_SeqResult(SequenceContext context, string id, SequenceActionResult param) { var resultOutParam = param.Param as SeqUploadWeldingList_OutParam; - if (resultOutParam.Success == false) { + if (resultOutParam.Success == false) + { //AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_ResultFailed); return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_UploadWeldingList_ResultFailed); //return null; @@ -947,13 +1001,15 @@ namespace ILSOS_CCW_H52A.Sequences _Scanner.SetEndList(); #region List 실행(처음엔 ExecuteList, 다음부터 AutoChangeList, 이후 대상 리스트 교체 (1 <-> 2)) - if (isTheFirstListExecute) { + if (isTheFirstListExecute) + { isTheFirstListExecute = false; _Scanner.ExecuteList(_WeldingScannerListNo); Log.I(string.Format($"START Welding : ExecuteList_{_WeldingScannerListNo}")); } - else { + else + { _Scanner.AutoChange(); Log.I(string.Format($"Next upload list : uploadList_{_WeldingScannerListNo}")); } @@ -974,7 +1030,8 @@ namespace ILSOS_CCW_H52A.Sequences { double send_time_offset = 0.1; - while (!context.Stopped) { + while (!context.Stopped) + { double encoderX, currentAngle; _Scanner.GetEncoder(out encoderX, out currentAngle, true); double CurrentPosPLC = GetRotaryCurrentPosition(); @@ -987,12 +1044,17 @@ namespace ILSOS_CCW_H52A.Sequences // Shift()는 메인 시퀀스에서만 호출되므로 루프 시작 시 캡처해도 안전. var executeTarget = _CellScheduler.Prefetch1; - if (WeldingInPosition) { - if (executeTarget != null && executeTarget.IsCanExist && executeTarget.JigNo > 0) { + if (WeldingInPosition) + { + if (executeTarget != null && executeTarget.IsCanExist && executeTarget.JigNo > 0) + { Log.I($"Fork Before Min Rotate Encoder X : ({encoderX}), Encoder Y : ({currentAngle}), PLC Rotary : ({CurrentPosPLC}), List {executeTarget.ListNo}, JigNo : ({executeTarget.JigNo})"); - if (!_SystemParameter.BypassModeLBAD) { - if (!executeTarget.CheckSendCellinfo) { - if (currentAngle > executeTarget.StartAngle) { + if (!_SystemParameter.BypassModeLBAD) + { + if (!executeTarget.CheckSendCellinfo) + { + if (currentAngle > executeTarget.StartAngle) + { executeTarget.CheckSendCellinfo = _StreamLightLBAD.SendCellInfo(executeTarget.LotId, executeTarget.CellId, _RecipeNo, _ModelNo, executeTarget.JigNo); if (!executeTarget.CheckSendCellinfo) @@ -1006,9 +1068,11 @@ namespace ILSOS_CCW_H52A.Sequences } var LaserIO = _IO._iOUnit.ReadDiBit(Convert.ToInt32(eADIAddress.LaserOn)); - var IsLaserOn = ChangeChecker.IsChangedBoolMonitoring("LaserOn", LaserIO, true); - if (IsLaserOn) { - if (executeTarget != null && executeTarget.IsCanExist && executeTarget.WeldStartTime == DateTime.MinValue) { + //var IsLaserOn = ChangeChecker.IsChangedBoolMonitoring("LaserOn", LaserIO, true); + if (true) + { + if (executeTarget != null && executeTarget.IsCanExist && executeTarget.WeldStartTime == DateTime.MinValue) + { executeTarget.WeldStartTime = DateTime.Now; executeTarget.WeldComplete = true; Log.I($"Laser On, Welding Complete. JigNo : ({executeTarget.JigNo})"); @@ -1021,7 +1085,8 @@ namespace ILSOS_CCW_H52A.Sequences eListNo effectiveList = (!isBusy && (curList == eListNo.LIST1 || curList == eListNo.LIST2)) ? eListNo.NONE : curList; - if (ChangeChecker.IsChangedInt("ListState", (int)effectiveList, out int prevListRaw)) { + if (ChangeChecker.IsChangedInt("ListState", (int)effectiveList, out int prevListRaw)) + { var prevList = (eListNo)prevListRaw; if (prevList != eListNo.NONE) Log.I($"[ListEnd] List {prevList} 종료 >> LaserOn({LaserIO}) EncoderY({currentAngle:F3}) JigNo({executeTarget?.JigNo})"); @@ -1029,8 +1094,10 @@ namespace ILSOS_CCW_H52A.Sequences Log.I($"[ListStart] List {effectiveList} 시작 >> LaserOn({LaserIO}) EncoderY({currentAngle:F3}) JigNo({executeTarget?.JigNo})"); } - for (int i = 0; i < _RotaryJigCount; i++) { - if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + i).data == false) { + for (int i = 0; i < _RotaryJigCount; i++) + { + if (_PLC.ReadBit((int)eBitInput.PLC_USE_WELD_JIG_1 + i).data == false) + { _PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + i, false); } } @@ -1136,10 +1203,12 @@ namespace ILSOS_CCW_H52A.Sequences //Jin : cycleStop 명령을 용접 프로그램에서 할 경우가 현재는 없음.. // CheckCycleStop 노드와 Complete 노드 사이 다른 노드가 필요하다면 해당 노드를 CheckCycleStop 노드 위로 올리자 bool cycleStop = false; - if (cycleStop) { + if (cycleStop) + { return SEQ_SAVE_RESULT_DATA; } - else { + else + { return SEQ_CHECK_LOAD_COMPLETE; } } @@ -1148,7 +1217,8 @@ namespace ILSOS_CCW_H52A.Sequences { // ── 재시작 전 미완료 보고 우선 처리 ───────────────────────────────────────── // SavePendingComplete()로 보존된 슬롯이 있으면 정상 파이프라인(Complete)보다 우선. - if (_CellScheduler.HasPendingComplete) { + if (_CellScheduler.HasPendingComplete) + { var p = _CellScheduler.PendingComplete; Log.I($"[PendingReport] 재시작 전 미완료 보고: LotId={p.LotId}, CellId={p.CellId}, JigNo={p.JigNo}"); return SEQ_REPORT_CELL_RESULT; @@ -1166,7 +1236,8 @@ namespace ILSOS_CCW_H52A.Sequences private void SaveCellAPD() { - if (Status.GetProcessingWeldingData().APD.Count > 0) { + if (Status.GetProcessingWeldingData().APD.Count > 0) + { string directoryPath = "D:\\ILSOSConfig\\APD_History"; string fileName = DateTime.Now.ToString("HH") + "_CellAPD"; string fullPath = Path.Combine(directoryPath, Status.GetProcessingWeldingData().APD.First().Date.ToString("yyyy-MM-dd"), fileName); @@ -1190,7 +1261,8 @@ namespace ILSOS_CCW_H52A.Sequences private SequenceActionResult InitConditionError(SequenceContext context, string id, SequenceActionResult param) { context.TryGetValue(ContextKey.KEY_SEQUENCE_ERROR_CODE, out int InitializeCode); - switch (InitializeCode) { + switch (InitializeCode) + { case (int)InitErrorList.PLC_AUTORUN_BIT_OFF: Log.D("AutoRun Sequence InitConditionError : PLC_AUTORUN_OFF"); return SequenceAction.ForceStopByAlarm(AlarmCode.ALARM_SEQUENCE_AutoRun_CheckInitCondition_PLC_AUTORUN_OFF); @@ -1224,7 +1296,8 @@ namespace ILSOS_CCW_H52A.Sequences context.TryGetValue(ContextKey.KEY_SEQUENCE_RESULT, out bool seqResult); SeqAutoRunCCWH52A_OutParam result = new SeqAutoRunCCWH52A_OutParam() { Success = seqResult }; - if (seqResult == false) { + if (seqResult == false) + { //AlarmManager.Alarm(AlarmCode.ALARM_SEQUENCE_AutoRun_ResultFailed); } Log.D("AutoRun Sequence Complete"); @@ -1236,7 +1309,8 @@ namespace ILSOS_CCW_H52A.Sequences private bool RestoreDeviceStatus() { //PLC All BIT OFF - for (int i = 0; i < _RotaryJigCount; i++) { + for (int i = 0; i < _RotaryJigCount; i++) + { _PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE_1 + i, false); } _PLC.WriteBit((int)eBitOutput.PC_AUTO_STATUS, false); @@ -1245,8 +1319,10 @@ namespace ILSOS_CCW_H52A.Sequences //LBAD Ready Off //_LBAD.SetReadybyAuto(false); - if (_SystemParameter.BypassModeLBAD == false) { - if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) { + if (_SystemParameter.BypassModeLBAD == false) + { + if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) + { Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null")); } } @@ -1295,7 +1371,8 @@ namespace ILSOS_CCW_H52A.Sequences { Status.EquipmentMode = eEquipmentMode.MANUAL; - foreach (var info in ProcessManager.Instance.ReceivedCellInfoQueue.Select((value, index) => (value, index))) { + foreach (var info in ProcessManager.Instance.ReceivedCellInfoQueue.Select((value, index) => (value, index))) + { Log.I($"[{info.index}]Queue >> CellId({info.value.CellId}) LotId({info.value.LotId})"); } @@ -1313,8 +1390,10 @@ namespace ILSOS_CCW_H52A.Sequences //LBAD Ready Off //_LBAD.SetReadybyAuto(false); - if (_SystemParameter.BypassModeLBAD == false) { - if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) { + if (_SystemParameter.BypassModeLBAD == false) + { + if (_StreamLightLBAD.SendReadyStatus(eRequestData.Ready_Off) == false) + { Log.I(string.Format($"[LBAD Interface]CheckReadyStatus null")); } } diff --git a/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRun.xaml b/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRun.xaml index 199070c..6f97ba7 100644 --- a/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRun.xaml +++ b/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRun.xaml @@ -104,7 +104,7 @@