Precision Time Protocol#
IEEE 1588規格でプロトコルが定義されています。Baslerカメラは、IEEE 1588-2008(PTP Version 2とも呼ばれる)をサポートしています。
情報
PTP同期の精度は、ネットワークのハードウェアとセットアップによって大きく異なります。最高の精度を得るには、高品質のネットワークハードウェアを選択し、PTP有効ネットワークスイッチを使用し、GPS受信機を備えた外部PTPクロックデバイスをネットワークに追加してください。
機能を使用する#
PTPを使用する理由#
Precision Time Protocol(PTP)機能を使用すると、カメラで次の機能を使用できます(使用可能な場合)。
仕組み#
PTPを使用すると、複数のデバイス(カメラなど)が、ネットワーク内にある最も正確なクロック(マスタークロック、またはベストマスタークロックと呼ばれる)と自動的に同期されます。
このプロトコルを使用すると、ネットワーク内のシステムで次のことが可能になります。
- マスタークロックと同期させます。つまり、ローカルクロックをマスタークロックの時間にできるだけ精密に合わせて設定します。
 - マスタークロックと同調させます。つまり、ローカルクロックの周波数をマスタークロックの周波数に調整します。両方のデバイスで、1秒の継続時間を可能な限り同一にする必要があります。
 
マスタークロックは、いくつかの基準によって決定されます。優先順位が最も高い基準は、デバイスのPriority 1設定です。
Timestampの同期#
Precision Time Protocol(IEEE 1588)の基本概念は、PTPメッセージ交換に基づいています。これらのメッセージにより、スレーブクロックは、タイムスタンプ値をマスタークロックのタイムスタンプ値と同期させることができます。Baslerカメラの場合、そのTimestampLatchValueパラメーター値が可能な限り同一であることを意味します。精度は、ネットワークのハードウェアとセットアップによって大きく異なります。
ネットワーク内のデバイスが協定世界時(TAIやUTCなど)に同期されていない場合、ネットワークは任意のタイムスケールモード(ARB)で動作します。このモードでは、絶対時間にバインドされないため、エポックは任意です。タイムスケールは相対的であり、このネットワーク内でのみ有効です。
情報
- IEEE 1588では、時間情報を保存および転送するための80ビットタイムスタンプが定義されています。GigEVisionは64ビットのタイムスタンプを使用するため、PTPタイムスタンプはGigE Visionの64ビットのタイムスタンプにマッピングされます。
 - 他のPTP有効デバイスがないネットワークで動作するPTP有効デバイスは、ローカルクロックを統制しません。ローカルクロックの精度は、PTP無効デバイスと同じです。
 - Precision Time Protocolの詳細については、Synchronous and in Real Time: Multi-Camera Applications in the GigE Networkホワイトペーパーを参照してください。
 
PTP Clock Synchronizationの有効化#
カメラの電源をオンにすると、PTPは常に無効になります。PTPを使用する場合は、有効にする必要があります。
PTPを有効にするには、次の手順に従います。
- 外部デバイスをマスタークロック(GPSレシーバーなど)として使用する場合は、外部デバイスをマスタークロックとして設定します。
Baslerは、ANNOUNCE間隔を2秒、SYNC間隔を0.5秒にすることをお勧めします。 - PTP経由で同期するすべてのカメラが正しく設定されていることを確認してください。
 - PTP経由で同期するすべてのカメラで、
GevIEEE1588パラメーターをtrueに設定します。 - すべてのPTPネットワークデバイスが十分に同期されるまで待機します。ネットワークの設定によっては、数秒または数分かかる場合があります。
PTPクロック同期のステータスを確認することで、デバイスが同期されるタイミングを確認できます。 
これで、PTPが有効化されたカメラ機能を使用できるようになりました。
情報
ace Classic/Lカメラでは、PTPクロック同期を有効にすると、カメラの内部ティック周波数が125MHz(= 8nsティック持続時間)から1GHz(=1nsティック持続時間)に変更されます。Inter-packet DelayおよびFrame Transmission Delayパラメーター値は自動的に調整されます。
他のカメラでは、ティック周波数は常に1GHzです。
PTP Clock Synchronizationの設定#
お使いのカメラのモデルに応じて、次の設定を使用できます。
Priority 1#
PTPが有効なネットワークでは、マスタークロックがいくつかの基準によって決定されます。最も重要な基準は、デバイスのPriority 1設定です。Priority 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).
他のカメラでは、Priority 1設定は128にプリセットされており、変更できません。
情報
マスタークロック基準の詳細については、IEEE 1588-2008仕様の7.6.2.2項を参照してください。
PTP Delay Mechanism#
遅延測定メカニズムは、ネットワーク内でPTP遅延測定メッセージを送受信する方法を定義します。PTP規格では、エンドツーエンド(E2E、「遅延要求応答」とも呼ばれる)とピアツーピア(P2P)の2つのメカニズムが定義されています。詳細については、この記事を参照してください。
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有効で、すべてのPTPデバイスがピアツーピア通信用に設定されている場合です。
 - ピアツーピア遅延測定を使用する場合は、次の制約事項が適用されます。
- ネットワークモードはHybridに設定できません。
 - ワンステップクロック操作を有効にできません。カメラは常に2ステップモードで動作します。
 
 
Network Mode#
ネットワークモード設定では、ネットワーク内でPTPメッセージを転送する方法が定義されます。
ace 2カメラでは、ネットワークモードを変更できます。これを行うには、BslPtpNetworkModeパラメーターを次のいずれかの値に設定します。
Multicast:PTPメッセージは、PTPマルチキャスト用に設定されたローカルネットワーク内のすべてのデバイスに送信されます。これはデフォルトのモードであり、ほとんどの使用ケースに適用できます。Hybrid:PTPメッセージは、マルチキャストメッセージおよびユニキャストメッセージを使用して送信されます。これにより、処理する必要のあるメッセージが少なくなるため、ネットワークの負荷が軽減されます。詳細については、この記事を参照してください。ユニキャスト:PTPメッセージは、ローカルネットワーク内の1つ以上の指定されたデバイスに送信されます。他のデバイスは、PTPメッセージを受信できません。
ユニキャストを設定するには、次の手順に従います。BslPtpNetworkModeがUnicastに設定されていることを確認します。BslPtpUcPortAddrIndexパラメーターを0に設定します。BslPtpUcPortAddrパラメーターに、最初の受信デバイスのIPアドレスを設定します。BslPtpUcPortAddrIndexパラメーターを1ずつ増やします。BslPtpUcPortAddrパラメーターに、次の受信デバイスのIPアドレスを設定します。- 関連するすべてのPTPデバイスについて、手順3と4を繰り返します。
 
他のカメラでは、ネットワークモードはマルチキャストにプリセットされています。ただし、これらのカメラはユニキャストメッセージを受信し、それに対応して応答することもできます。
情報
ユニキャストモードを使用する場合、関連するすべてのデバイスがユニキャストネゴシエーションをサポートしている必要があります。一部のPTP実装ではユニキャストネゴシエーションが使用されないため、Baslerカメラとの互換性はありません。
PTP Management#
PTP Management Protocolを使用すると、pylon APIを使用せずに、管理メッセージを介して任意のPTPデバイスの設定を読み取ることができます。許可されている場合は、設定を書き込むこともできます。
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 Management Protocolは無効になっており、設定の読み取りも書き込みもできません。
 
他のカメラでは、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を参照してください。
One-StepまたはTwo-Step Clock#
この設定では、egressタイムスタンプが必要なPTPイベントメッセージに対して生成されるメッセージ数を定義します。
- ワンステップ操作では、1つのメッセージが送信されます。メッセージには、メッセージデータとegressタイムスタンプが含まれます。
 - 2ステップ操作では、2つのメッセージが送信されます。最初のメッセージには、メッセージデータが含まれます。2番目のメッセージには、egressタイムスタンプが含まれます。
 
詳細については、この記事を参照してください。
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.
他のカメラでは、2ステップ操作は常に有効になっています。
PTP Clock Synchronizationのステータスを確認する#
PTPクロック同期のステータスを確認するには、pylon APIを使用して独自のチェック方法を開発する必要があります。
PTPステータスチェックの一般的な実装には、次の手順が含まれます。
GevIEEE1588DataSetLatchコマンドを実行します。
このコマンドを使用すると、カメラの現在のPTP状態の「スナップショット」を取得できます。「スナップショット」の実装により、ラッチデータセット内のパラメーター値すべてが正確に同じ時点を参照するようになります。GevIEEE1588Statusパラメーター値が初期化されなくなるまで待ちます。-  
カメラのモデルに応じて、デバイスから次のパラメーター値を読み取ります。
- On ace 2 and dart M cameras, read the 
PtpServoStatusparameter 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. -  
他のカメラでは、(1ミリ秒などの要件に従って)マスターからの最大オフセットが特定のしきい値を下回るまで、すべてのスレーブカメラの
GevIEEE1588OffsetFromMasterパラメーター値を読み取ります。
クロックが制御メカニズムによって連続的に調整されるため、オフセットは単調に減少しません。Baslerは、所定の時間ウィンドウ内で最大のGevIEEE1588OffsetFromMasterパラメーター値をチェックすることを推奨します。
 
 - On ace 2 and dart M cameras, read the 
 -  
デバイスが十分に同期されるまで、手順1と2を繰り返します。
 
Latched Data Setの中身#
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の値は、Delay Request-Responseメカニズムが使用されていることを示します。P2Pの値は、ピアツーピアメカニズムが使用されていることを示します。PtpClockAccuracy:PTPデバイスクロックがグランドマスターである(またはグランドマスターになる)ときの予測精度を示します。Baslerカメラでは、予測される精度は、Unknownにプリセットされています。これは、BaslerカメラがUTCなどの協定世界時に同期していないためです。PtpGrandmasterClockID:現在グランドマスタークロックとして機能しているPTPデバイスのクロックIDを示します。PtpServoStatus:クロックサーボの状態(PTPクロック同期の状態)を示します。ステータスがLockedの場合、現在のデバイスのクロックはマスタークロックと正常に同期されています。それ以外の場合、状態はUnknownです。
外部リンク#
- End-to-End Versus Peer-to-Peer (Time Synchronization Blog)
 - Hybrid Mode PTP: Mixed Multicast and Unicast (Time Synchronization Blog)
 - IEEE 1588-2008 Specification (IEEE Standards Association)
 - One-step or Two-step? (Time Synchronization Blog)
 - Precision Time Protocol(Wikipedia)
 - White Paper: Synchronous and in Real Time: Multi-Camera Applications in the GigE Network (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を使用して、パラメーターを簡単に設定することもできます。