コンテンツにスキップ

Periodic Signal#

Periodic Signalカメラ機能を使用すると、デバイス間で同期される定期的なトリガー信号を生成できます。

これにより、複数のカメラで同時に同じフレームレートで画像をキャプチャしたりできます。

This feature is similar to the Synchronous Free Run feature, but apart from image acquisition it can also be used for other purposes.

機能を使用する#

仕組み#

Periodic Signal機能をサポートするBaslerカメラは、追加のカメラ信号ソースPeriodicSignal1を提供します。このソースを介して、カメラは、次の特性を持つ信号を送信します。

  • 信号は反復的です。
  • 信号は、Precision Time Protocolを介してデバイス間で同期できます。
  • 信号の周期を設定できます。
  • 最初の期間までの遅延を設定できます。

PeriodicSignal1信号ソースは、デバイス間でカウンターや画像取得を同期するなど、さまざまな目的に使用できます。

Periodic Signalを使用して画像取得を同期する#

複数のカメラで画像取得を同期するには、次の手順に従います。

  1. Periodic Signalを使用して同期するカメラの1つを開きます。.
  2. カメラのBslPeriodicSignalSourceパラメーターがPtpClockに設定されていることを確認します。
    これは、カメラがPrecision Time Protocol機能を介して同期されることを示します。
  3. BslPeriodicSignalPeriodパラメーターを、マイクロ秒に変換された目的のフレームレートの逆数に設定します。例えば、カメラを50フレーム/秒で同期する場合は、パラメーターを20000(1/50 = 0.02秒 = 20000マイクロ秒)に設定します。すべてのカメラで同じパラメーター値を指定する必要があります。
  4. 定期的な信号遅延を、次のように設定します。
    • すべてのカメラで同時に画像を取得する場合は、すべてのカメラでBslPeriodicSignalDelayパラメーターを0に設定します。
    • すべてのカメラで画像を連続的に(つまり一定の間隔で)取得する場合、最初のカメラのBslPeriodicSignalDelayパラメーターを0に設定し、他のカメラで目的の間隔の倍数に設定します。
      例えば、カメラ間で10000µsの間隔で画像を取得するとします。これを行うには、最初のカメラの遅延を0、2番目のカメラの遅延を10000、3番目のカメラの遅延を20000に設定します。
  5. 定期的な信号によってトリガーされるようにカメラを設定します。
    1. TriggerSelectorパラメーターをFrameStartに設定します。
    2. TriggerModeパラメーターをOnに設定します。
    3. TriggerSourceパラメーターをPeriodicSignal1に設定します。
  6. すべてのカメラについて、手順1~5を繰り返します。

Periodic Signalを使用して外部デバイスを同期的にトリガーする#

Periodic Signal機能を使用して、外部デバイスを同期的にトリガーできます。これにより、非PTPデバイスPTP対応にできます。

カメラの内部周期信号をI/O信号として使用することはできません。ただし、周期信号を使用してカメラのTimer機能をトリガーし、タイマー信号をI/O信号として使用することは可能です。

これを行うには:

  1. 外部デバイスの起動に使用するカメラを開きます。
  2. カメラのBslPeriodicSignalSourceパラメーターがPtpClockに設定されていることを確認します。
    これは、カメラがPrecision Time Protocol機能を介して同期されることを示します。
  3. BslPeriodicSignalPeriodパラメーターを、目的のトリガーレートの逆数に設定します。この値はマイクロ秒に変換されます。例えば、1秒あたり20のトリガー信号を生成する場合は、パラメーターを50000(1/20 = 0.05秒 = 50000マイクロ秒)に設定します。
  4. 外部デバイスを時間遅延を伴って起動する場合は、BslPeriodicSignalDelayパラメーターを目的の遅延に設定します。
  5. カメラを設定 Timer 定期的な信号によって起動される機能:
    1. TimerSelectorパラメーターをTimer1に設定します。
    2. TimerDurationパラメーターを目的のタイマー時間(マイクロ秒単位)に設定します。
      カメラはこの値と等しい幅のI/O信号を送信します。したがって、外部デバイスが信号を受信できる高さにパラメーター値を設定してください。ほとんどの場合、デフォルト値の10µsで十分です。
    3. TimerTriggerSourceパラメーターをPeriodicSignal1に設定します。
  6. タイマー信号を出力するようにカメラを設定します:
    1. LineSelectorパラメーターを、必要なI/Oライン(Line2など)に設定します。ラインは出力として設定する必要があります。
    2. LineSourceパラメーターをTimer1Activeに設定します。
  7. 外部デバイスをステップ6で選択した出力ラインに接続します。
    これで、デバイスはこのラインで同期されたトリガー信号を受信するようになります。
  8. 別の外部デバイスを起動する場合は、手順5と6のTimer2およびTimer2Activeを使用して、手順1~6を繰り返します。

情報

また、カメラ間で画像取得を同期し、さらに同じ周期信号を使用して外部デバイスを同期的に起動することもできます。これを行うには、上記の手順を両方とも実行します。

追加パラメーター#

  • BslPeriodicSignalSelector:設定する周期的信号チャンネルを設定します。すべてのBaslerカメラは現在1つのチャンネルを提供しているため、このパラメーターは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);

pylon Viewerを使用して、パラメーターを簡単に設定することもできます。