LabVIEWForum.de - Fehlersuche bei FPGA-Code mit cRIO

LabVIEWForum.de

Normale Version: Fehlersuche bei FPGA-Code mit cRIO
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

zum Ansteuern von analogen Ausgängen verwende ich ein cRIO im FPGA Modus. Dabei ist mein Programm von der Struktur her aufgebaut, wie das Bild im Anhang: Der Host(cRIO ) startet das FPGA.VI und steuert im Haupteil verschiedenen Module an. Möchte ich dies beenden, soll über einen "Frontpanel Acess" vom Host aus geschehen. Dort soll der Anwender "stop" drücken und aufgrund der Verknüpfung zum FPGA.VI der Hauptteil dessen beendet werden. Anschließend einige Kanäle auf Null gesetz werden und ein Boolean auf true gesetz werden um dem Host zu signalisieren das die Rücksetzung erfolgte. Dieses liest der Host aus und beendet sich.

Nun ist mein Programm etwas komplexer und funktioniert leider nicht einwandfrei. Klicke ich auf Beenden, tut sich zwar was, aber die Kanäle werden nicht auf Null gesetz und das Programm wartet vergeblich auf ein True bei Reset. Also muss ich annehmen das das FPGA.vi nicht bis zu der Sequenz kommt.

Da ich nicht genau weis wo es hängt und es keine Highlight Execution im FPGA Modus gibt, ist meine Frage, wie kann ich herausfinden was das Problem im FPGA oder Host.VI ist? Wie kann ich sehen bis wohin das Programm wirklich ausgeführt wurde.
Oder hat jemand eine Idee warum es sich nicht beendet?

Das Programm im Anhang funktioniert natürlich deshalb weis ich nicht warum meins es nicht tut.


Danke für Eure Ratschläge, ich bin hier am verzweifeln Sad
Hier nochmal eine vereinfachte Version meines Programme, bei dem das Beenden leider wie bei dem Original nicht funktioniert.
Ein paar Ideen zum Debugging:

Schleifenindex an einem Indikator anschließen, dann kannst du ihm vom RT-Teil auslesen und somit sehen, ob eine Schleife noch läuft oder nicht.
Alternative: Eine T/F-Toggle Boolean erstellen, wenn sie entsprechend langsam ist, dann kann diese auch an die FPGA-LED angeschlossen werden.

Damit kannst du feststellen, welche Schleife nicht stoppt.

Auf den ersten Blick entdecke ich keinen Fehler im FPGA-Code.

Gruß, Jens
Also habe die Indikatoren eingebaut mit folgendem Ergebnis: beide Schleifenzähler stoppen. Der Indikator "Ansteuerung beendet?" ist ja auch true.
Wie kann das sein,das die Schleifen beendet werden, aber der nächste Schritt in der Sequenz nicht ausgeführt wird?
Im Anhang der Code mit Indikatoren.
Hallo Mietze,

ich beziehe mich auf das Bild in Beitrag #2:
RACE CONDITION!

- im RT-Teil startest du den FPGA, ohne vorher "Ansteuerung beenden" auf FALSE zu setzen.
- im FPGA-Teil fragst du eben diese Variable über eine lokale Variable in der oberen Schleife ab: wahrscheinlich ist sie vom letzten Aufruf her noch TRUE (Abbruch des vorigen Aufrufs), die Schleife bricht ab
- in der Sequenz darunter setzt du diese Variable auf FALSE (wahrscheinlich zu spät für die obere Schleife), die Schleife in der Sequenz sollte eigentlich laufen

Vorschlag:
- Abbruchbedingungen explizit im cRIO/RT-Teil setzen! (FPGA-Code laden, Werte setzen, FPGA starten...)
- THINK DATAFLOW: lokale Variablen tragen immer die Veranlagung für RACE CONDITIONS in sich...

Tipp:
- Im RT-Teil setzt du "stop" in der Schleife dauernd auf FALSE. Einmal neben der Schleife zu setzen reicht völlig aus!
- Eben diese Schleife läuft ungebremst: Willst du einen Burn-In-Test des cRIO veranstalten?
Danke für Eure Antworten.
Habe die Indikatoren hinzugefügt und das Initialsieren der Abbruchbedingung über den RT gemacht und das Setzen der Abbruchbedingung im RT für den RPFGA aus der Schleife genommen.
Leider funktioniert es immer noch nicht. Die Schleife außerhalb der Sequenz läuft einwandfrei. (Zusehen am Indikator des Schleifendurchlaufes, der läuft^^)
Habe noch einen Indikator "SchleifenEnde" eingebaut (siehe Bild). Das merkwürdige ist, das der Indikator "Ansteuerung beenden" true ist und somit die Bedingung für das beenden Schleife erfüllt ist. Aber am Indikator "SchleifeEnde"=false sieht man, das die Schleife noch nicht ausgeführt würde.
Was ist daran falsch?
Im Anhang ein Bild und die aktuellen VIs.
Hi,

könnte es an deinem IRQ liegen? Der wartet auf Acknowledge, was aber nur passiert, wenn die Schleife im Host so lange läuft. Die brichst du aber ab sobald du Stopp drückst.
Jetzt könnte die Schleife auf dem FPGA nochmal loslaufen (m.E. ist das beim Timingunterschied zwischen Host und FPGA eher wahrscheinlich), bleibt dann aber am IRQ hängen, der halt wartet. Da nützt dann auch die Abbruchbedingung nicht, weil die erst greift, wenn aller Inhalt der Schleife einmal durchgelaufen ist...

Grüße,

ch
Perfekt!
Habe den Eingang Wait until cleared des IRQ mit der Variablen Ansteuerung beenden verbunden.
Und nun beendet es korrekt.
Danke. Der Tag ist gerettet. Big Grin
natürlich mit einem Not dazwischen. Smile
Referenz-URLs