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!
Hi,
ich sitze hier gerade und hab ein rießiges Problem :-(
Ich habe einen kurzen Startimpuls der einen Zähler startet. Jetzt muss aber der Anfangswert des Zählwertes gespeichert werden und mit dem aktuellen Zählwert verglichen werden - und das klappt nicht.
Ich habe das ganze mit einer lokalen Variablen versucht , die in einem Case ist (auf dem Bild die Variable "Istposition" ). kommt nun mein Startimpuls, so müsste das case kurz "true" werden und der Wert sollte in der LV im Case gespeichert werden. Den gespeicherten Wert hole ich dann wieder an einer anderen Stelle im Programm aus meiner lokalen Variable. Sieht man ja im Bild.
Kurioser Weise geht das aber nicht, wenn ich es so mache, wie es auf dem Bild ist, dann wird die Variable nicht gespeichgert sondern läuft mit dem Zähler hoch und runter - wieso weis ich auch nicht!
Könnt Ihr mir da ein wenig weiterhelfen!? - wie speichert man sonst Variablen kurzzeitig in einem Programm?
Gruß Chriz
EDIT: Wenn jemand will kann ich auch das gesamte VI dem Thread anhängen, jedoch kann man es nicht ausführen solang man keine Adwin-Treiber installiert hat!
nur aus dem bild kann ich net viel erkennen :-)
eine andere bessere moeglichkeit werte zwischenzuspeichern ist eine "Funktionale - Globale - Variable" (SubVI mit einem nicht initialisiertem Schieberegister und einer sofortigen Abbruchbedingung) ODER eine Queue
Hab da eine Idee:
Vielleicht liegts einfach daran, dass der Schalter "Start Fahren" ein Schalter ist und kein Taster, also beim einmaligen Drücken steckenbleibt und damit immer den aktuellen Wert in Istzustand reinschreibt.
Hi,
Danke für Deine Antwort, jedoch ist der Schalter als Latch deklariert, daran kann es also nicht liegen.
Ich vermute eher dass es daran liegt, dass ich nach dem auslesen der lokalen Variable direkt eine arithmetische Operation habe (im case unten) - hab irendwo gelesen dass bei Rechnungen das Ergebniss direkt wieder an die LV zurück gegeben wird - ob das stimmt weiß ich jedoch nicht
nein, es wird lediglich bei der addition, das ergebnis auf den "knoten" des oberen einganges geschrieben!
sprich -> es wird eine speicherallokierung gespart, die lokale variable bleibt zur gaenze unangetastet!
geh mal auf dein frontpanel element und schau nach wo du ueberall lokale variablen als instanz vom frontpanel element verwendet hast, evtl. hast irgendwo eine lokale variable mti einer struktur ueberdeckt, oder aehnlichem...
hast dir das auch schon mal im highlightmodus mit probes angesehen?!
So,
ich hab jetzt nochmal das gesamte VI angehängt, ich hoffe mal damit kommt Ihr besser zurecht.
Nochmal zur Erklärung: Wenn ich auf start klicke, läuft eine Achse im Adwin los, darauf hin erhöht sich der Istwert. Im gleichen Moment in dem ich jetzt aber auf start klicke, soll auch das case kurz auf true gehen und diesen aktuellen Istwert als Startwert speichern. Im unteren case wird dann einfach nur nochmal der jeweilige Istwert mit dem Startwert verglichen, die addition ist die Berechnung des Zielwertes, also Startwert plus Strecke die gefahren werden soll. Dannach kommt nur noch der Vergleich und die boolsche Opperation die bestimmt, ob die Achse den Zielwert schon erreicht hat und wieder zurück muß, oder ob sie noch weiterhin vorwärts fahren muss - is aber nicht so wichtig.
Das Problem besteht nun wie bereits gesagt darin, dass die Startposition nicht gespeichert wird, sondern mit dem aktuellen Istwert verändert wird, Startposition und Istwert sind sozugagen immer gleich obwohl der Startwert im einem case gespeichert wird, welches nichtmehr true ist!
EDIT:
oh sorry freedive, Dein posting hab ich jetzt völlig übersehen!
Im Highlight erkennt man nichts, das case zum speichern des Wertes wird auch definitiv nicht true wenn ich es nicht anklicke!
Wie meinst Du das mit dem überdecken durch eine Struktur? - die Variable wird zwar noch mehrmals im VI ausgelesen, aber garantiert nicht an einem anderen Ort geschrieben, dass hab ich schon kontrolliert!
deine boolsche variable ist auf "schaltet, wenn" und nicht auf "latch, wenn..."
aber ob das ausschlaggebend ist, ist fraglich -> sehr verwirrend dein programm :-(
UND du solltest das anzeigelement des numerischen elements istposition in die case struktur legen,d ann wird sie net immer upgedatet!
das ist der hauptgrund fuer das fehlverhalten
StartFahren ist kein Latch, sondern ein Schalter. Einmal gedrückt bleibt er immer gedrückt, und generiert damit keinen Impuls.
Der wiederum würde hier sowieso nicht helfen:
StartFahren geht über ein Oder-Glied an die Case-Structure und schlägt sich damit immer durch, egal was die ungleich-Bedingung ergibt. Das heißt beide case-Strukturen werden nur im True-Modus aufgerufen, und damit bei jedem Durchlauf ausgeführt.
Außerdem: Istposition ungleich Istposition ist immer Null
(Terminal Istposition wird mit lokaler Variable Istposition verglichen).
Tipp: Versuch, den Startwert in eine eigene Variable zu speichern.
Und: Datenfluss beachten! Oben nach unten, links nach rechts. Lokale Variablen sind, was das betrifft, nicht ganz ungefährlich.
BitRechner schrieb:Und: Datenfluss beachten! Oben nach unten, links nach rechts. Lokale Variablen sind, was das betrifft, nicht ganz ungefährlich.
nix fuer ungut bit, aber das ist wirklich mist was du da geschrieben hast!
fuer das, dass du schon sehr viel programmiert hast und einiges an ahnung bezueglich cFP hast, war das eine sehr unkluge aussage...
Ups, dann ist das "schalten wenn.." noch vom highlight drine - ursprünglich war es aber ein lacht.
Die Istposition hab ich extra nicht ins case genommen, damit der aktuelle Wert ständig angezeigt wird (istwert eben!)
Das mit der Anzeige im case hab ich mir auch schon überlegt, hab dann mal eine eigene Anzeige ins case gelegt (Startwert) und die Variablen im Prog dementsprechend abgeändert, nützt aber nichts - auch die Variable Startwert läuft mit!?
[quote]Istposition ungleich Istposition ist immer Null