Simulation dynamischer Systeme in RF::Viper mit FMUs exportiert aus MATLAB/Simulink

FMU-Modelle in RF::ViPer ausführen: Ein praktischer Anwendungsfall-Workflow mit MATLAB/Simulink

In modernen Industrieprozessen und der Automatisierung wächst der Bedarf, immer komplexere dynamische Systeme und Verhaltensweisen zu simulieren. Während automatisierte Systeme Präzision bieten, bringen sie auch Komplexitäten mit sich, die simuliert werden müssen, um das tatsächliche Verhalten des Systems genau darzustellen.

Da kein einzelnes Tool eine „All-in-One“-Lösung darstellt, sind einige besser geeignet, um komplexe dynamische Verhaltensweisen zu simulieren als andere. Daher ist es sinnvoll, diese Tools zu nutzen, um Modelle mit komplexeren Dynamiken zu erstellen und diese dann in ein Format zu exportieren, das von anderen Tools leicht gelesen und ausgeführt werden kann.

Ein solches Format ist FMU (Functional Mock-up Unit). Die FMU ist ein standardisiertes Modell-Austauschformat, das für die Co-Simulation und den Modell-Austausch zwischen verschiedenen Simulationswerkzeugen verwendet wird. FMUs basieren auf dem FMI (Functional Mock-up Interface)-Standard, der es Ingenieuren ermöglicht, dynamische Systemmodelle zwischen verschiedenen Softwareumgebungen auszutauschen (z. B. MATLAB Simulink, Dymola, OpenModelica, ANSYS usw.).

Im Allgemeinen gibt es zwei Arten von FMUs:

1. Model Exchange (ME) – Nur die Modellstruktur wird geteilt (kein Solver).

2. Co-Simulation (CS) – Beinhaltet sowohl das Modell als auch einen Solver für die eigenständige Ausführung.

Erstellen und Ausführen von FMU-Modellen in MATLAB/Simulink

In diesem Fall wird die Erstellung eines FMU-Co-Simulationsmodells in MATLAB/Simulink demonstriert, gefolgt von der Ausführung des Modells in der RF::ViPer-Simulation.

Der grundlegende Workflow besteht aus den folgenden allgemeinen Schritten:

Schritt 1: Simulink-Modell erstellen

Schritt 2: Simulink-Modell als eigenständiges FMU im Co-Simulation (CS)-Modus exportieren

Schritt 3: FMI-Bibliothek zum aktuellen RF::ViPer-Projekt hinzufügen (derzeit unterstützt RF::ViPer Modelle gemäß FMI-Version 2.0)  

Schritt 4: Erstellen eines Funktionsblocks (FB) in RF::ViPer und Ausführen der Simulation

Als Beispiel kann ein hydraulisches Servosystem als unterdämpftes oszillierendes System zweiter Ordnung modelliert werden, das mit der folgenden Übertragungsfunktion beschrieben wird:

YsUs=Kn2s2+2ns+n2

Dabei ist 𝐾 ein Prozessgewinn, ζ das Dämpfungsverhältnis und n=2πf die natürliche Winkelgeschwindigkeit des Systems.

Die Sprungantwort des Systems zweiter Ordnung mit den folgenden Parametern K=10, 𝜁 = 0.2 f n ​ =0.1 Hz ist in der folgenden Abbildung dargestellt:

Das FMU-Modell wird in Simulink erstellt, indem man im Simulink-Standardmenü „Speichern → Als eigenständiges FMU exportieren“ wählt. 

Das FMU-Modell kann in Simulink verifiziert werden, indem seine Ausgaben mit denen eines standardmäßigen Übertragungsfunktionsblocks verglichen werden, wie in der untenstehenden Abbildung dargestellt.

A screenshot of a computerAI-generated content may be incorrect.

Die FMU-Modellvalidierung und das Abrufen von Metainformationen aus der Modellbeschreibung können online hier durchgeführt werden: https://fmu-check.herokuapp.com/

Das FMU-Modell wird als komprimiertes Archiv mit der Erweiterung .fmu gespeichert, das eine Datei namens modelDescription.xml enthält. Diese Datei beinhaltet alle relevanten Informationen, wie die Liste der Variablen, deren Typen und Anfangswerte. Der Inhalt der .fmu-Datei kann mit Tools wie 7-Zip oder ähnlichen Archivierungsprogrammen aufgerufen und geprüft werden. Ein Auszug ist in der folgenden Abbildung dargestellt:

Laden und Ausführen von FMU-Modellen in RF::ViPer 

Das FMU-Modell wird in RF::ViPer innerhalb eines Funktionsblocks mit der Bibliotheksfunktion namens "FMU_Import" geladen. LoadFmuDa alle Variablen in diesem Modell vom Typ REAL sind, werden ihre Werte mit der SetReal und GetReal Funktionen, beziehungsweise. Jede Variable im Modell wird eindeutig durch eine Wertreferenz identifiziert. Wertreferenz in der modelDescription.xml, die vom Typ „unsigned integer“ ist. Die DoStep Funktion fördert die Simulation einer Functional Mock-up Unit (FMU) innerhalb einer Co-Simulationsumgebung. Eine detaillierte Erklärung dieser Funktionen, einschließlich ihrer Eingabe- und Ausgabeparameter, liegt außerhalb des Rahmens dieses Blogs. Daher wird den Lesern empfohlen, die Dokumentation der RF::ViPer CmpFmiRuntime-Bibliothek für weitere Informationen zu konsultieren.  

Eine einfache Struktur des Wrapper-Funktionsblocks zum Laden und Ausführen eines FMU-Modells mit grundlegender Fehlerbehandlung ist unten angegeben:

FUNCTION_BLOCK SecondOrderSystem

VAR_INPUT
    u     : LREAL;
    K     : LREAL;
    fn    : LREAL;
    zeta  : LREAL;
    Ts    : LREAL;
END_VAR

VAR_OUTPUT
    y     : LREAL;
    Error : BOOL;
END_VAR

VAR
    _fmu  : FMI.FmuContext;
    // valueReference identifiers
    _u    : UDINT := 0;
    _y    : UDINT := 1;
    _K    : UDINT := 2;
    _fn   : UDINT := 3;
    _zeta : UDINT := 4;
END_VAR

// Implementation part
IF _fmu.handle = 0 THEN
    // Initialize only once
    _fmu := FMI.LoadFmu('SecondOrderSystem.fmu');
    
    IF FMI.IsValidFmuHandle(_fmu.handle) THEN
        FMI.SetReal(_fmu, _u, u);
        FMI.SetReal(_fmu, _y, y);
        FMI.SetReal(_fmu, _K, K);
        FMI.SetReal(_fmu, _fn, fn);
        FMI.SetReal(_fmu, _zeta, zeta);
    ELSE
        Error := TRUE;
        RETURN;
    END_IF

ELSE
    FMI.SetReal(_fmu, _u, u);
    FMI.DoStep(_fmu, Ts);

    IF FMI.FmiStatus.Ok  0 THEN
        Error := TRUE;
        FMI.FreeInstance(_fmu);
        RETURN;
    ELSE
        FMI.GetReal(_fmu, _u, u);
        FMI.GetReal(_fmu, _y, y);
    END_IF
END_IF

Um Flexibilität beim Testen mit verschiedenen Parameterwerten zu ermöglichen, können diese als Eingaben für den Wrapper-FB definiert werden. Der Benutzer sollte sicherstellen, dass die Abtastzeit (Schrittweite) mit der Zykluszeit der Aufgabe übereinstimmt, in der der FB aufgerufen wird.

Ein Beispiel für den Aufruf des FB aus dem Hauptprogramm ist unten angegeben:

A screenshot of a computerAI-generated content may be incorrect.

Die Sprungantwort des FMU-FB, aufgezeichnet mit dem Trace, ist unten angegeben:

A graph showing a blue lineAI-generated content may be incorrect.

Dieses einfache Beispiel zeigt, wie komplexere dynamische Systeme relativ einfach in RF::ViPer simuliert werden können. Das Erstellen solcher Dynamiken von Grund auf in RF::ViPer wäre nicht optimal und würde erheblichen Aufwand und Zeit erfordern. Andererseits ist es einfach, ein besser geeignetes Tool zu verwenden, um das Modell zu erstellen und es dann als FMU in RF::ViPer zu importieren.

Dies ermöglicht die Simulation einer Vielzahl von Geräten oder kompletten Systemen in RF::ViPer unter Verwendung der bereitgestellten FMU-Modelle. Dadurch können erhebliche Zeitersparnisse im gesamten Workflow erzielt und die Genauigkeit der Simulation verbessert werden.

Die EKSInTec Blog

Bitte aktiviere JavaScript in deinem Browser, um dieses Formular fertigzustellen.
Name
Klicke oder ziehe Dateien in diesen Bereich zum Hochladen. Du kannst bis zu 3 Dateien hochladen.
WordPress Appliance - Powered by TurnKey Linux