fix: 페이지 핸드셰이크 ACK 정정 + Auto OFF 시 에코워드 조건부 초기화
- 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 <noreply@anthropic.com>
This commit is contained in:
parent
159eda2d4d
commit
dd4f087e95
@ -91,6 +91,23 @@ namespace WeldingCommon.Sequences
|
|||||||
context.EventPublisher.Publish(new EventMessage("SeqStatusMonitor", CommonEventIds.EVENT_RESET_ALL_ALARMS_REQUEST));
|
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);
|
Thread.Sleep(NODE_SLEEP);
|
||||||
return SequenceAction.Ok();
|
return SequenceAction.Ok();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -518,8 +518,11 @@ namespace ILSOS_PrismaticRD_PTOP.Sequences
|
|||||||
//MessageUtil.ShowErrorToast($"WriteWord -> {plcPageNo}");
|
//MessageUtil.ShowErrorToast($"WriteWord -> {plcPageNo}");
|
||||||
//Thread.Sleep(1000);
|
//Thread.Sleep(1000);
|
||||||
|
|
||||||
_PLC.WriteBit(eBitOutput.PC_PAGE_CHANGE_COMPLETE, false);
|
// 에코한 PC_PAGE_NO(plcPageNo)와 현재 PLC_PAGE_NO 비교 → 같으면 ACK ON, 다르면 OFF
|
||||||
Log.I("[CheckPageNoComp] Set PC_PAGE_CHANGE_COMPLETE false");
|
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);
|
//Thread.Sleep(5);
|
||||||
|
|
||||||
// UI 페이지 업데이트 알림
|
// UI 페이지 업데이트 알림
|
||||||
@ -753,14 +756,14 @@ namespace ILSOS_PrismaticRD_PTOP.Sequences
|
|||||||
|
|
||||||
Status.GetProcessingWeldingData().WeldingEndTime = DateTime.Now;
|
Status.GetProcessingWeldingData().WeldingEndTime = DateTime.Now;
|
||||||
|
|
||||||
if (_CurrentPageNo == 1)
|
//if (_CurrentPageNo == 1)
|
||||||
{
|
//{
|
||||||
Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}"));
|
// Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}"));
|
||||||
}
|
//}
|
||||||
else
|
//else
|
||||||
{
|
//{
|
||||||
Log.D(string.Format($"[ExecuteWelding] -->(Wedling TackTime) {_CurrentPageNo} Welding Complete Time : {_WeldingSpanTime.TotalMilliseconds}"));
|
// 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($"[ExecuteWelding] JumpAbs + SelectCorrectionTable Time: {_WeldingSpanTime.TotalMilliseconds}ms");
|
||||||
Log.D(string.Format($"[ExecuteWelding] Change SelectCorrectionTable Time : {_WeldingSpanTime.TotalMilliseconds}"));
|
Log.D(string.Format($"[ExecuteWelding] Change SelectCorrectionTable Time : {_WeldingSpanTime.TotalMilliseconds}"));
|
||||||
|
|
||||||
|
Thread.Sleep(50);
|
||||||
// 양극(P) 미사용 → 모든 페이지 음극 완료 비트로 응답
|
// 양극(P) 미사용 → 모든 페이지 음극 완료 비트로 응답
|
||||||
_PLC.WriteBit((int)eBitOutput.PC_WELD_TRIGGER_ACK, false);
|
_PLC.WriteBit((int)eBitOutput.PC_WELD_TRIGGER_ACK, false);
|
||||||
Log.I($"[ExecuteWelding] 용접완료 송신 - READY_ACK=false (PageNo:{plcPageNo})");
|
Log.I($"[ExecuteWelding] 용접완료 송신 - READY_ACK=false (PageNo:{plcPageNo})");
|
||||||
Thread.Sleep(5);
|
Thread.Sleep(50);
|
||||||
_PLC.WriteBit((int)eBitOutput.PC_WELD_BUSY, false);
|
_PLC.WriteBit((int)eBitOutput.PC_WELD_BUSY, false);
|
||||||
Log.I($"[ExecuteWelding] 용접완료 송신 - BUSY=false (PageNo:{plcPageNo})");
|
Log.I($"[ExecuteWelding] 용접완료 송신 - BUSY=false (PageNo:{plcPageNo})");
|
||||||
Thread.Sleep(5);
|
Thread.Sleep(50);
|
||||||
_PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE, true);
|
_PLC.WriteBit((int)eBitOutput.PC_WELD_COMPLETE, true);
|
||||||
Log.I($"[ExecuteWelding] 용접완료 송신 - COMPLETE=true (PageNo:{plcPageNo})");
|
Log.I($"[ExecuteWelding] 용접완료 송신 - COMPLETE=true (PageNo:{plcPageNo})");
|
||||||
Thread.Sleep(5);
|
Thread.Sleep(5);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user