- 시리우스 에디터(SiriusEditorForm)을 사용하여 MOTF 용 문서 만들기
우선 레이어(Layer)에 레이저 펜(Pen) 개체를 만들어 줍니다. 스캐너의 속도는 외부 입력 엔코더의 속도가 있으므로 이보다는 훨씬 빠르게 가공되도록 적절한 속도값을 설정합니다.

그 다음으로는 위와 같이 MOTF 의 시작과 끝(Begin/End)을 나타내는 개체를 각각 생성해 줍니다.
가공 시작 타이밍은 외부 근접 센서를 이용해 트리거를 발생할 예정입니다. 때문에 리스트 버퍼의 시작은 외부 트리거 신호인 /START 발생시마다 RTC 제어기로 들어가는 누적 엔코더의 개수를 리셋해야 합니다. 때문에 MOTF 의 시작시에는 아래와 같이 Encoder Rest 을 설정했습니다.

엔코더가 리셋된후 실제 가공은 특정 위치가 더 이상하고 마킹이 되길 원할수있습니다. 즉 어떤 지정된 위치(특정 엔코더의 위치)에 도달했을때 HELLO 라는 텍스트 마킹을 원하므로 MOTF Wait 이라는 개체를 추가하였고, 그 위치는 10 mm, 엔코더 축은 X 축, 그리고 이 위치를 넘게 되면 (Over) 발동 되도록 아래와 같이 조건을 삽입할 수 있습니다.

마지막으로 텍스트 개체를 추가하였고, 적당한 해치(Hatch)를 넣었습니다.

이렇게 모든 준비가 끝났습니다. 마지막으로 할 것은 이 가공 데이타 (IDocument)를 마커(IMarker)에 준비(Ready) 시키고, 외부 트리거(/START)에 의해 실행될 것이라는 추가적인 코딩만 진행하면 됩니다.
MOTF 데모 프로그램을 참고해 보시기 바랍니다. 외부 트리거를 사용할 경우 실제 리스트의 실행(ListExecute)은 호출이 불필요하며, 외부 트리거 모드 설정을 위해 아래과 같은 추가 호출이 필요합니다. (ListEnd 후에 호출이 필요합니다)
//MOTF 용 외부 트리거 설정
var extMode = new RtcExternalControlMode();
extMode.Add(RtcExternalControlMode.Signal.ExternalStart);
extMode.Add(RtcExternalControlMode.Signal.ExternalStartAgain);
rtcMOTF.CtlExternalControl(extMode);
참고) RTC에서는 가상 이미지 필드 (Virtual Image Field)라는 방식으로 220bits 영역을 더 키워 MOTF 데이타가 처리됩니다. 주의할 것은 RTC5 의 경우 224bits 크기로 확장되므로, 16배의 좌표 길이로 확장되며, RTC6의 경우는 가상 이미지 필드 크기가 229bits 까지 지원하므로, 512배의 좌표 길이로 확장됩니다.
참고) 사용자의 단위계(mm)와 엔코더 펄수 개수의 비율을 설정해야 합니다. IRtcMotf 인터페이스에서는 EncXCountsPerMm, EncYCountsPerMm 속성값을 설정해야 합니다. 즉 1mm 이동시 2000개의 엔코더 펄스가 입력되면 이 값을 2000으로 설정해 주시기 바랍니다.
2. 시간/날짜/시리얼 번호 동적 마킹하기
만약 MOTF 와 같이 시간/날짜/시리얼 번호를 같이 마킹하고자 한다면 다음과 같이 개체들을 생성합니다. 이후 Time 개체를 이용해 년월일, Date 개체를 이용해 시분초, Serial 개체를 이용해 시리얼 번호를 각각 생성합니다.

아래와 같이 생성이 가능합니다. 년월일, 시분초 는 윈도우즈 시스템의 시간으로 동기화 되며 시리얼 번호의 경우 지정된 증가량 만큼 자동 증가됩니다. 이런 동적 마킹 개체의 경우 주의할 것은 …
- 폰트 종류를 최대 4개 까지만 지원함 (크기, 간격, 회전각도중 하나만 달라도 다른 폰트로 처리됨)
- 마킹 내용은 실시간으로 바뀌는 방식이기 때문에 모든 폰트가 사전에 RTC 의 리스트 메모리에 다운로드 되어 있어야 합니다. 때문에 마커(IMarker) 구현부에서 해당 폰트를 RTC 카드의 리스트버퍼3 공간에 미리 예약하는 코드가 필요하며 이에 대한 pseudo code 는 다음과 같습니다.
public virtual bool Ready(IMarkerArg markerArg)
{
...
//character set 모두 삭제
RtcCharacterSetHelper.Clear(rtc);
// 재등록
bool success = true;
for (int i = 0; i < this.clonedDoc.Layers.Count; i++)
{
var layer = this.clonedDoc.Layers[i];
if (layer.IsMarkerable)
{
foreach (var entity in layer)
{
var siriusText = entity as SiriusText;
if (null != siriusText)
success &= siriusText.RegisterCharacterSetIntoRtc(rtc);
var text = entity as Text;
if (null != text)
success &= text.RegisterCharacterSetIntoRtc(rtc);
}
}
}
...
}

또한 주의할 것은 시리얼 번호(SiriusTextSerial 등) 개체의 경우 시작 값을 외부에서 지정이 필요합니다. 이는 프로그램을 재시작 했을 경우 혹은 어떤 공정을 특정 시작번호로 해야 할 경우 유용합니다.
var rtcCharacterSet = rtc as IRtcCharacterSet;
rtcCharacterSet.CtlSerialReset(시작번호, 증가값);
//현재 시리얼 번호값을 조회하고자 할 경우
var currentNo = rtcCharacterSet.SerialCurrentNo;
핑백: 다양한 가공 최적화 기법 – v.1.131 – SPIRALLAB