SCANahead 데모 프로젝트는 RTC6 를 사용하여 SCANahead 및 SDC 기능을 사용하는 방법을 설명하고 있습니다.

전통적인(Classic) 스캐너는 트레킹 에러 시간(Tracking Error)이 발생합니다. 때문에 위치 오차(실제 위치 – 명령 위치)를 보상하기 위해 스캐너의 점프, 마크, 폴리곤 지연 시간들을 설정하게 됩니다. 반면 SCANahead 를 사용하면 속도에 따른 최적의 스캐너 지연 시간을 선행적으로 자동 연산해 주기 때문에 트레킹 에러 시간이 최소화(0) 됩니다. (다만 선행 연산 시간(PreviewTime: 1.25ms) 만큼의 추가 시간이 필요)
자 그럼 SCANahead 를 사용하는 예제 프로젝트의 코드를 살펴보겠습니다.
var fov = 60.0;
var kfactor = Math.Pow(2, 20) / fov;
var correctionFile = Path.Combine(Config.CorrectionPath, "cor_1to1.ct5");
var rtc = ScannerFactory.CreateRtc6(0, kfactor, LaserMode.Yag5, RtcSignalLevel.ActiveHigh, RtcSignalLevel.ActiveHigh, correctionFile);
rtc.Initialize();
// 50KHz, 2usec
rtc.CtlFrequency(50 * 1000, 2);
// 2000 mm/s
rtc.CtlSpeed(2*1000, 2*100);
Debug.Assert(rtc.IsScanAhead);
// Activate auto delays
rtc.CtlDelayAutoByScanAhead(true);
// Set laser delays
rtc.CtlDelayScanAhead(10, 100);
// excelliSCAN scan head must be connected and load pre-stored parameter from excelliSCAN head.
rtc.CtlAutoDelayParams(AutoDelayParamMode.Load, ScannerHead.Primary, CorrectionTableIndex.Table1);
위의 코드에서는 RTC6 카드를 초기화 합니다. 또한 Auto delay 기능을 활성화 시키고 스캐너 장치에 사전 튜닝된 값들을 가져와 적용 합니다. (RTC6 카드에 SCANahead 옵션 필요, 스캐너 역시 excelliSCAN 혹은 intelliSCAN IV 등의 제품 필수)
또한 가공 품질과 관련된 3가지의 중요 항목이 있습니다. Corner Scale Factor 값은 모너리 부분의 품질을, End Scale Factor 값은 끝 부분의 품질을, 그리고 Acc Scale Factor 값은 가감속 구간의 품질을 결정하는 요소로 사용할 수 있습니다. 자세한 효과는 아래 이미지를 참고해 주시기 바랍니다.


자 그럼 다음과 같이 3가지 값을 설정합니다.
// Line quality scale factor
rtc.ScanAheadLineParamsCornerScale = 100;
rtc.ScanAheadLineParamsEndScale = 100;
rtc.ScanAheadLineParamsAccScale = 0;
여기에서는 가상의 레이저 소스 객체를 생성하여 테스트합니다.
var laser = LaserFactory.CreateVirtual(0, 20);
laser.Scanner = rtc;
laser.Initialize();
laser.CtlPower(2);
SDC (Spot Distance Control) 기능 역시 활성화가 가능합니다. 아래와 같이 ALC(Automatic Laser Control) 신호에서 SpotDistance 항목을 선택하고, ActualVelocityWithSCANAhead 모드를 조합해줍니다. 또한 거리(Distance)값을 100% 인자 항목으로 지정해 줍니다.
// SDC(Spot Distance Control) on
double sdcDistance = 0.1;
rtcAlc.CtlAlc<double>(AutoLaserControlSignal.SpotDistance, AutoLaserControlMode.ActualVelocityWithSCANAhead, sdcDistance);
DrawRectangle(laser, rtc, 10, 10);
// SDC(Spot Distance Control) off
rtcAlc.CtlAlc<double>(AutoLaserControlSignal.Disabled, AutoLaserControlMode.Disabled);
DrawRectangle(laser, rtc, 10, 10);
private static bool DrawRectangle(ILaser laser, IRtc rtc, float width, float height)
{
if (rtc.CtlGetStatus(RtcStatus.Busy))
return false;
Console.WriteLine("WARNING !!! LASER IS BUSY ... DrawRectangle");
bool success = true;
success &= rtc.ListBegin();
success &= rtc.ListJumpTo(new System.Numerics.Vector2(-width / 2, height / 2));
success &= rtc.ListMarkTo(new System.Numerics.Vector2(width / 2, height / 2));
success &= rtc.ListMarkTo(new System.Numerics.Vector2(width / 2, -height / 2));
success &= rtc.ListMarkTo(new System.Numerics.Vector2(-width / 2, -height / 2));
success &= rtc.ListMarkTo(new System.Numerics.Vector2(-width / 2, height / 2));
success &= rtc.ListEnd();
if (success)
success &= rtc.ListExecute(true);
return success;
}
위와 같이 SDC(Spot Distance Control) 기능을 On/Off 하여 각각의 품질을 비교해 볼 수 있습니다.
위에서 살펴본 방식은 함수 호출을 사용한 방식이고, 에디터에서는 아래와 같은 방식으로 손쉽게 설정하여 사용이 가능합니다.

