From dd4f087e95c7fa226dda224fceb5d083ff4bd3c5 Mon Sep 17 00:00:00 2001 From: NohDoyeon241104 Date: Mon, 22 Jun 2026 00:55:27 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=95=B8?= =?UTF-8?q?=EB=93=9C=EC=85=B0=EC=9D=B4=ED=81=AC=20ACK=20=EC=A0=95=EC=A0=95?= =?UTF-8?q?=20+=20Auto=20OFF=20=EC=8B=9C=20=EC=97=90=EC=BD=94=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=A1=B0=EA=B1=B4=EB=B6=80=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CheckPageNoComp: PC_PAGE_NO 에코값과 현재 PLC_PAGE_NO 비교해 일치 시 PC_PAGE_CHANGE_COMPLETE=true, 불일치 시 false (기존 무조건 false) → 동일 Recipe/Page 반복 시 완료 ACK 전달 - SeqStatusMonitor: PLC/PC Auto State OFF 에지 감시 → PC_RECIPE_NO/PC_PAGE_NO 0 초기화. 단 PC Auto OFF는 M70515(Weld_01 Ready) 살아있으면 보존(Resume 시나리오) - ExecuteWelding: 완료비트 송신 간 딜레이 5→50ms 여유 확보 Co-Authored-By: Claude Opus 4.8 --- .../Sequences/Monitoring/SeqStatusMonitor.cs | 17 +++++++++++ .../Sequences/SeqAutoRunPTOP.cs | 29 ++++++++++--------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Machines/ILSOS_PrismaticRD_PTOP/Sequences/Monitoring/SeqStatusMonitor.cs b/Machines/ILSOS_PrismaticRD_PTOP/Sequences/Monitoring/SeqStatusMonitor.cs index f9d5603..5053c43 100644 --- a/Machines/ILSOS_PrismaticRD_PTOP/Sequences/Monitoring/SeqStatusMonitor.cs +++ b/Machines/ILSOS_PrismaticRD_PTOP/Sequences/Monitoring/SeqStatusMonitor.cs @@ -91,6 +91,23 @@ namespace WeldingCommon.Sequences context.EventPublisher.Publish(new EventMessage("SeqStatusMonitor", CommonEventIds.EVENT_RESET_ALL_ALARMS_REQUEST)); } + // ── Auto State OFF 시 에코 워드(PC_RECIPE_NO/PC_PAGE_NO) 0 초기화 ────────────── + // PLC Auto OFF : 무조건 초기화 + // PC Auto OFF : M70515(PLC_WELD_READY_REQ, Weld_01 Ready) 살아있으면 보존(초기화 생략) + bool plcAutoOff = ChangeChecker.IsChangedBoolMonitoring("PlcAutoStateOff", + _plc.ReadBit(PLCControllerPTOP.eBitInput.PLC_AUTO_STATUS).data, false); + bool pcAutoOff = ChangeChecker.IsChangedBoolMonitoring("PcAutoStateOff", + _plc.ReadOutBit(PLCControllerPTOP.eBitOutput.PC_AUTO_STATUS).data, false); + + bool weldReadyAlive = _plc.ReadBit(PLCControllerPTOP.eBitInput.PLC_WELD_READY_REQ).data; // M70515 + + if (plcAutoOff || (pcAutoOff && !weldReadyAlive)) + { + _plc.WriteWord(PLCControllerPTOP.eWordOutput.PC_RECIPE_NO, 0); + _plc.WriteWord(PLCControllerPTOP.eWordOutput.PC_PAGE_NO, 0); + Log.W($"[StatusMonitor] Auto OFF(PLC:{plcAutoOff}/PC:{pcAutoOff}, M70515:{weldReadyAlive}) → PC_RECIPE_NO/PC_PAGE_NO 0 초기화"); + } + Thread.Sleep(NODE_SLEEP); return SequenceAction.Ok(); } diff --git a/Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs b/Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs index d4406bc..11e5342 100644 --- a/Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs +++ b/Machines/ILSOS_PrismaticRD_PTOP/Sequences/SeqAutoRunPTOP.cs @@ -518,8 +518,11 @@ namespace ILSOS_PrismaticRD_PTOP.Sequences //MessageUtil.ShowErrorToast($"WriteWord -> {plcPageNo}"); //Thread.Sleep(1000); - _PLC.WriteBit(eBitOutput.PC_PAGE_CHANGE_COMPLETE, false); - Log.I("[CheckPageNoComp] Set PC_PAGE_CHANGE_COMPLETE false"); + // 에코한 PC_PAGE_NO(plcPageNo)와 현재 PLC_PAGE_NO 비교 → 같으면 ACK ON, 다르면 OFF + short curPlcPageNo = _PLC.ReadWord(eWordInput.PLC_PAGE_NO).data; + bool pageMatched = (plcPageNo == curPlcPageNo); + _PLC.WriteBit(eBitOutput.PC_PAGE_CHANGE_COMPLETE, pageMatched); + Log.I($"[CheckPageNoComp] PC_PAGE_NO({plcPageNo}) == PLC_PAGE_NO({curPlcPageNo}) ? → PC_PAGE_CHANGE_COMPLETE {pageMatched}"); //Thread.Sleep(5); // UI 페이지 업데이트 알림 @@ -753,14 +756,14 @@ namespace ILSOS_PrismaticRD_PTOP.Sequences Status.GetProcessingWeldingData().WeldingEndTime = DateTime.Now; - if (_CurrentPageNo == 1) - { - Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}")); - } - else - { - Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}")); - } + //if (_CurrentPageNo == 1) + //{ + // Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}")); + //} + //else + //{ + // Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}")); + //} @@ -783,14 +786,14 @@ namespace ILSOS_PrismaticRD_PTOP.Sequences Log.D($"[ExecuteWelding] JumpAbs + SelectCorrectionTable Time: {_WeldingSpanTime.TotalMilliseconds}ms"); Log.D(string.Format($"[ExecuteWelding] Change SelectCorrectionTable Time : {_WeldingSpanTime.TotalMilliseconds}")); - + Thread.Sleep(50); // 양극(P) 미사용 → 모든 페이지 음극 완료 비트로 응답 _PLC.WriteBit((int)eBitOutput.PC_WELD_TRIGGER_ACK, false); Log.I($"[ExecuteWelding] 용접완료 송신 - READY_ACK=false (PageNo:{plcPageNo})"); - Thread.Sleep(5); + Thread.Sleep(50); _PLC.WriteBit((int)eBitOutput.PC_WELD_BUSY, false); Log.I($"[ExecuteWelding] 용접완료 송신 - BUSY=false (PageNo:{plcPageNo})"); - Thread.Sleep(5); + Thread.Sleep(50); _PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE, true); Log.I($"[ExecuteWelding] 용접완료 송신 - COMPLETE=true (PageNo:{plcPageNo})"); Thread.Sleep(5);