跳转到内容

Timer(ace 2、boost)#

相机的 Timer 功能允许您配置在遇到特定相机事件时变为高电平、在特定持续时间后变为低电平的计时器输出信号。

有关 ace classic/U/L 相机 Timer 功能的说明,请单击此处

该功能的使用#

运作原理#

有两个计时器可用:计时器 1 和计时器 2。

计时器的工作方式如下:

  • 发生启动内部计时器的触发源事件
  • 延迟开始到期。
  • arm 延迟开始到期。
  • 延迟到期后,计时器输出信号将变为高电平并在您配置的持续时间内保持高电平。
  • 持续时间到期时,定时器输出信号变为低电平。
  • arm 延迟到期后,相机可以接收下一个触发源事件。

计时器操作

配置计时器#

要配置计时器:

  1. TimerSelector 参数设置为所需的计时器,例如 Timer1
  2. TimerDuration 参数设置为所需的计时器持续时间(以微秒为单位)。
  3. TimerDelay 参数设置为所需的计时器延迟(以微秒为单位)。
  4. TimerTriggerArmDelay 参数设置为所需的 arm 延迟(以微秒为单位)。
  5. LineSelector 参数设置为要用于计时器信号的输出线路。
    如果该线路是 GPIO 线路,则必须将该线路配置为输出
  6. 如果在步骤 1 中选择了计时器 1,请将 LineSource 参数设置为 Timer1Active
  7. 如果在步骤 1 中选择了计时器 2,请将 LineSource 参数设置为 Timer2Active

启动计时器#

计时器触发源#

TimerTriggerSource 参数允许您指定由哪个源启动计时器。

要指定触发源:

  1. TimerSelector 参数设置为所需的计时器,例如 Timer1
  2. TimerTriggerSource 参数设置为要用于启动计时器的源。

现在,只要相机在所选信号源上检测到信号,计时器就会启动。

在启动时,计时器的状态立即从 TimerTriggerWait 变为 TimerActive,无论延迟如何设置都是如此。但是,计时器输出信号仅在延迟结束后才变为高电平。

示例 1:TimerTriggerSource 参数设置为 Line2。现在,当Line 2 的输入或输出信号改变时,计时器就会启动。

示例 2:TimerTriggerSource 参数设置为 SoftwareSignal1。现在,只要您通过通道 1 执行 SoftwareSignalPulse 命令,计时器就会启动。

计时器触发激活#

默认情况下,仅当选定触发源上的信号上升时,即信号状态从低变高时,计时器才会启动。

若要改变此行为,请将 TimerTriggerActivation 参数设置为以下值:

  • RisingEdge(默认值):当信号上升时,即信号状态从低变高时,计时器启动。
  • FallingEdge:当信号下降时,即信号状态从高变低时,计时器启动。
  • AnyEdge:当信号下降或上升时,计时器启动。
  • LevelHigh:当信号为高电平时,计时器启动。当信号变为低电平时,计时器停止,必须重新启动
  • LevelLow:当信号为低电平时,计时器启动。当信号变为高电平时,计时器停止,必须重新启动

信息

TimerTriggerActivation 参数仅适用于计时器触发源,该触发源可以为高 (0) 或低 (1),即 I/O 信号或 ExposureActive 之类的“激活”信号。

重置计时器#

要重置计时器,请执行 TimerReset 命令。

计时器的状态TimerActive 更改为 TimerTriggerWait

现在,无论 arm 延迟设置如何,都可以立即重启计时器。

获取计时器状态#

要获取计时器的当前状态,请获取 TimerStatus 参数的值。此为只读参数。

可能的值包括:

  • TimerTriggerWait:计时器正在等待启动
  • TimerActive:计时器已启动。发生触发源事件时,无论延迟如何设置,计时器都会立即切换到此状态。如果设置了 arm 延迟,则计时器将保持在 TimerActive状态,直到 arm 延迟到期为止。
  • TimerIdle:计时器处于空闲状态。每当将 TimerTriggerSource 参数设置为 Off 时,计时器就处于此状态,即无法启动计时器。

示例代码#

// Select Timer 1
camera.TimerSelector.SetValue(TimerSelector_Timer1);
// Set the timer duration to 1000 microseconds
camera.TimerDuration.SetValue(1000.0);
// Set the timer delay to 500 microseconds
camera.TimerDelay.SetValue(500.0);
// Set the timer trigger arm delay to 5000 microseconds
camera.TimerTriggerArmDelay.SetValue(5000.0);
// Select Line 2 and configure the line as output
camera.LineSelector.SetValue(LineSelector_Line2);
camera.LineMode.SetValue(LineMode_Output);
// Specify that the timer signal is output on Line 2
camera.LineSource.SetValue(LineSource_Timer1Active);
// Specify that the timer starts whenever a rising signal is detected on Line 1
camera.TimerTriggerSource.SetValue(TimerTriggerSource_Line1);
camera.TimerTriggerActivation.SetValue(TimerTriggerActivation_RisingEdge);
// Reset the timer
camera.TimerReset.Execute();
// Get the current status of the timer
TimerStatusEnums timerStatus = camera.TimerStatus.GetValue();
INodeMap& nodemap = camera.GetNodeMap();
// Select Timer 1
CEnumerationPtr(nodemap.GetNode("TimerSelector"))->FromString("Timer1");
// Set the timer duration to 1000 microseconds
CFloatPtr(nodemap.GetNode("TimerDuration"))->SetValue(1000.0);
// Set the timer delay to 500 microseconds
CFloatPtr(nodemap.GetNode("TimerDelay"))->SetValue(500.0);
// Set the timer trigger arm delay to 5000 microseconds
CFloatPtr(nodemap.GetNode("TimerTriggerArmDelay"))->SetValue(5000.0);
// Select Line 2 and configure the line as output
CEnumerationPtr(nodemap.GetNode("LineSelector"))->FromString("Line2");
CEnumerationPtr(nodemap.GetNode("LineMode"))->FromString("Output");
// Specify that the timer signal is output on Line 2
CEnumerationPtr(nodemap.GetNode("LineSource"))->FromString("Timer1Active");
// Specify that the timer starts whenever a rising signal is detected on Line 1
CEnumerationPtr(nodemap.GetNode("TimerTriggerSource"))->FromString("Line1");
CEnumerationPtr(nodemap.GetNode("TimerTriggerActivation"))->FromString("RisingEdge");
// Reset the timer
CCommandPtr(nodemap.GetNode("TimerReset"))->Execute();
// Get the current status of the timer
String_t timerStatus = CEnumerationPtr(nodemap.GetNode("TimerStatus"))->ToString();
INodeMap& nodemap = camera.GetNodeMap();
// Select Timer 1
CEnumParameter(nodemap, "TimerSelector").SetValue("Timer1");
// Set the timer duration to 1000 microseconds
CFloatParameter(nodemap, "TimerDuration").SetValue(1000.0);
// Set the timer delay to 500 microseconds
CFloatParameter(nodemap, "TimerDelay").SetValue(500.0);
// Set the timer trigger arm delay to 5000 microseconds
CFloatParameter(nodemap, "TimerTriggerArmDelay").SetValue(5000.0);
// Select Line 2 and configure the line as output
CEnumParameter(nodemap, "LineSelector").SetValue("Line2");
CEnumParameter(nodemap, "LineMode").SetValue("Output");
// Specify that the timer signal is output on Line 2
CEnumParameter(nodemap, "LineSource").SetValue("Timer1Active");
// Specify that the timer starts whenever a rising signal is detected on Line 1
CEnumParameter(nodemap, "TimerTriggerSource").SetValue("Line1");
CEnumParameter(nodemap, "TimerTriggerActivation").SetValue("RisingEdge");
// Reset the timer
CCommandParameter(nodemap, "TimerReset").Execute();
// Get the current status of the timer
String_t timerStatus = CEnumParameter(nodemap, "TimerStatus").GetValue();
// Select Timer 1
camera.Parameters[PLCamera.TimerSelector].SetValue(PLCamera.TimerSelector.Timer1);
// Set the timer duration to 1000 microseconds
camera.Parameters[PLCamera.TimerDuration].SetValue(1000.0);
// Set the timer delay to 500 microseconds
camera.Parameters[PLCamera.TimerDelay].SetValue(500.0);
// Set the timer trigger arm delay to 5000 microseconds
camera.Parameters[PLCamera.TimerTriggerArmDelay].SetValue(5000.0);
// Select Line 2 and configure the line as output
camera.Parameters[PLCamera.LineSelector].SetValue(PLCamera.LineSelector.Line2);
camera.Parameters[PLCamera.LineMode].SetValue(PLCamera.LineMode.Output);
// Specify that the timer signal is output on Line 2
camera.Parameters[PLCamera.LineSource].SetValue(PLCamera.LineSource.Timer1Active);
// Specify that the timer starts whenever a rising signal is detected on Line 1
camera.Parameters[PLCamera.TimerTriggerSource].SetValue(PLCamera.TimerTriggerSource.Line1);
camera.Parameters[PLCamera.TimerTriggerActivation].SetValue(PLCamera.TimerTriggerActivation.RisingEdge);
// Reset the timer
camera.Parameters[PLCamera.TimerReset].Execute();
// Get the current status of the timer
string timerStatus = camera.Parameters[PLCamera.TimerStatus].GetValue();
// Select Timer 1
Pylon.DeviceFeatureFromString(hdev, "TimerSelector", "Timer1");
// Set the timer duration to 1000 microseconds
Pylon.DeviceSetFloatFeature(hdev, "TimerDuration", 1000.0);
// Set the timer delay to 500 microseconds
Pylon.DeviceSetFloatFeature(hdev, "TimerDelay", 500.0);
// Set the timer trigger arm delay to 5000 microseconds
Pylon.DeviceSetFloatFeature(hdev, "TimerTriggerArmDelay", 5000.0);
// Select Line 2 and configure the line as output
Pylon.DeviceFeatureFromString(hdev, "LineSelector", "Line2");
Pylon.DeviceFeatureFromString(hdev, "LineMode", "Output");
// Specify that the timer signal is output on Line 2
Pylon.DeviceFeatureFromString(hdev, "LineSource", "Timer1Active");
// Specify that the timer starts whenever a rising signal is detected on Line 1
Pylon.DeviceFeatureFromString(hdev, "TimerTriggerSource", "Line1");
Pylon.DeviceFeatureFromString(hdev, "TimerTriggerActivation", "RisingEdge");
// Reset the timer
Pylon.DeviceExecuteCommandFeature(hdev, "TimerReset");
// Get the current status of the timer
string timerStatus = Pylon.DeviceFeatureToString(hdev, "TimerStatus");
/* 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 */
size_t len = 0;
char timerStatus_str[64] = {0};
/* Select Timer 1 */
errRes = PylonDeviceFeatureFromString(hdev, "TimerSelector", "Timer1");
CHECK(errRes);
/* Set the timer duration to 1000 microseconds */
errRes = PylonDeviceSetFloatFeature(hdev, "TimerDuration", 1000.0);
CHECK(errRes);
/* Set the timer delay to 500 microseconds */
errRes = PylonDeviceSetFloatFeature(hdev, "TimerDelay", 500.0);
CHECK(errRes);
/* Set the timer trigger arm delay to 5000 microseconds */
errRes = PylonDeviceSetFloatFeature(hdev, "TimerTriggerArmDelay", 5000.0);
CHECK(errRes);
/* Select Line 2 and configure the line as output */
errRes = PylonDeviceFeatureFromString(hdev, "LineSelector", "Line2");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "LineMode", "Output");
CHECK(errRes);
/* Specify that the timer signal is output on Line 2 */
errRes = PylonDeviceFeatureFromString(hdev, "LineSource", "Timer1Active");
CHECK(errRes);
/* Specify that the timer starts whenever a rising signal is detected on Line 1 */
errRes = PylonDeviceFeatureFromString(hdev, "TimerTriggerSource", "Line1");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "TimerTriggerActivation", "RisingEdge");
CHECK(errRes);
/* Reset the timer */
errRes = PylonDeviceExecuteCommandFeature(hdev, "TimerReset");
CHECK(errRes);
/* Get the current status of the timer */
len = sizeof(timerStatus_str);
errRes = PylonDeviceFeatureToString(hdev, "TimerStatus", timerStatus_str, &len);
CHECK(errRes);

您也可以使用 pylon Viewer 轻松设置参数。