跳转到内容

Periodic Signal#

相机的 Periodic Signal 功能使您可以生成在不同设备间同步的周期性触发信号。

例如,借助该功能,您能同时在多台相机上以相同的帧速率采集图像。

此功能类似于 Synchronous Free Run 功能,但除了图像采集外,它还可以用于其他用途。

该功能的使用#

运作原理#

支持 Periodic Signal 功能的 Basler 相机提供了附加的相机信号源 PeriodicSignal1。相机通过此信号源传输具有以下特性的信号:

  • 信号是重复的。
  • 信号可以通过 Precision Time Protocol 在各设备间同步。
  • 可以配置信号的周期。
  • 可以配置第一个周期之前的延迟。

PeriodicSignal1 信号源可用于许多不同用途,例如,跨设备同步 counter 或图像采集。

使用 Periodic Signal 同步图像采集#

要在多台相机上同步图像采集,请执行以下操作:

  1. 打开要使用 Periodic Signal 进行同步的其中一台相机。
  2. 确保将相机上的 BslPeriodicSignalSource 参数设置为 PtpClock
    这表示相机是通过 Precision Time Protocol 功能同步的。
  3. BslPeriodicSignalPeriod 参数设置为所需帧速率的倒数,转换为微秒。例如,如果要以每秒 50 帧的速度同步相机,请将该参数设置为 20000(1/50 = 0.02 秒 = 20000 微秒)。您必须在所有相机上指定相同的参数值。
  4. 配置 periodic signal 延迟:
    • 如果希望所有相机同时采集图像,请将所有相机的 BslPeriodicSignalDelay 参数设置为 0。
    • 如果希望所有相机按顺序(即以固定间隔)采集图像,请在第一个相机上将 BslPeriodicSignalDelay 参数设置为 0,并在其他相机上将其设置为所需间隔的倍数。
      例如,假设您要按 10000 µs 的间隔采集相机之间的图像。为此,在第一台相机上将延迟设置为 0,在第二台相机上将延迟设置为 10000,在第三台相机上将延迟设置为 20000,依此类推。
  5. 将相机配置为由 periodic signal 触发:
    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 功能,然后将 timer 信号用作 I/O 信号。

为此:

  1. 打开要用于触发外部设备的相机。
  2. 确保将相机上的 BslPeriodicSignalSource 参数设置为 PtpClock
    这表示相机是通过 Precision Time Protocol 功能同步的。
  3. BslPeriodicSignalPeriod 参数设置为所需触发器速率的倒数,转换为微秒。例如,如果要每秒生成 20 个触发器,请将该参数设置为 50000(1/20 = 0.05 秒 = 50000 微秒)。
  4. 如果要延迟触发外部设备,请将 BslPeriodicSignalDelay 参数设置为所需的延迟。
  5. 配置相机的 Timer 功能以由 periodic signal 触发:
    1. TimerSelector 参数设置为 Timer1
    2. TimerDuration 参数设置为所需的 timer 持续时间(以微秒为单位)。
      相机将发送 width 等于该值的 I/O 信号。因此,请将参数值设置得足够高,以使外部设备能够接收信号。在大多数情况下,默认值 10 µs 应该足够了。
    3. TimerTriggerSource 参数设置为 PeriodicSignal1
  6. 配置相机以输出 timer 信号:
    1. LineSelector 参数设置为所需的 I/O 线路,例如 Line2。该线路必须配置为输出
    2. LineSource 参数设置为 Timer1Active
  7. 将外部设备连接到在步骤 6 中选择的输出线路。
    设备现已在此线路上接收同步的触发信号。
  8. 如果要触发另一个外部设备,使用步骤 5 和 6 中的 Timer2Timer2Active 重复步骤 1 至 6。

信息

您还可以在相机之间同步图像采集,使用相同的 periodic signal 同步触发外部设备。为此,请执行上面详细介绍的两个过程。

附加参数#

  • 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*/

CFloatPtr(nodemap.GetNode("BslPeriodicSignalPeriod"))->SetValue(20000.0);
// Set the signal delay to 0
CIntegerPtr(nodemap.GetNode("BslPeriodicSignalDelay"))->SetValue(0);
// Configure the camera to be triggered by the periodic signal
CEnumerationPtr(nodemap.GetNode("TriggerSelector"))->FromString("FrameStart");
CEnumerationPtr(nodemap.GetNode("TriggerMode"))->FromString("On");
CEnumerationPtr(nodemap.GetNode("TriggerSource"))->FromString("PeriodicSignal1");

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

CFloatPtr(nodemap.GetNode("BslPeriodicSignalPeriod"))->SetValue(50000.0);
// Set the signal delay to 0
CIntegerPtr(nodemap.GetNode("BslPeriodicSignalDelay"))->SetValue(0);
// Configure the camera's Timer feature to be triggered by periodic signals
CEnumerationPtr(nodemap.GetNode("TimerSelector"))->FromString("Timer1");
CFloatPtr(nodemap.GetNode("TimerDuration"))->SetValue(10.0);
CEnumerationPtr(nodemap.GetNode("TimerTriggerSource"))->FromString("PeriodicSignal1");
// Configure the camera to output the timer signal on Line 2
CEnumerationPtr(nodemap.GetNode("LineSelector"))->FromString("Line2");
CEnumerationPtr(nodemap.GetNode("LineMode"))->FromString("Output");
CEnumerationPtr(nodemap.GetNode("LineSource"))->FromString("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);
/*Using Periodic Signal to Synchronize Image Acquisition*/

Pylon.DeviceSetFloatFeature(hdev, "BslPeriodicSignalPeriod", 20000.0);
// Set the signal delay to 0
Pylon.DeviceSetIntegerFeature(hdev, "BslPeriodicSignalDelay", 0);
// Configure the camera to be triggered by the periodic signal
Pylon.DeviceFeatureFromString(hdev, "TriggerSelector", "FrameStart");
Pylon.DeviceFeatureFromString(hdev, "TriggerMode", "On");
Pylon.DeviceFeatureFromString(hdev, "TriggerSource", "PeriodicSignal1");

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

Pylon.DeviceSetFloatFeature(hdev, "BslPeriodicSignalPeriod", 50000.0);
// Set the signal delay to 0
Pylon.DeviceSetIntegerFeature(hdev, "BslPeriodicSignalDelay", 0);
// Configure the camera's Timer feature to be triggered by periodic signals
Pylon.DeviceFeatureFromString(hdev, "TimerSelector", "Timer1");
Pylon.DeviceSetFloatFeature(hdev, "TimerDuration", 10.0);
Pylon.DeviceFeatureFromString(hdev, "TimerTriggerSource", "PeriodicSignal1");
// Configure the camera to output the timer signal on Line 2
Pylon.DeviceFeatureFromString(hdev, "LineSelector", "Line2");
Pylon.DeviceFeatureFromString(hdev, "LineMode", "Output");
Pylon.DeviceFeatureFromString(hdev, "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 轻松设置参数。