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!
Ich bin noch ziemlich ein Greenhorn auf dem Gebiet von LabView und vorallem in Bezug auf Raspberry-PI.
Folgendes Problem:
Ich habe ein VI programmiert dass in sich funktioniert. Ein- & Ausgaben sind bis auf Abruf der Systemzeit nur Boolsche Werte die ich in ein Array ein- resp. auslese.
Und genau mit diesen boolschen Werten möchte ich die GPIO des Raspy ansteuern, resp. einlesen. Das Ganze soll eine BCD-Eingabe mit Umwandlung in einen Hammingcode darstellen.
Ich verwende LabView 2020 und habe hierfür bereits von MakerHub das LINX-Toolkit installiert. Angeblich für Raspy's der 2.Gen. geschrieben, aber scheint bedingt auf für das Raspy 4.Gen. zu funktionieren. Nun zur eigentlichen Frage:
- Kann ich irgendwie das ganze auf das Raspy übertragen, so dass die Anwendung selbst nach einem Stromausfall unabhängig wieder startet und permanent durchläuft? Denn das ganze System muss als Vorgabe auf einem Embedded-System laufen und darf nicht mehr mit dem Programmierlaptop verbunden sein.
- Kann die bei allenfalls lauffähigen Software die Systemzeit des Raspy's automatisch abrufen in meinem VI oder muss ich das auch noch irgendwie verknüpfen?
- Muss ich jedes Boolsche Signal einzeln schreiben/lesen oder kann ich ähnlich wie bei einem myDAQ ganze Array an definierte GPIO's übermitteln.
Viele Fragen .... hoffe auf gute Antworten
P.S. Für eine allfällige Verbreitung besteht bis am 01.05.2021 ein Copyright durch mich.
Zum Thema Stromausfall: Stromausfälle mag das RPi Betriebssystem nicht so und ich hatte da schon so meine Probleme mit. Besser den Rpi immer runterfahren und ne echt gute SD Karte kaufen.
Lexar hat bei meinem RPi Probleme gemacht, seid dem ich nur noch Samsung Evo und SanDisk Extreme einsetze habe ich da aber auch weniger Probleme mit.
Meines Wissensstandes nach sollte man die Community Edition von LV nutzen, weil hier LINX direkt mit kommt. Habe damals den selben Weg wie du gewählt (LV2020 + LINX nach installiert) und da hat es nicht geklappt. Mit der Community hat es ohne Probleme geklappt.
Abschließend würde ich LV für diese kleinen Embeded Sachen nicht mehr nutzen, weil man immer mal in Probleme läuft und der Support gefühlt null ist.
Mit Python ist man da auf dem besseren Weg, gerade weil MicroPython ja auch auf dem ESP32 oder Raspberry Pico läuft.
28.01.2021, 08:57 (Dieser Beitrag wurde zuletzt bearbeitet: 28.01.2021 08:58 von IchSelbst.)
(27.01.2021 19:22 )markus78 schrieb: Ich habe ein VI programmiert dass in sich funktioniert.
Das mag zwar hinlänglich funktionieren, hat aber offensichtlich im Signal Ausgabearray mehrere RaceConditions.
Ich weiß ja nicht, ob das so bleibt und ob dein "funktioniert" auch diese ReceConditions beinhaltet. Ich würde das nicht so belassen, auch wenn möglicherweise auf dem Zielsystem tatsächlich nie ein Fehler auftreten würde bzw. könnte - weil um Mitternacht niemand den Taster drückt.
Nachtrag:
Ich vergas den Copyright: Also ich würde diesen Code nie nachmachen, verwenden oder weitergeben.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
(28.01.2021 08:57 )IchSelbst schrieb: [quote='markus78' pid='198453' dateline='1611771744']Ich habe ein VI programmiert dass in sich funktioniert.Das mag zwar hinlänglich funktionieren, hat aber offensichtlich im Signal Ausgabearray mehrere RaceConditions.
Ich weiß ja nicht, ob das so bleibt und ob dein "funktioniert" auch diese ReceConditions beinhaltet. Ich würde das nicht so belassen, auch wenn möglicherweise auf dem Zielsystem tatsächlich nie ein Fehler auftreten würde bzw. könnte - weil um Mitternacht niemand den Taster drückt.
Vielen Dank für dein Feedback....aber wie Anfangs meines Treads geschrieben steht: Greenhorn
Was genau sind ReceConditions? Und wie genau stehen sie in Ursache in meiner Programmierung, resp. was sind die Auswirkungen?
Wie genau müsste ich den mein VI anpassen resp. ergänzen, damit ich dieser Fehlerquelle vorbeugen kann?
Vielen Dank für eine Antwort
(28.01.2021 12:05 )jg schrieb: Hallo Markus,
neben den schon erwähnten Race-Conditions, um die du dich noch kümmern solltest, zwei Tipps:
1) Die Berechnung des numerischen Werts geht auch einfacher, dafür brauchst du keine Formula Node:
2) Anstelle der extrem kreativen Verwendung der FOR-Loop empfehle ich den Einsatz einer Case-Struktur, dann ist das Programm deutlich besser lesbar.
Gruß, Jens
Vielen Dank für dein Feedback und deine Vorschläge.
Betreffend den Race-Conditions habe ich schon ein geantwortet dass ich keine Ahnung habe was damit gemeint ist.
Kleine Frage zu Pkt.1: Was ist das genau für ein Symbol? Sowas wie ne Matrix....habs nicht gefunden.
Kleine Frage zu Pkt.2: Meinst du dass innerhalb der WHILE eine CASE-Struktur laufen soll in der die folgenden 2 Zustände auftretten - 1.Reset um Mitternacht - 2.Bestätigung und Ausgabe des Ausgabearray?
ich empfehle dir diese Artikelserie zu LabVIEW auf dem RPi, da sollten die meisten deiner Fragen beantwortet werden.
Mit Python ist man da auf dem besseren Weg, gerade weil MicroPython ja auch auf dem ESP32 oder Raspberry Pico läuft.
Vielen Dank für die Links...werde mich da mal durchlesen...hoffe das ich das mal verstehe
Die Vorgabe mit LabView auf einem Embedded System ist nicht auf meinem Mist gewachsen......Es gibt Dozenten die wollen das so
29.01.2021, 08:49 (Dieser Beitrag wurde zuletzt bearbeitet: 29.01.2021 08:53 von GerdW.)
Zitat:Was genau sind ReceConditions? Und wie genau stehen sie in Ursache in meiner Programmierung, resp. was sind die Auswirkungen?
Wie genau müsste ich den mein VI anpassen resp. ergänzen, damit ich dieser Fehlerquelle vorbeugen kann?
Schau dir mal die Links in meiner Signatur an…
Um die RaceConditions in deinem Code zu vermeiden, solltest du ALLE lokalen Variablen durch Draht und Schieberegister ersetzen!
Zitat:Kleine Frage zu Pkt.1: Was ist das genau für ein Symbol? Sowas wie ne Matrix....habs nicht gefunden.
BuildArray. Wenn du diese Funktion nicht kennst, muss ich dir nochmal die Links in meiner Signatur nahelegen!
Eine "Matrix" ist in LabVIEW nur angebracht, wenn du mathematische Matrix-Berechnungen durchführen willst. Alles andere macht man mit Arrays…
Zitat:Kleine Frage zu Pkt.2: Meinst du dass innerhalb der WHILE eine CASE-Struktur laufen soll in der die folgenden 2 Zustände auftretten - 1.Reset um Mitternacht - 2.Bestätigung und Ausgabe des Ausgabearray?
Ja.
Ich würde noch einen dritten Case/State hinzufügen: "nichts am Ausgabearray ändern"!
Damit bist du dann ganz kurz vor einer Statemachine, einem der simpelsten (und doch oftmals effektivstem) Programmschemata…
Noch mehr Anmerkungen zu deinem VI:
- Warum musst du "Zwischenarray" erst als Array mit 7 Elementen definieren und dann in der Schleife die 7 Elemente allesamt ersetzen? Würde es dann nicht viel einfacher (und besser lesbar) sein, wenn du einfach ein "Zwischenarray" aus den 7 Elementen baust - mittels BuildArray???
- Du verwendest ein InRangeAndCoerce, was prinzipiell nicht schlecht ist. Dummerweise willst du damit Strings prüfen: du weißt schon, dass dieser Check bei Strings anders verläuft als bei numerischen Zahlenwerten?
(29.01.2021 08:49 )GerdW schrieb: Hallo Markus,
- Um die RaceConditions in deinem Code zu vermeiden, solltest du ALLE lokalen Variablen durch Draht und Schieberegister ersetzen!
- Ich würde noch einen dritten Case/State hinzufügen: "nichts am Ausgabearray ändern"!
- Du verwendest ein InRangeAndCoerce, was prinzipiell nicht schlecht ist. Dummerweise willst du damit Strings prüfen: du weißt schon, dass dieser Check bei Strings anders verläuft als bei numerischen Zahlenwerten?
Hallo GerdW
Das mit dem InRangeAndCoerce verstehe ich leider überhaupt nicht.
Jedoch habe ich versucht die anderen Punkte im VI umzusetzen. Habe jetzt alle lokalen Variablen entfernt.
Allerdings geht es jetzt grad gar nicht mehr so wie es sollte. Das Zwischenarray habe ich jetzt in einem Case mit einer Bedingung auf das Ausgabearray geführt
Ebenso kann jetzt der TimeReset ein TRUE auf das Case geben und damit das Ausgangsarray mit FALSE-Werten füllen.
Jedoch wenn ich die BCD-Eingabe vom Zwischenarry ins Ausgangsarray übertragen möchte, passiert das jetzt natürlich nur 1 Zyklus lang.
Die übertragenen Werte sollten jetzt aber darin gespeichert werden, bis entweder ein neuer Wert übertragen wird, oder das TimeReset alles auf FALSE stellt.
Ich schnalls echt überhaupt nicht mehr
Bin froh um jeden Tip....
Vielen Dank im Voraus
01.02.2021, 13:51 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2021 07:55 von jg.)