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 habe ein 16 Arrays mit je 32 Werten (siehe Bild). Die habe ich wie oben im Bild gezeigt in Excel eingelesen (16*32 pro Zeile). DIe Überschrift habe ich in der rosa Box beschrieben (HSL1.1, HSL1.2 usw.). Das erscheint immer statisch in der ersten Zeile.
Jetzt hab ich aber in diesem Fall nur 4 Arrays aktiv. Im Endeffekt habe ich dann auch nur 4*32 Werte pro Zeile gespeichert. Die Überschrift ist aber trotzdem 16*32 lang und diese passt jetzt natürlich nicht zu den Werten.
Am liebsten wärs mir, wenn ich die Überschriften nur zu jedem Array habe.
Wenn ein Array aktiv ist, dann sind das immer alle 32 Werte. Das erste Array soll mit HSL1 beginnen, das zweite HSL2 usw.
Jeder Arraywert kriegt dann noch eine .1, .2 ... .32 dazu.
Wär cool wenn das ginge, ich weiß nur nicht wie.
Alternativ würde ich das auch so nehmen, dass ich die inaktiven Arrays mit 0 oder "" speicher, damit die Überschriften stimmen. Ist zwar dann sehr viel unnötige Daten, aber es ist wenigsten richtig.
Hallo win98,
Was mich an dem Foto wundert, bist du dir sicher, das es ein 2D Array ist? So wie der Screenshot aussieht, sind das 1D Arrays die nebeneinander auf dem Frontpanel liegen?
Die Beschriftung mit HSL1.1 ... HSL 16.32 geht relativ angenehm mit 2 for-Schleifen.
05.07.2011, 08:53 (Dieser Beitrag wurde zuletzt bearbeitet: 05.07.2011 09:18 von Takuro.)
ich hoffe ich versteh das Problem richtig. Mein Vorschlag wäre folgender:
Du nimmst eine Fall unterscheidung. Ich glaub hier wird das immer "State-Maschine" genannt. Du fragst ab, welche Werte abgespeichert werden, bzw das muss ja in deinem Programm eh vorhanden sein, damit du weißt welche der Spalten du nach Excel schickst.
Sagen wir, du schickst Spalte 0,1,3 und 5 nach Excel. Nun rufst du die entsprechenden States auf und in jedem State addierst du zu einem String die entsprechende Überschrift. Am Ende der Abfrage schreibst du dann dieses String genauso wie du es jetzt tust in die Datei.
Hmm, ich hoffe ist klar was ich meine.
Ich hab noch eine Frage am Rande an dich: Warum nutzt du in der WriteFileTask-Schleife den Rückkopplungsknoten für den Boolean? mMn müsste willst du doch nur noch nach 10 Interationen abbrechen. Da würde es auch reichen, direkt in die Abbruchbedingung vom größergleich zu gehen. Wenn da nen tieferer Sinn hintersteckt, bitte aufklären.
Grüße,
Takuro
Neu, aber motiviert. Nehme immer gern Verbesserungsvorschläge an!
da kannste ich das mit den schleifen und dem "automatisch indizieren" nicht. Deswegen hab ich das 1d array als 2d array indiziert und in der schleifen nochmal automatisch indiziert. ganz nach dem motto dont change a running system
wie meinst du über eine for-schleife? die zahlen hinzuschreiben ist mit ner schleife kein problem das stimmt. aber wie krieg ich raus welches array gerade aktiv ist oder nicht?
in VB würde ich sowas sagen wie "if (Textbox1.Enable=0) then return "HSL1.1;HSL1.2...."
aber wie in LV
05.07.2011, 09:33 (Dieser Beitrag wurde zuletzt bearbeitet: 05.07.2011 09:35 von Takuro.)
(05.07.2011 09:29 )win98 schrieb: aber wie krieg ich raus welches array gerade aktiv ist oder nicht?
in VB würde ich sowas sagen wie "if (Textbox1.Enable=0) then return "HSL1.1;HSL1.2...."
aber wie in LV
Dann hast du wohl scheinbar keine Abfrage bisher gebaut, um deine Daten selektiv nach Excel zu schreiben.
Du kannst doch einfach über eine Schleife abfragen, ob ein Array in keinem Index einen Wert enthält. Wenn das der Fall ist, dann ist er leer und wird nicht geschrieben. Ist ein Wert irgendwo drin, dann wird er rausgeschrieben. Bzw wenn du die Auswahl durch irgendwelche Controllboxen beschränkst, dann kannst du diese ja auch abfragen.
Und dann eben in die Case Schleife springen.
Neu, aber motiviert. Nehme immer gern Verbesserungsvorschläge an!
05.07.2011, 09:35 (Dieser Beitrag wurde zuletzt bearbeitet: 05.07.2011 09:50 von win98.)
ich hoffe ich versteh das Problem richtig. Mein Vorschlag wäre folgender:
Du nimmst eine Fall unterscheidung. Ich glaub hier wird das immer "State-Maschine" genannt. Du fragst ab, welche Werte abgespeichert werden, bzw das muss ja in deinem Programm eh vorhanden sein, damit du weißt welche der Spalten du nach Excel schickst.
Sagen wir, du schickst Spalte 0,1,3 und 5 nach Excel. Nun rufst du die entsprechenden States auf und in jedem State addierst du zu einem String die entsprechende Überschrift. Am Ende der Abfrage schreibst du dann dieses String genauso wie du es jetzt tust in die Datei.
Hmm, ich hoffe ist klar was ich meine.
Ich hab noch eine Frage am Rande an dich: Warum nutzt du in der WriteFileTask-Schleife den Rückkopplungsknoten für den Boolean? mMn müsste willst du doch nur noch nach 10 Interationen abbrechen. Da würde es auch reichen, direkt in die Abbruchbedingung vom größergleich zu gehen. Wenn da nen tieferer Sinn hintersteckt, bitte aufklären.
Grüße,
Takuro
das könnte ich machen, wenn ich irgendwoher wüsste welche arrays aktiv und inaktiv sind. ich glaube ich kann nicht unterscheiden ob ich array 1,3,5,9 hab oder 2,6,8,10
hier nochmal die verkettung des arrays
edit: ich bin zu langsam mit dem posten, da habt ihr schon wieder ne lösung muss erst ma lesen und verstehn^^
(05.07.2011 09:33 )Takuro schrieb: Dann hast du wohl scheinbar keine Abfrage bisher gebaut, um deine Daten selektiv nach Excel zu schreiben.
Ne, die sind zusammen auf ein Array geklatscht und in einer Excelzeile hintereinander gespeichert.
(05.07.2011 09:33 )Takuro schrieb: Du kannst doch einfach über eine Schleife abfragen, ob ein Array in keinem Index einen Wert enthält. Wenn das der Fall ist, dann ist er leer und wird nicht geschrieben. Ist ein Wert irgendwo drin, dann wird er rausgeschrieben. Bzw wenn du die Auswahl durch irgendwelche Controllboxen beschränkst, dann kannst du diese ja auch abfragen.
Und dann eben in die Case Schleife springen.
Kling gut, und bringt mich auf eine Idee (da weiß ich wie das geht, kA wie ich rauskrieg ob n array kein index hat ^^). Ich kann doch von den 16 Arrays die Größe bestimmen und wenn die größer 0 ist schreib ich einen String ansonsten nich, die strings für ich dann zusammen als überschrift, wo jetzt die pinke box mit HSL... ist.
Und das mach ich am besten mit "Lokale Varbiable erstellen" und "in Lesen ändern".
Da sollte doch in jedem Array Real 1 - Real 4 dasselbe drinstehen? Klick mal im Bedienfeld auf Real 1 *rechtsklick* Sichtbarkeit - Indizierung aktivieren und schau durch.
--> Dadurch hast du eigentlich nur 4* 1D Arrays (Real, Int, Bool, Long). Die in 4 * 32 Teile geschrieben werden.
Somit kannst du mit Array Größe die jeweilige Länge bestimmen. Bei 3*32=96 weißt du das es nur 3 Spalten sind.
ja Real 1 - 4 ist das selbe, die haben nur die indizirung 0 / 32 / 64 / 96 um das besser anzuzeigen. hab ich mir auch zuerst gedacht, dass das reicht, aber es könnte ja sein das Real1 inaktiv ist und Real4 nicht
---- (Gedankenstriche)
soeben ist mir eingefallen dass das gar nicht möglich ist stimmt dann mach ich das so
dann muss ich nur 4 arraygrößen bestimmen mit 4 case und 4 strings zusammenführen. klingt easy