Hallo,
ich bin ein ziemlicher Neuling in LabVIEW 8.2 und habe eine Frage zur FPGA Programmierung zu der ich im Forum und über google nichts finden konnte.
Ich habe ein Programm erstellt, mit welchem ich über ein FPGA VI, welches auf einem cRIO läft, verschiedene Ventile ansteuere. Was für mich wichtig wäre, ist eine Möglichkeit aus Sicherheitsgründen alle Ventile zu schließen, falls die Verbindung zwischen Frontpanel-VI auf dem PC und dem cRIO verloren geht (PC stürzt ab, etc.). Es würde wohl reichen, das VI auf dem cRIO zu stoppen, da ja dann die an den analogen I/Os ausgegebenen Spannungen Null werden?!?
Wie könnte man eine solche Funktion realisieren? Für Hilfe und Tips wäre ich sehr dankbar!
Viele Grüße
Maetthy
Die werte am FPGA werden nicht zurueck gesetzt, wenn du das FPGA VI einfach stoppst.
Was du machen koenntest ist, dass du ein lifebit all XXms toggelst.
Am cRIO checkst du das bit und sollte eine bestimmte guardtime nicht eingehalten werden, laeufst den nothalt am FPGA, der alle outputs in einen von dir definierten zustand versetzt.
' schrieb:Was du machen koenntest ist, dass du ein lifebit all XXms toggelst.
Am cRIO checkst du das bit...
Danke Thomas, das scheint mir eine gute Lösung zu sein. Hast mir - da ich wirklich ein blutiger Anfänger bin - vielleicht noch einen kurzen Tip, wie man das ganz konkret realisiert?
Danke!
Maetthy
Ich nehme an, dass du, nachdem du PC schreibst nur ein Host VI und ein FPGA VI hast und direkt vom PC das bitfile deployest.
Was du machen kannst ist folgendes (einfachste der einfachen loesungen):
Am FPGA laesst du eine separate schleife laufen, die ein front panel (FP) boolean element auf wertaenderung ueberprueft.
Wenn die wertaenderung innerhalb einer bestimmten Zeit (timeout), nicht auftritt, dann kannst du mittels eines flags (ueber lokale variable, notifier, etc.) der haupt schleife im FPGA einen error signalisieren und dementsprechend in den notbetrieb gehen.
Nachdem das andere VI am Host laeuft musst du mit der schleifenzeit hier ein wenig spielen.
Grundsaetzlich solltest du das lebensbit in eine hoeher priore Schleife (timed loop) laufen lassen. Nachdem der determinismus am PC nicht vorhanden ist, musst du mit den loop werten ein wenig spielen. Als anfangswert kannst du die zeit vom timeout am FPGA durch 2 teilen und das result als timerwert am host VI nehmen.
In der schleife laesst das bit immer toggeln (entsprechend der logik am FPGA, welche ein toggelndes bit erwartet). Wenn das Host VI aussetzt oder die Verbindung verloren geht, bekommt das in dem Fall der FPGA mit und kann entsprechend deiner logik darauf reagieren.
Es gibt auch noch andere moeglichkeiten die weniger codearbeit fuer dich bedeuten, aber weitaus mehr text von meiner seite :-)
Wäre das nicht eine Standard-Aufgabe für ein IRQ? FPGA wirft eins, wenn das nicht nach x mx gelöscht ist, dann stoppt das FPGA. Meine, dass lässt sich auf dem FPGA per Eigenschaftskonten abfragen...
Die andere Möglcihkeit aus dem Hause NI würde mcih aber auch interessieren...
ch
das kann man doch recht einfach mit einer Netzwerk-Variablen lösen:
Auf dem PC wird in einer While-Schleife eine numerische Variable alle 250 ms um eins erhöht. Auf dem RT-Teil wird diese Variable alle 500 ms abgefragt und wenn der neue Wert gleich dem alten (in einem Shift-Register zwischengespeicherten) Wert ist, dann hat der PC keine neuen Daten geschrieben und ist vermutlich abgestürzt.
im FPGA-Teil muss man dann noch was programmieren, dass auf ein bestimmtes Signal hin (z.B. ein Control STOP (False) /GO (True)) im Stop-Fall alle Ausgänge auf den gewünschten Wert setzt. Wenn nun der Watchdog "Alarm schlägt" wird der Button GO auf False gesetzt und die Ausgänge werden auf die definierten Stop-Werte gesetzt.
so ist das IMHO in 30 min implementiert und nicht wirklich schwieritsch ...
Ich danke euch allen für eure Antworten!
Da sind wirklich gute und nachvollziehbare Lösungen für mich dabei, werde mich nun an die Umsetzung machen.
Grüße
Maetthy