Skip to content

damage-calculation

Der damage-calculation Service stellt eine REST API für die statistische Auswertung von Messdaten zur Verfügung. Die folgenden Auswertungen sind implementiert:

  • Extremwerte
  • Schädigung
  • Kollektive (Rainflow, Levelcrossing und Rangepair)
  • PSD (Power Spectral Density)

Extremwerte, Schädigungen und Kollektive können jeweils für einzelne Kanäle oder über mehrere Kanäle hinweg berechnet werden, die PSD wird ausschließlich für einzelne Kanäle berechnet.

Laufzeitumgebung

---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
    class Client
    class damage-calculation {
        <<Service>>
    }
    class MinIO {
        <<Cloud Storage>>
    }

    Client --> damage-calculation : calculation request
    damage-calculation ..> Client : calculation result
    damage-calculation ..> MinIO : fetch data

Konfiguration

Umgebungsvariable Beschreibung Typ Werte
SERVICE_PORT* Der TCP-Port, unter dem der damage-calculation Service zur Verfügung gestellt wird. int 64-65535
WORKER_THREADS Anzahl der Threads, die parallel Berechnungsanfragen verarbeiten. int 1-16 (default: 4)
MINIO_HOST* Name bzw. Adresse des Hosts, unter dem der MinIO-Server erreichbar ist. string
MINIO_PORT* TCP-Port, unter dem der MinIO-Server erreichbar ist. int 64-65535
MINIO_BUCKET* Name des MinIO-Buckets, der zum Laden der Messdaten verwendet werden soll. string
MINIO_USER* Nutzername, den der Service zur Authentifizierung mit MinIO verwenden soll. string mind. 8 Zeichen
MINIO_PASSWORD* Passwort des konfigurierten MinIO-Nutzers. string mind. 8 Zeichen
MINIO_TLS* Gibt an, ob TLS bzw. HTTPS für eine verschlüsselte Kommunikation verwendet werden soll. boolean
MINIO_SSL_CERT_FILE Pfad zu einer Datei, die die verwendete Kette an SSL-Zertifikaten enthält (mit der u.a. das Server-Zertifikat signiert wurde). Ist keine solche Datei angegeben, wird das Client-Zertifikat bei Anfragen nicht überprüft. string
RAINFLOW_CALCULATION_TYPE* Verwendetes Rainflow-Zählverfahren für die Kollektivberechnung. string ASTM, CLORMANN_SEEGER

API

Der damage-calculation Service stellt seine Berechungen über eine REST API zur Verfügung, deren Endpunkte im Folgenden beschrieben werden.

Die Berechnungen werden über POST-Anfragen an den jeweiligen Pfad gestartet (eine Anfrage zur Berechnung der kanalweisen Extremwerte muss z.B. an <service host>:<service port>/extremes gesendet werden).

Anfrageparameter müssen jeweils als JSON im Request Body übergeben werden, die berechnete Antwort wird im Response Body ebenfalls als JSON zurückgegeben. In den jeweiligen Unterkapiteln werden die Anfrage- und Antwortformate für alle Berechnungen beschrieben.

Die API stellt die folgenden Endpoints zur Verfügung:

GET /status

Gibt bei fehlerfrei laufender API Code 200 OK zurück.

POST /extremes

Berechnet die Extremwerte für jeden in der Anfrage enthaltenen Kanal einzeln.

{
    "distance_km": 10,
    "target_distance_km": 100,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...
        },
        {
            "channel_name": "F_BaHL",
            "data_provider": ...
        }
    ]
}
{
    "channels": [
        {
            "channel_name": "F_BaHR",
            "min": -0.12,
            "max": 0.73
        },
        {
            "channel_name": "F_BaHL",
            "min": -1.02,
            "max": 0.23
        }
    ]
}
POST /damage

Berechnet die Schädigung für jeden in der Anfrage enthaltenen Kanal einzeln.

Dabei werden für jeden Kanal zwei Schädigungswerte berechnet:

  • damage Die Schädigung über die gemessene Laufleistung, im Beispiel 10km.
  • target_damage Die auf die Target-Laufleistung extrapolierte Schädigung, im Beispiel 100km.

Die Angabe der Wöhlerlinie und der Klassifizierungs-Konfiguration ist für die Schädigungsberechnung verpflichtend.

{
    "distance_km": 10,
    "target_distance_km": 100,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "woehler_curve": ...,
            "classification_config": ...
        },
        {
            "channel_name": "F_BaHL",
            "data_provider": ...,
            "woehler_curve": ...,
            "classification_config": ...
        }
    ]
}
{
    "channels": [
        {
            "channel_name": "F_BaHR",
            "damage": 7.3e-13,
            "target_damage": 7.3e-10,
            "used_parameters": {
                "woehler_curve": ...,
                "classification_config": ...
            }
        },
        {
            "channel_name": "F_BaHL",
            "damage": 6.8e-13,
            "target_damage": 6.8e-10,
            "used_parameters": {
                "woehler_curve": ...,
                "classification_config": ...
            }
        }
    ]
}
POST /frequency-distributions

Berechnet die Kollektive für jeden in der Anfrage enthaltenen Kanal einzeln.

Dabei werden für jeden Kanal zwei Kollektive berechnet:

  • frequency_distribution Das Kollektiv über die gemessene Laufleistung, im Beispiel 10km.
  • target_frequency_distribution Das auf die Target-Laufleistung etrapolierte Kollektiv, im Beispiel 100km.
{
    "distance_km": 10,
    "target_distance_km": 100,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "classification_config": ...
        }
    ]
}

Die Angabe der Klassifizierungs-Konfiguration ist für die Kollektivberechnung verpflichtend.

{
    "channels": [
        {
            "channel_name": "F_BaHR",
            "frequency_distribution": {
                "levelcrossing": {
                    "x": [1, 2, 3, 4, 5],
                    "y": [1, 2, 3, 4, 5]
                },
                "rangepair": {
                    "x": [1, 2, 3, 4, 5],
                    "y": [1, 2, 3, 4, 5]
                },
                "rainflow": {
                    "x": [1, 2, 3, 4, 5],
                    "y": [1, 2, 3, 4, 5],
                    "z": [[1, 2, 3, 4, 5],
                        [1, 2, 3, 4, 5],
                        [1, 2, 3, 4, 5],
                        [1, 2, 3, 4, 5],
                        [1, 2, 3, 4, 5]]
                }
            },
            "target_frequency_distribution": ...,
            "used_parameters": {
                "classification_config": ...
            }
        },
        ...
    ]
}

Das Feld target_frequency_distribution folgt demselben Schema wie frequency_distribution.

POST /psd

Berechnet die PSD (Power Spectral Density) für jeden in der Anfrage enthaltenen Kanal einzeln.

Der PSD-Berechnung liegt eine Fourier-Transformation des Signals zugrunde. Dafür wird das Signal in getrennt analysierte Fenster zerlegt, die folgendermaßen parametrisiert werden:

  • window_type: Die zum Einteilen des Messsignals in Fenster verwendete Fensterfunktion (eine aus rectangular, triangular, hamming oder hanning)
  • window_size: Anzahl der Messwerte je Fenster
  • window_overlap: Anzahl der überlappenden Messwerte je Fenster, um Artefakte an den Rändern zu verhindern
{
    "distance_km": 10,
    "target_distance_km": 100,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "psd_parameters": {
                "window_type": "rectangular",
                "window_size": 100,
                "window_overlap": 50
            }
        }
    ]
}
{
    "channels": [
        {
            "channel_name": "A_BaHR",
            "frequencies": [0, 0.1, 0.2, 0.3, 0.4, 0.5],
            "power_spectral_densities": [0, 0.8, 0.7, 0, 0],
            "psd_parameters": {
                "window_type": "rectangular",
                "window_size": 100,
                "window_overlap": 50
            }
        }
    ]
}
POST /multi-channel/extremes

Berechnet die absoluten Extremwerte über alle in der Anfrage enthaltenen Kanäle, d.h. einen einzigen min- und max-Wert je Anfrage.

{
    "target_distance_km": 10000,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "distance_km": 10
        },
        {
            "channel_name": "F_BaHL",
            "data_provider": ...,
            "distance_km": 10
        }
    ]
}
{
    "channel_names": [
        "F_BaHR",
        "F_BaHL"
    ],
    "min": -0.12,
    "max": 0.73,
    "total_distance_km": 20,
    "target_distance_km": 100000
}
POST /multi-channel/damage

Berechnet die kumulierte Gesamtschädigung über alle in der Anfrage enthaltenen Kanäle.

{
    "target_distance_km": 10000,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "distance_km": 10
        },
        {
            "channel_name": "F_BaHL",
            "data_provider": ...,
            "distance_km": 10
        }
    ],
    "woehler_curve": ...,
    "classification_config": ...
}
{
    "channel_names": [
        "F_BaHR",
        "F_BaHL"
    ],
    "damage": 7.3e-13,
    "target_damage": 1.46e-9,
    "used_parameters": {
        "woehler_curve": ...,
        "classification_config": ...
    },
    "total_distance_km": 20,
    "target_distance_km": 100000
}
POST /multi-channel/frequency-distributions

Berechnet die kumulierten Gesamtkollektive über alle in der Anfrage enthaltenen Kanäle.

{
    "target_distance_km": 10000,
    "channels": [
        {
            "channel_name": "F_BaHR",
            "data_provider": ...,
            "distance_km": 10
        },
        {
            "channel_name": "F_BaHL",
            "data_provider": ...,
            "distance_km": 10
        }
    ],
    "classification_config": ...
}
{
    "channel_names": [
        "F_BaHR",
        "F_BaHL"
    ],
    "frequency_distribution": ...,
    "target_frequency_distribution": ...,
    "used_parameters": {
        "classification_config": ...
    }
    "total_distance_km": 20,
    "target_distance_km": 100000
}

Die Felder frequency_distribution und target_frequency_distribution folgen dem gleichen Schema wie in der frequency-distributions-Anfrage.