跳转到内容

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 的相机功能

信息

启用 PTP 时钟同步会将相机的内部滴答频率从 125 MHz(= 8 ns 滴答持续时间)更改为 1 GHz(= 1 ns 滴答持续时间)。
包间隔帧传输延迟参数值会自动调整。

配置 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
CIntegerPtr(nodemap.GetNode("BslPtpPriority1"))->SetValue(128);
// Enable end-to-end delay measurement
CEnumerationPtr(nodemap.GetNode("BslPtpProfile"))->FromString("DelayRequestResponseDefaultProfile");
// Set the network mode to unicast
CEnumerationPtr(nodemap.GetNode("BslPtpNetworkMode"))->FromString("Unicast");
// Set the IP address of the first unicast device to 192.168.10.12
// (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12)
CIntegerPtr(nodemap.GetNode("BslPtpUcPortAddrIndex"))->SetValue(0);
CIntegerPtr(nodemap.GetNode("BslPtpUcPortAddr"))->SetValue(0xC0A80A0C);
// Enable PTP Management Protocol
CBooleanPtr(nodemap.GetNode("BslPtpManagementEnable"))->SetValue(true);
// Disable two-step operation
CBooleanPtr(nodemap.GetNode("BslPtpTwoStep"))->SetValue(false);
// ** Enable PTP on the current device **
CBooleanPtr(nodemap.GetNode("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.
// ** Configure PTP **
// Set Priority 1 to 128
Pylon.DeviceSetIntegerFeature(hdev, "BslPtpPriority1", 128);
// Enable end-to-end delay measurement
Pylon.DeviceFeatureFromString(hdev, "BslPtpProfile", "DelayRequestResponseDefaultProfile");
// Set the network mode to unicast
Pylon.DeviceFeatureFromString(hdev, "BslPtpNetworkMode", "Unicast");
// Set the IP address of the first unicast device to 192.168.10.12
// (0xC0 = 192, 0xA8 = 168, 0x0A = 10, 0x0C = 12)
Pylon.DeviceSetIntegerFeature(hdev, "BslPtpUcPortAddrIndex", 0);
Pylon.DeviceSetIntegerFeature(hdev, "BslPtpUcPortAddr", 0xC0A80A0C);
// Enable PTP Management Protocol
Pylon.DeviceSetBooleanFeature(hdev, "BslPtpManagementEnable", true);
// Disable two-step operation
Pylon.DeviceSetBooleanFeature(hdev, "BslPtpTwoStep", false);
// ** Enable PTP on the current device **
Pylon.DeviceSetBooleanFeature(hdev, "PtpEnable", 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
CBooleanPtr(nodemap.GetNode("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.
// Enable PTP on the current device
Pylon.DeviceSetBooleanFeature(hdev, "GevIEEE1588", 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 轻松设置参数。