LabVIEWForum.de
String teilen und Teilstrings ausgeben - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: String teilen und Teilstrings ausgeben (/Thread-String-teilen-und-Teilstrings-ausgeben)



String teilen und Teilstrings ausgeben - kritzel - 24.05.2012 13:02

Hallo!

Ich habe im Forum schon die eine oder andere Antwort zu Problemen gefunden. Nun stehe ich allerdings vor einem Problem, was ich so direkt selber glaube ich nicht loesen kann. Deswegen habe ich mich jetzt hier registriert Smile
Ich kann zwar programmieren (Java, C, etc.), allerdings fällt mir Labview trotzdem schwer, weil es halt einfach "anders" ist.

Zum Problem:

Ich muss im Rahmen meiner Bachelorarbeit ein Programm in Labview schreiben, dass mit Motoren (Nanotec) kommuniziert.
Dies habe ich erfolgreich hinbekommen, sprich ich kann die Motoren so ansteuern, dass sie genau das tun, was ich will.
Nun aber muss ich den Motoren über Labview eine Art "Fahrplan" mitgeben, den sie abarbeiten; beispielsweise sage ich Motor1: Bewege dich 1000 Schritte in Drehrichtung rechts, danach 500 Schritte in Drehrichtung links usw.

Ich habe mir vom Algorithmus her soetwas gedacht:
Ich habe ein Eingabefeld, in dem ich einen Code eingebe. Diese Code ist der gesamte "Fahrplan" und besteht wiederrum aus Code, den ich an den Motor schicken will, welcher durch Semicolons getrennt sind. Dazu muss ich das Eingabefeld, also eine String-Variable, in die einzelnen Bestandteile zerlegen.

Ich habe hier im Forum schon gefunden, dass ich doch das "Spreadsheet String to Array" hernehmen kann, um den String in ein Array zu speichern.
1. Problem: Wenn ich das so mache und als Format-String "%s" eingebe, sowie als Delimiter ";" und das ganze an einem Ausgabefeld anzeigen will, zeigt er mir nur "ints" an und keine String-Bestandteile. Beispiel: Ich gebe "44;a6;bb;" ein und im Ausgabearray steht dann im ersten Feld 44, der Rest ist Null. Wie kann ich das aendern?

Wenn der Code erfolgreich im array ist, will ich jeden Bestandteil des arrays wieder zerlegen (da der Code ja in einer Schrittanzahl für den Motor und einer Drehrichtung besteht). Ich denke, dass ich das mit irgendeiner String-Teile-Funktion hinbekommen kann, mein Problem ist eher das Umdenken von einer Struktur dieser Art:

-----------------------------
for (int i, i<array-length, i++)
{
VISA.write = array[i]
}
-----------------------------

auf die Labview Struktur. Ich weiß also nicht, wie ich an die i-te Stelle des arrays rankomme, damit ich die einzelnen Befehle weiter an VISA-write schicken kann.

Vielleicht gibt es in Labview auch einfach eine Struktur, die einen viel einfacherern Algorithmus fuer soeinen Fahrplan ermoeglicht; mir fehlt da leider noch so ein bisschen der Ueberblick in Labview; mache das ganze erst so 2 Wochen.
Vielleicht kann mir jemand einen kleinen Tipp geben, wie ich das ganze loesen kann, ich bin fuer jede Hilfe dankbar Smile

Gruesse,
kritzel


RE: String teilen und Teilstrings ausgeben - Soean - 24.05.2012 13:19

Hast du den Eingang "Array Type" der "Spreadsheet String To Array" mit einer String-Konstanten verbunden, um der Funktion mitzuteilen, dass sie ein String-Array generieren soll? Wenn du da nichts anschließt, wird ein DBL-Array generiert. Alles, was in dem Eingabestring keine Zahl ist, wird dann als 0 interpretiert. Daher deine Nullen.


RE: String teilen und Teilstrings ausgeben - GerdW - 24.05.2012 13:20

Hallo kritzel,

Zitat:1. Problem: Wenn ich das so mache und als Format-String "%s" eingebe, sowie als Delimiter ";" und das ganze an einem Ausgabefeld anzeigen will, zeigt er mir nur "ints" an und keine String-Bestandteile.
Du hast den Anschluß links unten nicht beachtet. Standardmäßig erhälst du übrigens keine Ints, sondern DBLs. Du musst über diesen Anschluß festlegen, dass du ein Array of Strings haben willst:
[attachment=39898]

Code:
for (int i, i<array-length, i++)
{
VISA.write = array[i]
}
Sieht so aus:
[attachment=39897]

Zitat:Ich weiß also nicht, wie ich an die i-te Stelle des arrays rankomme, damit ich die einzelnen Befehle weiter an VISA-write schicken kann.
Wozu der ganze Aufwand? Schicke doch den ganzen String mit einem Mal statt jedes Byte einzeln...


RE: String teilen und Teilstrings ausgeben - Soean - 24.05.2012 13:23

Die Sendefunktion kannst du in eine For-Schleife setzen, und das Array von draußen draufgeben. Dabei wird automatisch ein "Autoindexing Tunnel" erstellt. Das bedeutet, dass für jede iteration der For-Schleife ein Element des Arrays nach Innen gegeben wird. Bei Iteration 0 Index 0, Iteration 1 Index 1 ...
Die Schleife wird dann so oft ausgeführt, wie das Array groß ist, ohne dass du das manuell vorgeben musst.
(24.05.2012 13:20 )GerdW schrieb:  Hallo kritzel,

Zitat:1. Problem: Wenn ich das so mache und als Format-String "%s" eingebe, sowie als Delimiter ";" und das ganze an einem Ausgabefeld anzeigen will, zeigt er mir nur "ints" an und keine String-Bestandteile.
Du hast den Anschluß links unten nicht beachtet. Standardmäßig erhälst du übrigens keine Ints, sondern DBLs. Du musst über diesen Anschluß festlegen, dass du ein Array of Strings haben willst:


Code:
for (int i, i<array-length, i++)
{
VISA.write = array[i]
}
Sieht so aus:


Zitat:Ich weiß also nicht, wie ich an die i-te Stelle des arrays rankomme, damit ich die einzelnen Befehle weiter an VISA-write schicken kann.
Wozu der ganze Aufwand? Schicke doch den ganzen String mit einem Mal statt jedes Byte einzeln...

Hab ich gar nicht so verstanden, dass jedes Byte einzeln gesendet werden soll. "array-length" und nicht "string-length". Oder?


RE: String teilen und Teilstrings ausgeben - Lucki - 24.05.2012 13:37

Und mir deinem Spreadstring-to-Array-vi ginge es so:
[attachment=39899]
Hässlich ist das letzte Semikolon in Deinem String. Ich habe es weggelassen. Wenn das so nicht geht, melde dich.


RE: String teilen und Teilstrings ausgeben - kritzel - 25.05.2012 13:54

Hi,
vielen Dank an euch! Ihr habt mich schon ein gutes Stueck weitergebracht.


@Soean und GerdW: Auch mit eurer Beschreibung habe ich leider nicht genau gewusst, wie ich Labview sagen soll, dass es als "array-type" ein "String-array" nehmen soll. Nach ein bisschen googeln bin ich darauf gekommen, dass man einfach bei dem Ausgang auf "create constant" klicken muss und dann im rechten Feld der Konstanten eine "String-Konstante" reinziehen muss.
Das mag fuer euch recht trivial sein, fuer mich noch nicht Smile Ich wurde da mit Labview so ein bisschen ins kalte Wasser geschubst.. Wink

@GerdW: Ich glaube fast, dass ich jeden Befehl an sich schicken muss, weil sonst die Steuerung streikt.
Im Grunde gebe ich den Befehl (ich habe das Format ein bisschen geaendert) ein (als Fahrplan): "s2000, d0;s500,d1", was bedeutet, dass der Motor zuerst 2000 Schritte in Richtung 0 = links und danach 500 Schritte in Richtung 1 = rechts machen soll. Die Befehle "s2000" und "d0" beispielsweise muessen dann aber separat an die Steuerung uebermittelt werden. Aus dem Grund muss ich jeden "Teilstring" selber schicken.

@Soean: Nochmals danke an dich, der "autoindexing-tunnel" ist genial, einfach und funktioniert Wink

@Lucki: Vielen Dank auch an dich, genauso wollte ich es. Da das Format der Eingabe komplett von mir gewaehlt werden kann, ist das fehlende Semicolon kein Problem.


Ich habe das Ganze vorerst so implementiert (fuer die, dies interessiert^^):

if (button.pressed)
{
teile den Fahrplan-String nach jedem ";" und schreibe die Einzelwerte in ein array;
while(indexing_tunnel1)
{
teile das array an den Stellen "," und schreibe Einzelwerte in ein array;
while(indexing_tunnel2)
{
schicke die Einzelbefehle mit Modifikation an VISA.write
}
}
}


Ich teile also zuerst den ganzen Fahrplan in eine "Befehlsgruppe" (Schritt-anzahl und Richtung) und danach in Einzelbefehle (Schrittanzahl oder Richtung), welche ich dann an die Steuerung uebergebe.
Ich hoffe, dass das Ganze jetzt so funktioniert und wuerde einfach nochmal schreiben, wenn es doch noch Probleme gibt Smile

lg,
kritzel