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.
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
.Deaktivieren Sie ein Objekt.
Beispiel
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.
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.
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
.
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.

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).
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.

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:
Fügen Sie im Gerätebaum unterhalb des Geräteobjekts ein Objekt Trace ein.
Aktivieren Sie in den Redundanzeinstellungen auf Registerkarte Allgemein die Option Benötigte Sync-Zeit in System-Trace aufzeichnen.
Laden und starten Sie die Traceaufzeichung des System-Trace.
Der Standardwert der Zeitüberschreitung bei der Synchronisierung
SyncWaitTime
ist der Wert vonStandbyWaitTime
, 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.