Skip to content

Energy, utilities and offshoreMuvia Industrial

The storm, as the moorings felt it

Waves, platform motion and mooring tensions arrive every minute. A Python function computes the significant wave height and the fatigue of each line every half hour, so after a storm you know which mooring worked hardest, and by how much.

Illustrative scenario: it describes a typical case, not a customer project.

After a storm there is one question: how much did the moorings suffer?

On a platform the on-board recorder collects waves, motion and mooring-line tensions, but the data stays on board or reaches shore as files to be opened one by one. After a storm, finding out which line worked hardest means days of processing.

In Muvia the signals arrive from the platform's edge node, and a Python function your team writes computes sea state and fatigue for every window, with the method your team chooses. The report is ready when the sea calms down.

Who it's for
Structural integrity engineers, offshore operations managers and maintenance teams for platforms and floating installations.
Diagram: the wave radar and the motion unit over OPC UA, the mooring load cells over Modbus TCP and the compressor's Siemens S7 PLC send their signals through the platform's edge node. Muvia produces sea state and fatigue every 30 minutes, each line's tension against the waves, the storm report in a notebook and an alarm on the tensions.

In Muvia, step by step

Real product screens, recorded on a project with sample data.

1 of 5

The video · Waves, platform motion and mooring tensions arrive every minute. A Python function computes the significant wave height and the fatigue of each line every half hour, so after a storm you know which mooring worked hardest, and by how much.

What you get

The report when the sea calms down
Sea state and fatigue are already computed window by window: the report does not wait for processing on shore.
The line that worked hardest
Tension and fatigue per line tell you which mooring to inspect first.
The method stays yours
S-N curve, thresholds and windows are parameters of the function your team tunes.
Every event has a note
Fronts, inspections and interventions annotated on the signals explain the peaks to whoever reads later.

For the technical team

How it is built in Muvia

  1. 1

    Connect the on-board recorder

    On the platform's edge node you configure the drivers for the radar, the motion unit and the load cells. If the link to shore drops, the node keeps the readings in a local buffer and sends them when it comes back.

  2. 2

    Clean the samples

    A step query discards radar echoes and unpowered load cells and orders the samples in time: the clean base for the calculations.

  3. 3

    Compute sea state and fatigue

    A Python function computes, every 30 minutes, the significant wave height, the RMS of the motion, each line's maximum tension and the fatigue damage from the tension cycles. A flow runs it every hour and saves the result to a table.

  4. 4

    Read the storm in Analysis

    The XY view puts each line's tension against wave height; the trend shows the days of the storm with the front's annotations.

  5. 5

    Write the report

    A notebook gathers maximum wave, tensions and cumulative fatigue day by day, and prints to PDF for whoever decides on the inspection.

Python function

import numpy as np
import pandas as pd

def ranges(x, threshold):
    """Ranges of the half cycles between two successive reversals of the tension."""
    d = np.diff(x)
    reversals = x[np.r_[True, d[1:] * d[:-1] < 0, True]]
    r = np.abs(np.diff(reversals))
    return r[r >= threshold]

def transform(inputs, params, ctx):
    d = inputs["rows"].sort_values("ts")
    d["start"] = pd.to_datetime(d["ts"]).dt.floor(f"{params['window_minutes']}min")
    rows = []
    for start, w in d.groupby("start"):
        r = ranges(w["tension_l3_kn"].to_numpy(), params["cycle_threshold_kn"])
        rows.append({
            "start": start,
            "hs_m": 4 * w["wave_m"].std(ddof=0),
            "roll_rms_deg": float(np.sqrt(np.mean(w["roll_deg"] ** 2))),
            "max_tension_l3_kn": w["tension_l3_kn"].max(),
            "damage_l3": 0.5 * float(np.sum(r ** params["sn_exponent"])),
        })
    out = pd.DataFrame(rows)
    out["cumulative_damage_l3"] = out["damage_l3"].cumsum()
    return {"rows": out}
Significant wave height, motion, maximum tension and fatigue damage on line L3 with Miner's rule, window by window. The cycle count here is simplified: yours can be a full rainflow.
The data it needs
  • Wave elevation from the radar and platform motion (heave, pitch, roll) over OPC UA
  • Tension on the four mooring lines from the load cells, over Modbus TCP
  • Compressor vibration from its Siemens S7 PLC
  • Fronts, inspections and interventions, annotated on the signals

Tell us which machines you run. We'll tell you how to read them.

PLC brand, protocol, how the floor is connected: with those three answers, in a demo with one of our engineers, we show you how Muvia Industrial puts line data next to the rest of the business.