Skip to main content

Redundante Daten synchronisieren

Grundsätzlich können Sie über den Redundanz-Area-Typ beeinflussen, ob und wann die Redundanzdaten synchronisiert und von wo nach wo die Daten kopiert werden.

Wenn das Objekt Redundanzkonfiguration in der Applikation vorhanden ist, wird allen Variablen (in allen globalen Variablenlisten und allen Programmen, die der Benutzer anlegt) standardmäßig der Redundanz-Area-Typ AREA_INPUT zugewiesen. Das passiert auch, wenn Sie das Objekt der Applikation später hinzufügen. Somit sind alle Variablen standardmäßig registriert.

Eine Liste dieser Objekte finden Sie im Editor Redundanzkonfiguration unter der Registerkarte Registrierte Bereiche.

Für weitere Informationen siehe: Allgemein

Beim Start des Redundanzsystems synchronisieren

Beim Start der zweiten Steuerung werden erstmals und einmalig die Redundanzdaten (mit Redundanz-Area-Typ AREA_INPUT) von der aktiven zur zweiten Steuerung kopiert. Dann geht die Steuerung in Standby.

Sie können den voreingestellten Redundanz-Area-Typ AREA_INPUT allerdings abwählen und so Variablen von der Synchronisierung ausschließen.

Prozedur. Objekte von der Synchronisierung ausschließen
  1. Wählen Sie im Editor Redundanzkonfiguration die Registerkarte Registrierte Bereiche, Registerkarte Variablen.

    Unter Objekt ist eine Liste mit Objekten (Typ Programm oder Globale Variablenliste). Die aktivierten Objekte sind für die Synchronisierung ausgewählt und erhalten deshalb den Redundanz-Area-Typ AREA_INPUT.

  2. Deaktivieren Sie ein Objekt.

    Beispiel

    rdncy_img_settings_registered_areas.png

    Tipp

    Das ist ratsam bei lokalen Diagnosedaten des Feldbusses oder bei einem lokalen Redundanzstatus.

In jedem Taskzyklus synchronisieren

Wenn die Konfigurationsdatei des Laufzeitsystems (*.cfg) den folgenden Eintrag enthält, wird mit jedem Taskzyklusstart eine Synchronisierung angestoßen.

[CmpRedundancy]
DataSyncAlways=1

Betroffen davon sind die Variablen von PROGRAM-Objekten und globalen Variablenlisten, deren Redundanz-Area-Typ AREA_INPUT ist.

Beispiel 4. Beispiel
PROGRAM PLC_PRG
VAR
    b: INT;
END_VAR

IF sReduState.eRedundancyState = RDCY.STATE.RS_CYCLE_ACTIVE THEN
    b := b + 1;
END_IF

Die Variable b wird nur in der aktiven Steuerung inkrementiert. Da im Redundanzsystem mit jedem Taskzyklus synchronisiert wird, wird die Redundanzvariable laufend zur zweiten Steuerung übertragen.



Auf Anforderung synchronisieren

Wenn die Konfigurationsdatei des Laufzeitsystems (<rts name>.cfg) ohne den Eintrag DataSyncAlways=1 ist, kann es wünschenswert sein, im IEC-Code programmatisch eine Synchronisation anzustoßen.

Rufen Sie dazu die Funktion RedundancySynchronizeData() in Ihrem IEC-Code auf. Die Variablen mit dem Redundanz-Area-Typ AREA_INPUT werden dann synchronisiert. Überprüfen Sie deshalb die Einstellungen in Registerkarte Registrierte Bereiche in Registerkarte Variablen. Der Kopiervorgang findet am Anfang des Taskzyklus statt.

Beispiel 5. Beispiel

Im Aktiv/Standby-Betrieb wird die Variable b in der aktiven Steuerung inkrementiert. Wenn bUpdateData gesetzt ist, wird einmalig eine Datensynchronisierung angestoßen und der Wert zur zweiten Steuerung übertragen.

IF bUpdateData THEN
    bUpdateData := FALSE;
    RedundancySynchronizeData();
END_IF


Von der aktiven zur Standby-SPS in jedem Taskzyklus synchronisieren

Redundanzdaten des Typs AREA_SYNCHRO können während des Betriebs in jedem Taskzyklus von der aktiven zur Standby-SPS übertragen werden. Dabei ist die Größe der Daten beschränkt. Die Zuweisung des Typs wird in CODESYS nicht unterstützt, sondern muss programmatisch als Callback der Funktion AreaRegister erfolgen.

Die Registrierung des Bereichs muss vor dem Start der Anwendung erfolgen. Es ist zu spät, Bereiche im ersten Zyklus zu registrieren. Die Registrierung erfolgt deshalb im Callback des Systemereignisses cbDownloadDone.

Beispiel 6. Beispiel
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();

Der Aufruf von cbDownloadDone erfolgt, wenn das Systemereignis OnlineChangeDone eintritt. Systemereignisse werden in der Taskkonfiguration hinzugefügt.

rdncy_img_task_configuration_redundant.png


Tipp

Bitte beachten Sie, dass die Funktion AreaRegister in einigen Versionen der Redundanzbibliothek versteckt ist, aber trotzdem aufgerufen werden kann.

Von der Standby- zur aktiven SPS in jedem Taskzyklus synchronisieren

Redundanzdaten des Typs AREA_PASSIVE können während des Betriebs in jedem Taskzyklus von der Standby- zur aktiven SPS übertragen werden. Dabei ist die Größe der Daten beschränkt. Die Zuweisung des Typs wird in CODESYS nicht unterstützt, sondern muss programmatisch als Callback der Funktion AreaRegister erfolgen.

Die Registrierung des Bereichs muss vor dem Start der Anwendung erfolgen. Es ist zu spät, Bereiche im ersten Zyklus zu registrieren. Die Registrierung erfolgt deshalb im Callback des Systemereignisses cbDownloadDone (in der gleichen Weise wie im Beispiel des vorherigen Kapitels).

Beispiel 7. Beispiel
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();

Der Aufruf von cbDownloadDone erfolgt, wenn das Systemereignis OnlineChangeDone eintritt. Systemereignisse werden in der Taskkonfiguration hinzugefügt.

rdncy_img_task_configuration_redundant.png


Timer synchronisieren

Der Wert der IEC-Zeitbasis wird in jedem SPS-Zyklus von der aktiven zur Standby-SPS übertragen. Das betrifft TIME, TON und TOF. Die Systemzeiten wie beispielsweise SysTimeGetMs werden nicht übertragen und stehen auf jeder SPS als lokale Zeit zur Verfügung.

Einstellen der Zeitüberschreitung bei der Synchronisierung registrierter Bereiche

Um in den Redundanzeinstellungen einen passenden Wert für die Zeitüberschreitung bei Synchronisierung registrierter Bereiche einzustellen, können Sie diesen zunächst mit Hilfe eines System-Traces ermitteln:

  1. Fügen Sie im Gerätebaum unterhalb des Geräteobjekts ein Objekt Trace ein.

  2. Aktivieren Sie in den Redundanzeinstellungen auf Registerkarte Allgemein die Option Benötigte Sync-Zeit in System-Trace aufzeichnen.

  3. Laden und starten Sie die Traceaufzeichung des System-Trace.

  4. Der Standardwert der Zeitüberschreitung bei der Synchronisierung SyncWaitTime ist der Wert von StandbyWaitTime, der wiederum mit einem Wert von 30ms vorbelegt ist.

    Falls die eingestellte SyncWaitTime zu klein ist, erscheint die folgende Meldung im Log: "Synchronization terminated after %" PRI_UI32 "ms because of SyncWaitTime".

    Falls die eingestellte SyncWaitTime ausreichend groß ist, wird die tatsächlich benötigte SyncTime im System-Trace aufgezeichnet. Sie können versuchen, die eingestellte SyncWaitTime zu optimieren, damit sie der tatsächlich benötigten SyncTime möglichst nahe kommt.