개요
Sirius3 라이브러리를 이용하여 간단한 프로젝트를 진행하는 튜토리얼 입니다.
금속 제품을 생산하는 업체에서 재고 관리를 위해 일련번호를 각인하는 프로그램을 Sirius3 라이브러리를 이용해서 제작하는 과정을 설명합니다.
Visual Studio 2022 로 튜토리얼을 진행합니다.
프로젝트 생성
Visual Studio 2022 이상 버전을 실행하고 새 프로젝트를 선택합니다.

새 프로젝트 만들기를 선택하면 다음과 같은 화면이 나타나는데 Windows Forms 앱을 선택합니다.

다음 화면이 나타나면 적당한 이름과 위치를 입력하고 다음 버튼을 클릭합니다.

다음 화면이 나타나면 프레임워크 항목을 .NET 8.0 을 선택하고 만들기 버튼을 클릭합니다. 만일 .NET 8.0 이 설치되어 있지 않으면 이곳에서 다운로드 하여 설치하시면 됩니다.

잠시 후 Form 편집 화면이 나타납니다.
Nuget 패키지 설치
프로젝트 > NuGet 패키지 관리 메뉴를 선택합니다. NuGet 패키지 관리자 화면이 나타나면 찾아보기 탭을 클릭합니다. 다음의 패키지를 검색해서 설치합니다 (SpiralLab.Sirius3 로 검색). 버전 번호는 업데이트 상황에 다를 수 있습니다. 최신 버전 사용을 권장합니다. 이 튜토리얼은 1.7.1 버전 기준입니다.
- SpiralLab.Sirius3.Dependencies
- SpiralLab.Sirius3
- SpiralLab.Sirius3.UI


UI 디자인
다음과 같이 SiriusEditorControl 과 작업에 필요한 Control 을 Form 에 추가합니다.

생산되는 제품을 선택하고 시작 번호, 끝 번호, 시간 간격을 입력하고 제품 별 일련번호를 각인하는 시나리오로 Form을 구성하였습니다. 프로그램이 실행되면 하단에 로그 영역이 나타나고 진행되는 정보를 출력해서 현재 상황을 파악할 수 있도록 했습니다.
코드 입력
Form Load 이벤트 코드를 다음과 같이 입력합니다.
bool isSimulateStop = false;
private void Form1_Load(object sender, EventArgs e)
{
comboBoxProduct.SelectedIndex = 0;
//Initialize
Core.Initialize();
// Create devices and initialize them, then register to editor control
bool success = true;
// Scanner control
string correctionFile = "cor_1to1.ct5";
string correctionPath = Path.Combine(Config.CorrectionPath, correctionFile);
var fov = 100.0;
var kfactor = Math.Pow(2, 20) / fov;
var index = 0;
var rtc = ScannerFactory.CreateRtc5(index, kfactor, LaserModes.Yag1, RtcSignalLevels.ActiveHigh, RtcSignalLevels.ActiveHigh, correctionPath);
success &= rtc.Initialize();
rtc.CtlFrequency(50 * 1000, 2);
rtc.CtlSpeed(100, 100);
// DIO control
var dIExt1 = IOFactory.CreateInputExtension1(rtc); success &= dIExt1.Initialize();
var dOExt1 = IOFactory.CreateOutputExtension1(rtc); success &= dOExt1.Initialize();
var dOExt2 = IOFactory.CreateOutputExtension2(rtc); success &= dOExt2.Initialize();
var dILaserPort = IOFactory.CreateInputLaserPort(rtc); success &= dILaserPort.Initialize();
var dOLaserPort = IOFactory.CreateOutputLaserPort(rtc); success &= dOLaserPort.Initialize();
// Powermeter control
double laserMaxPower = 20;
var powerMeter = PowerMeterFactory.CreateVirtual(index, laserMaxPower);
success &= powerMeter.Initialize();
// Laser control
var laser = LaserFactory.CreateVirtualDutyCycle(index, laserMaxPower, 0, 100);
success &= laser.Initialize();
laser.Scanner = rtc;
// Powermap
var powerMap = PowerMapFactory.CreateDefault(index, "default");
powerMap.Reset1to1("10000", laserMaxPower);
laser.PowerMap = powerMap;
// Marker
var marker = MarkerFactory.CreateRtc(index);
success &= marker.Initialize();
Debug.Assert(success);
// Register devices
siriusEditorControl1.RegisterDevices(rtc, laser, powerMeter, dIExt1, dILaserPort, dOExt1, dOExt2, dOLaserPort, marker);
siriusEditorControl1.ShowLogWindow(true);
marker.Ready(siriusEditorControl1.Document, siriusEditorControl1.View, rtc, laser, powerMeter);
}
1행에 지역 변수를 선언합니다. 8행부터 48행 까지 실제 연결된 장비를 초기화하는 코드입니다.
55행은 부분은 하단에 로그 영역이 나타나도록 하는 코드 입니다.
Start 버튼의 이벤트 코드를 다음과 같이 입력합니다.
private async void buttonStart_Click(object sender, EventArgs e)
{
isSimulateStop = false;
var document = siriusEditorControl1.Document;
document.ActNew();
var interval = Convert.ToInt32(textBoxInterval.Text) * 1000;
buttonStart.Enabled = false;
buttonStop.Enabled = true;
var processCount = 0;
for (int i = Convert.ToInt32(textBoxStartNumber.Text); i <= Convert.ToInt32(textBoxEndNumber.Text); i++)
{
if (isSimulateStop) { break; }
var entity = new EntitySiriusText("ocra.cxf", EntitySiriusText.LetterSpaces.Variable, 0.2, 0.5, 1, "", 2);
document.ActivePage?.ActiveLayer?.AddChild(entity);
processCount++;
Logger.Log(LogLevel.Information, $"Process {processCount} started.");
var markingText = comboBoxProduct.Text + "-" + i.ToString("D2");
entity.SourceText = markingText;
siriusEditorControl1?.View?.DoRender();
document.ActSelect(entity);
var entities = new IEntity[1] { entity };
if (checkBoxIsSimulation.Checked)
{
await siriusEditorControl1.View.Document.ActSimulateStart(siriusEditorControl1.View, entities, siriusEditorControl1.Marker, SpiralLab.Sirius3.Document.IDocument.SimulationSpeeds.Fast);
}
else
{
await siriusEditorControl1.Marker.Start();
}
Logger.Log(LogLevel.Information, $"Process {processCount} completed.");
document.ActivePage?.ActiveLayer?.RemoveChild(0, out IEntity entityItem);
if (i < Convert.ToInt32(textBoxEndNumber.Text) && !isSimulateStop)
{
Logger.Log(LogLevel.Information, $"Waiting {textBoxInterval.Text} seconds.");
await Task.Delay(interval);
}
}
if (!isSimulateStop)
{
Logger.Log(LogLevel.Information, "All processes done.");
buttonStart.Enabled = true;
buttonStop.Enabled = false;
}
}
1행에서 메소드를 비동기로 표시 합니다.
18행은 EntitySiriusText 개체를 생성해서 변수에 할당하는 코드 입니다.
19행은 현재 활성화된 페이지의 레이어에 18행에서 생성된 개체를 자식으로 추가하는 코드 입니다.
27행은 추가된 EntitySiriusText 개체를 선택하는 코드 입니다.
31행 부터 38행까지 시뮬레이션 체크 여부에 따라 각인을 실행하는 코드입니다.
Stop 버튼의 이벤트 코드를 다음과 같이 입력합니다.
private async void buttonStop_Click(object sender, EventArgs e)
{
if (checkBoxIsSimulation.Checked)
{
siriusEditorControl1?.View?.Document.ActSimulateStop();
}
else
{
await siriusEditorControl1.Marker.Stop();
}
buttonStart.Enabled = true;
buttonStop.Enabled = false;
isSimulateStop = true;
Logger.Log(LogLevel.Information, "Process stopped.");
}
Form Closing 이벤트 코드를 다음과 같이 입력합니다.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Dispose devices
siriusEditorControl1.DisposeDevices();
var doc = siriusEditorControl1.Document;
siriusEditorControl1.Document = null;
doc?.Dispose();
// Clean-up sirius3 library
SpiralLab.Sirius3.Core.Cleanup();
}
Simulation 을 체크하고 Start 버튼을 클릭하면 다음과 같이 각인 시뮬레이션이 진행됩니다.

프로젝트 파일 : SerialMarking.zip