From f15800250e667a8d0d646096f119f340b63a91ce Mon Sep 17 00:00:00 2001 From: choieigun Date: Tue, 10 Mar 2026 15:07:00 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20LBAD=20AVG=20=ED=83=80=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=B4=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?4=EB=8B=A8=EA=B3=84=20=ED=8C=8C=EC=9D=B4=ED=94=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=81=EC=9A=A9=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20LBAD=20ME?= =?UTF-8?q?S=20Report=EA=B0=80=20=EC=9A=A9=EC=A0=91=20=EC=99=84=EB=A3=8C?= =?UTF-8?q?=20=ED=9B=84=20~100ms=20=EB=92=A4=EC=97=90=20=EC=88=98=EC=8B=A0?= =?UTF-8?q?=EB=90=98=EC=96=B4=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=203=EB=8B=A8=EA=B3=84(Prefetch2=E2=86=92Prefetch1?= =?UTF-8?q?=E2=86=92Complete)=20=EB=B3=B4=EA=B3=A0=20=EC=8B=9C=EC=A0=90?= =?UTF-8?q?=EC=97=90=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EA=B0=80=20=EC=97=86=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=EB=A5=BC=20=ED=8C=8C=EC=9D=B4=ED=94=84=EB=9D=BC=EC=9D=B8=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=EC=9C=BC=EB=A1=9C=20=ED=95=B4=EA=B2=B0.=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ReportSlot=20?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=20=EC=B6=94=EA=B0=80=20=E2=80=94=20=EC=A7=80?= =?UTF-8?q?=EA=B7=B8=201=ED=9A=8C=EC=A0=84(~320ms)=20=EA=B2=BD=EA=B3=BC=20?= =?UTF-8?q?=ED=9B=84=20=EB=B3=B4=EA=B3=A0=ED=95=98=EB=AF=80=EB=A1=9C=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20LBAD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=8B=A0=20?= =?UTF-8?q?=EB=B3=B4=EC=9E=A5.=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EB=8C=80?= =?UTF-8?q?=EA=B8=B0=20=EC=97=86=EC=9D=B4=20=EB=A9=94=EC=9D=B8=20=EC=8B=9C?= =?UTF-8?q?=ED=80=80=EC=8A=A4=20=ED=83=80=EC=9D=B4=EB=B0=8D=20=EC=9C=A0?= =?UTF-8?q?=EC=A7=80.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=82=B4=EC=9A=A9:=20=20=20-=20CellInf?= =?UTF-8?q?oScheduler:=20ReportSlot=20=EC=B6=94=EA=B0=80,=204=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=20Shift()=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?pending=20=EC=8A=AC=EB=A1=AF=EC=9D=84=20=5FpendingFromReportSlo?= =?UTF-8?q?t=20/=20=5FpendingFromComplete=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20TrySetLbadAvg(c?= =?UTF-8?q?ellId,=20avg)=20=EC=B6=94=EA=B0=80=20=E2=80=94=20Complete?= =?UTF-8?q?=E2=86=92ReportSlot=20=EC=88=9C=20=ED=8F=B4=EB=B0=B1=20?= =?UTF-8?q?=ED=83=90=EC=83=89=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20JigInfo:=20LbadAvg=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(Clear/CopyFrom=20=ED=8F=AC=ED=95=A8)=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20StreamLightLBAD:=20MesReportRece?= =?UTF-8?q?ived=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=EC=8B=9C=20=EB=B0=9C=ED=99=94=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Proce?= =?UTF-8?q?ssManager:=20RegisterLbadStream()=20/=20OnLbadMesReportReceived?= =?UTF-8?q?()=20=EC=B6=94=EA=B0=80=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20LBAD=20=EC=BD=9C=EB=B0=B1=20=EC=B2=98=EB=A6=AC=EB=A5=BC?= =?UTF-8?q?=20=EC=8B=9C=ED=80=80=EC=8A=A4=EA=B0=80=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?ProcessManager=EC=97=90=EC=84=9C=20=EB=8B=B4=EB=8B=B9=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20SeqAutoRunCCWH52A:=20RegisterLbadStream=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C,=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20ReportCellResult=EC=97=90=EC=84=9C=20report.L?= =?UTF-8?q?badAvg=20=EC=A7=81=EC=A0=91=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuroraLBAD/Services/StreamLightLBAD.cs | 10 +- .../ILSOS_CCW_H52A/Datas/CellInfoScheduler.cs | 146 +++++++++++++----- Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs | 5 + .../ProcessObjects/ProcessManager.cs | 17 ++ .../Sequences/SeqAutoRunCCWH52A.cs | 13 +- 5 files changed, 143 insertions(+), 48 deletions(-) diff --git a/AuroraDevices/AuroraLBAD/Services/StreamLightLBAD.cs b/AuroraDevices/AuroraLBAD/Services/StreamLightLBAD.cs index 9e8a3d0..5ab4e55 100644 --- a/AuroraDevices/AuroraLBAD/Services/StreamLightLBAD.cs +++ b/AuroraDevices/AuroraLBAD/Services/StreamLightLBAD.cs @@ -26,6 +26,10 @@ namespace AuroraLBAD.Service public static double[] LaserPowerByLBAD = new double[100]; //headnum 크기면 되지만 우선 100으로 해둠 + /// LBAD MES Report 수신 시 발화 — (lotId, cellId, headNum, avg) + /// 시퀀스에서 구독하여 Complete 슬롯의 LbadAvg를 채우는 데 사용 + public event Action MesReportReceived; + public Int16 LBADAlive { get; set; } public Int16? LBADAlarmStatus { get; set; } [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -318,10 +322,12 @@ namespace AuroraLBAD.Service Log.I($"StreamLight LBAD Report Data (from LBAD to Welder) : LotID {LotID_string}, CellID {CellID_string}"); Log.I($"StreamLight LBAD Report Data (from LBAD to Welder) : HeadNum {HeadNum}"); Log.I($"StreamLight LBAD Report Data (from LBAD to Welder) : LaserPower_AVG {AVG}"); - if (HeadNum > 0) + if (HeadNum > 0) { LaserPowerByLBAD[HeadNum] = AVG; - else + MesReportReceived?.Invoke(LotID_string, CellID_string, HeadNum, AVG); + } else { Log.E($"Head Number is {HeadNum}"); + } } break; default: diff --git a/Machines/ILSOS_CCW_H52A/Datas/CellInfoScheduler.cs b/Machines/ILSOS_CCW_H52A/Datas/CellInfoScheduler.cs index 22dbdfb..9256830 100644 --- a/Machines/ILSOS_CCW_H52A/Datas/CellInfoScheduler.cs +++ b/Machines/ILSOS_CCW_H52A/Datas/CellInfoScheduler.cs @@ -21,15 +21,17 @@ namespace ILSOS_CCW_H52A.Data /// 파이프라인 단계 접근을 동시에 지원하는 셀 스케줄러. /// /// - 물리 지그 접근: scheduler[eJigNo.Jig5] - /// - 파이프라인 접근: scheduler.Prefetch2, scheduler.Prefetch1, scheduler.Complete + /// - 파이프라인 접근: scheduler.Prefetch2, scheduler.Prefetch1, scheduler.Complete, scheduler.ReportSlot /// - /// 3단계 파이프라인: Prefetch2 → Prefetch1 → Complete - /// Prefetch2 : 셀 정보 수신 완료, 스캐너 리스트 업로드 전 - /// Prefetch1 : 업로드 완료, 실행 중 — EncoderMonitor 감시 + 완료 체크 대상 - /// Complete : 용접 완료, 보고 대기 + /// 4단계 파이프라인: Prefetch2 → Prefetch1 → Complete → ReportSlot + /// Prefetch2 : 셀 정보 수신 완료, 스캐너 리스트 업로드 전 + /// Prefetch1 : 업로드 완료, 실행 중 — EncoderMonitor 감시 + 완료 체크 대상 + /// Complete : 용접 완료, LBAD MES Report 수신 대기 (~100ms) + /// MesReportReceived 콜백이 CellId 매칭 후 LbadAvg를 채움 + /// ReportSlot : 지그 1회전(~320ms) 경과 → LBAD 데이터 보장, CellTracker 보고 대상 /// - /// Shift()가 3단계 전체를 전진. GC 할당 없음. - /// Complete ← Prefetch1 ← Prefetch2 ← this[nextJig] + /// Shift()가 4단계 전체를 전진. GC 할당 없음. + /// ReportSlot ← Complete ← Prefetch1 ← Prefetch2 ← this[nextJig] /// public class CellInfoScheduler : Dictionary { @@ -44,22 +46,44 @@ namespace ILSOS_CCW_H52A.Data private set => _prefetch1 = value; } - public JigInfo Complete { get; private set; } // 전 셀: 용접 완료, 보고 대기 + public JigInfo Complete { get; private set; } // 용접 완료, LBAD 수신 대기 + public JigInfo ReportSlot { get; private set; } // LBAD 보장, CellTracker 보고 대상 - // 재시작 보존용 독립 슬롯 — Reset()에서 건드리지 않음 - // 재시작 시, List를 최초 리스트 2번을 생성하는 로직 때문에.. 필요함 - private readonly JigInfo _pendingSlot = new JigInfo(); // 용접 직후 (용접 완, 보고 미완) - private readonly JigInfo _pendingPrefetch1 = new JigInfo(); // 정지 직전 Prefetch1 (업로드 완료, 용접 미완) - private readonly JigInfo _pendingPrefetch2 = new JigInfo(); // 정지 직전 Prefetch2 (업로드 완료, 용접 미완) + // ── 재시작 보존용 독립 슬롯 — Reset()에서 건드리지 않음 ────────────────────── + private readonly JigInfo _pendingPrefetch1 = new JigInfo(); // 정지 직전 Prefetch1 (업로드 완료, 용접 미완) + private readonly JigInfo _pendingPrefetch2 = new JigInfo(); // 정지 직전 Prefetch2 (업로드 완료, 용접 미완) - // 재시작 전 미완료 보고 슬롯 (유효 시 non-null) - public JigInfo PendingComplete => HasPendingComplete ? _pendingSlot : null; + // 정지 직전 ReportSlot: LBAD 수신 완료 상태로 보고만 남은 셀 + private readonly JigInfo _pendingFromReportSlot = new JigInfo(); + // 정지 직전 Complete: 용접은 완료됐으나 ReportSlot 진입 전 정지 (LBAD 수신 여부 불확실) + private readonly JigInfo _pendingFromComplete = new JigInfo(); - // 재시작 보존 보고가 있는지 - public bool HasPendingComplete => _pendingSlot.IsCanExist && !_pendingSlot.ReportComplete; + // ── 재시작 미완료 보고 접근 ────────────────────────────────────────────────── + // 우선순위: _pendingFromReportSlot > _pendingFromComplete + public JigInfo PendingComplete { + get { + if (_pendingFromReportSlot.IsCanExist && !_pendingFromReportSlot.ReportComplete) + return _pendingFromReportSlot; + if (_pendingFromComplete.IsCanExist && !_pendingFromComplete.ReportComplete) + return _pendingFromComplete; + return null; + } + } - // 현재 활성 보고 슬롯 — 재시작 pending 우선 - public JigInfo ActiveReportSlot => HasPendingComplete ? _pendingSlot : Complete; + public bool HasPendingComplete => + (_pendingFromReportSlot.IsCanExist && !_pendingFromReportSlot.ReportComplete) + || (_pendingFromComplete.IsCanExist && !_pendingFromComplete.ReportComplete); + + // 현재 활성 보고 슬롯 — 재시작 pending 우선, 그 다음 ReportSlot + public JigInfo ActiveReportSlot { + get { + if (_pendingFromReportSlot.IsCanExist && !_pendingFromReportSlot.ReportComplete) + return _pendingFromReportSlot; + if (_pendingFromComplete.IsCanExist && !_pendingFromComplete.ReportComplete) + return _pendingFromComplete; + return ReportSlot; + } + } // 정지 전 미용접 슬롯이 보존돼 있는지 (재시작 후 복원 가능 여부) public bool HasPendingPrefetch => @@ -67,9 +91,9 @@ namespace ILSOS_CCW_H52A.Data || !string.IsNullOrEmpty(_pendingPrefetch2.CellId); // 보고가 필요한 상태인지 (정상 + 재시작 모두 포함) >> 용접 완, 보고 미완 - // Complete는 Shift()마다 갱신되므로 IsCanExist·WeldComplete 조건을 함께 확인한다. + // ReportSlot은 Shift()마다 갱신되므로 IsCanExist·WeldComplete 조건을 함께 확인한다. public bool HasReport => HasPendingComplete || - (Complete != null && Complete.IsCanExist && Complete.WeldComplete && !Complete.ReportComplete); + (ReportSlot != null && ReportSlot.IsCanExist && ReportSlot.WeldComplete && !ReportSlot.ReportComplete); public CellInfoScheduler() { @@ -77,7 +101,7 @@ namespace ILSOS_CCW_H52A.Data Add(no, new JigInfo()); } - // 1-based jigNo (_WeldingJigNo 등) → 0-based eJigNo 변환 의의 인덱서 + // 1-based jigNo (_WeldingJigNo 등) → 0-based eJigNo 변환 인덱서 public JigInfo this[int jigNo] { get => base[(eJigNo)(jigNo - 1)]; } @@ -85,15 +109,25 @@ namespace ILSOS_CCW_H52A.Data // Reset() 전에 호출 — 미완료 보고 및 미용접 슬롯을 보존. public void SavePendingComplete() { - // 용접 완료됐으나 보고 전 정지된 경우 (_pendingSlot) + // ReportSlot: LBAD 수신 완료 상태, 보고만 남은 셀 + if (ReportSlot != null + && ReportSlot.IsCanExist + && ReportSlot.WeldComplete + && !ReportSlot.ReportComplete) + _pendingFromReportSlot.CopyFrom(ReportSlot); + else + _pendingFromReportSlot.Clear(); + + // Complete: 용접 완료, ReportSlot 진입 전 정지 (LBAD 도착 여부 불확실) if (Complete != null && Complete.IsCanExist && Complete.WeldComplete && !Complete.ReportComplete) - _pendingSlot.CopyFrom(Complete); + _pendingFromComplete.CopyFrom(Complete); + else + _pendingFromComplete.Clear(); // 업로드 완료됐으나 로터리 정지로 용접 자체가 안 된 경우 (_pendingPrefetch1/2) - // (연속셀이 들어왔을때, 중간에 멈춘 경우) if (Prefetch1 != null && Prefetch1.IsCanExist && !string.IsNullOrEmpty(Prefetch1.CellId) @@ -136,51 +170,79 @@ namespace ILSOS_CCW_H52A.Data return false; } - // 보고 완료 처리 — Complete 마킹 및 _pendingSlot 클리어. - // GetReportCellResult_SeqResult 성공 시 호출. + /// + /// LBAD MES Report 수신 시 CellId로 파이프라인 슬롯을 찾아 LbadAvg를 저장. + /// 정상 경로: Complete 단계에서 수신 (~100ms 후). + /// 폴백: Shift 타이밍이 빠른 경우 ReportSlot에도 확인. + /// + public bool TrySetLbadAvg(string cellId, double avg) + { + if (Complete != null && Complete.CellId == cellId) { + Complete.LbadAvg = avg; + return true; + } + if (ReportSlot != null && ReportSlot.CellId == cellId) { + ReportSlot.LbadAvg = avg; + return true; + } + return false; + } + + // 보고 완료 처리. + // 정상 경로: ReportSlot.ReportComplete = true + // 재시작 경로: _pendingFromReportSlot 또는 _pendingFromComplete 클리어 public void CompleteReport() { var reported = ActiveReportSlot; _log.I($"Report >> CellId({reported?.CellId}), JigNo({reported?.JigNo})"); - Complete?.SetReportComplete(true); // 정상 보고 마킹 (pending 경로면 no-op) - _pendingSlot.Clear(); // 재시작 보존 슬롯 항상 클리어 + + if (_pendingFromReportSlot.IsCanExist && !_pendingFromReportSlot.ReportComplete) + _pendingFromReportSlot.Clear(); + else if (_pendingFromComplete.IsCanExist && !_pendingFromComplete.ReportComplete) + _pendingFromComplete.Clear(); + else + ReportSlot?.SetReportComplete(true); } /// - /// 3단계 파이프라인 전진. GC 할당 없음. - /// Complete ← Prefetch1 ← Prefetch2 ← this[nextJig] (Clear) + /// 4단계 파이프라인 전진. GC 할당 없음. + /// ReportSlot ← Complete ← Prefetch1 ← Prefetch2 ← this[nextJig] (Clear) /// 새 Prefetch2 슬롯은 Clear 후 반환 — 호출자가 셀 정보를 채워야 한다. /// public void Shift(eJigNo nextJig) { - Complete = Prefetch1; // Prefetch1 → Complete - Prefetch1 = Prefetch2; // Prefetch2 → Prefetch1 (volatile write: release fence) - Prefetch2 = base[nextJig]; + ReportSlot = Complete; // Complete → ReportSlot + Complete = Prefetch1; // Prefetch1 → Complete + Prefetch1 = Prefetch2; // Prefetch2 → Prefetch1 (volatile write: release fence) + Prefetch2 = base[nextJig]; Prefetch2.Clear(); } // AutoRun에서 사용되는 자료형으로 추가 (편의 인덱서 사용) public void Shift(int nextJig) { - Complete = Prefetch1; // Prefetch1 → Complete - Prefetch1 = Prefetch2; // Prefetch2 → Prefetch1 (volatile write: release fence) - Prefetch2 = this[nextJig]; + ReportSlot = Complete; // Complete → ReportSlot + Complete = Prefetch1; // Prefetch1 → Complete + Prefetch1 = Prefetch2; // Prefetch2 → Prefetch1 (volatile write: release fence) + Prefetch2 = this[nextJig]; Prefetch2.Clear(); } /// /// 전체 초기화 (AutoRun 시작 시 호출). /// SavePendingComplete() 호출 후 이 메서드를 호출할 것. - /// _pendingSlot / _pendingPrefetch1 / _pendingPrefetch2 는 재시작 복원을 위해 건드리지 않음. + /// pending 슬롯들은 재시작 복원을 위해 건드리지 않음. /// public void Reset() { foreach (var info in Values) info.Clear(); - Prefetch2 = null; - Prefetch1 = null; - Complete = null; - // _pendingSlot, _pendingPrefetch1/2: SavePendingComplete()가 복사해 둔 데이터를 유지 + Prefetch2 = null; + Prefetch1 = null; + Complete = null; + ReportSlot = null; + // _pendingFromReportSlot, _pendingFromComplete, _pendingPrefetch1/2: + // SavePendingComplete()가 복사해 둔 데이터를 유지 } /// diff --git a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs index 0fdacb3..cd8ea21 100644 --- a/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs +++ b/Machines/ILSOS_CCW_H52A/Datas/JigInfo.cs @@ -27,6 +27,9 @@ namespace ILSOS_CCW_H52A.Data public string LotId; public string CellId; + // LBAD MES Report 수신 값 — Complete 단계에서 콜백으로 채워짐, ReportSlot 단계에서 보고에 사용 + public double LbadAvg; + // --- 플래그 --- public bool CheckSendCellinfo; public bool ReportComplete; @@ -60,6 +63,7 @@ namespace ILSOS_CCW_H52A.Data WeldingSpanTime = src.WeldingSpanTime; LotId = src.LotId; CellId = src.CellId; + LbadAvg = src.LbadAvg; CheckSendCellinfo = src.CheckSendCellinfo; ReportComplete = src.ReportComplete; UpdateCellInfo(src.InnerCellInfo); @@ -85,6 +89,7 @@ namespace ILSOS_CCW_H52A.Data LotId = string.Empty; CellId = string.Empty; + LbadAvg = 0.0; CheckSendCellinfo = false; ReportComplete = false; diff --git a/Machines/ILSOS_CCW_H52A/Sequences/ProcessObjects/ProcessManager.cs b/Machines/ILSOS_CCW_H52A/Sequences/ProcessObjects/ProcessManager.cs index be0a631..2a7da18 100644 --- a/Machines/ILSOS_CCW_H52A/Sequences/ProcessObjects/ProcessManager.cs +++ b/Machines/ILSOS_CCW_H52A/Sequences/ProcessObjects/ProcessManager.cs @@ -70,6 +70,23 @@ namespace ILSOS_CCW_H52A.Sequences.ProcessObjects cellScheduler = new CellInfoScheduler(); } + /// + /// LBAD MES Report 수신 콜백을 등록. + /// InitDev에서 StreamLightLBAD 생성 후 호출. + /// + public void RegisterLbadStream(AuroraLBAD.Service.StreamLightLBAD lbad) + { + lbad.MesReportReceived += OnLbadMesReportReceived; + } + + private void OnLbadMesReportReceived(string lotId, string cellId, int headNum, double avg) + { + if (cellScheduler.TrySetLbadAvg(cellId, avg)) + _log.I($"[LBAD] AVG 저장 >> CellId({cellId}) HeadNum({headNum}) AVG({avg:F3})"); + else + _log.W($"[LBAD] 매칭 슬롯 없음 >> CellId({cellId}) HeadNum({headNum}) AVG({avg:F3})"); + } + private void OnCellReceived(string lotId, string cellId) { lotId = lotId.Replace("\0", "").Trim(); diff --git a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs index 696ecc6..722838b 100644 --- a/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs +++ b/Machines/ILSOS_CCW_H52A/Sequences/SeqAutoRunCCWH52A.cs @@ -308,6 +308,7 @@ namespace ILSOS_CCW_H52A.Sequences _StreamLightLBAD = new StreamLightLBAD(); _StreamLightLBAD._Client = context.GetStreamLightClient(); _StreamLightLBAD._Sub = context.GetStreamLightSub(); + ProcessManager.Instance.RegisterLbadStream(_StreamLightLBAD); } _CellTracker = context.GetCellTracker(); _PLC = context.Devices[DeviceIds.PLCDevice] as PLCControllerCCWH52A; @@ -1031,8 +1032,12 @@ namespace ILSOS_CCW_H52A.Sequences string strDate = DateTime.Now.Date.ToString("yyyyMMdd"); string strTime = DateTime.Now.ToString("HHmmss"); - // 셀 식별 정보는 스케줄러 슬롯에서 직접 읽음 (Complete 또는 pendingSlot) + // 셀 식별 정보 + 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) + Log.W($"[LBAD] ReportSlot LbadAvg 미수신 >> CellId({report.CellId})"); // 레시피·장비 계측값은 Status에서 읽음 (TodayProduct/TotalProduct 포함) var wd = Status.GetProcessingWeldingData(); @@ -1060,17 +1065,17 @@ namespace ILSOS_CCW_H52A.Sequences equipName + "DATA009={12}", strDate, strTime, report.LotId, report.CellId, report.InnerCellInfo.RecipeNo, report.InnerCellInfo.LaserPowerCore, report.InnerCellInfo.MarkSpeed, report.InnerCellInfo.FocalLength, - report.JigNo, report.WeldingSpanTime.TotalMilliseconds.ToString(), wd.LaserPowerByLBAD, + report.JigNo, report.WeldingSpanTime.TotalMilliseconds.ToString(), lbadAvg, wd.TodayProduct, wd.TotalProduct); _CellTracker.SendEcsData(report.CellId, strPath, strData + ""); - Log.I($"Report to CellTracker >> [LotID({report.LotId})] [CellID({report.CellId})]"); + Log.I($"Report to CellTracker >> [LotID({report.LotId})] [CellID({report.CellId})] [LbadAvg({lbadAvg})]"); // 로컬 CSV 저장 string strItem = "//Date, Time, LotID, CellID, RecipeNo, LaserPower, MarkSpeed, FocalLength, HeadNo, WeldingTime, LaserPowerByLBAD, TodayCount, TotalCount"; string strCsvData = string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}", strDate, strTime, report.LotId, report.CellId, report.InnerCellInfo.RecipeNo, report.InnerCellInfo.LaserPowerCore, report.InnerCellInfo.MarkSpeed, report.InnerCellInfo.FocalLength, - report.JigNo, report.WeldingSpanTime.TotalMilliseconds.ToString(), wd.LaserPowerByLBAD, + report.JigNo, report.WeldingSpanTime.TotalMilliseconds.ToString(), lbadAvg, wd.TodayProduct, wd.TotalProduct); WeldingCommon.Utils.ExcelManagementUnit.AppendStringInCSV(strPath, strItem, strCsvData);