跳转到内容

Precision Time Protocol#

相机的 Precision Time Protocol (PTP) 功能可让您同步同一网络中的多个 GigE 相机。

IEEE 1588标准定义了该协议。Basler 相机支持 IEEE 1588-2008,也称为 PTP 版本 2。

信息

PTP 同步的精度在很大程度上取决于您的网络硬件和设置。为了获得最高精度,请选择高质量的网络硬件、使用支持 PTP 的网络交换机,并向您的网络添加一个带有 GPS 接收器的外部 PTP 时钟设备。

该功能的使用#

为什么使用 PTP#

Precision Time Protocol (PTP) 功能使相机可以使用以下功能(如果可用):

运作原理#

通过 PTP,多台设备(例如相机)会自动与网络中找到的最准确的时钟(称为主时钟或最佳主时钟)同步。

该协议使网络中的系统可以执行以下操作:

  • 与主时钟同步,即,将本地时钟尽可能精确地设置为主时钟的时间。
  • 与主时钟同步,即,将本地时钟的频率调整为主时钟的频率。您希望两台设备上 1 秒钟的持续时间尽可能保持相同。

主时钟由几个条件决定。最高优先级的条件是设备的优先级 1 设置。

时间戳同步#

Precision Time Protocol (IEEE 1588) 的基本概念基于 PTP 消息的交换。这些消息允许从时钟将其 timestamp 值与主时钟的时间戳值同步。对于 Basler 相机,这意味着它们的 TimestampLatchValue 参数值将尽可能保持相同。精度在很大程度上取决于您的网络硬件和设置。

如果网络中没有设备同步到协调世界时间(例如 TAI 或 UTC),网络将以任意时标模式 (ARB) 运行。在此模式下,epoch 是任意的,因为它不受绝对时间的限制。时标是相对的,仅在此网络中有效。

信息

  • IEEE 1588 定义了用于存储和传输时间信息的 80 位时间戳。因为 GigE Vision 使用 64 位时间戳,所以 PTP 时间戳映射到 GigE Vision 的 64 位时间戳。
  • 如果支持 PTP 的设备在没有其他支持 PTP 的设备的网络中运行,则该设备不会调整其本地时钟。其本地时钟的精度与不支持 PTP 的设备相同。
  • 有关 Precision Time Protocol 的更多信息,请参阅 Synchronous and in Real Time: Multi-Camera Applications in the GigE Network 白皮书。

启用 PTP 时钟同步#

开启相机电源时,始终禁用 PTP。如果要使用 PTP,必须自行启用。

要启用 PTP:

  1. 如果要将外部设备用作主时钟(例如 GPS 接收器),请将外部设备配置为主时钟。
    Basler 建议将 ANNOUNCE 间隔设为 2 秒,将 SYNC 间隔设为 0.5 秒。
  2. 确保要通过 PTP 同步的所有相机均已正确配置
  3. 在您要通过 PTP 进行同步的所有相机上,将 GevIEEE1588 参数设置为 true
  4. 等待全部 PTP 网络设备已充分同步。根据您的网络设置,这可能需要几秒钟或几分钟。
    您可以通过检查设备的 PTP 时钟同步状态来确定何时同步设备。

现在,您可以使用启用 PTP 的相机功能

信息

On ace Classic/U/L cameras, enabling PTP clock synchronization changes the camera's internal tick frequency from 125 MHz (= 8 ns tick duration) to 1 GHz (= 1 ns tick duration). The Inter-packet Delay and the Frame Transmission Delay parameter values are adjusted automatically.
On other cameras, the tick frequency is always 1 GHz.

配置 PTP 时钟同步#

根据您的相机型号,可以使用以下设置:

优先级 1#

在启用 PTP 的网络中,主时钟由几个条件决定。最重要的条件是设备的“优先级 1”设置。具有最低“优先级 1”设置的网络设备是主时钟。

ace 2 相机中,您可以更改“优先级 1”设置,将相机强制用作主时钟或防止将相机设为主时钟。为此,请将 BslPtpPriority1 参数设置为 0(最高优先级)和 255(最低优先级)之间的值。

其他相机上,“优先级 1”设置预设为 128,无法更改。

信息

有关主时钟标准的更多信息,请参见 IEEE 1588-2008 规范的条款 7.6.2.2。

PTP 延迟机制#

延迟测量机制定义了如何在网络内发送和接收 PTP 延迟测量消息。PTP 标准定义了两种机制:端到端(E2E,也称为“延迟请求-响应”)和点对点 (P2P)。有关更多信息,请参见本文

ace 2 相机上,可以更改延迟测量机制。为此,请将 BslPtpProfile 参数设置为 DelayRequestResponseDefaultProfile(默认值)或 PeerToPeerDefaultProfile

其他相机上,延迟测量机制预设为端到端,无法更改。

信息

  • 在大多数情况下,请使用端到端延迟测量。仅当整个网络都设置为点对点延迟测量时,才使用点对点。这意味着所有交换机和路由器都启用了 PTP,并且所有 PTP 设备都配置为点对点通信。
  • 使用点对点延迟测量时,以下限制适用:

网络模式#

网络模式设置定义了如何在网络内传输 PTP 消息。

ace 2 相机上,可以更改网络模式。为此,请将 BslPtpNetworkMode 参数设置为以下值之一:

  • Multicast:将 PTP 消息发送到本地网络中配置为 PTP 多播的所有设备。这是默认模式,对于大多数用例而言已足够。
  • Hybrid:使用多播和单播消息发送 PTP 消息。由于需要处理的消息较少,因此可以节省网络负载。有关更多信息,请参见本文
  • 单播:PTP 消息被发送到本地网络中的一个或多个指定设备。其他设备无法接收 PTP 消息。
    要配置单播,请执行以下操作:
    1. 确保将 BslPtpNetworkMode 设置为 Unicast
    2. BslPtpUcPortAddrIndex 参数设置为 0。
    3. BslPtpUcPortAddr 参数设置为第一个接收设备的 IP 地址。
    4. BslPtpUcPortAddrIndex 参数增加 1。
    5. BslPtpUcPortAddr 参数设置为下一个接收设备的 IP 地址。
    6. 对涉及的所有 PTP 设备重复步骤 3 和 4。

其他相机上,网络模式预设为多播。但是,这些相机也可以接收单播消息并做出相应响应。

信息

使用单播模式时,涉及的所有设备都必须支持单播协商。一些 PTP 实现不使用单播协商,因此与 Basler 相机不兼容。

PTP 管理#

PTP 管理协议可让您通过管理消息读取任何 PTP 设备的设置,即无需使用 pylon API。如果允许,也可以写入设置。

ace 2 相机上,可以启用或禁用 PTP 管理。为此:

  1. 启用 PTP 时钟同步
  2. 设置 BslPtpManagementEnable 参数设置为以下值:
    • True:可以使用具有如下列出的消息 ID 的管理消息读取设置 (GET)、写入设置 (SET) 以及执行命令 (COMMAND)。
    • false(默认值):PTP 管理协议已禁用,并且无法读取或写入设置。

其他相机上,PTP 管理始终处于启用状态并预设为只读访问。

支持的管理消息#
管理消息 ID 支持的操作
NULL_MANAGEMENT GET、SET
CLOCK_DESCRIPTION GET
USER_DESCRIPTION GET、SET
INITIALIZE COMMANDa
DEFAULT_DATA_SET GET
CURRENT_DATA_SET GET
PARENT_DATA_SET GET
TIME_PROPERTIES_DATA_SET GET
PORT_DATA_SET GET
PRIORITY1 GET、SET
PRIORITY2 GET、SET
DOMAIN GET
SLAVE_ONLY GET
LOG_ANNOUNCE_INTERVAL GET、SET
ANNOUNCE_RECEIPT_TIMEOUT GET、SET
LOG_SYNC_INTERVAL GET、SET
VERSION_NUMBER GET
ENABLE_PORT COMMAND
DISABLE_PORT COMMAND
TIME GET、SETb
CLOCK_ACCURACY GET、SET
UTC_PROPERTIES GET、SET
TRACEABLE_PROPERTIES GET、SET
TIMESCALE_PROPERTIES GET、SET
UNICAST_NEGOTIATION_ENABLE GET
ACCEPTABLE_MASTER_TABLE GET、SET
ACCEPTABLE_MASTER_TABLE_ENABLED GET、SET
ACCEPTABLE_MASTER_MAX_TABLE_SIZE GET
DELAY_MECHANISM GET、SET
LOG_MIN_PDELAY_REQ_INTERVAL GET、SET

  1. INITIALIZE 命令可重置时钟速度。

  2. 仅当相应的设备用作超级主时钟时才能设置。

有关这些属性的默认值和范围的信息,请参见 IEEE 1588-2008 规范附录 J。

一步或两步时钟#

此设置定义为需要出口 timestamp 的任何 PTP 事件消息生成多少条消息:

  • 一步操作中,发送一条消息。该消息包括消息数据和出口 timestamp。
  • 两步操作中,发送两条消息。第一条消息包括消息数据。第二条消息包括出口 timestamp。

有关更多信息,请参见本文

ace 2 相机上,默认情况下禁用两步操作。如果网络中的另一个 PTP 设备明确需要两步事件消息,可以通过将 BslPtpTwoStep 参数设置为 true 来启用这些操作。

其他相机上,始终启用两步操作。

检查 PTP 时钟同步的状态#

要检查 PTP 时钟同步的状态,您必须使用 pylon API。

一个典型的 PTP 状态检查实现包含以下步骤:

  1. 执行 GevIEEE1588DataSetLatch 命令。
    该命令可让您获取相机当前 PTP 状态的“快照”。“快照”实现可确保锁存数据集内的所有参数值都指向完全相同的时间点。
  2. 请等待,直至 GevIEEE1588Status 参数值不再是 Initializing
  3. 从设备读取以下参数值,具体取决于相机型号:

    • ace 2 相机上,从所有从属相机读取 PtpServoStatus 参数。如果参数值是 Locked,则各个设备应充分同步。如果您需要更精细的状态检查,请遵循以下“其他相机”步骤。
    • 其他相机,从 GevIEEE1588OffsetFromMaster 所有从属相机读取参数值,直到与主相机的最大偏移量低于某个阈值(根据您的要求,例如 1 毫秒)。
      由于时钟是通过控制机制连续调整的,因此偏移量不会单调降低。Basler 建议您检查最大值 GevIEEE1588OffsetFromMaster 给定时间范围内的参数值: PTP 相对于主振幅的偏移
  4. 重复步骤 1 和 2,直到设备充分同步。

锁存数据集内包含什么?#

执行 GevIEEE1588DataSetLatch 命令之后,您可以从设备读取以下参数值:

  • GevIEEE1588ClockId:指示当前 PTP 设备的唯一 ID(“时钟 ID”)。
  • GevIEEE1588OffsetFromMaster:指示主时钟和当前 PTP 设备的时钟之间的估计时间偏移量(以滴答为单位,1 声滴答 = 1 纳秒)。
  • GevIEEE1588ParentClockId:指示当前用作主时钟的 PTP 设备的时钟 ID(“父时钟 ID”)。
  • GevIEEE1588Status:指示当前 PTP 设备的状态,例如,它是主时钟还是从时钟。返回值与 PTP 端口状态枚举值匹配(即 Initializing、Faulty、Disabled、Listening、Pre_Master、Master、Passive、Uncalibrated 和 Slave)。有关更多信息,请参阅 pylon API 文档和 IEEE 1588-2008 规范
  • GevIEEE1588StatusLatched:如果此参数可用,Basler 建议使用它代替 GevIEEE1588Status 参数。这是因为 GevIEEE1588Status 参数未绑定到 GevIEEE1588DataSetLatch 命令。因此,如果您从设备读取多个与 PTP 相关的值,则设备状态与其他值不在同一时间点。
附加参数#

ace 2 相机上,执行 PtpDataSetLatch 命令之后,可以从设备读取以下其他参数值:

  • BslPtpDelayMechanism:指示 PTP 网络使用的延迟机制E2E 值表示使用了延迟请求-响应机制。P2P 值表示使用了点对点机制。
  • PtpClockAccuracy:指示当 PTP 设备时钟是或成为超级主时钟时的预期精度。在 Basler 相机上,预期精度预设为 Unknown。这是因为 Basler 相机无法与协调的世界时间同步,例如 UTC。
  • PtpGrandmasterClockID:指示当前用作超级主时钟的 PTP 设备的时钟 ID。
  • PtpServoStatus:指示时钟伺服器的状态,即 PTP 时钟同步的状态。如果状态为 Locked,则当前设备的时钟与主时钟成功同步。在所有其他情况下,状态为 Unknown

示例代码#

ace 2 相机#

// ** Configure PTP **
// Set Priority 1 to 128
camera.BslPtpPriority1.SetValue(128);
// Enable end-to-end delay measurement
camera.BslPtpProfile.SetValue(BslPtpProfile_DelayRequestResponseDefaultProfile);
// Set the network mode to unicast
camera.BslPtpNetworkMode.SetValue(BslPtpNetworkMode_Unicast);
// Set the IP address of the first unicast device to 192.168.10.12
// (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12)
camera.BslPtpUcPortAddrIndex.SetValue(0);
camera.BslPtpUcPortAddr.SetValue((0xC0A80A0C);
// Enable PTP Management Protocol
camera.BslPtpManagementEnable.SetValue(true);
// Disable two-step operation
camera.BslPtpTwoStep.SetValue(false);
// ** Enable PTP on the current device **
camera.PtpEnable.SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
INodeMap& nodemap = camera.GetNodeMap();
// ** Configure PTP **
// Set Priority 1 to 128
CIntegerParameter(nodemap, "BslPtpPriority1").SetValue(128);
// Enable end-to-end delay measurement
CEnumParameter(nodemap, "BslPtpProfile").SetValue("DelayRequestResponseDefaultProfile");
// Set the network mode to unicast
CEnumParameter(nodemap, "BslPtpNetworkMode").SetValue("Unicast");
// Set the IP address of the first unicast device to 192.168.10.12
// (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12)
CIntegerParameter(nodemap, "BslPtpUcPortAddrIndex").SetValue(0);
CIntegerParameter(nodemap, "BslPtpUcPortAddr").SetValue(0xC0A80A0C);
// Enable PTP Management Protocol
CBooleanParameter(nodemap, "BslPtpManagementEnable").SetValue(true);
// Disable two-step operation
CBooleanParameter(nodemap, "BslPtpTwoStep").SetValue(false);
// ** Enable PTP on the current device **
CBooleanParameter(nodemap, "PtpEnable").SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
// ** Configure PTP **
// Set Priority 1 to 128
camera.Parameters[PLCamera.BslPtpPriority1].SetValue(128);
// Enable end-to-end delay measurement
camera.Parameters[PLCamera.BslPtpProfile].SetValue(PLCamera.BslPtpProfile.DelayRequestResponseDefaultProfile);
// Set the network mode to unicast
camera.Parameters[PLCamera.BslPtpNetworkMode].SetValue(PLCamera.BslPtpNetworkMode.Unicast);
// Set the IP address of the first unicast device to 192.168.10.12
// (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12)
camera.Parameters[PLCamera.BslPtpUcPortAddrIndex].SetValue(0);
camera.Parameters[PLCamera.BslPtpUcPortAddr].SetValue(0xC0A80A0C);
// Enable PTP Management Protocol
camera.Parameters[PLCamera.BslPtpManagementEnable].SetValue(true);
// Disable two-step operation
camera.Parameters[PLCamera.BslPtpTwoStep].SetValue(false);
// ** Enable PTP on the current device **
camera.Parameters[PLCamera.PtpEnable].SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
/* 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 */
/* ** Configure PTP ** */
/* Set Priority 1 to 128 */
errRes = PylonDeviceSetIntegerFeature(hdev, "BslPtpPriority1", 128);
CHECK(errRes);
/* Enable end-to-end delay measurement */
errRes = PylonDeviceFeatureFromString(hdev, "BslPtpProfile", "DelayRequestResponseDefaultProfile");
CHECK(errRes);
/* Set the network mode to unicast */
errRes = PylonDeviceFeatureFromString(hdev, "BslPtpNetworkMode", "Unicast");
CHECK(errRes);
/* Set the IP address of the first unicast device to 192.168.10.12 */
/* (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12) */
errRes = PylonDeviceSetIntegerFeature(hdev, "BslPtpUcPortAddrIndex", 0);
CHECK(errRes);
errRes = PylonDeviceSetIntegerFeature(hdev, "BslPtpUcPortAddr", 0xC0A80A0C);
CHECK(errRes);
/* Enable PTP Management Protocol */
errRes = PylonDeviceSetBooleanFeature(hdev, "BslPtpManagementEnable", 1);
CHECK(errRes);
/* Disable two-step operation */
errRes = PylonDeviceSetBooleanFeature(hdev, "BslPtpTwoStep", 0);
CHECK(errRes);
/* ** Enable PTP on the current device ** */
errRes = PylonDeviceSetBooleanFeature(hdev, "PtpEnable", 1);
CHECK(errRes);
/* To check the status of the PTP clock synchronization, */
/* implement your own check method here. */
/* For guidelines, see "Checking the Status of */
/* the PTP Clock Synchronization" in this topic. */

其他相机#

// Enable PTP on the current device
camera.GevIEEE1588.SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
INodeMap& nodemap = camera.GetNodeMap();
// Enable PTP on the current device
CBooleanParameter(nodemap, "GevIEEE1588").SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
// Enable PTP on the current device
camera.Parameters[PLCamera.GevIEEE1588].SetValue(true);
// To check the status of the PTP clock synchronization,
// implement your own check method here.
// For guidelines, see "Checking the Status of
// the PTP Clock Synchronization" in this topic.
/* 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 */
/* Enable PTP on the current device */
errRes = PylonDeviceSetBooleanFeature(hdev, "GevIEEE1588", 1);
CHECK(errRes);
/* To check the status of the PTP clock synchronization, */
/* implement your own check method here. */
/* For guidelines, see "Checking the Status of */
/* the PTP Clock Synchronization" in this topic. */

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