Jump to content

Auslesegeschwindikeit von Bricklets


Recommended Posts

Hallo zusammen

Ich arbeite an einer Linearführung, bei der ich einen Steppermotor und einen Encoder mit einem Tinkerforge-Stack betreibe. Den Encoder lese ich mit dem Industrial Counter Bricklet aus. Zusätzlich will ich mit dem Accelerometer 2.0 Bricklet die Beschleunigungwerte auslesen. Ich muss sicherstellen, dass ich die Encoder- und Beschleunigungswerte gleichzeitig bekomme und ich möchte eine hohe Datenrate erreichen. Wie programmiere ich das in Python, welche Funktionen kommen dafür in Frage?

Bisher habe ich es mit dem CALLBACK_CONTINUOUS_ACCELERATION_16_BIT versucht. Damit erreiche ich eine grossartige Datenrate für die Beschleunigung alleine aber wie kann ich gleichzeitig den Industrial Counter auslesen? Eine get.function für den Counter im Callback des Accelerometers aufzurufen ist wahrscheinlich keine gute Idee und zwei Callbacks parallel laufen zu lassen auch nicht...

Für Eure Hilfe wäre ich sehr dankbar und falls meine Frage zu unklar oder unspezifisch ist, erläutere ich das Problem gerne genauer!

Link to comment
Share on other sites

Prinzipiell ist es so, dass du über einen Master Brick ~ 1000 Nachrichten pro Sekunde verarbeiten kannst. D.h. wenn du z.B. nur Getter benutzt schaffst du nur 500 Abfragen pro Sekunde, weil das ja die Abfrage-Nachricht und die Antwort involviert. Deshalb sind die Callbacks effizienter.

Theoretisch kannst du jetzt also durchrechnen, wie viele Nachrichten das Continuous-Acceleration Callback bei deiner Konfiguration erzeugt, z.B. wie folgt:

  • In einer Nachricht sind bei 16-Bit Messwerten 30 Werte enthalten
  • D.h. bei 1000 Nachrichten pro Sekunde schaffst du es 30000 Messwerte rauszuziehen
  • D.h. wenn du z.B. zwei Achsen verwendest kannst du pro Achse und Sekunde 15000 Messwerte verwenden
  • -> 15000 Hz ist die maximal sinnvolle Messfrequenz, konfigurieren kannst du dann 12800 Hz

(So werden z.B. die Werte in der Tabelle hier: https://www.tinkerforge.com/de/doc/Software/Bricklets/AccelerometerV2_Bricklet_Python.html#BrickletAccelerometerV2.set_continuous_acceleration_configuration berechnet)

Wenn du jetzt das Counter-Bricklet parallel abfragen willst (sinnvollerweise auch per Callback), musst du von den verfügbaren 1000 Nachrichten in der Rechnung so viele abziehen, wie du für den Counter zur Verfügung haben willst.

Wenn du z.B. alle 10 Millisekunden den aktuellen Encoder-Wert bekommen willst, heißt dass, dass 100 Nachrichten vom Counter-Bricklet erzeugt werden. Du kannst dann also nur noch 900 Nachrichten für das Accelerometer-Bricklet verwenden, also 27000 Messwerte, bei zwei Achsen also max. 13500 Hz, d.h. die (konfigurierbaren) 12800 Hz schaffst du weiterhin.

Soweit die Theorie. In der Praxis musst du das dann natürlich ausprobieren und gegebenenfalls die Timings nicht ganz so eng wählen. Falls sich Nachrichten beim Brick aufstauen, kann es passieren, dass du dann veraltete Werte bekommst.

Noch ein paar Performance-Optimierungs-Ideen:

Link to comment
Share on other sites

  • 2 weeks later...
Am 2.5.2022 um 17:07 schrieb duaw:

Warum sollte das keine gute Idee sein? 

Ich hatte Probleme mit dem Timing der beiden Callbacks und dem Zuordnen der Messwerte zueinander.

Aber ja, es ist eine gute Idee mehrere Callbacks zu verwenden.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...