跳转到内容

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

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

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

有效负载大小#

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

此为只读参数。

数据包大小#

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

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

By default, the packet size is set to 1 500 bytes. This will be sufficient for most configurations. If required, you can increase the packet size to reduce Ethernet overhead load and improve network efficiency.

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

信息

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

包间隔#

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

The GevSCPD parameter sets the inter-packet delay in ticksa.

帧传输延迟#

The GevSCFTD parameter sets a delay in ticksa between when a camera would normally begin transmitting an acquired frame and when it actually begins transmission.

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

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

已分配带宽#

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

此为只读参数。

带宽预留#

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

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

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

带宽预留累积#

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

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

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

带宽预留模式#

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

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

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

最大帧抖动#

If the bandwidth reserve accumulation is set to a high value, the camera can experience a large burst of data resends during the transmission of a frame. This burst of resends will delay the start of the transmission of the next acquired frame. The GevSCFJM parameter indicates the maximum time in ticksa that the next frame transmission could be delayed due to a burst of resends.

此为只读参数。

设备最大吞吐量#

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

If you are using the Acquisition Frame Rate parameter to control the camera's frame rate, the camera uses that parameter value to calculate the GevSCDMT parameter value. If you are using software triggering or hardware triggering to control the camera's frame rate, the camera uses the maximum frame rate allowed with the current camera settings to calculate the GevSCDMT parameter value.

此为只读参数。

当前设备吞吐量#

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

If you are using the Acquisition Frame Rate parameter to control the camera's frame rate, the camera uses that parameter value to calculate the GevSCDCT parameter value. If you are using software triggering or hardware triggering to control the camera's frame rate, the camera uses the maximum frame rate allowed with the current camera settings to calculate the GevSCDCT parameter value.

此为只读参数。

信息

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,并且无法更改。


  1. On ace Classic/U/L cameras, one tick equals 8 ns (PTP disabled) or 1 ns (PTP enabled). On other cameras, one tick always equals 1 ns. You can determine the tick frequency by reading the GevTimestampTickFrequency parameter value. This value indicates the number of clock ticks per second.

示例代码#

// 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 = 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);
/* 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 轻松设置参数。