FB_TimeSync

Dieser Funktionsbaustein dient der Synchronisierung von Systemen. Basierend auf dem Zyklusindex empfangener Netzwerkvariablen wird der Gangunterschied der Systeme bestimmt und eine Korrekturzeit berechnet.

Beschreibung

Zur Synchronisierung verteilter Systeme werden die Informationen von einem System zyklisch versendet und von den anderen Systemen empfangen. Durch Gangunterschiede zwischen den Zykluszeiten des Senders und des jeweiligen Empfängers treten Schwebungseffekte (siehe Einführung ) durch Verpassen oder doppelten Lesen einzelner Informationen auf. Im Folgenden wird zur einfacheren Darstellung nur der Fall nominell gleicher Zykluszeiten auf Sender- und Empfängerseite betrachtet. Für unterschiedliche Zykluszeiten (unterstützt werden geradzahlige Verhältnisse) gilt die folgende Beschreibung mit anderen Werten.

Jeder Sendevorgang wird mit einer fortlaufenden Nummer assoziiert, dem Zyklusindex m der Netzwerkvariablen. Für den Unterschied Δmi des im aktuellen (i) und des im vorherigen (i-1) Zyklus empfangenen Zyklusindex (Δmi=mi-mi-1) ergeben sich folgende Fälle:

Δm=0: Im aktuellen und im vorherigen Zyklus wurden die gleichen Daten gelesen.

Δm=1: Die gesendeten Daten werden kontinuierlich empfangen.

Δm>=2: Ein oder mehrere Informationen wurden nicht empfangen.

 

Abbildung 1 zeigt an der markierten Position schematisch den Fall für Δm=0, d.h. für ein doppeltes Lesen einer Information. Analog ist der Fall Δm=2 in Abbildung 2 dargestellt, hier wird eine gesendete Information übersprungen und nicht ausgewertet.

Abbildung 1: Schwebungseffekt, wenn die Zykluszeit des Senders (S) größer als die des Empfängers (E). Durch Linien sind die zusammengehörigen Sender- und Empfängerzyklen verbunden.

 

Abbildung 2: Schwebungseffekt, wenn die Zykluszeit des Senders (S) kleiner als die des Empfängers (E).

Identifikation von Schwebungen

Im Idealfall nur durch die Drift voneinander abweichender Zeiten würde das Auftreten von Δm≠1 einen Sprung charakterisieren. Aufgrund des Jitters der Zykluszeiten um Ihren nominellen Wert treten diese Fälle zeitlich gehäuft im Bereich um die Schwebung auf und verbreitern den punktuellen Sprung zu einer Übergangszone. Deren Breite ist abhängig davon, wie groß zum einen der Jitter der Uhren ist, und zum Anderen von der Größe des absoluten Gangunterschieds. Die Breite des Übergangs macht es notwendig, diesen durch eine andere Forderung als Δm≠1 zu identifizieren. Durch die Abweichungen von Δm=1 vergrößert sich an den Sprungstellen die Differenz stattgefundener Sender- und Empfängerzyklen. Eine über mehrere (stTimeSyncParameters.iEndOfTransitionLimit) Zyklen konstante Differenz wird genutzt, um das Auftreten einer Schwebung zu identifizieren. Dadurch kann ein Sprung erst die zur Identifikation notwendige Anzahl von Zyklen nach seinem Auftreten erkannt werden, was bei der Bestimmung der Korrekturen von Bedeutung ist.

Aus der Anzahl von Taktzyklen des Empfängers zwischen zwei Schwebungen wird der Gangunterschied zwischen den Rechnern bestimmt. Dieser kann zur Korrektur der Schwebungseffekte verwendet werden.

Korrekturen

Abbildung 3 zeigt den Zyklusindex der gesendeten Informationen als Funktion des empfangenen Zyklusindex für den Fall Δm=2 an der Sprungstelle. Die Steigung der Kurve weicht durch die Schwebungseffekte von dem Idealwert 1 ab. Um die Sprünge zu vermeiden, kann ein korrigierter Zyklusindex so berechnet werden (punktierte Linie), dass die Schwebungseffekte in der Zeit zwischen den Sprüngen ausgeglichen werden. Das Ergebnis ist ein korrigierter Zyklusindex auf der Empfängerseite, der geringfügig von dem übermittelten Wert abweicht, dafür aber äquidistant ist und keine Sprünge zeigt.

Abbildung 3: Empfangener (durchgehende Linie) und korrigierter (gestrichelt) Zyklusindex. Durch Kreise markiert sind die Sprungstellen mit Δm=2.

Da nach obigen Ausführungen ein Sprung erst verzögert erkannt werden kann, kommt die mit der aktuell berechneten Drift bestimmte Korrektur auch erst verzögert zum Einsatz. Um auch bei starken Variationen der Gangunterschiede Sprünge in dem korrigierten Zyklusindex zu vermeiden, wird nach Identifikation eines Sprungs die zur Korrektur verwendete Drift schrittweise von dem alten an den neuen Wert angepasst.

Eine weitere Möglichkeit die Auswirkungen sich stark ändernder Gangunterschiede zu begrenzen, ist die nicht-gleichförmige Korrektur der Schwebungseffekte. Dabei wird nach einem Sprung stärker korrigiert als kurz vor dem erwarteten Eintreten des nächsten Sprungs. Verkürzt sich die Zeit zwischen zwei Sprüngen, ist die Korrektur weitestgehend abgeschlossen und es sind kaum zusätzliche Korrekturen notwendig. Weitere Erläuterungen finden sich bei der Beschreibung der Konfigurationsparameter.

 

Korrekturzeit

Aus der Differenz des korrigierten und des empfangenen Zyklusindex kann, durch Multiplikation mit der Zykluszeit, die Korrekturzeit bestimmt werden. Mit der Korrekturzeit wird angegeben, um welche Zeit die aktuell gelesene Information verschoben werden muss, um äquidistant und ohne Sprünge interpretiert zu werden. Ist der zeitliche Verlauf der zu korrigierenden Größe bekannt, kann diese entsprechend extrapoliert werden. Für den Zyklusindex ist der Zusammenhang einfach (+1 pro Zykluszeit), zur Extrapolation von Achsinformationen wie Position und Geschwindigkeit müssen entsprechend die Geschwindigkeit und Beschleunigung bekannt sein (siehe Dokumentation der Funktionsbausteine FB_AxisSync und FB_AxisExtrapolateValues, sowie die Einführung).

 

Initialisierungsphase

Zur Berechnung der Korrekturen müssen mindestens zwei Schwebungen stattgefunden haben, um eine Drift berechnen zu können. Um auch vor dem Auftreten dieser zwei Schwebungen Fluktuationen und Sprünge ausgleichen zu können, existiert der so genannte Time-Modus. In diesem Modus (Ausgänge bStartUp=TRUE und bSynced=FALSE) wird der korrigierte Zyklusindex bei jedem Zyklus um +1 inkrementiert und Sprünge im empfangenen Zyklusindex so ausgeglichen. Nach Identifikation eines Sprungs (dessen Eintreffzeitpunkt hier noch nicht vorhersehbar ist) wird die auftretende Differenz im Verlauf mehrerer Zyklen (stTimeSyncParameters.iTimeModeBlendingCycles) kompensiert. Nach Identifikation der benötigten Anzahl von Schwebungen (stTimeSyncParameters.iNoOfPeriodsForMeanDrift) wird die Korrekturzeit nach der oben beschriebenen Methode berechnet (Ausgänge bStartUp=FALSE und bSynced=TRUE), es erfolgt ein Übergang vom Time- in den Sync-Modus.

Wichtig für den Betrieb

Es ist sicherzustellen, dass der Baustein FB_TimeSync nur einmal pro SPS-Zyklus aufgerufen wird!

VAR_INPUT

VAR_INPUT
    iCycleIndex          : WORD;
    fTaskCycleTime       : LREAL;
    bEnable              : BOOL;
    stTimeSyncParameters : ST_TimeSyncParameters;
END_VAR

iCycleIndex : Zyklusindex der aktuell empfangenen Daten

fTaskCycleTime : Nominelle Zykluszeit des Empfängers in [s]. Weicht die Zykluszeit des Senders hiervon ab, muss diese über den Parameter stTimeSyncParameters.fDataCycleTime konfiguriert werden. Ansonsten wird angenommen, dass beide Zykluszeiten gleich sind. Die Zykluszeiten müssen geradzahlige Vielfache voneinander sein, d.h. z.B. tSender=2ms, tEmpfänger=4ms oder tEmpfänger=1ms.

bEnable : FALSE deaktiviert den Funktionsbaustein, eine steigende Flanke reinitialisiert und startet ihn

stTimeSyncParameters :Struktur mit Konfigurationsparametern

VAR_OUTPUT

VAR_OUTPUT
    bError          : BOOL;
    iErrorId        : DINT;
    bWarning        : BOOL;
    iWarningId      : DINT;
    fCorrectionTime : LREAL;
    bSynced         : BOOL;
    bStartUp        : BOOL;
    stTimeSyncDiagnostic: ST_TimeSyncDiagnostic;
END_VAR

bError :TRUE im Falle eines Fehlers
iErrorId : liefert im Falle eines Fehlers den Fehlercode (E_Sync_ErrorCodes) zurück

bWarning : TRUE im Falle einer Warnung, d.h. Betrieb geht, wenn auch nicht unter optimalen Bedingungen, weiter

iWarningId : liefert, falls eine Warnung aufgetreten ist, den entsprechenden Code zurück (E_Sync_WarningCode)

fCorrectionTime : Korrekturzeit, d.h. die zur Extrapolation der empfangenen Informationen zu verwendende Zeit in [s]

bSynced : TRUE wenn Sender und Empfänger synchronisiert sind. Im Sync-Modus konnte eine Korrekturzeit bestimmt werden, d.h. die Initialisierungsphase ist abgeschlossen, und die Korrekturzeit befindet sich innerhalb zulässiger Werte ( d.h. nach der Identifikation von stTimeSyncParameters.iNoOfPeriodsForMeanDrift Schwebungen, und dem anschließenden Unterschreiten von stTimeSyncParameters.fThresholdForSync*TaskCycleTime durch den Absolutwert der Korrekturzeit ).

bStartUp : TRUE wenn der Funktionsbaustein sich in der Initialisierungsphase befindet. In dieser Phase wird die Korrekturzeit so berechnet, dass diese zur Extrapolation der Daten verwendet werden kann, aber _nur_ Fluktuation ( Δm≠1) ausgleicht. Nach Identifikation einer Schwebung in der Initialisierungsphase wird innerhalb von stTimeSyncParameters.iExtendedStartUpBlendingCycles Zyklen auf eine Korrekturzeit von 0 linear übergeblendet.

stTimeSyncDiagnostic: Struktur mit weitergehenden Diagnoseausgaben