Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
14.07.2016, 10:56 (Dieser Beitrag wurde zuletzt bearbeitet: 14.07.2016 10:56 von martinkrimsh..)
ich hab ein Programm erstellt, das 6 Motoren und 7 weitere Aktoren gleichzeitig und unabhängig voneinander ansteuert. Die Kommunikation zu den Motoren und Aktoren funktioniert einwandfrei.
Den Motoren muss man jede Sekunde oder schneller die Kommandos schicken (sprich Drehzahl und Drehrichtung), ansonsten bremsen sie ab.
Gleichzeit werden die Daten die die Motor zurückgeben in einer TDMS-Datei gespeichert.
Die ersten Seiten der Registerkarte dienen zur Initialisierung. Mir geht es um Seite 4 im Blockdiagramm.
Wenn ich das Programm laufen lasse bekommen die Motoren die Kommandos zu spät, also nicht jede Sekunden sondern nur alle 1,2 Sekunden. Das ist zu langsam.
Können Sie mir Tipps geben wie ich das Programm beschleunigen könnte?
ich hab ein Programm erstellt, das 6 Motoren und 7 weitere Aktoren gleichzeitig und unabhängig voneinander ansteuert. Die Kommunikation zu den Motoren und Aktoren funktioniert einwandfrei.
Den Motoren muss man jede Sekunde oder schneller die Kommandos schicken (sprich Drehzahl und Drehrichtung), ansonsten bremsen sie ab.
Gleichzeit werden die Daten die die Motor zurückgeben in einer TDMS-Datei gespeichert.
Die ersten Seiten der Registerkarte dienen zur Initialisierung. Mir geht es um Seite 4 im Blockdiagramm.
Wenn ich das Programm laufen lasse bekommen die Motoren die Kommandos zu spät, also nicht jede Sekunden sondern nur alle 1,2 Sekunden. Das ist zu langsam.
Können Sie mir Tipps geben wie ich das Programm beschleunigen könnte?
deine Sub-VIs, die du da alle scheinbar parallel abarbeitest, werden nur parallel abgearbeitet, wenn es alles verschiedene VIs sind, oder (wenn es ein und das selbe VI ist) dann muss es ablaifinvariant sein und es darf keine Datenflussabhängigkeiten zwischen ihnen geben. Da du nur das Main angehängt hast, kann ich das nicht prüfen.
Wenn deine Kommunikation in einem VI 100ms dauert, addieren sich im Sequenziell-Abarbeitungsfall die Zeiten,
Das könnte ich mir hier als Grund vorstellen.
Gruß, Marko
14.07.2016, 13:35 (Dieser Beitrag wurde zuletzt bearbeitet: 14.07.2016 13:35 von Lucki.)
(14.07.2016 11:27 )Trinitatis schrieb: deine Sub-VIs, die du da alle scheinbar parallel abarbeitest, werden nur parallel abgearbeitet, wenn es alles verschiedene VIs sind, oder (wenn es ein und das selbe VI ist)
Die SubVIs mögen zwar vom Code her gleich sein, es handelt sich hier aber um Kopien, die jeweils nur 1 Mal verwendet werden. (Jede Kopie hat einen eigenen Namen). Das ist gewissermaßen die umständliche Anfänger-Methode, ein SubVI ablaufinvariant zu machen. Die SubVI arbeiten also parallel, genau als wenn man nur ein ablaufinvariantes VI verwendet hätte,
Trotzdem: Das Geheinmis der Langsamkeit liegt bestimmt in den SubVIs. Es wäre als sehr sinnvoll, die auch noch zu posten.
(14.07.2016 13:35 )Lucki schrieb: Die SubVIs mögen zwar vom Code her gleich sein, es handelt sich hier aber um Kopien, die jeweils nur 1 Mal verwendet werden. (Jede Kopie hat einen eigenen Namen).
Genau das wusste ich nicht, weil die VIs fehlten. Ich habe dann jetzt aber auch in der Kontexthilfe gesehen, dass sie alle namentlich unterschiedlich sind.
(14.07.2016 13:53 )Trinitatis schrieb: Ich habe dann jetzt aber auch in der Kontexthilfe gesehen, dass sie alle namentlich unterschiedlich sind.
Ich aktiviere dazu immer "Sichtbare Objekte/Beschriftung". Obwohl das VI selbst gar nicht existiert, funktioniert das erstaunlicherweise - genau so wie auch die von Dir benutzte Kontexthilfe.
Gruß Ludwig
Vielen Dank für Ihre schnellen Rückmeldungen.
Die SubVI´s für die einzelnen Motoren sind zwar vom Aufbau identisch, aber sind alle extra abgespeichert, also kein copy paste.
Das SubVI_Lüftermotor1_ansteuern ist für eben den 1. Motor zuständig. In diesem SubVI befinden sich noch weiter SubVI´s (SubVI_EBM_COM_INIT_Motor1, SubVI_Soll-Drehzahl_Motor1, SubVI_EEPROM write turn_Motor1, SubVI_Ist-Drehzahl_auslesen_Motor1), also noch eine ebene tiefer.
Ich glaub daran liegt das Problem, aber ich brauch die komplexität der VI´s um die richtigen Motorbefehle (Schnittstellenprotokoll) zu senden.
es fehlen noch weitere subVIs (Checksummenberechnung, Typdefs, …)!
Abgesehen davon:
- Jeder "Stellbefehl" enthält eine Schleife, die bis zu 5mal wiederholt wird.
- die Kommunikation ist für 38.4kbaud ausgelegt: die RS232 ist damit nicht besonders schnell
- in diesen Schleifen gibt es Wartezeiten, z.T. "nur" 2ms, aber auch mal bis zu 100ms!
- es wird mit Semaphoren hantiert: evtl. sperrt man darüber den parallelen Zugriff auf mehrere/andere Geräte und bremst sich somit gegenseitig aus!?
- der COM-Port wird bei jedem Aufruf erneut konfiguriert: ist das sinnvoll oder gar notwendig?
Und das alles bei einem flüchtigen Blick in VIs, bei denen etliche subVIs noch fehlen…