원복 코드 -> 레이저 출사 X

기존 코드에서 완료 플래그 초기화 추가 및 왕복 스테이지 동작으로 변경
This commit is contained in:
RnD_Welder 2026-04-17 13:50:08 +09:00
parent e98384906b
commit a7bec5220d
2 changed files with 112 additions and 14 deletions

View File

@ -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");

View File

@ -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)
{