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:
damageDie Schädigung über die gemessene Laufleistung, im Beispiel 10km.target_damageDie 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_distributionDas Kollektiv über die gemessene Laufleistung, im Beispiel 10km.target_frequency_distributionDas 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 ausrectangular,triangular,hammingoderhanning)window_size: Anzahl der Messwerte je Fensterwindow_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.