12.10.2013, 16:52
Hallo liebe LVF-Gemeinde,
zuerst möchte ich mal ein DANKE an euch loswerden. Ich Grünschnabel habe durch euch schon einige Sachen in meinem Projekt lösen können, wie zum Beispiel die Kommunikation über serielle Schnittstellen oder die Konvertierung von Strings.
Jetzt zu meinem Projekt welches ich in LabVIEW 2012 SP1 f4 umsetze:
Ich möchte mit Hilfe einer Relaiskarte die an COM1 angeschlossen ist und 2 KERN Waagen die an COM2 und COM3 angeschlossen sind einen Fraktionssammler schreiben der sich folgendermaßen verhalten soll:
Gefäß für die 1. Fraktion auf Waage 1 läuft bis zu einer bestimmten Gewichtsgrenze (als Testdatum 10g) voll und es wird dann ein Schlauchquetschventil über die Relaiskarte geschalten, sodass dann ein Gefäß für die 2. Fraktion auf Waage 2 bis zu einer neuen Gewichtsgrenze (auch als Test 10g) volllaufen kann. Das Ventil wird dann geschlossen sodass die 3. Fraktion in ein Gefäß läuft das sich wieder auf Waage 1 befindet (bis zur Gewichtsgrenze 30g). Ventil wird wieder geschalten sodass die 4. Fraktion in ein Gefäß das sich wieder auf Waage 2 befindet laufen kann (bis zur Gewichtsgrenze 50g).
Was bereits funktioniert ist die Kommunikation mit den Waagen (VISA, Befehl an Waage schicken Daten zu senden, zurückgelieferten String lesen und den String so manipulieren, dass ich daraus ein INT/DBL mache um Vergleichsoperationen durchführen zu können) und das Öffnen und Schließen des Ventils über die Relaiskarte.
In meinem VI hat es bisher immer nur geklappt die 1. Fraktion und die 2. Fraktion erfolgreich zu sammeln, die 3. und 4. Fraktion lassen sich nicht korrekt sammeln, weil leider die Abbruchbedingung der 1. und 2. Fraktion greifen und die 3 Fraktion bei 10g und die 4. Fraktion bei 10g endet.
Ich habe bei der Lösung meiner vorherigen Probleme immer wieder den Leitspruch "THINK DATAFLOW" gelesen aber irgendwie stell ich mich zu dumm an bzw. habe das Datenflussprinzip in LabVIEW noch nicht wirklich verinnerlicht... In meinen Büchern die ich hier vor mir zu liegen habe stand dazu auch ein treffendes Zitat: "Die Parallelität der Abarbeitung ist hier kein Segen, sondern ein "Fluch"."
Erläuterungen zu den VIs & SubVIs:
Main.vi - Hier sollen die Berechnungen stattfinden die durch die Bedienfelder vorgegeben wurden und dann soll das Programm sequentiell abgearbeitet werden.
Waage1_auslesen.vi & Waage2_auslesen.vi - nutze ich als SubVI zum Senden von Befehlen an die Waagen und zum Empfangen der zurückgelieferten Strings, die Strings werden dann auch gleich so manipuliert, dass ich Zahlenwerte erhalte.
Waage1_tarieren.vi & Waage2_tarieren.vi - hier wird der Befehl zum Tarieren an die Waage gesendet
Relaiskarte_initialisieren.vi - Initialisiert die Relaiskarte
Relais_schalten.vi - Beinhaltet den Befehl zum Schalten des Relais an dem ein Ventil angeschlossen ist
Relais_schließen.vi - Beinhaltet den Befehl zum Schließen des Relais an dem ein Ventil angeschlossen ist
Meine Fragen:
Wie bekomme ich es hin, dass die 3. Fraktion und die 4. Fraktion nicht durch die Abbruchbedingung der 1. und 2. Fraktion unterbrochen wird? Denn eigentlich soll die 3. Fraktion bis 30g und die 4. Fraktion bis 50g laufen, das habe ich auch im Vergleichsoperator Größer? so eingebunden... Ich habe schon die Funktionen "Bedingte Deaktivierungsstruktur" oder "Diagrammdeaktivierungsstruktur" gesehen, könnten die bei meinem Problem zielführend sein? Oder muss ich eventuell eine Zeitgesteuerte Struktur in Betracht ziehen?
Eine andere aber nicht so wichtige Sache ist: Ich habe versucht mit dem Vergleichsoperator Gleich? diese Abfragen zu steuern aber wenn ich Gleich? benutze läuft irgendetwas schief und die Fraktion wird nicht bei 10g gestoppt sondern läuft fröhlich weiter. Habe aber extra darauf geachtet, dass die Werte vom selben Typ (DBL) sind. Wenn ich Größer? oder Kleiner? benutze klappt es aber... Hat das etwas mit der Funktion "Muster suchen" oder "Dezimal-String nach Zahl" in meinen SubVIs Waage1_auslesen.vi & Waage2_auslesen.vi zu tun?
Ich danke schon jetzt für die Mühe und etwaige Tipps zur Lösung bzw. Verbesserung meines VIs!!!
Einen freundlichen Gruß,
Orbaxx
[attachment=46691]
EDIT: Eine Frage noch, die ich vergessen habe zu stellen: Kann man bei der Funktion "Muster suchen" in den regulären Ausdruck mehrere reguläre Ausdrücke suchen lassen? In meinem Fall ist es so, dass die Waage ja auch negative Werte anzeigen kann aber das umgehe ich aktuell weil ich im beim Muster suchen [0-9]+ angegeben habe um im String nur die Zahlenwerte suchen zu lassen. Das ist eigentlich auch zielführend aber wenn man das befüllte Gefäß von der Waage nimmt wird der eigentlich negative Wert als positiver Wert angezeigt und der würde ja den Programmablauf stören... Allerdings kann ich dann bestimmt den String nicht zu einer Zahl konvertieren wenn das "-"-Zeichen vorangestellt wäre oder?
zuerst möchte ich mal ein DANKE an euch loswerden. Ich Grünschnabel habe durch euch schon einige Sachen in meinem Projekt lösen können, wie zum Beispiel die Kommunikation über serielle Schnittstellen oder die Konvertierung von Strings.
Jetzt zu meinem Projekt welches ich in LabVIEW 2012 SP1 f4 umsetze:
Ich möchte mit Hilfe einer Relaiskarte die an COM1 angeschlossen ist und 2 KERN Waagen die an COM2 und COM3 angeschlossen sind einen Fraktionssammler schreiben der sich folgendermaßen verhalten soll:
Gefäß für die 1. Fraktion auf Waage 1 läuft bis zu einer bestimmten Gewichtsgrenze (als Testdatum 10g) voll und es wird dann ein Schlauchquetschventil über die Relaiskarte geschalten, sodass dann ein Gefäß für die 2. Fraktion auf Waage 2 bis zu einer neuen Gewichtsgrenze (auch als Test 10g) volllaufen kann. Das Ventil wird dann geschlossen sodass die 3. Fraktion in ein Gefäß läuft das sich wieder auf Waage 1 befindet (bis zur Gewichtsgrenze 30g). Ventil wird wieder geschalten sodass die 4. Fraktion in ein Gefäß das sich wieder auf Waage 2 befindet laufen kann (bis zur Gewichtsgrenze 50g).
Was bereits funktioniert ist die Kommunikation mit den Waagen (VISA, Befehl an Waage schicken Daten zu senden, zurückgelieferten String lesen und den String so manipulieren, dass ich daraus ein INT/DBL mache um Vergleichsoperationen durchführen zu können) und das Öffnen und Schließen des Ventils über die Relaiskarte.
In meinem VI hat es bisher immer nur geklappt die 1. Fraktion und die 2. Fraktion erfolgreich zu sammeln, die 3. und 4. Fraktion lassen sich nicht korrekt sammeln, weil leider die Abbruchbedingung der 1. und 2. Fraktion greifen und die 3 Fraktion bei 10g und die 4. Fraktion bei 10g endet.
Ich habe bei der Lösung meiner vorherigen Probleme immer wieder den Leitspruch "THINK DATAFLOW" gelesen aber irgendwie stell ich mich zu dumm an bzw. habe das Datenflussprinzip in LabVIEW noch nicht wirklich verinnerlicht... In meinen Büchern die ich hier vor mir zu liegen habe stand dazu auch ein treffendes Zitat: "Die Parallelität der Abarbeitung ist hier kein Segen, sondern ein "Fluch"."
Erläuterungen zu den VIs & SubVIs:
Main.vi - Hier sollen die Berechnungen stattfinden die durch die Bedienfelder vorgegeben wurden und dann soll das Programm sequentiell abgearbeitet werden.
Waage1_auslesen.vi & Waage2_auslesen.vi - nutze ich als SubVI zum Senden von Befehlen an die Waagen und zum Empfangen der zurückgelieferten Strings, die Strings werden dann auch gleich so manipuliert, dass ich Zahlenwerte erhalte.
Waage1_tarieren.vi & Waage2_tarieren.vi - hier wird der Befehl zum Tarieren an die Waage gesendet
Relaiskarte_initialisieren.vi - Initialisiert die Relaiskarte
Relais_schalten.vi - Beinhaltet den Befehl zum Schalten des Relais an dem ein Ventil angeschlossen ist
Relais_schließen.vi - Beinhaltet den Befehl zum Schließen des Relais an dem ein Ventil angeschlossen ist
Meine Fragen:
Wie bekomme ich es hin, dass die 3. Fraktion und die 4. Fraktion nicht durch die Abbruchbedingung der 1. und 2. Fraktion unterbrochen wird? Denn eigentlich soll die 3. Fraktion bis 30g und die 4. Fraktion bis 50g laufen, das habe ich auch im Vergleichsoperator Größer? so eingebunden... Ich habe schon die Funktionen "Bedingte Deaktivierungsstruktur" oder "Diagrammdeaktivierungsstruktur" gesehen, könnten die bei meinem Problem zielführend sein? Oder muss ich eventuell eine Zeitgesteuerte Struktur in Betracht ziehen?
Eine andere aber nicht so wichtige Sache ist: Ich habe versucht mit dem Vergleichsoperator Gleich? diese Abfragen zu steuern aber wenn ich Gleich? benutze läuft irgendetwas schief und die Fraktion wird nicht bei 10g gestoppt sondern läuft fröhlich weiter. Habe aber extra darauf geachtet, dass die Werte vom selben Typ (DBL) sind. Wenn ich Größer? oder Kleiner? benutze klappt es aber... Hat das etwas mit der Funktion "Muster suchen" oder "Dezimal-String nach Zahl" in meinen SubVIs Waage1_auslesen.vi & Waage2_auslesen.vi zu tun?
Ich danke schon jetzt für die Mühe und etwaige Tipps zur Lösung bzw. Verbesserung meines VIs!!!
Einen freundlichen Gruß,
Orbaxx
[attachment=46691]
EDIT: Eine Frage noch, die ich vergessen habe zu stellen: Kann man bei der Funktion "Muster suchen" in den regulären Ausdruck mehrere reguläre Ausdrücke suchen lassen? In meinem Fall ist es so, dass die Waage ja auch negative Werte anzeigen kann aber das umgehe ich aktuell weil ich im beim Muster suchen [0-9]+ angegeben habe um im String nur die Zahlenwerte suchen zu lassen. Das ist eigentlich auch zielführend aber wenn man das befüllte Gefäß von der Waage nimmt wird der eigentlich negative Wert als positiver Wert angezeigt und der würde ja den Programmablauf stören... Allerdings kann ich dann bestimmt den String nicht zu einer Zahl konvertieren wenn das "-"-Zeichen vorangestellt wäre oder?