跳转到内容

Counter(ace 2、boost)#

相机的 Counter 功能允许您计算部分相机事件的数量,例如,采集的图像数量。

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

该功能的使用#

运作原理#

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

每个计数器都具有以下特征:

  • 从 0 开始。
  • 必须先启动才能计数。
  • 一旦启动,就可以对特定类型的事件(即“事件源”)进行计数。例如,它可以对已曝光的图像数量进行计数。
  • 可以手动重置
  • 可以通过获取 CounterValue 参数的值来确定其当前值。
  • 其最大值由 CounterDuration 参数值定义(默认值:4294967295)。达到最大值后,计数器会停止计数,必须将其重置
  • 可以通过获取 CounterStatus 参数的值来确定其当前状态。
  • 每次关闭相机电源后再次打开电源时,它将重置为 0。

获取计数器值#

若要确定计数器的当前值,请获取 CounterValue 参数的值。此为只读参数。

启动计数器#

必须先启动计数器,才能计数。

信息

如果您启动了一个计数器,它一定会开始计数。计数器是否以及何时计数取决于事件源集。

计数器触发源#

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

要指定触发源:

  1. CounterSelector 参数设置为所需的计数器,例如 Counter2
  2. CounterTriggerSource 参数设置为要用于启动计数器的源。

现在,只要相机在所选信号源上检测到信号,计数器就会启动。启动后,计数器的状态CounterTriggerWait 更改为 CounterActive

示例 1:CounterTriggerSource 参数设置为 Line2。现在,当第 2 行的输入或输出信号改变时,计数器就会开始计数。

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

计数器触发激活#

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

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

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

信息

CounterEventActivation 参数仅适用于可能为高 (0) 或低 (1) 的事件源,即 I/O 信号或诸如 ExposureActive 之类的“激活”信号。

增加计数器计数#

计数器一旦启动,就可以开始增加计数器的数字,也就是可以开始计数。

计数器事件源#

CounterEventSource 参数允许您指定由哪个源增加计数器的数字。

要指定事件源:

  1. CounterSelector 参数设置为所需的计数器,例如 Counter2
  2. CounterEventSource 参数设置为要用于增加计数器数字的源。

现在,只要相机在所选信号源上检测到信号,计数器的数字就会增加。

示例 1:CounterEventSource 参数设置为 Line2。现在,只要Line 2 上的输入或输出信号按照 CounterEventActivation 参数的指定进行更改,计数器的数字就会增加。

示例 2:CounterEventSource 参数设置为 SoftwareSignal1。现在,每当您通过通道 1 执行 SoftwareSignalPulse 命令时,计数器数字就会增加。

计数器事件激活#

默认情况下,仅当选定事件源上的信号上升时,即信号状态从低变高时,计数器才会开始计数。

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

  • RisingEdge(默认值):当信号上升时,即信号状态从低变高时,计数器开始计数。
  • FallingEdge:当信号下降时,即信号状态从高变低时,计数器开始计数。
  • AnyEdge:当信号下降或上升时,计数器开始计数。

信息

CounterEventActivation 参数仅适用于可能为高 (0) 或低 (1) 的事件源,即 I/O 信号或诸如 ExposureActive 之类的“激活”信号。

重置计数器#

您可以随时将计数器重置为 0。

如果计数器已达到最大值(由 CounterDuration 参数值定义),并且您想重复使用它,则必须将其重置。

信息

重置计数器后,必须重新启动

通过软件重置#

要通过软件重置计数器,请执行 CounterReset 命令。

您也可以将软件信号设置为重置源(请参见下文)。

使用重置源重置#

CounterResetSource 参数允许您指定由哪个源重置计数器。

要指定重置源:

  1. CounterSelector 参数设置为所需的计数器,例如 Counter2
  2. CounterResetSource 参数设置为要用于重置计数器的源。

现在,只要相机在所选信号源上检测到信号,计数器就会重置。重置后,计数器的状态将更改为 CounterTriggerWait,必须重新启动

示例 1:CounterResetSource 参数设置为 Line2。现在,只要 Line2 上的输入或输出信号按照 CounterResetActivation 参数的指定进行更改,计数器就会重置。

示例 2:CounterResetSource 参数设置为 SoftwareSignal1。现在,每当您通过通道 1 执行 SoftwareSignalPulse 命令时,计数器就会重置。

计数器重置激活#

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

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

  • RisingEdge(默认值):当信号上升时,即信号状态从低变高时,计数器重置。
  • FallingEdge:当信号下降时,即信号状态从高变低时,计数器重置。
  • AnyEdge:当信号下降或上升时,计数器重置。

信息

CounterResetActivation 参数仅适用于可能为高 (0) 或低 (1) 的事件源,即 I/O 信号或诸如 ExposureActive 之类的“激活”信号。

停止计数器#

要停止计数器,请执行以下任一操作:

  • 停止在选定的事件源上发送信号。
  • CounterEventSource 参数设置为 Off
  • 重置计数器。

获取计数器状态#

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

可能的值包括:

  • CounterTriggerWait:计数器正在等待启动
  • CounterActive:计数器正在等待由选定事件源增加其计数或当前正在计数。
  • CounterCompleted:计数器已达到由 CounterDuration 参数定义的最大值。
  • CounterIdle:计数器处于空闲状态。每当将 CounterTriggerSource 参数设置为 Off 时,计数器就处于此状态,即无法启动计数器。

示例代码#

// Select Counter 1
camera.CounterSelector.SetValue(CounterSelector_Counter1);
// Specify that the counter starts when a software signal is sent via channel 1
camera.CounterTriggerSource.SetValue(CounterTriggerSource_SoftwareSignal1);
// Specify that the counter increases whenever a rising signal is detected on Line 1
camera.CounterEventSource.SetValue(CounterEventSource_Line1);
camera.CounterEventActivation.SetValue(CounterEventActivation_RisingEdge);
// Specify that the counter is reset whenever a falling signal is detected on Line 2
camera.CounterResetSource.SetValue(CounterResetSource_Line2);
camera.CounterResetActivation.SetValue(CounterEventActivation_FallingEdge);
// Set the maximum value of the counter to 1000
camera.CounterDuration.SetValue(1000);
// Manually reset the counter
camera.CounterReset.Execute();
// Get the current status of the counter
CounterStatusEnums counterStatus = camera.CounterStatus.GetValue();
// Get the current value of the counter
int64_t i = camera.CounterValue.GetValue();
INodeMap& nodemap = camera.GetNodeMap();
// Select Counter 1
CEnumerationPtr(nodemap.GetNode("CounterSelector"))->FromString("Counter1");
// Specify that the counter starts when a software signal is sent via channel 1
CEnumerationPtr(nodemap.GetNode("CounterTriggerSource"))->FromString("SoftwareSignal1");
// Specify that the counter increases whenever a rising signal is detected on Line 1
CEnumerationPtr(nodemap.GetNode("CounterEventSource"))->FromString("Line1");
CEnumerationPtr(nodemap.GetNode("CounterEventActivation"))->FromString("RisingEdge");
// Specify that the counter is reset whenever a falling signal is detected on Line 2
CEnumerationPtr(nodemap.GetNode("CounterResetSource"))->FromString("Line2");
CEnumerationPtr(nodemap.GetNode("CounterResetActivation"))->FromString("FallingEdge");
// Set the maximum value of the counter to 1000
CIntegerPtr(nodemap.GetNode("CounterDuration"))->SetValue(1000);
// Manually reset the counter
CCommandPtr(nodemap.GetNode("CounterReset"))->Execute();
// Get the current status of the counter
String_t counterStatus = CEnumerationPtr(nodemap.GetNode("CounterStatus"))->ToString();
// Get the current value of the counter
int64_t i = CIntegerPtr(nodemap.GetNode("CounterValue"))->GetValue();
INodeMap& nodemap = camera.GetNodeMap();
// Select Counter 1
CEnumParameter(nodemap, "CounterSelector").SetValue("Counter1");
// Specify that the counter starts when a software signal is sent via channel 1
CEnumParameter(nodemap, "CounterTriggerSource").SetValue("SoftwareSignal1");
// Specify that the counter increases whenever a rising signal is detected on Line 1
CEnumParameter(nodemap, "CounterEventSource").SetValue("Line1");
CEnumParameter(nodemap, "CounterEventActivation").SetValue("RisingEdge");
// Specify that the counter is reset whenever a falling signal is detected on Line 2
CEnumParameter(nodemap, "CounterResetSource").SetValue("Line2");
CEnumParameter(nodemap, "CounterResetActivation").SetValue("FallingEdge");
// Set the maximum value of the counter to 1000
CIntegerParameter(nodemap, "CounterDuration").SetValue(1000);
// Manually reset the counter
CCommandParameter(nodemap, "CounterReset").Execute();
// Get the current status of the counter
String_t counterStatus = CEnumParameter(nodemap, "CounterStatus").GetValue();
// Get the current value of the counter
int64_t i = CIntegerParameter(nodemap, "CounterValue").GetValue();
// Select Counter 1
camera.Parameters[PLCamera.CounterSelector].SetValue(PLCamera.CounterSelector.Counter1);
// Specify that the counter starts when a software signal is sent via channel 1
camera.Parameters[PLCamera.CounterTriggerSource].SetValue(PLCamera.CounterTriggerSource.SoftwareSignal1);
// Specify that the counter increases whenever a rising signal is detected on Line 1
camera.Parameters[PLCamera.CounterEventSource].SetValue(PLCamera.CounterEventSource.Line1);
camera.Parameters[PLCamera.CounterEventActivation].SetValue(PLCamera.CounterEventActivation.RisingEdge);
// Specify that the counter is reset whenever a falling signal is detected on Line 2
camera.Parameters[PLCamera.CounterResetSource].SetValue(PLCamera.CounterResetSource.Line2);
camera.Parameters[PLCamera.CounterResetActivation].SetValue(PLCamera.CounterEventActivation.FallingEdge);
// Set the maximum value of the counter to 1000
camera.Parameters[PLCamera.CounterDuration].SetValue(1000);
// Manually reset the counter
camera.Parameters[PLCamera.CounterReset].Execute();
// Get the current status of the counter
string counterStatus = camera.Parameters[PLCamera.CounterStatus].GetValue();
// Get the current value of the counter
Int64 i = camera.Parameters[PLCamera.CounterValue].GetValue();
// Select Counter 1
Pylon.DeviceFeatureFromString(hdev, "CounterSelector", "Counter1");
// Specify that the counter starts when a software signal is sent via channel 1
Pylon.DeviceFeatureFromString(hdev, "CounterTriggerSource", "SoftwareSignal1");
// Specify that the counter increases whenever a rising signal is detected on Line 1
Pylon.DeviceFeatureFromString(hdev, "CounterEventSource", "Line1");
Pylon.DeviceFeatureFromString(hdev, "CounterEventActivation", "RisingEdge");
// Specify that the counter is reset whenever a falling signal is detected on Line 2
Pylon.DeviceFeatureFromString(hdev, "CounterResetSource", "Line2");
Pylon.DeviceFeatureFromString(hdev, "CounterResetActivation", "FallingEdge");
// Set the maximum value of the counter to 1000
Pylon.DeviceSetIntegerFeature(hdev, "CounterDuration", 1000);
// Manually reset the counter
Pylon.DeviceExecuteCommandFeature(hdev, "CounterReset");
// Get the current status of the counter
string counterStatus = Pylon.DeviceFeatureToString(hdev, "CounterStatus");
// Get the current value of the counter
Int64 i = Pylon.DeviceGetIntegerFeature(hdev, "CounterValue");
/* 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 counterStatus_str[64] = {0};
int64_t i = 0;
/* Select Counter 1 */
errRes = PylonDeviceFeatureFromString(hdev, "CounterSelector", "Counter1");
CHECK(errRes);
/* Specify that the counter starts when a software signal is sent via channel 1 */
errRes = PylonDeviceFeatureFromString(hdev, "CounterTriggerSource", "SoftwareSignal1");
CHECK(errRes);
/* Specify that the counter increases whenever a rising signal is detected on Line 1 */
errRes = PylonDeviceFeatureFromString(hdev, "CounterEventSource", "Line1");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "CounterEventActivation", "RisingEdge");
CHECK(errRes);
/* Specify that the counter is reset whenever a falling signal is detected on Line 2 */
errRes = PylonDeviceFeatureFromString(hdev, "CounterResetSource", "Line2");
CHECK(errRes);
errRes = PylonDeviceFeatureFromString(hdev, "CounterResetActivation", "FallingEdge");
CHECK(errRes);
/* Set the maximum value of the counter to 1000 */
errRes = PylonDeviceSetIntegerFeature(hdev, "CounterDuration", 1000);
CHECK(errRes);
/* Manually reset the counter */
errRes = PylonDeviceExecuteCommandFeature(hdev, "CounterReset");
CHECK(errRes);
/* Get the current status of the counter */
len = sizeof(counterStatus_str);
errRes = PylonDeviceFeatureToString(hdev, "CounterStatus", counterStatus_str, &len);
CHECK(errRes);
/* Get the current value of the counter */
errRes = PylonDeviceGetIntegerFeature(hdev, "CounterValue", &i);
CHECK(errRes);

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