From a7bec5220d83909ff2238aabfe8e1d9abb26681b Mon Sep 17 00:00:00 2001 From: RnD_Welder Date: Fri, 17 Apr 2026 13:50:08 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9B=90=EB=B3=B5=20=EC=BD=94=EB=93=9C=20->=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=A0=80=20=EC=B6=9C=EC=82=AC=20X=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20=EC=BD=94=EB=93=9C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=ED=94=8C=EB=9E=98=EA=B7=B8=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=99=95?= =?UTF-8?q?=EB=B3=B5=20=EC=8A=A4=ED=85=8C=EC=9D=B4=EC=A7=80=20=EB=8F=99?= =?UTF-8?q?=EC=9E=91=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sequences/SeqAutoRunPrismaticScanner.cs | 112 +++++++++++++++--- .../WeldingCommon/Devices/ACS/ScannerACS.cs | 14 +++ 2 files changed, 112 insertions(+), 14 deletions(-) diff --git a/Machines/ILSOS_PrismaticScanner/Sequences/SeqAutoRunPrismaticScanner.cs b/Machines/ILSOS_PrismaticScanner/Sequences/SeqAutoRunPrismaticScanner.cs index 60c59c8..d5afd01 100644 --- a/Machines/ILSOS_PrismaticScanner/Sequences/SeqAutoRunPrismaticScanner.cs +++ b/Machines/ILSOS_PrismaticScanner/Sequences/SeqAutoRunPrismaticScanner.cs @@ -304,7 +304,7 @@ namespace ILSOS_PrismaticScanner.Sequences var mainPage = CommonHelper.GetMainPage(); _ScannerCanvasUserCtrl = mainPage.ScannerCanvasCtrlTeaching; _WeldingScannerListNo = eListNo.LIST1; - _SelectedObjectList = FindObjects(); + //_SelectedObjectList = FindObjects(); // 중복 주석 처리 260417 //Vision Correction File 선택 _Scanner.SelectCorrectionTable(2); @@ -381,13 +381,15 @@ namespace ILSOS_PrismaticScanner.Sequences { Status.SetWorkingPosition(eWorkingPosition.UPLOADING_WELD_LIST); + bool _isUseInitParam = _InitParam == null ? false : true; + // TeachingRun에는 용접 시퀀스만 정의해서 Auto Run에서도 사용하므로 Offset 넣어줘야 함 SeqUploadWeldingList_InitParam seqParams = new SeqUploadWeldingList_InitParam() { - NeedSetLaserTiming = _InitParam.NeedSetLaserTiming, + NeedSetLaserTiming = _isUseInitParam ? _InitParam.NeedSetLaserTiming : true, IncludeListStartEnd = false, - CellMeasureCenterOffsetX = _SystemParameter.CellPosMeasureCenterOffsetX + _InitParam.CellCenterOffsetX, - CellMeasureCenterOffsetY = _SystemParameter.CellPosMeasureCenterOffsetY + _InitParam.CellCenterOffsetY, + CellMeasureCenterOffsetX = _SystemParameter.CellPosMeasureCenterOffsetX + (_isUseInitParam ? _InitParam.CellCenterOffsetX :0), + CellMeasureCenterOffsetY = _SystemParameter.CellPosMeasureCenterOffsetY + (_isUseInitParam ? _InitParam.CellCenterOffsetY : 0), SelectedDrawObjectList = _SelectedObjectList, WeldingScannerListNo = _WeldingScannerListNo, PageNum = _PageNum, @@ -466,27 +468,109 @@ namespace ILSOS_PrismaticScanner.Sequences private SequenceActionResult SetMotion(SequenceContext context, string id, SequenceActionResult param) { - // 메뉴얼 화면에서 셋팅이 필요해보임 - _ACS.SetMOTFParams(0, 0, 0, 0, 0); + #region 디바이스 세팅 값만 가져오기 + var _scannerConfig = _Scanner.Config; + #endregion + Log.I("[SetMotion] 정방향 파라미터 세팅 시작"); + Log.I($"[SetMotion] PosX={_scannerConfig.MarkingStartX_1}, NegX={_scannerConfig.MarkingStartX_2}, Vel={_scannerConfig.MOTFStageSpeed}"); + // 메뉴얼 화면에서 셋팅이 필요해보임 - 출발, 도착, 스피드,rPCset_MOF_WEL_ACC,iPCset_MOF_WEL_MOTION_INTERVAL + + // iMOTFComplete 리셋 + _ACS.ResetMOTFComp(); // 0 으로 바꿔주는 거 다시 추가해줘야함. + + Log.I("[SetMotion] ResetMOTFComp 완료"); + // 정방향 파라미터 세팅 (310 → 640) + bool result = _ACS.SetMOTFParams( + posX: _scannerConfig.MarkingStartX_1, + negX: _scannerConfig.MarkingStartX_2, + velocity: _scannerConfig.MOTFStageSpeed, + acc: 5000, + interval: 100 + ); + + if (!result) { Log.E("[SetMotion] SetMOTFParams 실패"); return null; } + Log.I("[SetMotion] SetMOTFParams 완료"); + _ACS.SetMOTFParams(_scannerConfig.MarkingStartX_1, _scannerConfig.MarkingStartX_2, _scannerConfig.MarkSpeed, 0, 0); return SequenceAction.Ok(); + } private SequenceActionResult StartMotion(SequenceContext context, string id, SequenceActionResult param) { - _ACS.MOTFStart(); - // 모션 동작시키고 바로 확인하면 그냥 빠져나올 것 같음 - var res = context.Wait(1000, 100); - if (res == E2.TIMEOUT) ; - else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; } + #region + //_ACS.MOTFStart(); + //// 모션 동작시키고 바로 확인하면 그냥 빠져나올 것 같음 + //var res = context.Wait(1000, 100); + //if (res == E2.TIMEOUT) {;} + //else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; } - res = context.RetryUntilSuccess(() => _ACS.CheckMOTFComp(), 1000 * 20, 100, true); - if (res == E2.TIMEOUT) { Log.E("[MOTF] Motion TIMEOUT"); return null; } - else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; } + //res = context.RetryUntilSuccess(() => _ACS.CheckMOTFComp(), 1000 * 20, 100, true); + //if (res == E2.TIMEOUT) { Log.E("[MOTF] Motion TIMEOUT"); return null; } + //else if (res == E2.CANCELLED) { Log.E("[MOTF] Motion CANCELLED"); return null; } + + //return SequenceAction.Ok(); + + #endregion + + var config = _Scanner.Config; + + // ── 정방향 실행 (310 → 640) ── + Log.I("[StartMotion] 정방향 MOTFStart 호출"); + _ACS.MOTFStart(); + + // 출발 후 50mm 이동 시간만큼 대기 + // 50mm / velocity(mm/s) * 1000 = ms + int waitMs = (int)((50.0 / config.MOTFStageSpeed) * 1000) + 200; // 여유 200ms + Log.I($"[StartMotion] 정방향 50mm 이동 대기 {waitMs}ms"); + var res = context.Wait(waitMs, 10); + if (res == E2.CANCELLED) { Log.E("[StartMotion] 정방향 50mm 대기 CANCELLED"); return null; } + + // 정방향 완료 대기 + Log.I("[StartMotion] 정방향 CheckMOTFComp 대기 시작"); + res = context.RetryUntilSuccess(() => _ACS.CheckMOTFComp(), 1000 * 30, 100, true); + if (res == E2.TIMEOUT) { Log.E("[StartMotion] 정방향 TIMEOUT"); return null; } + else if (res == E2.CANCELLED) { Log.E("[StartMotion] 정방향 CANCELLED"); return null; } + Log.I("[StartMotion] 정방향 완료"); + + // ── 역방향 세팅 (640 → 310) ── + Log.I("[StartMotion] 역방향 파라미터 세팅 시작"); + _ACS.ResetMOTFComp(); + Log.I("[StartMotion] 역방향 ResetMOTFComp 완료"); + + bool result = _ACS.SetMOTFParams( + posX: config.MarkingStartX_2, // 640 출발 + negX: config.MarkingStartX_1, // 310 도착 + velocity: config.MOTFStageSpeed, + acc: 5000, + interval: 100 + ); + if (!result) { Log.E("[StartMotion] 역방향 SetMOTFParams 실패"); return null; } + Log.I($"[StartMotion] 역방향 SetMOTFParams 완료 | PosX={config.MarkingStartX_2}, NegX={config.MarkingStartX_1}"); + + // ── 역방향 실행 (640 → 310) ── + Log.I("[StartMotion] 역방향 MOTFStart 호출"); + _ACS.MOTFStart(); + + // 출발 후 50mm 이동 대기 + Log.I($"[StartMotion] 역방향 50mm 이동 대기 {waitMs}ms"); + res = context.Wait(waitMs, 10); + if (res == E2.CANCELLED) { Log.E("[StartMotion] 역방향 50mm 대기 CANCELLED"); return null; } + + // 역방향 완료 대기 + Log.I("[StartMotion] 역방향 CheckMOTFComp 대기 시작"); + res = context.RetryUntilSuccess(() => _ACS.CheckMOTFComp(), 1000 * 30, 100, true); + if (res == E2.TIMEOUT) { Log.E("[StartMotion] 역방향 TIMEOUT"); return null; } + else if (res == E2.CANCELLED) { Log.E("[StartMotion] 역방향 CANCELLED"); return null; } + Log.I("[StartMotion] 역방향 완료 → EndWelding 진입"); return SequenceAction.Ok(); + + } private SequenceActionResult EndWelding(SequenceContext context, string id, SequenceActionResult param) { + + _Scanner.WaitForListTaskCompleted(_SystemParameter.WeldLinesTaskTimeOut); Log.I("ExecuteList Complete"); diff --git a/WeldingComponents/WeldingCommon/Devices/ACS/ScannerACS.cs b/WeldingComponents/WeldingCommon/Devices/ACS/ScannerACS.cs index 90a18d0..4973de1 100644 --- a/WeldingComponents/WeldingCommon/Devices/ACS/ScannerACS.cs +++ b/WeldingComponents/WeldingCommon/Devices/ACS/ScannerACS.cs @@ -41,6 +41,7 @@ namespace WeldingCommon.Devices.ACS bool MOTFStart(); bool MOTFStop(); bool CheckMOTFComp(); + bool ResetMOTFComp(); // ← 여기에 추가 BUFFER 17에서 완료에 대한 플래그 리셋 0 으로 하는 것 260417 // OneShot bool SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2); @@ -244,6 +245,19 @@ namespace WeldingCommon.Devices.ACS return ReadVariableInt(iMOTFComplete) > 0; } + // 260417여기 추가 + bool IScannerACS.ResetMOTFComp() + { + if (IsSimul) return true; + if (WriteVariableInt(iMOTFComplete, 0)) + { + Log.I("ResetMOTFComp >> Complete (iPCset_MOF_WEL_COMP = 0)"); + return true; + } + Log.E("ResetMOTFComp >> Fail"); + return false; + } + // ── OneShot ────────────────────────────────────────────────────────── bool IScannerACS.SetOneShot(int msecShotTime, double secPhzShotPulse1, double secPhzShotPulse2) {