冗長データの同期
基本的に、冗長領域タイプを使用して、冗長データが同期されるかどうか、いつ同期されるか、およびデータがどこからどこにコピーされるかに影響を与えることができます。
とき 冗長構成 オブジェクトがアプリケーションに存在する場合、 AREA_INPUT 冗長領域タイプは、デフォルトですべての変数 (すべてのグローバル変数リストおよびユーザーが作成するすべてのプログラム) に割り当てられます。これは、オブジェクトを後でアプリケーションに追加した場合にも発生します。その結果、すべての変数がデフォルトで登録されます。
これらのオブジェクトのリストは、 冗長構成 の編集者 登録地域 タブ。
詳細については、以下を参照してください。 全般的
冗長システム起動時の同期
2台目のPLCが起動すると、冗長データ(と AREA_INPUT 冗長エリア (タイプ) が最初にコピーされ、アクティブな PLC から 2 番目の PLC に 1 回コピーされます。その後、PLC はスタンバイに切り替わります。
ただし、デフォルトの選択を解除することはできます AREA_INPUT 同期から変数を除外する冗長領域タイプ。
- の中に 冗長性の構成 エディター、 登録エリア タブをクリックし、 変数 タブ。 - オブジェクトのリスト(タイプ プログラム また グローバル変数リスト)は下に表示されます 物体。アクティブ化されたオブジェクトが同期用に選択されるため、 - AREA_INPUT冗長エリアタイプ。
- オブジェクトを非アクティブ化します。 - 例  - ヒント- これは、フィールドバスのローカル診断データまたはローカル冗長状態に推奨されます。 
すべてのタスクサイクルで同期する
ランタイムシステムの構成ファイル(* .cfg)に次のエントリが含まれている場合、タスクサイクルが開始されるたびに同期がトリガーされます。
[CmpRedundancy] DataSyncAlways=1
の変数 PROGRAM 冗長領域タイプがであるオブジェクトおよびグローバル変数リスト AREA_INPUT 影響を受けます。
PROGRAM PLC_PRG
VAR
    b: INT;
END_VAR
IF sReduState.eRedundancyState = RDCY.STATE.RS_CYCLE_ACTIVE THEN
    b := b + 1;
END_IFザル b 変数はアクティブな PLC でのみインクリメントされます。冗長システム内のデータは各タスクサイクルと同期されるため、冗長変数は 2 番目の PLC に継続的に転送されます
オンデマンドで同期
ランタイムシステムのコンフィギュレーションファイル(.cfg)に DataSyncAlways=1 という項目がない場合は、IEC コードの中でプログラム的に同期をトリガーする方が望ましいかもしれない。
これを行うには、 RedundancySynchronizeData() IECコードで機能します。次に、 AREA_INPUT 冗長エリアタイプは同期されます。したがって、の設定を確認してください 登録エリア のタブ 変数 タブ。コピー操作は、タスクサイクルの開始時に実行されます。
アクティブ/スタンバイモードでは、 b アクティブな PLC では変数がインクリメントされます。いつ bUpdateData が設定されると、データ同期が 1 回トリガーされ、その値が 2 番目の PLC に転送されます。
IF bUpdateData THEN
    bUpdateData := FALSE;
    RedundancySynchronizeData();
END_IFすべてのタスクサイクルにおけるアクティブ PLC からスタンバイ PLC への同期
ザル AREA_SYNCHRO あるタイプの冗長データは、各タスクサイクルの動作中にアクティブ PLC からスタンバイ PLC に転送できます。この場合のデータサイズには制限があります。型の割り当ては、ではサポートされていません CODESYSただし、のコールバックとしてプログラムで実行する必要があります AreaRegister 関数。
アプリケーションを開始する前にエリアを登録する必要があります。最初のサイクルで領域を登録するには遅すぎます。そのため、登録は のコールバックで行われます。 cbDownloadDone システムイベント。
FUNCTION cbDownloadDone : DWORD
VAR_IN_OUT
        EventPrm: CmpApp.EVTPARAM_CmpApp;
END_VAR
(* Register GVL_Synchro to be synchronized in every task cycle *)
bAreaRegisterDone := AreaRegister(ADR(iSyncFirst), ADR(iSyncLast) - ADR(iSyncFirst) + sizeof(iSyncLast), AREA_TYPE.AREA_SYNCHRO);
tNowDownloadDone := TIME();の呼び出し cbDownloadDone が実行されるときに実行されます OnlineChangeDone システムイベントが発生します。システムイベントがタスク構成に追加されます。

ヒント
に注意してください AreaRegister 関数は冗長ライブラリの一部のバージョンでは非表示になっていますが、それでも呼び出すことができます。
すべてのタスク サイクルでパッシブ PLC からアクティブ PLC への同期
タイプの冗長データAREA_PASSIVE各タスク サイクルの動作中にパッシブ PLC からアクティブ PLC に転送できます。このため、データのサイズは制限されます。型の割り当ては次ではサポートされていません。 CODESYS、ただし、コールバックとしてプログラム的に実行する必要があります。 AreaRegister 関数。
アプリケーションを開始する前にエリアを登録する必要があります。最初のサイクルで領域を登録するには遅すぎます。その結果、登録は のコールバックで行われます。 cbDownloadDone システム イベント ( 前の章の例)。
FUNCTION cbDownloadDone : DWORD
VAR_IN_OUT
    EventPrm: CmpApp.EVTPARAM_CmpApp;
END_VAR
(* Register GVL_Synchro to be synchronized in every task cycle *)
bAreaRegisterDone := AreaRegister(ADR(iSyncFirst), ADR(iSyncLast) - ADR(iSyncFirst) + sizeof(iSyncLast), AREA_TYPE.AREA_PASSIVE);
tNowDownloadDone := TIME();の呼びかけ cbDownloadDone のときに実行されます。 OnlineChangeDone システムイベントが発生します。システムイベントがタスク設定に追加されます。

タイマーの同期
IEC タイムベースの値は、PLC サイクルごとにアクティブ PLC からスタンバイ PLC に転送されます。これは影響します TIME、 TON、および TOF。システム時間 (例: SysTimeGetMs) は転送されず、各 PLC の現地時間として表示されます。
登録エリアの同期のタイムアウトの設定
に適切な値を設定するには 同期タイムアウト 内の登録エリアの 冗長設定まず、システムトレースを使用してこれを判断できます。
- デバイスツリーで、を追加します トレース デバイスオブジェクトの下にあるオブジェクト。 
- の中に 冗長設定 で 将軍 タブを選択し、 必要な同期時間をシステムトレースに記録します。 オプション。 
- ロード そして、システムトレースのトレース記録を開始します。 
- 同期中のタイムアウトのデフォルト値 - SyncWaitTimeは、の値です。- StandbyWaitTime次に、この値が 30 ミリ秒にプリセットされます。- セットの場合 - SyncWaitTimeが短すぎる場合は、「同期待機時間が原因で、%」PRI_UI32「ms 後に同期が終了しました」というメッセージがログに表示されます。- セット時 待機時間を同期 十分な長さであれば、実際に必要な SyncTime がシステムトレースに記録されます。このセットを最適化してみることもできます - SyncWaitTimeこれにより、実際に必要な SyncTime にできるだけ近づけることができます。