Hallo,
ich habe eine Vermutung, weshalb die erste Position doppelt in die Tabelle geschrieben wird und die letzte Position fehlt. Und zwar handelt es sich dabei wohl um ein Timing-Problem.
Und zwar soll sich für i=0 der Motor nicht bewegen, damit die Startposition auch aufgenommen wird. Jetzt für i=1 soll sich der Motor um einen Step bewegen und
danach die Position in die Tabelle geschrieben werden. Aber anscheinend funktioniert das so nicht, sondern beinahe instantan wird der Messwert in die Tabelle geschrieben. Und das so schnell, dass der Motor den Befehl noch nicht verarbeitet hat. Deswegen befindet sich in der Tabelle zweimal der Wert der Startposition. Und für i_1=N_1(äußere Schleife) i_2=N_2 (innere Schleife) wird der letzte Befehl an den Motor gesendet und direkt danach die Position gespeichert. Aber die Position entspricht dann eigentlich die der i_2=N_2-1. Iteration.
Und "mitten drin" funktioniert es, weil sowohl in der inneren als auch in der äußeren Schleife jeweils ein Timer ist. Der dann aber am Ende logischerweise nicht mehr zur Geltung kommt. Soweit macht das Sinn, oder?
Also kann man das beheben, indem man überprüft, ob der Motor in der Position angekommen ist. Deswegen hatte ich vorher schonmal ein SubVI angefertigt, das mittels State Machine abfragt, ob der Motor in der endgültigen Position angekommen ist. Das hat in der Praxis aber leider gar nicht funktioniert.
Ich hänge es nochmal an zur Überprüfung, ob das soweit stimmt oder fehlerhaft ist.
Das hat vermutlich nicht funktioniert, weil, wenn das Intervall zur Überprüfung zu genau ist, und der Motor eine Ungenauigkeit hat, die größer ist, als das eingegebene Intervall, ist die State-Machine im State "Wait" gefangen. Wie man der Tabelle entnehmen kann, sind Ungenauigkeiten von 0,1 um möglich, was eben auch die minimale Resolution sein soll. Wenn ich das Intervall jetzt auf +- 0,1 um setze, dann ist bei einer Auflösung von 0,1 um der boolesche Wert immer true, die Bedingung also immer erfüllt. Was dann nichts bringen würde. Gibt es da zu vielleicht Anregungen?
In der Palette "Timing" habe ich die Funktion "Datenfluss aufhalten" gefunden. Kann das eventuell eine Alternative sein?
Wenn ich den Datenfluss an dieser Stelle aufhalten würde, sollte das Problem ja nicht mehr sein. Klar, für die Performance ist es defintiv nicht die schönste Lösung, allerdings sind mir fehlerfreie Werte aktuell lieber. Und den Timer in der inneren Loop könnte ich dann einfach an diese Stelle mit "Datenfluss aufhalten" setzen.
Allerdings erklärt das noch nicht wirklich, weshalb in der Tabelle (siehe oben) der erste Messwert 10 beträgt und im Z-Array 70. Und den anderen Ungereimheiten bzgl. des Z-Arrays bin ich auch noch nicht auf die Schliche gekommen.
Aber generell ist da ja das gleiche Problem: Der Messwert soll wie die Positionen erst aufgenommen werden, wenn der Motor seine Position erreicht hat. Denn nur so kann man das ja eindeutig zuordnen.