콘텐츠로 건너뛰기
STAGING SERVER
DEVELOPMENT SERVER

Periodic Signal#

Periodic Signal camera feature를 사용하면 디바이스 간에 동기화되는 주기적 트리거 신호를 생성할 수 있습니다.

이를 통해 예를 들어 여러 카메라에서 동시에 동일한 프레임 레이트로 이미지를 캡처할 수 있습니다.

이 기능은 Synchronous Free Run 기능과 유사하지만, 이미지 취득 외에도 다른 용도로 사용할 수 있습니다.

기능 사용법#

작동 원리#

Periodic Signal 기능을 지원하는 Basler 카메라는 추가 카메라 신호 소스를 제공하며, PeriodicSignal1. 이 소스를 통해 카메라는 다음과 같은 특성을 가진 신호를 전송합니다.

  • 신호가 반복됩니다.
  • 신호는 Precision Time Protocol을 통해 디바이스 간에 동기화될 수 있습니다.
  • 신호의 주기를 구성할 수 있습니다.
  • 첫 번째 주기 전의 지연(delay)을 구성할 수 있습니다.

이 PeriodicSignal1 신호 소스는 Counter 동기화나 디바이스 간 이미지 취득 동기화 등 다양한 용도로 사용할 수 있습니다.

Periodic Signal을 사용하여 이미지 획득 동기화하기#

여러 카메라에서 이미지 취득을 동기화하려면:

  1. Periodic Signal을 사용하여 동기화하려는 카메라 중 하나를 엽니다.
  2. 다음 항목이 올바르게 설정되어 있는지 확인하세요. BslPeriodicSignalSource 카메라의 파라미터가 다음으로 설정됩니다. PtpClock.
    이는 카메라가 다음을 통해 동기화됨을 나타냅니다. Precision Time Protocol feature.
  3. 다음 값 중 하나로 BslPeriodicSignalPeriod 파라미터는 원하는 프레임 레이트의 역수로 설정하고 마이크로초 단위로 변환합니다. 예를 들어, 50 fps로 카메라를 동기화하려면 파라미터를 20000으로 설정합니다(1 / 50 = 0.02초 = 20000마이크로초). 모든 카메라에서 동일한 파라미터 값을 지정해야 합니다.
  4. 주기적 신호 지연을 구성합니다.
    • 모든 카메라에서 이미지를 취득하려면 동시에으로 설정하고 BslPeriodicSignalDelay 모든 카메라의 파라미터를 0으로 설정합니다.
    • 모든 카메라에서 이미지를 취득하려면 순차적으로, 즉 일정한 간격으로 설정하려면 첫 번째 카메라의 BslPeriodicSignalDelay 파라미터는 0으로, 다른 카메라들은 원하는 간격의 배수로 설정합니다.
      예를 들어, 카메라 간에 10000 µs의 간격으로 이미지를 취득하려고 한다고 가정해 보겠습니다. 이 경우 첫 번째 카메라는 지연을 0으로, 두 번째 카메라는 10000으로, 세 번째 카메라는 20000으로 설정하는 식으로 진행합니다.
  5. 주기적 신호에 의해 카메가가 트리거되도록 구성합니다.
    1. 다음 값 중 하나로 TriggerSelector 매개변수: FrameStart.
    2. 다음 값 중 하나로 TriggerMode 매개변수: On.
    3. 다음 값 중 하나로 TriggerSource 매개변수: PeriodicSignal1.
  6. 모든 카메라에 대해 1~5단계를 반복합니다.

Periodic Signal을 사용하여 외부 장치를 동기식으로 트리거하기#

Periodic Signal 기능을 사용하여 외부 장치를 동기화하여 트리거할 수 있습니다. 이를 통해 PTP를 지원하지 않는 장치에서도 PTP를 사용할 수 있습니다.

카메라의 내부 periodic signal은 I/O 신호로 사용할 수 없습니다. 하지만 periodic signal을 사용하여 카메라의 Timer 기능을 트리거한 다음, 타이머 신호를 I/O 신호로 사용할 수 있습니다.

방법:

  1. 외부 장치를 트리거하는 데 사용할 카메라를 엽니다.
  2. 다음 항목이 올바르게 설정되어 있는지 확인하세요. BslPeriodicSignalSource 카메라의 파라미터가 다음으로 설정됩니다. PtpClock.
    이는 카메라가 다음을 통해 동기화됨을 나타냅니다. Precision Time Protocol feature.
  3. 다음 값 중 하나로 BslPeriodicSignalPeriod 파라값을 원하는 트리거 속도의 역수로 설정하고 마이크로초 단위로 변환합니다. 예를 들어, 초당 20개의 트리거 신호를 생성하려면 파라미터를 50000(1/20 = 0.05초 = 50000마이크로초)으로 설정합니다.
  4. 시간 지연을 두고 외부 장치를 트리거하려면 BslPeriodicSignalDelay 파라미터를 원하는 지연 시간으로 설정합니다.
  5. 카메라의 Timer 기능이 periodic signal에 의해 트리거되도록 설정합니다:
    1. 다음 값 중 하나로 TimerSelector 매개변수: Timer1.
    2. 다음 값 중 하나로 TimerDuration parameter를 원하는 Timer 지속 시간 마이크로초 단위로 설정합니다.
      카메라는 이 값과 동일한 폭의 I/O 신호를 전송합니다. 따라서 외부 장치가 신호를 수신할 수 있도록 파라미터 값을 충분히 높게 설정하세요. 대부분의 경우 기본값인 10 µs면 충분합니다.
    3. 다음 값 중 하나로 TimerTriggerSource 매개변수: PeriodicSignal1.
  6. 타이머 신호를 출력하도록 카메라를 설정합니다:
    1. 다음 값 중 하나로 LineSelector 파라미터를 원하는 I/O 라인으로 설정합니다(예: Line2. 해당 라인은 출력으로 구성되어야 합니다..
    2. 다음 값 중 하나로 LineSource 매개변수: Timer1Active.
  7. 단계 6에서 선택한 출력 라인에 외부 장치를 연결합니다.
    이제 장치가 이 라인에서 동기화된 트리거 신호를 수신합니다.
  8. 다른 외부 장치를 트리거하려면 단계 1부터 6까지를 반복하고, 단계 5와 6에서 Timer2 및 Timer2Active 을(를) 사용합니다.

정보

동일한 periodic signal을 사용하여 카메라 간의 이미지 취득을 동기화하고 외부 장치도 동시에 트리거할 수 있습니다. 이렇게 하려면 위에 설명된 두 가지 절차를 모두 수행하세요.

추가 Parameters#

  • BslPeriodicSignalSelector: 설정할 periodic signal 채널을 지정합니다. 현재 모든 Basler 카메라는 하나의 채널만 제공하므로 이 파라미터는 다음으로 사전 설정되어 있습니다. PeriodicSignal1 변경할 수 없습니다.

샘플 코드#

/* Using Periodic Signal to Synchronize Image Acquisition */
// Set the signal period to 20000 µs
camera.BslPeriodicSignalPeriod.SetValue(20000.0);
// Set the signal delay to 0
camera.BslPeriodicSignalDelay.SetValue(0);
// Configure the camera to be triggered by the periodic signal
camera.TriggerSelector.SetValue(TriggerSelector_FrameStart);
camera.TriggerMode.SetValue(TriggerMode_On);
camera.TriggerSource.SetValue(TriggerSource_PeriodicSignal1);

/* Using Periodic Signal to Synchronously Trigger External Devices */
// Set the signal period to 50000 µs
camera.BslPeriodicSignalPeriod.SetValue(50000.0);
// Set the signal delay to 0
camera.BslPeriodicSignalDelay.SetValue(0);
// Configure the camera's Timer feature to be triggered by periodic signals
camera.TimerSelector.SetValue(TimerSelector_Timer1);
camera.TimerDuration.SetValue(10.0);
camera.TimerTriggerSource.SetValue(TimerTriggerSource_PeriodicSignal1);
// Configure the camera to output the timer signal on Line 2
camera.LineSelector.SetValue(LineSelector_Line2);
camera.LineMode.SetValue(LineMode_Output);
camera.LineSource.SetValue(LineSource_Timer1Active);
INodeMap& nodemap = camera.GetNodeMap();
/*Using Periodic Signal to Synchronize Image Acquisition*/

CFloatParameter(nodemap, "BslPeriodicSignalPeriod").SetValue(20000.0);
// Set the signal delay to 0
CIntegerParameter(nodemap, "BslPeriodicSignalDelay").SetValue(0);
// Configure the camera to be triggered by the periodic signal
CEnumParameter(nodemap, "TriggerSelector").SetValue("FrameStart");
CEnumParameter(nodemap, "TriggerMode").SetValue("On");
CEnumParameter(nodemap, "TriggerSource").SetValue("PeriodicSignal1");

/*Using Periodic Signal to Synchronously Trigger External Devices*/

CFloatParameter(nodemap, "BslPeriodicSignalPeriod").SetValue(50000.0);
// Set the signal delay to 0
CIntegerParameter(nodemap, "BslPeriodicSignalDelay").SetValue(0);
// Configure the camera's Timer feature to be triggered by periodic signals
CEnumParameter(nodemap, "TimerSelector").SetValue("Timer1");
CFloatParameter(nodemap, "TimerDuration").SetValue(10.0);
CEnumParameter(nodemap, "TimerTriggerSource").SetValue("PeriodicSignal1");
// Configure the camera to output the timer signal on Line 2
CEnumParameter(nodemap, "LineSelector").SetValue("Line2");
CEnumParameter(nodemap, "LineMode").SetValue("Output");
CEnumParameter(nodemap, "LineSource").SetValue("Timer1Active");
/*Using Periodic Signal to Synchronize Image Acquisition*/

camera.Parameters[PLCamera.BslPeriodicSignalPeriod].SetValue(20000.0);
// Set the signal delay to 0
camera.Parameters[PLCamera.BslPeriodicSignalDelay].SetValue(0);
// Configure the camera to be triggered by the periodic signal
camera.Parameters[PLCamera.TriggerSelector].SetValue(PLCamera.TriggerSelector.FrameStart);
camera.Parameters[PLCamera.TriggerMode].SetValue(PLCamera.TriggerMode.On);
camera.Parameters[PLCamera.TriggerSource].SetValue(PLCamera.TriggerSource.PeriodicSignal1);

/*Using Periodic Signal to Synchronously Trigger External Devices*/

camera.Parameters[PLCamera.BslPeriodicSignalPeriod].SetValue(50000.0);
// Set the signal delay to 0
camera.Parameters[PLCamera.BslPeriodicSignalDelay].SetValue(0);
// Configure the camera's Timer feature to be triggered by periodic signals
camera.Parameters[PLCamera.TimerSelector].SetValue(PLCamera.TimerSelector.Timer1);
camera.Parameters[PLCamera.TimerDuration].SetValue(10.0);
camera.Parameters[PLCamera.TimerTriggerSource].SetValue(PLCamera.TimerTriggerSource.PeriodicSignal1);
// Configure the camera to output the timer signal on Line 2
camera.Parameters[PLCamera.LineSelector].SetValue(PLCamera.LineSelector.Line2);
camera.Parameters[PLCamera.LineMode].SetValue(PLCamera.LineMode.Output);
camera.Parameters[PLCamera.LineSource].SetValue(PLCamera.LineSource.Timer1Active);
/* Macro to check for errors */
#define CHECK(errc) if (GENAPI_E_OK != errc) printErrorAndExit(errc)
GENAPIC_RESULT errRes = GENAPI_E_OK;  /* Return value of pylon methods */
/*Using Periodic Signal to Synchronize Image Acquisition*/

errRes = PylonDeviceSetFloatFeature(hdev, "BslPeriodicSignalPeriod", 20000.0);
CHECK(errRes);
/* Set the signal delay to 0 */
errRes = PylonDeviceSetIntegerFeature(hdev, "BslPeriodicSignalDelay", 0);
CHECK(errRes);
/* Configure the camera to be triggered by the periodic signal */
errRes = PylonDeviceFeatureFromString(hdev, "TriggerSelector", "FrameStart");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "TriggerMode", "On");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "TriggerSource", "PeriodicSignal1");
CHECK(errRes);

/*Using Periodic Signal to Synchronously Trigger External Devices*/

errRes = PylonDeviceSetFloatFeature(hdev, "BslPeriodicSignalPeriod", 50000.0);
CHECK(errRes);
/* Set the signal delay to 0 */
errRes = PylonDeviceSetIntegerFeature(hdev, "BslPeriodicSignalDelay", 0);
CHECK(errRes);
/* Configure the camera's Timer feature to be triggered by periodic signals */
errRes = PylonDeviceFeatureFromString(hdev, "TimerSelector", "Timer1");
CHECK(errRes);
errRes = PylonDeviceSetFloatFeature(hdev, "TimerDuration", 10.0);
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "TimerTriggerSource", "PeriodicSignal1");
CHECK(errRes);
/* Configure the camera to output the timer signal on Line 2 */
errRes = PylonDeviceFeatureFromString(hdev, "LineSelector", "Line2");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineMode", "Output");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineSource", "Timer1Active");
CHECK(errRes);
# Using Periodic Signal to Synchronize Image Acquisition
camera.BslPeriodicSignalPeriod.Value = 20000.0
# Set the signal delay to 0
camera.BslPeriodicSignalDelay.Value = 0
# Configure the camera to be triggered by the periodic signal
camera.TriggerSelector.Value = "FrameStart"
camera.TriggerMode.Value = "On"
camera.TriggerSource.Value = "PeriodicSignal1"

# Using Periodic Signal to Synchronously Trigger External Devices
camera.BslPeriodicSignalPeriod.Value = 50000.0
# Set the signal delay to 0
camera.BslPeriodicSignalDelay.Value = 0
# Configure the camera's Timer feature to be triggered by periodic signals
camera.TimerSelector.Value = "Timer1"
camera.TimerDuration.Value = 10.0
camera.TimerTriggerSource.Value = "PeriodicSignal1"
# Configure the camera to output the timer signal on Line 2
camera.LineSelector.Value = "Line2"
camera.LineMode.Value = "Output"
camera.LineSource.Value = "Timer1Active"

또한 pylon Viewer를 사용하여 파라미터를 손쉽게 설정할 수 있습니다.