跳转到内容

网络相关参数(GigE 相机)#

与网络相关的参数可让您优化 Basler ace GigE 相机的性能。

本主题描述最重要的网络相关参数。

有效负载大小#

PayloadSize 参数的值指示图像数据加上传输的任何块数据的总大小(以字节为单位)。数据包报头不包括在内。

此为只读参数。

数据包大小#

GevSCPSPacketSize 参数指定通过以太网传输的数据包的最大大小。该值以字节为单位。

该参数应始终设置为网络硬件可以处理的最大大小。

默认情况下,数据包大小设置为 1500 字节。这对于大多数配置已经足够。如果需要,可以增加数据包大小以减少以太网开销负载并提高网络效率。Basler 建议将数据包大小增加到最大值 9014 字节。

无论数据包大小如何,前导和尾随部分的大小始终保持不变。您应该记住,在大多数情况下,最后一个数据包比其他数据包小。

信息

  • 如果将数据包大小增加到 1500 字节以上,则必须在所有涉及的网络设备(包括任何交换机)上启用所谓的巨型帧支持。
  • 每当增加相机端的数据包大小时,还必须调整网络控制器卡的数据包大小。否则,数据流可能会由于数据包阻塞而失败。

包间隔#

如果您的网络硬件无法处理传入的数据包速率,则增加数据包传输之间的延迟非常有用。这样可以减少丢包的数量。请注意,这也会减慢数据传输速度。结果可能会造成相机的帧速率降低。

GevSCPD 参数设置以 tick 为单位的包间隔。默认情况下,1 tick 等于 8 ns。在启用 PTP 的情况下,1 tick 等于 1 ns。

信息

要检查 tick 频率,请检查 GevTimestampTickFrequency 参数值。此值表示每秒的时钟 tick 数。

帧传输延迟#

GevSCFTD 参数设置了相机通常应该开始发送所采集帧的时间与实际开始发送时间之间的 tick 延迟。默认情况下,1 tick 等于 8 ns。启用 PTP 时,1 tick 等于 1 ns。

在大多数情况下,此参数应设置为零。

但是,如果您的网络硬件不能处理网络流量峰值(例如,如果您同时触发了多个相机),则可以使用帧传输延迟参数,将各相机开始传输图像数据的时间错开。

已分配带宽#

GevSCBWA 参数指示带宽,以每秒字节数为单位,相机可以使用该带宽传输图像和块数据、处理数据包重发以及控制数据传输。可以通过更改包间隔帧传输延迟设置来调整分配的带宽。

此为只读参数。

带宽预留#

GevSCBWR 参数指定保留所分配带宽的哪一部分来处理数据包重发和控制数据传输。

此设置表示为所分配带宽的百分比。

示例:如果为相机分配了 30MB/s 的带宽,并且 GevSCBWR 参数设置为 5%,则带宽预留将为 1.5 MB/s。

带宽预留累积#

您可以使用 GevSCBWRA 参数来处理网络连接不稳定(例如由于 EMI 突发引起的不稳定)的情况。在这些情况下,可能需要重新发送大量的数据包以发送图像。带宽预留累积基本上是相机在异常情况下可以使用的额外重发池。

GevSCBWRA 参数是一个乘数,用于设置“累加器池”中可以预留的最大重发数。

示例:假设当前的带宽预留设置足够大,允许在一个帧周期内最多重新发送 5 个数据包。还要假设带宽预留累积(GevSCBWRA 参数)设置为 3。使用这些设置,累积池最多可容纳 5 x 3 = 15 次重新发送。

带宽预留模式#

如果可用,则 BandwidthReserveMode 参数允许您一步配置带宽预留带宽预留累积

您可以将该参数设置为以下值:

  • Standard:相机配置用于中等带宽需求。
  • Performance:相机配置用于高带宽需求。
  • Manual:不使用预设。您可以手动配置带宽预留带宽预留累积

最大帧抖动#

如果将带宽预留累积设置为较高的值,则相机可能会在传输帧期间遇到大量的数据重发。这种大量突发的重发将导致下一个所采集帧的传输开始延迟。GevSCFJM 参数指示由于这种突发的重发而可能造成下一帧传输延迟的最大时长(以 tick 为单位,1 tick = 8 ns)。

此为只读参数。

设备最大吞吐量#

GevSCDMT 参数指示在相机的当前设置以及无网络限制的理想条件下,相机理论上能够生成的最大数据量(每秒字节数)。此参数未考虑 GigE 网络是否具有承载所有数据的容量,并且不考虑重新发送所需的任何带宽。

如果您正在使用 Acquisition Frame Rate 参数来控制相机的帧速率,相机使用该参数值来计算 GevSCDMT 参数值。如果使用软件触发硬件触发来控制相机的帧速率,相机将使用当前相机设置允许的最大帧速率来计算 GevSCDMT 参数值。

此为只读参数。

当前设备吞吐量#

GevSCDCT 参数指示在给定当前相机设置的情况下,相机用于传输图像数据和块数据的实际带宽(以每秒字节数为单位)。

如果您正在使用 Acquisition Frame Rate 参数来控制相机的帧速率,相机使用该参数值来计算 GevSCDCT 参数值。如果使用软件触发硬件触发来控制相机的帧速率,相机将使用当前相机设置允许的最大帧速率来计算 GevSCDCT 参数值。

此为只读参数。

信息

GevSCDCT 参数指示传输实际图像数据和块数据所需的带宽。GevSCBWA 参数(已分配带宽)指示传输图像数据和块数据所需的带宽,再加上为处理数据包重发和控制数据传输而预留的带宽。

如果可用,可以使用 DeviceLinkCurrentThroughput 参数来限制数据传输的最大可用带宽。有关更多信息,请参见 Device Information Parameters

检测信号超时#

GigE Vison 标准要求实现“检测信号”例程,以监视相机和主机之间的连接。GevHeartbeatTimeout 参数设置检测信号超时(以毫秒为单位)。如果发生超时,相机将释放网络连接并进入允许重新连接的状态。

默认情况下,心跳超时设置为 3000 ms。正常相机操作中不需要更改该值。但是,如果要调试应用程序并在断点处停止,则可能会发生检测信号超时,并且可能会丢失与相机的连接。因此,在调试时应增大 GevHeartbeatTimeout 参数值。调试完成后,您应将超时恢复为其正常设置。

有关更多信息,请参阅 Basler pylon Camera Software Suite 随附的 C++ 程序员指南和参考文档“高级主题”主题中的“使用 GigE 相机调试 pylon 应用程序”部分。

信息

pylon API 还提供了 HeartbeatTimeout 参数,该参数在传输层端设置检测信号超时。HeartbeatTimeoutGevHeartbeatTimeout 参数将自动同步。当您更改一个参数时,另一个将随时调整,反之亦然。

流通道选择器#

GigE Vision 标准指定了一种机制,用于在相机和计算机之间建立几个独立的流通道。使用 GevStreamChannelSelector 参数,您可以指定在更改其他与网络相关的参数时将受影响的流通道。

当前,相机仅支持一个流通道,即流通道 0。因此,GevStreamChannelSelector 参数已预设为 StreamChannel0,并且无法更改。

示例代码#

// Payload Size
int64_t payloadSize = camera.PayloadSize.GetValue();
// Packet Size
camera.GevSCPSPacketSize.SetValue(1500);
// Inter-Packet Delay
camera.GevSCPD.SetValue(1000);
// Frame transmission delay
camera.GevSCFTD.SetValue(1000);
// Bandwidth Assigned
int64_t bandwidthAssigned = camera.GevSCBWA.GetValue();
// Bandwidth Reserve
camera.GevSCBWR.SetValue(10);
// Bandwidth Reserve Accumulation
camera.GevSCBWRA.SetValue(10);
// Frame Jitter Max
int64_t jitterMax = camera.GevSCFJM.GetValue();
// Device Max Throughput
int64_t maxThroughput = camera.GevSCDMT.GetValue();
// Device Current Throughput
int64_t currentThroughput = camera.GevSCDCT.GetValue();
// Heartbeat Timeout
camera.GevHeartbeatTimeout.SetValue(5000);
INodeMap& nodemap = camera.GetNodeMap();
// Payload Size
int64_t payloadSize = CIntegerPtr(nodemap.GetNode("PayloadSize"))->GetValue();
// Packet Size
CIntegerPtr(nodemap.GetNode("GevSCPSPacketSize"))->SetValue(1500);
// Inter-Packet Delay
CIntegerPtr(nodemap.GetNode("GevSCPD"))->SetValue(1000);
// Frame transmission delay
CIntegerPtr(nodemap.GetNode("GevSCFTD"))->SetValue(1000);
// Bandwidth Assigned
int64_t bandwidthAssigned = CIntegerPtr(nodemap.GetNode("GevSCBWA"))->GetValue();
// Bandwidth Reserve
CIntegerPtr(nodemap.GetNode("GevSCBWR"))->SetValue(10);
// Bandwidth Reserve Accumulation
CIntegerPtr(nodemap.GetNode("GevSCBWRA"))->SetValue(10);
// Frame Jitter Max
int64_t jitterMax = CIntegerPtr(nodemap.GetNode("GevSCFJM"))->GetValue();
// Device Max Throughput
int64_t maxThroughput = CIntegerPtr(nodemap.GetNode("GevSCDMT"))->GetValue();
// Device Current Throughput
int64_t currentThroughput = CIntegerPtr(nodemap.GetNode("GevSCDCT"))->GetValue();
// Heartbeat Timeout
CIntegerPtr(nodemap.GetNode("GevHeartbeatTimeout"))->SetValue(5000);
INodeMap& nodemap = camera.GetNodeMap();
// Payload Size
int64_t payloadSize = CIntegerParameter(nodemap, "PayloadSize").GetValue();
// Packet Size
CIntegerParameter(nodemap, "GevSCPSPacketSize").SetValue(1500);
// Inter-Packet Delay
CIntegerParameter(nodemap, "GevSCPD").SetValue(1000);
// Frame transmission delay
CIntegerParameter(nodemap, "GevSCFTD").SetValue(1000);
// Bandwidth Assigned
int64_t bandwidthAssigned = CIntegerParameter(nodemap, "GevSCBWA").GetValue();
// Bandwidth Reserve
CIntegerParameter(nodemap, "GevSCBWR").SetValue(10);
// Bandwidth Reserve Accumulation
CIntegerParameter(nodemap, "GevSCBWRA").SetValue(10);
// Frame Jitter Max
int64_t jitterMax = CIntegerParameter(nodemap, "GevSCFJM").GetValue();
// Device Max Throughput
int64_t maxThroughput = CIntegerParameter(nodemap, "GevSCDMT").GetValue();
// Device Current Throughput
int64_t currentThroughput = CIntegerParameter(nodemap, "GevSCDCT").GetValue();
// Heartbeat Timeout
CIntegerParameter(nodemap, "GevHeartbeatTimeout").SetValue(5000);
// Payload Size
Int64 payloadSize = camera.Parameters[PLCamera.PayloadSize].GetValue();
// Packet Size
camera.Parameters[PLCamera.GevSCPSPacketSize].SetValue(1500);
// Inter-Packet Delay
camera.Parameters[PLCamera.GevSCPD].SetValue(1000);
// Frame transmission delay
camera.Parameters[PLCamera.GevSCFTD].SetValue(1000);
// Bandwidth Assigned
Int64 bandwidthAssigned = camera.Parameters[PLCamera.GevSCBWA].GetValue();
// Bandwidth Reserve
camera.Parameters[PLCamera.GevSCBWR].SetValue(10);
// Bandwidth Reserve Accumulation
camera.Parameters[PLCamera.GevSCBWRA].SetValue(10);
// Frame Jitter Max
Int64 jitterMax = camera.Parameters[PLCamera.GevSCFJM].GetValue();
// Device Max Throughput
Int64 maxThroughput = camera.Parameters[PLCamera.GevSCDMT].GetValue();
// Device Current Throughput
Int64 currentThroughput = camera.Parameters[PLCamera.GevSCDCT].GetValue();
// Heartbeat Timeout
camera.Parameters[PLCamera.GevHeartbeatTimeout].SetValue(5000);
// Payload Size
Int64 payloadSize = Pylon.DeviceGetIntegerFeature(hdev, "PayloadSize");
// Packet Size
Pylon.DeviceSetIntegerFeature(hdev, "GevSCPSPacketSize", 1500);
// Inter-Packet Delay
Pylon.DeviceSetIntegerFeature(hdev, "GevSCPD", 1000);
// Frame transmission delay
Pylon.DeviceSetIntegerFeature(hdev, "GevSCFTD", 1000);
// Bandwidth Assigned
Int64 bandwidthAssigned = Pylon.DeviceGetIntegerFeature(hdev, "GevSCBWA");
// Bandwidth Reserve
Pylon.DeviceSetIntegerFeature(hdev, "GevSCBWR", 10);
// Bandwidth Reserve Accumulation
Pylon.DeviceSetIntegerFeature(hdev, "GevSCBWRA", 10);
// Frame Jitter Max
Int64 jitterMax = Pylon.DeviceGetIntegerFeature(hdev, "GevSCFJM");
// Device Max Throughput
Int64 maxThroughput = Pylon.DeviceGetIntegerFeature(hdev, "GevSCDMT");
// Device Current Throughput
Int64 currentThroughput = Pylon.DeviceGetIntegerFeature(hdev, "GevSCDCT");
// Heartbeat Timeout
Pylon.DeviceSetIntegerFeature(hdev, "GevHeartbeatTimeout", 5000);
/* 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 */
int64_t payloadSize = 0;
int64_t bandwidthAssigned = 0;
int64_t jitterMax = 0;
int64_t maxThroughput = 0;
int64_t currentThroughput = 0;
/* Payload Size */
errRes = PylonDeviceGetIntegerFeature(hdev, "PayloadSize", &payloadSize);
CHECK(errRes);
/* Packet Size */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevSCPSPacketSize", 1500);
CHECK(errRes);
/* Inter-Packet Delay */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevSCPD", 1000);
CHECK(errRes);
/* Frame transmission delay */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevSCFTD", 1000);
CHECK(errRes);
/* Bandwidth Assigned */
errRes = PylonDeviceGetIntegerFeature(hdev, "GevSCBWA", &bandwidthAssigned);
CHECK(errRes);
/* Bandwidth Reserve */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevSCBWR", 10);
CHECK(errRes);
/* Bandwidth Reserve Accumulation */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevSCBWRA", 10);
CHECK(errRes);
/* Frame Jitter Max */
errRes = PylonDeviceGetIntegerFeature(hdev, "GevSCFJM", &jitterMax);
CHECK(errRes);
/* Device Max Throughput */
errRes = PylonDeviceGetIntegerFeature(hdev, "GevSCDMT", &maxThroughput);
CHECK(errRes);
/* Device Current Throughput */
errRes = PylonDeviceGetIntegerFeature(hdev, "GevSCDCT", &currentThroughput);
CHECK(errRes);
/* Heartbeat Timeout */
errRes = PylonDeviceSetIntegerFeature(hdev, "GevHeartbeatTimeout", 5000);
CHECK(errRes);

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