Precision Time Protocol#
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 的更多信息,请参见 GigE 网络白皮书中的同步和实时:多相机应用。
启用 PTP 时钟同步#
开启相机电源时,始终禁用 PTP。如果要使用 PTP,必须自行启用。
要启用 PTP:
- 如果要将外部设备用作主时钟(例如 GPS 接收器),请将外部设备配置为主时钟。
Basler 建议将 ANNOUNCE 间隔设为 2 秒,将 SYNC 间隔设为 0.5 秒。 - 确保要通过 PTP 同步的所有相机均已正确配置。
- 在您要通过 PTP 进行同步的所有相机上,将
GevIEEE1588
参数设置为true
。 - 等待全部 PTP 网络设备已充分同步。根据您的网络设置,这可能需要几秒钟或几分钟。
您可以通过检查设备的 PTP 时钟同步状态来确定何时同步设备。
现在,您可以使用启用 PTP 的相机功能。
信息
在 ace Classic/U/L 相机上,启用 PTP 时钟同步会将相机的内部滴答频率从 125 MHz(= 8 ns 滴答持续时间)更改为 1 GHz(= 1 ns 滴答持续时间)。包间隔和帧传输延迟参数值会自动调整。
在其他相机上,滴答频率始终为 1 GHz。
配置 PTP 时钟同步#
根据您的相机型号,可以使用以下设置:
优先级 1#
在启用 PTP 的网络中,主时钟由几个条件决定。最重要的条件是设备的“优先级 1”设置。具有最低“优先级 1”设置的网络设备是主时钟。
On ace 2 and dart M cameras, you can change the Priority 1 setting to force a camera to be the master clock, or to prevent a camera from being the master clock. To do so, set the BslPtpPriority1
parameter to a value between 0 (highest priority) and 255 (lowest priority).
在其他相机上,“优先级 1”设置预设为 128,无法更改。
信息
有关主时钟标准的更多信息,请参见 IEEE 1588-2008 规范的条款 7.6.2.2。
PTP 延迟机制#
延迟测量机制定义了如何在网络内发送和接收 PTP 延迟测量消息。PTP 标准定义了两种机制:端到端(E2E,也称为“延迟请求-响应”)和点对点 (P2P)。有关更多信息,请参见本文。
On ace 2 and dart M cameras, you can change the delay measurement mechanism. To do so, set the BslPtpProfile
parameter to DelayRequestResponseDefaultProfile
(default) or PeerToPeerDefaultProfile
.
在其他相机上,延迟测量机制预设为端到端,无法更改。
信息
网络模式#
网络模式设置定义了如何在网络内传输 PTP 消息。
在 ace 2 相机上,可以更改网络模式。为此,请将 BslPtpNetworkMode
参数设置为以下值之一:
Multicast
:将 PTP 消息发送到本地网络中配置为 PTP 多播的所有设备。这是默认模式,对于大多数用例而言已足够。Hybrid
:使用多播和单播消息发送 PTP 消息。由于需要处理的消息较少,因此可以节省网络负载。有关更多信息,请参见本文。单播
:PTP 消息被发送到本地网络中的一个或多个指定设备。其他设备无法接收 PTP 消息。
要配置单播,请执行以下操作:- 确保将
BslPtpNetworkMode
设置为Unicast
。 - 将
BslPtpUcPortAddrIndex
参数设置为 0。 - 将
BslPtpUcPortAddr
参数设置为第一个接收设备的 IP 地址。 - 将
BslPtpUcPortAddrIndex
参数增加 1。 - 将
BslPtpUcPortAddr
参数设置为下一个接收设备的 IP 地址。 - 对涉及的所有 PTP 设备重复步骤 3 和 4。
- 确保将
在其他相机上,网络模式预设为多播。但是,这些相机也可以接收单播消息并做出相应响应。
信息
使用单播模式时,涉及的所有设备都必须支持单播协商。一些 PTP 实现不使用单播协商,因此与 Basler 相机不兼容。
PTP 管理#
PTP 管理协议可让您通过管理消息读取任何 PTP 设备的设置,即无需使用 pylon API。如果允许,也可以写入设置。
On ace 2 and dart M cameras, you can enable or disable PTP management. To do so:
- 启用 PTP 时钟同步。
- 设置
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 |
-
INITIALIZE 命令可重置时钟速度。
-
仅当相应的设备用作超级主时钟时才能设置。
有关这些属性的默认值和范围的信息,请参见 IEEE 1588-2008 规范附录 J。
一步或两步时钟#
此设置定义为需要出口 timestamp 的任何 PTP 事件消息生成多少条消息:
- 在一步操作中,发送一条消息。该消息包括消息数据和出口 timestamp。
- 在两步操作中,发送两条消息。第一条消息包括消息数据。第二条消息包括出口 timestamp。
有关更多信息,请参见本文。
On ace 2 and dart M cameras, two-step operation is disabled by default. If another PTP device in the network explicitly requires two-step event messages, you can enable them by setting the BslPtpTwoStep
parameter to true
.
在其他相机上,始终启用两步操作。
检查 PTP 时钟同步的状态#
要检查 PTP 时钟同步的状态,您必须使用 pylon API。
一个典型的 PTP 状态检查实现包含以下步骤:
- 执行
GevIEEE1588DataSetLatch
命令。
该命令可让您获取相机当前 PTP 状态的“快照”。“快照”实现可确保锁存数据集内的所有参数值都指向完全相同的时间点。 - 请等待,直至
GevIEEE1588Status
参数值不再是Initializing
。 -
从设备读取以下参数值,具体取决于相机型号:
- On ace 2 and dart M cameras, read the
PtpServoStatus
parameter from all slave cameras. If the parameter value isLocked
, the respective device should be sufficiently synchronized. If you need a more refined status check, follow the "other cameras" procedure below instead. -
在其他相机上,从所有从属相机读取
GevIEEE1588OffsetFromMaster
参数值,直到与主相机的最大偏移量低于某个阈值(根据您的要求,例如 1 毫秒)。
由于时钟是通过控制机制连续调整的,因此偏移量不会单调降低。Basler 建议您检查给定时间范围内的最大GevIEEE1588OffsetFromMaster
参数值:
- On ace 2 and dart M cameras, read the
-
重复步骤 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 相关的值,则设备状态与其他值不在同一时间点。
附加参数#
On ace 2 and dart M cameras, after executing the PtpDataSetLatch
command, you can read the following additional parameter values from the device:
BslPtpDelayMechanism
:指示 PTP 网络使用的延迟机制。E2E
值表示使用了延迟请求-响应机制。P2P
值表示使用了点对点机制。PtpClockAccuracy
:指示当 PTP 设备时钟是或成为超级主时钟时的预期精度。在 Basler 相机上,预期精度预设为Unknown
。这是因为 Basler 相机无法与协调的世界时间同步,例如 UTC。PtpGrandmasterClockID
:指示当前用作超级主时钟的 PTP 设备的时钟 ID。PtpServoStatus
:指示时钟伺服器的状态,即 PTP 时钟同步的状态。如果状态为Locked
,则当前设备的时钟与主时钟成功同步。在所有其他情况下,状态为Unknown
。
外部链接#
- 端到端与点对点(时间同步博客)
- 混合模式 PTP:混合多播和单播(时间同步博客)
- IEEE 1588-2008 规范(IEEE 标准协会)
- 一步还是两步?(时间同步博客)
- Precision Time Protocol(维基百科)
- 白皮书:同步和实时:GigE 网络 (Basler) 中的多相机应用
示例代码#
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. */
# ** Configure PTP **
# Set Priority 1 to 128
camera.BslPtpPriority1.Value = 128
# Enable end-to-end delay measurement
camera.BslPtpProfile.Value = "DelayRequestResponseDefaultProfile"
# Set the network mode to unicast
camera.BslPtpNetworkMode.Value = "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.Value = 0
camera.BslPtpUcPortAddr.Value = 0xC0A80A0C
# Enable PTP Management Protocol
camera.BslPtpManagementEnable.Value = True
# Disable two-step operation
camera.BslPtpTwoStep.Value = False
# ** Enable PTP on the current device **
camera.PtpEnable.Value = 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.
/* 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 轻松设置参数。