DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Der Index "XXX" entspricht keinem Element der Auflistung

Hallo Zusammen!

Ich nutze gerade VBScript zur automatischen Approximation einer Messreihe. Zu Anfang kann man auswählen, mit welchem Polynom der Ansatz vollzogen werden soll. Die Approximationskoeffizienten speicher ich mithilfe der Variable "ResultApprAnsatzCoefX" in einer ASCII-Datei. Ich hab nun folgendes Problem: Werte ich beispielsweise nur bis zu einem Polynom 4. Ordnung aus, soll er mir beispielsweise die Variable ResultApprAnsatzCoef6 als 0 speichern. Das Script endet aber schon vorher mit der Fehlermeldung Der Index "ResultApprAnsatzCoef6" entspricht keinem Element der Auflistung.

Gibt es ein Befehl mit dem ich abfragen kann, ob dies der Fall ist. Beispielsweise:   IsEmpty(..."ResultApprAnsatzCoef6") = True then ....     (IsEmpty funktioniert leider nicht)

 

Danke und Gruß,

 

Thomas

0 Kudos
Message 1 of 9
(6,606 Views)

Hallo nochmal,

 

ich bin jetzt einen Schritt weiter. Anstatt mit Data.Root.ChannelGroups(1).Channels(1).Properties("ResultApprAnsatzCoef1").Value nutze ich jetzt die Variable ApprAnsatzCoef(1). Der Vorteil ist, wenn ich den Appr-Ansatz nicht ausgewählt hab führt es nicht mehr zu der im Subject genannten Fehlermeldung, sondern eine 0 wird gespeichert.

Das führt allerdings zu einem neuen Problem:

Der Anwender wählt beispielsweise per Dialog folgenden Appr-Ansatz:

a1*1+a2*x+a5*x^4. In meiner gespeicherten ASCII-Datei soll jetzt folgendes stehen:

1     Wert   'mittels ApprAnsatzCoef(1)

x     Wert   'mittels ApprAnsatzCoef(2)

x^2  0        'mittels ApprAnsatzCoef(3)

x^3  0        'mittels ApprAnsatzCoef(4)

x^4  Wert   'mittels ApprAnsatzCoef(5)

 

Leider ist die Variable ApprAnsatzCoef(i) nicht einer festen Funktion zugeordnet, sondern wird einfach je nach Anzahl der gewählten Appr-Ansätze hochgezählt. Das führt dann in der ASCII Datei zu folgendem:

1     Wert   'mittels ApprAnsatzCoef(1)

x     Wert   'mittels ApprAnsatzCoef(2)

x^2  Wert   'mittels ApprAnsatzCoef(3)

x^3  0        'mittels ApprAnsatzCoef(4)

x^4  0        'mittels ApprAnsatzCoef(5)

 

Ich könnte das jetzt mittels ApprAnsatzName(i) variabel gestelten, brauch aber eine feste Reihenfolge, weil ich die ASCII-Datei in Excel weiterverwenden möchte.

 

Weiß vielleicht irgendwer einen Ausweg?

 

Viele Grüße,

 

Thomas

 

 

0 Kudos
Message 2 of 9
(6,593 Views)

Hallo T.Abeln,

 

ob ein Property existiert oder nicht kann mit folgendem Befehl abgefragt werden:

 

Data.Root.ChannelGroups(1).Channels(1).Properties.Exists("PropertyName")

 

Das Ergebnis ist TRUE oder FALSE

 

Vielleicht hilft dir das weiter.

 

Gruß

Walter

0 Kudos
Message 3 of 9
(6,586 Views)

Hallo Walter,

 

auf die 1. Frage ist das die Lösung 🙂

 

Allerdings dachte ich zu dem Zeitpunkt noch, dass die Variable ApprAnsatzCoef(i) fest einem Appr-Ansatz (ApprAnsatzFct(i)) zugeordnet ist und nicht hochgezählt wird nach Anzahl der gewählten Ansätze.

0 Kudos
Message 4 of 9
(6,582 Views)

Hi Thomas,

 

kannst du dein Script hochladen? Dann schau ich es mir mal an. Wie speicherst du die ASCII-Datei ab?

 

RMathews

Ramona Lombardo
Applications Engineer, NI Germany
Certified LabVIEW Developer
0 Kudos
Message 5 of 9
(6,551 Views)

Hi Thomas,

 

hab grad noch ein bisschen gespielt:

 

Option Explicit  'Erzwingt die explizite Deklaration aller Variablen in einem Script.
Dim iLoop, iNumber, sText

Call SUDDlgShow("Main", ResourceDrv & "AnaChnApprCalc")
iNumber = 1

For iLoop = 1 to 26
  If ApprAnsatzFct(iLoop) = "Yes" Then
    sText = sText & ApprAnsatzCoef(iNumber) & vbCRLF
    iNumber = iNumber + 1
  End If
Next
Call MsgBox(sText)

Ich denke nicht, dass es eine andere Möglichkeit gibt, aber so kann man es ja auch relativ simple machen 😄

 

LG, RMathews

Ramona Lombardo
Applications Engineer, NI Germany
Certified LabVIEW Developer
0 Kudos
Message 6 of 9
(6,546 Views)

Hallo RMathews,

 

mit so einer ähnlichen Schleife bin ich auch angefangen. Das Problem ist halt das der ApprAnsatzCoef() nach Anzahl der gewählten ApprAnsatzFct() hochgezählt wird und nicht einer Funktion zugeordnet ist. Das kann zum Beispiel bei Auswahl von 8 Funktionen so aussehen:

 

 

ApprAnsatzFct (1) Konstante x ApprAnsatzCoef(1)
ApprAnsatzFct (2) x
x
ApprAnsatzCoef(2)
ApprAnsatzFct (3) x^2 x
ApprAnsatzCoef(3)
ApprAnsatzFct (4) x^3 x
ApprAnsatzCoef(4)
ApprAnsatzFct (5) x^4 x
ApprAnsatzCoef(5)
ApprAnsatzFct (6) x^5

ApprAnsatzFct (7) x^6

ApprAnsatzFct (8) x^7    
ApprAnsatzFct (9) x^8

ApprAnsatzFct (10) x^9

ApprAnsatzFct (11) x^10

ApprAnsatzFct (12) x^11

ApprAnsatzFct (13) 1/x
x

ApprAnsatzCoef(6)
ApprAnsatzFct (14) 1/x^2
x
ApprAnsatzCoef(7)
ApprAnsatzFct (15) 1/x^3

ApprAnsatzFct (16) 1/x^4    
ApprAnsatzFct (17) ln(x)

ApprAnsatzFct (18) log(x)

ApprAnsatzFct (19) e^x

ApprAnsatzFct (20) 10^x

ApprAnsatzFct (21) sqrt(x)

ApprAnsatzFct (22) e^(x^2)

ApprAnsatzFct (23) x^(1/3) x ApprAnsatzCoef(8)
ApprAnsatzFct (24) 10^(x^2)

ApprAnsatzFct (25) e^(-x)

ApprAnsatzFct (26) e^(-x^2)

 

Ich gestalte es jetzt doch variabel und hab halt später in Excel den höheren Aufwand. Der relevante Abschnitt aus dem Script sieht dann so aus:

 

 

n = 1 
  Do While (nf+1) > n   'Schleife zum Schreiben der Ansatzfunktion (Name) und dem Koeffizienten bis zu der Anzahl an Funktionen die per Dialog gewählt wurden
    SchreibFehler = TextFileWriteLn(Dateivariable,ApprAnsatzName(n)&";"&ApprAnsatzCoef(n))
      if SchreibFehler <> 0 then call Msgerror(DateiVariable) : Call AutoQuit(Abbruch) else
    n=n + 1
  Loop
  n0 = 10 - nf
  Do While 0 < n0       'Schleife zum Auffüllen der Namen und Koeffizienten bis 10
    SchreibFehler = TextFileWriteLn(Dateivariable,"0;0")
      if SchreibFehler <> 0 then call Msgerror(DateiVariable) : Call AutoQuit(Abbruch) else
    n0=n0 - 1
  Loop

 

Die ASCII Datei sieht dann so aus:

 

1;186654,896283448
x;1442,91469151125
x^2;-4,71879147416404
x^3;1,20601813352712E-02
x^4;-1,40725605619874E-05
1/x;-1515173,02612808
1/(x^2);11068930,4108822
x^(1/3);-60389,104134634
0;0
0;0

 

 

Viele Grüße,

Thomas

0 Kudos
Message 7 of 9
(6,539 Views)

Hi Thomas,

 

ich habe meinen Code nochmals kurz angepasst:

 

Option Explicit  'Erzwingt die explizite Deklaration aller Variablen in einem Script.
Dim iLoop, iNumber, sText

Call SUDDlgShow("Main", ResourceDrv & "AnaChnApprCalc")
iNumber = 1

For iLoop = 1 to 26
  If ApprAnsatzFct(iLoop) = "Yes" Then
    sText = sText &  ApprAnsatzName(iNumber) & ";" & ApprAnsatzCoef(iNumber) & vbCRLF
    iNumber = iNumber + 1
  End If
Next
Call MsgBox(sText)

 Meiner Ansicht nach ist das auch variabel - nur die Namen werden übernommen, die auch ausgewählt worden sind 😉

Noch eine Sache - wenn du den String erst zusammenstellst und dann nur einmal schreibst, hast du bessere Performance (nur einen Schreibzugriff auf die Festplatte).

 

 

Aber dann läuft es ja jetzt - schön. 😄

Ramona Lombardo
Applications Engineer, NI Germany
Certified LabVIEW Developer
Message 8 of 9
(6,532 Views)

Guten Morgen RMathews,

 

ein guter Tip mit den String. Danke für die Hilfestellung.

 

 

0 Kudos
Message 9 of 9
(6,509 Views)