Liebe Kollegen, eine Frage habe ich: Ich habe einen adaptiven Regler in Simulink erstellt und möchte diesen direkt auf mein Arduino laden, direkt von Simulink aus. Nun sehe ich aber, dass der Regler so komplex ist, dass meine Hardware hier keine Regelung in Echtzeit garantieren kann. Meine Frage daher: Gibt es Möglichkeiten, wie ich den erzeugten Code direkt, bevor ich den AUF DIE Hardware implementiere, prüfen kann, ob der die Zeitanforderungen schafft? Oder anders ausgedrückt: Kann ich abschätzen, wie lange mein Code an Zeit/Ressourcen benötigen wird vom Eingangssignal einlesen über den Sensor bis zur Ausgabe an den Aktuator?
Du könntest die einzelnen benötigten Signalverarbeitenden Elemente ressourcensparend implementieren (z.B. erst mal Floatingpoint-Arithmetik durch fixkomma-Arithmetik ersetzen) und in jeweils einer C-mex S-Function gegen dein bestehendes Simulink-Modell benchmarken. Die ressourcensparende(n) Implementierung(en) kannst du mit einer Laufzeitmessung on-target charakterisieren (Portpin an, Rechenschritt, Portpin aus) und dir dann zusammenrechnen, was die Rechenlast und die erreichbare Zykluszeit des ganzen Reglers ist. Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand: a) Verarbeitungsschritte, die einmal pro Zyklus vorkommen, aber sehr viel Zeit fressen b) Verarbeitungsschritte, die oft pro Zyklus vorkommen, einzeln relativ wenig Zeit fressen (z.B. 10µsec pro Instanz, aber 100x pro Zyklus, da sparst du pro Zyklus 100µsec, wenn du den nur je um 1µsec verkürzen kannst) mfg mf
Erst mal herzlichen Dank dafür. Achim M. schrieb: > Du könntest die einzelnen benötigten Signalverarbeitenden Elemente > ressourcensparend implementieren (z.B. erst mal Floatingpoint-Arithmetik > durch fixkomma-Arithmetik ersetzen) und in jeweils einer C-mex > S-Function gegen dein bestehendes Simulink-Modell benchmarken. Aber wie genau soll das funktionieren? Wir können auch als einfaches Beispiel ein einfachen PID-Regler nehmen. Achim M. schrieb: > Die ressourcensparende(n) Implementierung(en) kannst du mit einer > Laufzeitmessung on-target charakterisieren (Portpin an, Rechenschritt, > Portpin aus) und dir dann zusammenrechnen, was die Rechenlast und die > erreichbare Zykluszeit des ganzen Reglers ist. AUch hier frage ich mich, welche Blöcke ich dazu verwenden soll? Was genau meinst du mit PortPin? Achim M. schrieb: > Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand: > a) Verarbeitungsschritte, die einmal pro Zyklus vorkommen, aber sehr > viel Zeit fressen > b) Verarbeitungsschritte, die oft pro Zyklus vorkommen, einzeln relativ > wenig Zeit fressen (z.B. 10µsec pro Instanz, aber 100x pro Zyklus, da > sparst du pro Zyklus 100µsec, wenn du den nur je um 1µsec verkürzen > kannst) Guter Hinweis. Aber sorry, ich bin nicht soooooo der Matlab-Experte, kannst du es ein bisschen verfeinern?
Michel Weis schrieb: > Nun sehe ich aber, dass der Regler so komplex ist, dass meine Hardware > hier keine Regelung in Echtzeit garantieren kann. Definiere komplex und definiere Echtzeit. Michel Weis schrieb: > Gibt es Möglichkeiten, wie ich den erzeugten Code direkt, bevor ich den > AUF DIE Hardware implementiere, prüfen kann, ob der die > Zeitanforderungen schafft? Na du hast in einer Regelung in irgendeiner Art eine Signal Erhebung (z.B. ADC) und eine Signal/Wert Generierung (z.B. DAC). Das würde ich nicht ganz vernachlässigen, braucht aber wahrscheinlich am wenigsten Zeit. Dazwischen sind deine Berechnungen. Wenn du den Code übersetzt, weißt du wieviel Befehle dafür benötigt werden. Damit kannst du dann eine Zweitabschätzung machen. Achim M. schrieb: > z.B. erst mal Floatingpoint-Arithmetik durch fixkomma-Arithmetik > ersetzen Halte ich für eine gewagte Aussage, da sie Hardwareabhängig ist. Viele Controller haben heute eine FPU an Bord. Dann kann Floating Point schneller sein als eine Fixed Bib.
@ Michel Weis
>und möchte diesen direkt auf mein Arduino laden
Nun, ich nutze ihn zwar ganz gerne, nur ist der Arduino nicht gerade als
Sprinter bekannt.
Spätestens wenn Du ihn Fließkommaoperationen durchhecheln lässt wirst Du
das auch selber feststellen. Es gibt zwar viele Bibliotheken, die das
unterstützen, die brauchen aber prinzipiell viel Zeit.
Ob Du aber den Output eines Programmes wie den von Simulink, soweit
beeinflussen kannst dass KEINE Fließkommaarithmetik verwendet wird weiß
ich nicht. Überhaupt betrachte ich solche Programme als Komfort-Liegen.
Also hast du "unendlich" viel Power, so machen sie, was sie sollen. Bei
Meister Schmalhans gehen diese aber nicht so gerne essen.
Wenn es also ein Arduino sein soll, so würde ich das Ganze mit Simulink
simulieren und überprüfen. Dann aber in ganz normalem C
nachprogrammieren und den ganzen Fließkommakram im Keller lassen.
Eventuell sind zeitkritische Routinen auch ein Grund, mal wieder die
Assemblerkenntnisse herauszuholen. Oft geht es ja nur um ein oder zwei
Kernfunktionen. Der restliche Kram, aus den Bibliotheken, sollte auch so
schon "optimal" sein.
N. M. schrieb: > Halte ich für eine gewagte Aussage, da sie Hardwareabhängig ist. Viele > Controller haben heute eine FPU an Bord. Dann kann Floating Point > schneller sein als eine Fixed Bib. Aha. Michel Weis schrieb aber im Beitrag #6408617: > direkt auf mein Arduino Soviel dazu... Michel Weis schrieb: > AUch hier frage ich mich, welche Blöcke ich dazu verwenden soll? Was > genau meinst du mit PortPin? Simulink ist eine blockorientierte Simulation. Daher die "signalverarbeitenden Blöcke". Portpin ist einfach ein Pin am Mikrocontroller auf deinem Arduino-Board. Also "DigitalWrite 1", rechnen "DigitalWrite 0". Die Länge des resultierenden Pulses kannst du z.B. mit einem Oszilloskop messen. Michel Weis schrieb: > Aber wie genau soll das funktionieren? Wir können auch als einfaches > Beispiel ein einfachen PID-Regler nehmen. Dann implementiere den PID in "plain C" selber oder nimm ihn aus einer Quelloffenen Library, schmeiß das in eine C-Mex S-Function und lass deinen PID gegen den von Simulink antreten. Und benutze bitte die Doku/Hilfe von Simulink. Die ist sehr ausführlich und klar formuliert. Michel Weis schrieb: > Achim M. schrieb: >> Dabei fallen dir die Möglichkeiten der Optimierung gleich in die Hand: >> ... > > Guter Hinweis. > > Aber sorry, ich bin nicht soooooo der Matlab-Experte, kannst du es ein > bisschen verfeinern? Das hat erstmal garnix mit Matlab zu tun... Beispiel für a). Du brauchst irgendwo z.B. den Betrag eines Vektors mit 2 Elementen. Erster Ansatz ist, Elemente des Vektors Quadrieren, summieren und darauf die Wurzelfunktion anwenden. Frisst viel Rechenzeit ohne FPU. Optimierung: Nutzung eines Vektorlängen-Schätzers, der genau genug ist. Beispiel für b) Du hast überall quer durch den Code verstreut, reskalierung von Rechenergebnissen mit einem Parameter, der zwar einstellbar ist, aber dooferweise der Nenner eines Bruches ist. Vorschlag, das einmal zur Init-Zeit (lingua Arduini: setup-Funktion) in den Kehrwert umzurechnen, um zur Laufzeit dann nur noch multiplizieren zu müssen. Oder noch was für b) Multiplikation oder Division mit/durch Zweierpotenzen durch Schiebeoperationen ersetzen. mfg mf
Achim M. schrieb: > Aha. Michel Weis schrieb aber im Beitrag #6408617: >> direkt auf mein Arduino > > Soviel dazu... Wenn sein Regler wirklich so komplex ist wird er da ja wahrscheinlich nicht die kleinste Möhre nehmen vermute ich. Gibt es bei dem Arduino Zeug wirklich keinen einzigen mit einer FPU? 🙄 Achim M. schrieb: > Dann implementiere den PID in "plain C" Ja so wurde ich das auch machen. Den Regler in C schreiben. Auf dem PC mit Eingangsdaten füttern und schauen ob der Output stimmt. Danach einmal für das Target übersetzen und man sieht ohne Hardware zu haben wieviel es kostet.
N. M. schrieb: > Gibt es bei dem Arduino Zeug wirklich keinen einzigen mit einer FPU? 🙄 Na halt keinen klassischen. Da sind bloß 8-bit Microchip (Atmel) AVR drauf. Aber in dem Format mit entsprechendem Pfostenverbinder-Layout für die Mezzanine-Aufsteckplatinchen gibt es schon was mit FPU. mfg mf
N. M. schrieb: > Ja so wurde ich das auch machen. Den Regler in C schreiben. Auf dem PC > mit Eingangsdaten füttern und schauen ob der Output stimmt. > Danach einmal für das Target übersetzen und man sieht ohne Hardware zu > haben wieviel es kostet. WIe viel was genau kostet? N. M. schrieb: > Dazwischen sind deine Berechnungen. > Wenn du den Code übersetzt, weißt du wieviel Befehle dafür benötigt > werden. Damit kannst du dann eine Zweitabschätzung machen. Gibt es ein Beispiel, wie man das macht? Achim M. schrieb: > Portpin ist einfach ein Pin am Mikrocontroller auf deinem Arduino-Board. > Also "DigitalWrite 1", rechnen "DigitalWrite 0". Die Länge des > resultierenden Pulses kannst du z.B. mit einem Oszilloskop messen. ABer das ist ja genau mein Punkt. Ich will keine Hardware verwenden. Herzlichen Dank für eure Mühe.
Leute Hintergrund meiner Fragestellung ist, ob man dies auch mit Matlab-Simulink machen kann wie bei dem Hersteller hier: https://www.youtube.com/watch?v=mD_CodP-2jE Jmd. eine Idee?
Michel Weis schrieb: > WIe viel was genau kostet? Wenn du deinen Regler in, sagen wir Mal C schreibst, kannst du ihn auf dem PC validieren über Stimulie (z.B. Sprungantwort o.ä.). Wenn alles funktioniert übersetzt du denn gleichen Code für dein Zielsystem. Über den Output des Compilers (z.B. Object Files) weißt du wie viele Befehle dein Zielsystem braucht um den Algorithmus umzusetzen. Damit kannst du dann mit dem uC Manual umrechnen auf Zeit. Also wieviel der Code "kostet". Michel Weis schrieb: > Gibt es ein Beispiel, wie man das macht? Ich hab jetzt keins zur Hand, aber hier im Forum findet man mit Sicherheit etwas.
Michel Weis schrieb: > Leute Hintergrund meiner Fragestellung ist, ob man dies auch mit > Matlab-Simulink machen kann wie bei dem Hersteller hier Das kann ich dir nicht beantworten. Aber letzten Endes muss irgendwann der Matlab Code / Simulink Modell auf dein Zielsystem übersetzt werden. Also wird es auch ein/mehrere Object Files geben...
Michel Weis schrieb: > ABer das ist ja genau mein Punkt. Ich will keine Hardware verwenden. Dann brauchst du dir auch keine weiteren Sorgen zu machen. Wahrscheinlich reicht es dir sowieso nicht, auszuprobieren, ob es funktioniert. Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst du den generierten Code genau analysieren und auf maximale Laufzeit abklopfen müssen.
Wolfgang schrieb: > Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst > du den generierten Code genau analysieren und auf maximale Laufzeit > abklopfen müssen. Ja mir fehlt ja ein Beispiel, da ich mir sonst schwer tue, wie man ein Code auf Laufzeit analysieren kann. Ich würde nämlich mit Simulink folgendes gerne machen: https://www.youtube.com/watch?v=X98XQ_gv4sE&t=6s Das muss doch auch möglich sein,oder?
Michel Weis schrieb: > Wolfgang schrieb: >> Damit du garantieren kannst, das die Regelung in Echtzeit läuft, wirst >> du den generierten Code genau analysieren und auf maximale Laufzeit >> abklopfen müssen. > > Ja mir fehlt ja ein Beispiel, da ich mir sonst schwer tue, wie man ein > Code auf Laufzeit analysieren kann. > > Ich würde nämlich mit Simulink folgendes gerne machen: > > Youtube-Video "Kürzere Entwicklungszyklen durch virtuelle Verifikation > von Timing-Anforderungen" > > Das muss doch auch möglich sein,oder? Kann hier keiner helfen?
Hersteller von "richtigen" Signalprozessoren bieten auch Libraries fuer Funktionsbloecke an. Mit verifizierter Laufzeit. Und fuer selbstgeschriebene Funktionen/Bloecke muss man dann halt den Simulator bemuehen und sich die Befehlszyklen mitzaehlen lassen. Dazu muss man natuerlich auch die Eingangsparameter variieren um die Worst-Case-Faelle zu erkennen. Keiner braucht also: "... virtuelle Verifikation von Timing-Anforderungen". Allgemein gilt ohnehin, dass der Regler zwischen 2 Abtastungen mit seiner Rechnerei fertig sein muss. Ein Regler der bzgl. der Rechenzeit nicht deterministisch ist, ist da ganz einfach unbrauchbar.
pittiplatsch schrieb: > Keiner braucht also: "... virtuelle Verifikation von > Timing-Anforderungen". Das Abzählen im Simulator, das du vorschlägst, ist aber doch genau das?
Genaue Zeiten kann Dir sowieso niemand angeben! Spätestens wenn sich irgendwo im Code eine bedingte Verzweigung in den Weg stellt, wird jedem Gleichheitszeichen der Gar ausgemacht. Da es Regler im Allgemeinen genau wissen wollen, treten bedingte Verzweigungen gleich Rudelweise auf.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.