Programmierung eines PT1-Gliedes...



  • Hallo,

    vielleicht kann mir hier ja jemand bei der Lösung meines Problemes helfen...

    Also: Ich habe als Eingangsgröße eine Rampenfunktion die zum Zeitpunkt x einen Sprung macht. Dieser Sprung soll nun nach der 1. Ordnung verzögert werden, was ja einem Regelungstechnischen PT1-Glied entspricht. (Formel sollte ja sein T*x'+x=K*u). Nur wie bringe ich C bei, dass genau das passiern soll? Als Ausgangsgröße hätte ich gerne die Rampe verzögert nach der 1. Ordnung...

    Oder ist dieses Problem gar nicht so trivial? 😕

    Gruß an alle
    Yogi



  • Erstens bist du im falschen Forum, C# != C, und zweitens glaube ich weniger das es ein programmiertechnisches Problem ist. Warum, wegen der Fragestellung "wie bringe ich C bei...".
    C macht gar nichts für dich. in der Programmiersprache formulierst du dein Problem, und der Computer hilft es dir nur dann zu lösen. Ohne zu wissen was er machen soll hilft di C kein bisschen. Du musst dir also überlegen wie du dein problem mathematisch ausdrücken kannst und dann überträgst du es einfach in C. Das sollte dann wirklich eine Trivialität sein.

    Vielleicht weißt du ja schon wie du dein Problem lösen würdest, dann schreib das mal hier, weil dann können dir auch Leute helfen das in C zu formulieren.

    Gruß Talla



  • Hallo @Talla,

    tja, wenn ich wüßte wie ich C programmieren soll, dann würde ich hier die Frage nicht stellen 😉

    Versuche mal mein Problem genauer zu beschreiben...: Ich arbeite mit dem Simulationsprogramm Dymola/Modelica. Dort habe ich ein Funktion (genauer gesagt eine Rampenfunktion). Diese Rampenfunktion wird über eine Ausgabeschnittstelle u ausgegeben und soll in C nach der 1. Ordnung verzögert werden. Also das Verhalten eines PT1-Gliedes aufweisen, welches die Gleichung T*x'+x=K*u (T=0,01, u=Eingabefunktion, x=Ausgabefunktion, x'=Ableitung der Ausgabefunktion) hat. Und an der Stelle hörts es bei mir halt auf. Ich weiß nicht was ich genau in C schreiben muss um als Ausgabefunktion oben genanntes x zu erhalten...

    Gruß an alle
    Yogi



  • Was für eine Ausgabeschnittstelle ist das denn? Irgend ne Api die vom Programm offengelegt wird, oder wie kommst du an die Daten?



  • Hallo @Talla,

    Keine Ahnung was das für ne Ausgabeschnittstelle ist...

    Ich sag Dymola/Modelica halt den Pfad in dem die *.c Datei und damit der Code liegt welcher ausgeführt werden soll und Dymola/Modelica übergibt alle nötigen Werte der Funktion an die *.c Datei.
    -----------------------------------
    function Verzoegerung
    input Real T, k, u;
    output Real y;
    external "C";
    annotation(Include="#include \"Verzögerung.c\"");
    end Verzoegerung;
    -----------------------------------
    Die *.c Datei soll dann halt die Verzögerung erster Ordnung berechnen und das Ergebnis (also die neue Funktion) wieder über nen return an Dymola/Modelica zurückgeben.
    -----------------------------------
    int Verzoegerung(Double T, Double k, Double u)
    {
    x=k*u-T*x'
    return x;
    }
    -----------------------------------
    So ungefähr jedenfalls stell ich mir das vor. Und genau das klappt halt nicht...

    Gruß an alle
    Yogi



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • "Trivial" ist das Problem sicher nicht. Zuerst solltest du wissen, ob die Funktion zeitdiskret arbeiten soll oder nicht (in die API einarbeiten).

    Ich habe das mal für mich (spasseshalber) durchgerechnet. Ausgegangen bin ich von der Übertragungsfunktion im LaPlacebereich:

    H(s) = K / (T*s + 1)
    

    welche ich dann mit der bilinearen Transormation in eine zeidiskrete Form gebracht habe um die Koeffizienten des digitalen Tiefpassfilters zu bekommen (PT1 ist ja ein TP 1. Ordnung). Das Ergebnis war zwar ein Filter mit typischem PT1-Verhalten, aber meine persönliche kleine Unkenntnis der bilinearen Transformation hat leider dazu geführt, dass die Vorgaben von T nicht exakt mit der Ausgabe übereinstimmen (getestet in Simulink). Dazwischen liegt ein Faktor, der (leider nicht nur) von der Samplerate abhängt. Ich weiss zwar wo der Fehler liegt, aber nicht wie ich ihn beheben kann. Ergo -> nichts wirklich brauchbares.

    Aber du hast jetzt wenigstens einen neuen Ansatz und viele Suchbegriffe für google. 😉



  • Jo. Ich hab den Fehler jetzt behoben. Ich hab eine falsche Formel bei der bilinearen Transformation benutzt. Falls es dich interessiert kann ich es ja mal posten. Ist aber nicht der zweck des Forums hier _deine_ Aufgabe zu erledigen. Also probier's selbst mal.


Anmelden zum Antworten