시리우스 라이브러리 시작하기

Visual Studio 에서 이 시리우스 라이브러리를 사용하기 위해서는 Git 저장소에서 다운로드 받은 후 중요 dll 파일이 반드시 필요합니다. bin 폴더에 있는 3개의 dll 파일을 신규 프로젝트에 참조(add reference) 되도록 지정해 주시기 바랍니다. (spirallab.core.dll, spirallab.sirius.dll, spirallab.sirius.rtc.dll, spirallab.sirius.fieldcororection.dll)

1. RTC5 와 레이저 소스 객체를 만들어 선분, 원, 사각형, 점 그리고 레스터(Pixel) 모양 가공하기

static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    var rtc = new Rtc5(0); //create Rtc5 controller
    float fov = 60.0f;    // scanner field of view : 60mm            
    float kfactor = (float)Math.Pow(2, 20) / fov; // k factor (bits/mm) = 2^20 / fov
    var correctionFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "correction", "cor_1to1.ct5");
    rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile);    
    rtc.CtlFrequency(50 * 1000, 2); // laser frequency : 50KHz, pulse width : 2usec
    rtc.CtlSpeed(100, 100); // default jump and mark speed : 100mm/s
    rtc.CtlDelay(10, 100, 200, 200, 0); // scanner and laser delays
    varlaser = new LaserVirtual(0, "virtual", 20);  // 최대 출력 20W 의 가상 레이저 소스 생성
    ConsoleKeyInfo key;
    do
    {
        Console.WriteLine("Testcase for spirallab.sirius.");
        Console.WriteLine("");
        Console.WriteLine("'S' : get status");
        Console.WriteLine("'L' : draw line");
        Console.WriteLine("'C' : draw circle");
        Console.WriteLine("'R' : draw rectangle");
        Console.WriteLine("'D' : draw circle with dots");
        Console.WriteLine("'P' : draw square area with pixel operation");
        Console.WriteLine("'Q' : quit");
        Console.WriteLine("");
        Console.Write("select your target : ");
        key = Console.ReadKey(false);
        Console.WriteLine("");
        if (key.Key == ConsoleKey.Q)
            break;
        var timer = Stopwatch.StartNew();
        switch (key.Key)
        {
            case ConsoleKey.S:  //RTC의 상태 확인
                if (rtc.CtlGetStatus(RtcStatus.Busy))
                    Console.WriteLine($"\r\nRtc is busy!");
                else if (!rtc.CtlGetStatus(RtcStatus.PowerOK))
                    Console.WriteLine($"\r\nScanner power is not ok");
                else if (!rtc.CtlGetStatus(RtcStatus.PositionAckOK))
                    Console.WriteLine($"\r\nScanner position is not acked");
                else if (!rtc.CtlGetStatus(RtcStatus.NoError))
                    Console.WriteLine($"\r\nRtc status has an error");
                else
                    Console.WriteLine($"\r\nIt's okay");
                break;
            case ConsoleKey.L:  // 선 모양 가공
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                DrawLine(laser, rtc, -10,-10, 10, 10);
                break;
            case ConsoleKey.C:  // 원 모양 가공
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                DrawCircle(laser, rtc, 10);
                break;
            case ConsoleKey.R:  // 사각형 모양 가공
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                DrawRectangle(laser, rtc, 10, 10);
                break;
            case ConsoleKey.D:  //점으로 이루어진 원 모양 가공
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                DrawCircleWithDots(laser, rtc, 10, 1.0f);
                break;
            case ConsoleKey.P:  // 픽셀 이루어진 사각 모양 가공
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                DrawSquareAreaWithPixels(laser, rtc, 10, 0.2f);
                break;
        }
        Console.WriteLine($"Processing time = {timer.ElapsedMilliseconds/1000.0:F3}s");     
    } while (true);
    rtc.Dispose();
}        
private static void DrawCircle(ILaser laser, IRtc rtc, float radius)
{
    rtc.ListBegin(laser);
    rtc.ListJump(radius, 0);
    rtc.ListArc(0, 0, 360.0f);
    rtc.ListEnd();
    rtc.ListExecute(true);
}
private static void DrawLine(ILaser laser, IRtc rtc, float x1, float y1, float x2, float y2)
{
    rtc.ListBegin(laser);
    rtc.ListJump(x1, y1);
    rtc.ListMark(x2, y2);
    rtc.ListEnd();
    rtc.ListExecute(true);
}
private static void DrawRectangle(ILaser laser, IRtc rtc, float width, float height)
{
    rtc.ListBegin(laser);
    rtc.ListJump(-width / 2, height / 2);
    rtc.ListMark(width / 2, height / 2);
    rtc.ListMark(width / 2, -height / 2);
    rtc.ListMark(-width / 2, -height / 2);
    rtc.ListMark(-width / 2, height / 2);
    rtc.ListEnd();
    rtc.ListExecute(true);
}
private static void DrawCircleWithDots(ILaser laser, IRtc rtc, float radius, float durationMsec)
{
    rtc.ListBegin(laser);
    for (float angle =0; angle<360; angle+=1)
    {
        double x = radius * Math.Sin(angle * Math.PI / 180.0);
        double y = radius * Math.Cos(angle * Math.PI / 180.0);
        rtc.ListJump((float)x, (float)y);
        //지정된 짧은 시간동안 레이저 출사
        rtc.ListLaserOn(durationMsec);                
    }            
    rtc.ListEnd();
    rtc.ListExecute(true);
}
private static void DrawSquareAreaWithPixels(ILaser laser, IRtc rtc, float size, float gap)
{
    // pixel operation 은 IRtcExtension 인터페이스에서 제공
    var rtcExt = rtc as IRtcExtension;
    if (null == rtcExt)
        return;
    int counts = (int)(size / gap);
    rtc.ListBegin(laser);
    for (int i=0; i< counts; i++)
    {
        //줄의 시작위치로 점프
        rtc.ListJump(0, i * gap);
        // pixel의 최대 주기시간 (200us), 출력 채널(analog 1), 간격, 총 pixel 개수
        rtcExt.ListPixelLine(200, ExtensionChannel.ExtAO1, new Vector2(gap, 0), (uint)counts);
        for (int j = 0; j < counts; j++)
            rtcExt.ListPixel(20, 5); // 20usec, 5V
    }
    rtc.ListEnd();
    rtc.ListExecute(true);
}

주의1) 64bit 사용시에는 bin\x64 폴더의 모든 파일들을 bin\ 폴더로 복사해 주시기 바랍니다. (32bit 사용시에는 bin/x32 의 모든 파일 복사)

주의2) 1.7 버전부터 HPGL(PLT파일) 분석용 라이브러리가 추가되었습니다. spirallab.hpglx64.dll / spirallab.hpgl.dll 파일

주의3) Visual Studio 로 솔류션 파일을 빌드하기전 NuGet 패키지 복원을 실시해 주시기 바랍니다

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top