From d31020df7238753713f532477c0daac46241f141 Mon Sep 17 00:00:00 2001 From: choieigun Date: Tue, 10 Mar 2026 16:37:19 +0900 Subject: [PATCH] =?UTF-8?q?LbadAvg=20-=20NaN=20=3D=20=EB=AF=B8=EC=88=98?= =?UTF-8?q?=EC=8B=A0=20-=200.0=EC=9D=80=20=EC=88=98=EC=8B=A0=EB=90=90?= =?UTF-8?q?=EC=9C=BC=EB=82=98=20=EC=B8=A1=EC=A0=95=EA=B0=92=200?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add WeldingLog --- Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs | 2 +- .../Sequences/SeqAutoRunCCWH52A.cs | 22 ++++++++++++------- .../WeldingCommon/Utils/ChangeChecker.cs | 18 +++++++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs index cd8ea21..9493d82 100644 --- a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs +++ b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs @@ -89,7 +89,7 @@ namespace ILSOS_CCW_H52A.Data LotId = string.Empty; CellId = string.Empty; - LbadAvg = 0.0; + LbadAvg = double.NaN; // NaN = 미수신, 0.0은 수신됐으나 측정값 0 CheckSendCellinfo = false; ReportComplete = false; diff --git a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs index 722838b..05d1445 100644 --- a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs +++ b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs @@ -775,6 +775,7 @@ namespace ILSOS_CCW_H52A.Sequences } else { if (canExist) Log.E($"[QueueEmpty] Jig{_WeldingJigNo} canExist=true 이지만 큐가 비어있음"); + _CellTracker.getDummyData(out string lotId, out string cellId); recvInfo.LotId = lotId; recvInfo.CellId = cellId; @@ -1003,15 +1004,19 @@ namespace ILSOS_CCW_H52A.Sequences } } - // List의 실행의 토글을 확인함 + // List의 시작/종료 로그 — MOTF에서 LIST1 -> LIST2 전환 시 종료+시작 각각 기록 _Scanner.GetListPointer(out eListNo curList, out uint pos); var isBusy = _Scanner.GetBusyStatus(); - if (!isBusy && (curList == eListNo.LIST1 || curList == eListNo.LIST2)) - curList = eListNo.NONE; + eListNo effectiveList = (!isBusy && (curList == eListNo.LIST1 || curList == eListNo.LIST2)) + ? eListNo.NONE : curList; - var IsToggleListState = ChangeChecker.IsChangedInt("ListState", (int)curList); - if (IsToggleListState) - Log.I($"Fork Laser On({LaserIO}) Encoder X : ({encoderX}), Encoder Y : ({currentAngle}), PLC Rotary : ({CurrentPosPLC}), List {executeTarget?.ListNo}, JigNo : ({executeTarget?.JigNo})"); + 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})"); + if (effectiveList != eListNo.NONE) + 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) { @@ -1035,8 +1040,9 @@ namespace ILSOS_CCW_H52A.Sequences // 셀 식별 정보 + LBAD AVG는 스케줄러 슬롯에서 직접 읽음 (ReportSlot 또는 pendingSlot) // ReportSlot 단계에서는 지그 1회전(~320ms) 경과 → LBAD MES Report(~100ms) 보장 수신 var report = _CellScheduler.ActiveReportSlot; - string lbadAvg = report.LbadAvg > 0 ? report.LbadAvg.ToString("F3") : "0"; - if (report.LbadAvg <= 0) + bool lbadReceived = !double.IsNaN(report.LbadAvg); + string lbadAvg = lbadReceived ? report.LbadAvg.ToString("F3") : "0"; + if (!lbadReceived) Log.W($"[LBAD] ReportSlot LbadAvg 미수신 >> CellId({report.CellId})"); // 레시피·장비 계측값은 Status에서 읽음 (TodayProduct/TotalProduct 포함) var wd = Status.GetProcessingWeldingData(); diff --git a/WeldingComponents/WeldingCommon/Utils/ChangeChecker.cs b/WeldingComponents/WeldingCommon/Utils/ChangeChecker.cs index e3366e8..ca234c9 100644 --- a/WeldingComponents/WeldingCommon/Utils/ChangeChecker.cs +++ b/WeldingComponents/WeldingCommon/Utils/ChangeChecker.cs @@ -57,5 +57,23 @@ namespace WeldingCommon.Utils mappingInt[Resource] = value; return true; } + + public static bool IsChangedInt(string Resource, int value, out int prevalue, int defaultVal = 0) + { + if (mappingInt.ContainsKey(Resource) == false) { + mappingInt[Resource] = defaultVal; + prevalue = mappingInt[Resource]; + return false; + } + + if (mappingInt[Resource] == value) { + prevalue = value; + return false; + } + + prevalue = mappingInt[Resource]; + mappingInt[Resource] = value; + return true; + } } }