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メッセージの交換に基づいています。これらのメッセージにより、スレークロックは次のように同期させることができます。 タイムスタンプ マスタークロックのTimestamp値と値を同期させます。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およびdart Mカメラでは、Priority 1設定を変更して、カメラを強制的にマスタークロックにしたり、カメラがマスタークロックになるのを防いだりすることができます。これを行うには、 BslPtpPriority1 パラメータを0(最優先)から255(最も優先度が低い)の間の値に設定します。
他のカメラでは、Priority 1設定は128にプリセットされており、変更できません。
情報
マスタークロック基準の詳細については、IEEE 1588-2008仕様の7.6.2.2項を参照してください。
PTP Delay Mechanism#
遅延測定メカニズムは、ネットワーク内でPTP遅延測定メッセージを送受信する方法を定義します。PTP規格では、エンドツーエンド(E2E、「遅延要求応答」とも呼ばれる)とピアツーピア(P2P)の2つのメカニズムが定義されています。詳細については、この記事を参照してください。
On ace 2およびdart Mカメラでは、遅延測定メカニズムを変更できます。これを行うには、 BslPtpProfile パラメータを DelayRequestResponseDefaultProfile (デフォルト)または PeerToPeerDefaultProfile.
他のカメラでは、遅延測定メカニズムはエンドツーエンドにプリセットされており、変更できません。
情報
- ほとんどの場合、エンドツーエンドの遅延測定を使用します。ピアツーピアの遅延測定がネットワーク全体で設定されている場合にのみ、ピアツーピアを使用します。つまり、すべてのスイッチとルーターがPTP有効で、すべてのPTPデバイスがピアツーピア通信用に設定されている場合です。
- ピアツーピア遅延測定を使用する場合は、次の制約事項が適用されます。
- ネットワークモードはHybridに設定できません。
- ワンステップクロック操作を有効にできません。カメラは常に2ステップモードで動作します。
Network Mode#
ネットワークモード設定では、ネットワーク内でPTPメッセージを転送する方法が定義されます。
On ace 2カメラでは、ネットワークモードを変更できます。これを行うには、 BslPtpNetworkMode パラメーターを次のいずれかの値に設定します。
Multicast: PTPメッセージは、PTPマルチキャスト用に設定されたローカルネットワーク内のすべてのデバイスに送信されます。これがデフォルトモードであり、ほとんどのユースケースで十分です。Hybrid: PTPメッセージは、マルチキャストおよびユニキャストメッセージを使用して送信されます。処理するメッセージが少なくて済むため、ネットワーク負荷が軽減されます。詳細については、 この記事.Unicast: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デバイスの設定を読み取ることができます。許可されている場合は、設定を書き込むこともできます。
ace 2およびdart Mカメラでは、PTP管理を有効または無効にできます。手順は以下の通りです。
- 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を参照してください。
One-StepまたはTwo-Step Clock#
この設定では、egressタイムスタンプが必要なPTPイベントメッセージに対して生成されるメッセージ数を定義します。
- ワンステップ操作では、1つのメッセージが送信されます。メッセージには、メッセージデータとegressタイムスタンプが含まれます。
- 2ステップ操作では、2つのメッセージが送信されます。最初のメッセージには、メッセージデータが含まれます。2番目のメッセージには、egressタイムスタンプが含まれます。
詳細については、この記事を参照してください。
On ace 2およびdart Mカメラでは、デフォルトで2ステップ動作が無効になっています。ネットワーク内の別のPTPデバイスが2ステップイベントメッセージを明示的に必要とする場合は、設定を変更して有効にすることができます。 BslPtpTwoStep パラメータを true.
他のカメラでは、2ステップ操作は常に有効になっています。
PTP Clock Synchronizationのステータスを確認する#
PTPクロック同期のステータスを確認するには、pylon APIを使用して独自のチェック方法を開発する必要があります。
PTPステータスチェックの一般的な実装には、次の手順が含まれます。
- 実行します:
GevIEEE1588DataSetLatchコマンド。
このコマンドを使用すると、カメラの現在のPTP状態の「スナップショット」を取得できます。「スナップショット」の実装により、すべてが保証されます。 ラッチされたデータセット内のパラメータ値 正確に同じ時点を指します。 - 次まで待機します。
GevIEEE1588Statusパラメータ値がなくなったら、Initializing. -
カメラのモデルに応じて、デバイスから次のパラメーター値を読み取ります。
- On ace 2およびdart Mカメラすべてのスレーブカメラから、
PtpServoStatusパラメータを読み取ります。パラメータ値がLockedである場合、各デバイスは十分に同期されているはずです。より詳細なステータスチェックが必要な場合は、代わりに以下の「その他のカメラ」の手順に従ってください。 -
On その他のカメラすべてのスレーブカメラから、
GevIEEE1588OffsetFromMasterマスターからの最大オフセットが特定のしきい値(要件に応じて、例:1ミリ秒)を下回るまで、すべてのスレーブカメラからパラメータ値を取得します。
クロックは制御機構によって継続的に調整されるため、オフセットは単調減少しません。Baslerでは、指定された時間枠内で最大GevIEEE1588OffsetFromMasterパラメータ値を確認することを推奨しています:
- On ace 2およびdart Mカメラすべてのスレーブカメラから、
-
デバイスが十分に同期されるまで、手順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およびdart M カメラでは、 PtpDataSetLatch コマンドを実行した後、デバイスから以下の追加パラメータ値を読み取ることができます:
BslPtpDelayMechanism: 遅延メカニズム を示します。PTPネットワークで使用されます。値はE2EDelay 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を使用して、パラメーターを簡単に設定することもできます。