# LGF_DifferenceQuotientFB (FB / V3.0.1)

Autor: Siemens Digital Industry

## Kurzbeschreibung

Diese Funktion differenziert numerisch ein zeitlich äquidistant abgetastetes Signal. So kann z. B. aus einer gemessenen Ortskurve die Geschwindigkeit, oder aus der gemessenen Geschwindigkeit die Beschleunigung errechnet werden. Um die Auswirkungen eines streuenden Messsignals zu minimieren nutzt dieser Algorithmus ein Ausgleichspolynom.

Der Funktionsbaustein berechnet die differenzierten Werte zyklisch.

Der Funktionsbaustein liest mit jeder positiven Flanke am Eingang `insert` einen Wert ein. Sobald fünf Werte eingelesen wurden, berechnet der Baustein einen differenzierten Wert und gibt diesen aus.

### Baustein Schnittstelle

| LGF_DifferenceQuotientFB (FB) |
--- | --- | ---
Bool |  |  | enable |  | derivatedValue |  |  | LReal
Bool |  |  | insert |  | error |  |  | Bool
LReal |  |  | value |  | status |  |  | Word
LReal |  |  | deltaT |  |  |  |  |

### Input Parameter

Bezeichner | Datentyp | Default Wert | Beschreibung
--- | --- | --- | ---
enable | Bool | FALSE | Aktiviert den Baustein. Solange enable `TRUE` ist, kann der Baustein Werte am Parameter `value` übernehmen.
insert | Bool | FALSE | Übernimmt bei einer positiven Flanke den Wert am Eingang `value` und gibt einen `derivatedValue` aus, wenn fünf Werte eingelesen wurden.
value | LReal | 0.0 | Wert, der in die Differenzierung eingehen sollen.
deltaT | LReal | 0.0 | Äquidistanter Abstand zwischen zwei Messwerten. (z. B. 1s)

### Output Parameter

Bezeichner | Datentyp | Beschreibung
--- | --- | ---
derivatedValue | LReal | Der differenzierte Wert.
error | Bool | FALSE: Kein Fehler TRUE: Während der Ausführung des FB ist ein Fehler aufgetreten
status | Word | 16#0000-16#7FFF: Status des FB 16#8000-16#FFFF: Fehleridentifikation (siehe folgende Tabelle)

### Status & Error Meldungen

Code / Wert | Bezeichner / Beschreibung
--- | ---
16#7000 | STATUS_NO_CALL Status: Kein Aufruf. Der Baustein wartet auf die Aktivierung durch den Parameter `enable`.
16#7001 | STATUS_FIRST_CALL Status: Erstaufruf des FB nach einschalten
16#7002 | STATUS_SUBSEQUENT_CALL Status: Die Bearbeitung ist aktiv. Nachfolgender Aufruf des FB.
16#7010 | STATUS_NOT_ENOUGH_VALUES Status: Nicht genug Werte. Der Baustein benötigt Fünf (5) Werte, um einen differenzierten Wert zu berechnen. Übergeben Sie weitere Werte mit einer positiven Flanke am Eingang `insert`.
16#8200 | ERR_DELTA_T Fehler: Abtastzeit `deltaT` darf nicht null sein.

## Funktionsbeschreibung

Zur Berechnung des Differenzenquotienten eines streuenden Signals wird zuerst ein Ausgleichspolynom dritten Grades durch die Messwerte gelegt. Anschließend wird dieses Polynom differenziert. Durch dieses Verfahren kann auch ein verrauschtes Eingangssignal noch sinnvoll differenziert werden.

Der Differenzquotient berechnet sich mit folgender Formel:

y^{\prime}(n) = \frac{y(n-2) - 8y(n-1) + 8y(n+1) - y(n+2)}{12 \cdot deltaT}

deltaT: äquidistanter Abstand zwischen zwei Messwerten (z.B. 1s).

Die Funktion (FC) kann aus N-Messwerten N-4 differenzierte und geglättete Messwerte berechnen. Das Ausgabe-Array würde im Index (0,1,N-1,N) mit 0 belegt werden. Allerdings können mit folgenden Formalismen Ersatzwerte berechnet werden:

y^{\prime}(n-2) = \frac{-125(y(n-2) + 136y(n-1) + 48y(n) - 88y(n+1) + 29y(n+2)}{84 \cdot deltaT} y^{\prime}(n-1) = \frac{-38(y(n-2) - 2y(n-1) + 24y(n) + 26y(n+1) - 10y(n+2)}{84 \cdot deltaT} y^{\prime}(n+1) = \frac{10(y(n-2) - 26y(n-1) - 24y(n) + 2y(n+1) + 38y(n+2)}{84 \cdot deltaT} y^{\prime}(n+2) = \frac{-29(y(n-2) + 88y(n-1) - 48y(n) - 136y(n+1) + 125y(n+2)}{84 \cdot deltaT}

## Änderungshistorie

Version & Datum | Änderungsbeschreibung
--- | ---
| 01.00.00 | Siemens Industry Online Support
| 23.11.2018 | First released version
| 01.00.01 | Simatic Systems Support
| 04.11.2019 | Code reworked. Regions, comments and constants are added
| 03.00.00 | Simatic Systems Support
| 23.04.2020 | Set version to V3.0.0, harmonize the version of the whole library
| 03.00.01 | Simatic Systems Support
| 06.04.2021 | Insert documentation