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!
13.08.2015, 17:33 (Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2015 17:42 von skyph.)
ich habe folgendes Problem: ich will mit meinem sbRIO auf die Zusandsänderung durch das angesteuerte Relais reagieren. Dabei sehe ich das bekannte Nebeneffekt, es prellt. Da die HW schon vor mir liegt, wollte ich das Problem im LV lösen und zwar über einen Lowpassfilter (Butterworth Filter). Ist es überhaupt eine gute Idee oder gibt es intelegentere?
Am Eingang vom Butterworth Filter erwarte ich ein 1D array (laut Definition), kann diesem aber "nur" einen boolschen Wert von meinem abgelesenen IO bieten. Gibt es eine Chance das zu konvertieren?
Vielen Dank schon im Voraus
Grüße
Dennis
Anzeige
13.08.2015, 18:02 (Dieser Beitrag wurde zuletzt bearbeitet: 13.08.2015 18:02 von Lucki.)
Die Filter mit Array-Eingang sind zur Offline-Verarbeitung von Daten. Für die Online-Verarbeitung gibt es alle Filter auch als Punkt-zu Punkt-Funktionen. Die haben nur einen einzelnen numerischen Wert als Eingang.
Ich sehe aber Filter nicht als optimale Methode zur Entprellung. Andere Methode z.B: Ein Zustandswechsel, beispielsweise von High auf Low, wird erst dann gültig, wenn mehr als 5 hintereinanderfolgende Abtastwerte Low sind. (die "5" ist hier nur ein Beispiel, der optimale Wert ist durch Probieren zu ermitteln).
dass die Filter VIs auf dem FPGA nicht laufen, ist natürlich ein Argument.
Mit den einfacheren Schleifen das abzufangen war ich bei der Lösung aus dem Anhang.
Allerdings habe ich 24 Kanäle gleichzeitig zu überwachen. Dafür lese ich diese in einem Sub VI permanet aus, pack in ein 1D Array. Dieses leite ich zum einem zur RT Ebene weiter, zum anderen stelle ich einen möglichen Flankenwechsel über xor fest (Flag wird ebenfalls danach weitergereicht). An der Stelle wollte ich eigentlich keine Schleife einbauen, weil ich im aufrufenden VI weitere Befehle ohne Zeitverzögerung unabhängig vom Flankenwechsel ausführen muss... Ich probiere aus, ob ein "Zeitopfer" an der Stelle mich doch weiterbringt
Das ist doch schnell skaliert:
Irgendwann packst du den Inhalt in der Schleife oder die gesamte Schleife noch in ein SubVI, und dann sieht das BD auch wieder übersichtlich aus.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
danke für den weiteren Tipp ich kann da alles nachvollziehen bis auf das größer-gleich Fkt. Welche Rolle spielt hier die Dauer und warum muss ich sie mit der Zustandsänderung vergleichen?
Ich habe jetzt eine andere Lösung, auch wenn es vielleicht mit Kanone auf Spatzen geschossen ist State Machine. Es tut sogar! Jetzt nur noch optimieren
(14.08.2015 12:09 )skyph schrieb: danke für den weiteren Tipp ich kann da alles nachvollziehen bis auf das größer-gleich Fkt. Welche Rolle spielt hier die Dauer und warum muss ich sie mit der Zustandsänderung vergleichen?
Also das Beispiel überwacht eigentlich nur ein Prellen beim Flankenwechsel von Low auf High. Der echte Zustand High wird erst dann weitergegeben, wenn x-mal direkt hintereinander der Zustand High erkannt wurde. "Dauer" ist die Grenze (in Einheiten der Loop-Time), wie oft hintereinander der Zustand High erkannt werden muss, bevor er als Ausgabe weitergeleitet wird.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Was soll die UND-Verknüpfung unten? Wenn du die mit einem Array aus lauter FALSE startest, bleibt das Ergebnis immer FALSE…
Was machst du im FALSE-Case?
Warum vergleichst du das XOR-Ergebnis ALLER Relais gleichzeitig? Werden die alle gleichzeitig geschaltet?
Was soll die UND-Verknüpfung mit TRUE vor dem Schleifen-Stop? RubeGoldberg lässt grüßen…
Nachtrag zu Jens' Kommentar: bei einer SPS nennt sich die gleichwertige Funktion "TON"…
die UND Verknüpfung ganz unten rechts ist überflüssig (das meinte ich mit Optimierung). Die Abbruchbedingung wird aus jeweiligen Case definiert und das ist ausreichend.
Die andere Verknüpfung... wo Du das grade sagst, verstehe ich auch warum ich in RT die Relaiszustände richtig ablese aber keine Flankenauswertung erhalte! Danke
XOR - weil es tatsächlich möglich ist, dass alle Relais gleichzeitig schalten können, und ich lese auf den höheren Ebenen was genau geschaltet hat.
und im false-Case wird nur der nächste Zustand angegeben. In diesem Fall Ausgabe mit Überleitung zum Loop Abbruch.