Rampenfunktion mit Pointer



  • Hallo,
    weiß jemand, wie man eine Rampe mit Pointern programmiert, die einfach in 0.001 schritten nach oben zählt??
    Vielen Dank im voraus.



  • willst du auf die variable, die hochgezählt wird, indirekt zugreifen?
    sowas etwa?

    void inc (double *p)
    {
      *p += 0.0001;
    }
    

    oder hab ich das jetzt falsch verstanden 😕



  • Hi Net,
    DANKE, ja so in etwa. Kann ich das ganze jetz noch in Echtzeit ablaufen lassen? D. h. 0.001 = 1ms 😕



  • Dazu brauchst du dann hochauflösende Timer, welche nicht Bestandteil von ANSI C sind. Also müssen Implementierungsspezifische Timer genutzt werden. Auf welcher Plattform soll das Ding laufen?



  • [edit] zu langsam und dann noch 2 Mal... [/edit]



  • Dafür brauchst 'nen Timer. Aber von Timern hat ANSI C keine Ahnung.
    Also: Welches OS, welche APIs?
    Wofür brauchst denn das?

    Greetz, Swordfish



  • Ich programmier in C eine s-function in Matlab/Simulink, d. h. Timer gibts schon, aber wie ich auf diese zugreifen kann..?? Ich hoffe ihr könnt mir weiterhelfen 🙂



  • Aragon089 schrieb:

    Ich programmier in C eine s-function in Matlab/Simulink, d. h. Timer gibts schon, aber wie ich auf diese zugreifen kann..?? Ich hoffe ihr könnt mir weiterhelfen 🙂

    Na dann ist es kein Problem, da Simulink selbst ja der Timer ist. Sprich du stellst in "Simulation parameters" den Solver auf "fixed step" und "discrete (no continous states)" und dann noch die "fixed step size" auf die gewünschte Größe (0.001).
    Machst du das mit dem S-Function Builder? Der ist zwar schrottig wenn es um aufwändigere Funktionen geht, aber ganz brauchbar für sowas kleines hier.

    Nachtrag: Ähmm, was ist eigentlich mit dem normalen Rampenblock? Warum nimmst nicht den?



  • Hi TactX,
    so in etwa mach ich das momentan. Dafür muss ich aber die Rampe über ssGetInputPortRealSignal(S, 0) in meine s-function einlesen. Genau dies muss ich aber vermeiden (Eingänge reduzieren). Ich probier grad mit ssGetTaskTime rum, aber das funktioniert leider noch nicht. Hast Du ne Idee?
    Ne, den s-function builder hab ich noch nie ausprobiert 🙂



  • Ich sehe gerade 2 einfache Möglichkeiten:

    1. Die Rampenvariable ist static. Dann kannst du sie bei jedem Step einfach inkrementieren. Hat aber den Nachteil, dass du die S-Function nur einmal im Modell verwenden kannst.

    2. Die Rampenvariable wird über ssSetNumRWork angefordert (in mdlInitializeSizes()). In der mdlOutputs() bekommst du dann via ssGetRWork() immer einen Zeiger. Diese Variante wäre sauberer, da die S-Function mehrfach benutzt werden könnte.


Anmelden zum Antworten