INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.




Unsere Partner:

DIAdem-Forum.de Partner

DIAdem-Forum.de Partner






Stellenangebote:
Ingenieur/in Fernüberwachung
Westliches Ruhrgebiet

Berater und SW-Entwickler (m/w) für 3D-Erfassung/-Visualisierung/-Druck
Ulm

Entwicklungsingenieur (m/w) Auslegung / Versuch für Elektromotoren
Frankfurt

Senior Softwareentwickler/in
Westliches Ruhrgebiet

Applicationsingenieur (m/w) Testsysteme Central IE Prozessentwicklung
Frankfurt am Main





.
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5

Bessere Performance
13.04.2016, 13:08,
#1
DIAdem-Version: 2014 SP1
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: -
Bessere Performance

Guten Tag,

Ich habe zwei Kanäle. der Eine Kanal springt unregelmäßig zwischen 1, 2, 3, 4, 5 und 6 und der andere Kanal ist beliebig.

Jetzt möchte ich, immer wenn im ersten Kanal die 1 anliegt die dazugehörigen Werte aus dem zweiten Kanal in einen neuen Kanal schreiben.
Wenn beim ersten Kanal die 2 anliegt, möchte ich die dazugehörigen Werte aus dem zweiten Kanal wiederrum in einen neuen Kanal schreiben.

Dass ich am Ende quasi 6 neue Kanäle hab mit jeweils den Umdrehungen in dem jeweiligen Gang.

Bisher habe ich es so gelöst:

For i=1 to ChnLength("1")
If Ch("1") (i) = 1 then
Ch("neu1")(i) = Ch("2")(i)
End If
If Ch("1") (i) = 2 then
Ch("neu2")(i) = Ch("2")(i)
End If
...
Next

Der Schleifendurchlauf ist soweit nur schematisch dargestellt.
Mein Programm funktioniert zwar, dauert aber bei einer Kanallänge von knapp 2.000.000 ewig.

Gibt es in DIAdem eine schönere Lösung für mein Problem, die auch schneller ist?

Liebe Grüße Flo

Antworten
14.04.2016, 07:09,
#2
DIAdem-Version: 2014SP1, 2015SP2 und DIAdem 2017 / dabei seit DIA/DAGO 2
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: 1995
RE: Bessere Performance

Hallo Flo,

da gibt es vielfältige bessere Möglichkeiten:

1. Falls du die Schleifen liebst, solltest du die objektorientierte Script-Schnittstelle für den Zugriff auf interne Daten verwenden.
Das ist in der Hilfe "Programmierreferenz" gut beschrieben z.B. "Eigenschaft: Values für Channel <Data>"
Das beschleunigt die Datenzugriffe um Faktoren.

2. Mit der IIF-Funktion lassen sich schnell und elegant Kanäle erzeugen, die abhängig von Werten deines "Sprungkanals" die Eintragungen des Drehzahlkanals haben. Die anderen Werte sind dann z.B. NoValue. Die NoValues lassen sich auf Wunschmit der NoValue-Bearbeitung auf einen Schlag rauswerfen.

3. Falls mit den Drehzahlen pro Gang weitere Auswertungen erfolgen sollen (min, max, Mittel, Anzahl), löst die reduzierende Klassierung diese Aufgabe gleich komplett.

Gruß Voyager

Antworten
28.04.2016, 13:44,
#3
DIAdem-Version: 2014 SP1
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: -
RE: Bessere Performance

Vielen Dank Voyager erstmal für deine Antwort. also meine "Lösung war nur schematisch dargestellt. So sieht meine tatsächliche for schleife aus.

For i = 1 To ChnLength("[1]/Gr")

If oMyChannels.Channels("Gr").Values(i) = 1 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 4.377

ElseIf oMyChannels.Channels("Gr").Values(i) = 2 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 2.859

ElseIf oMyChannels.Channels("Gr").Values(i) = 3 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 1.921

ElseIf oMyChannels.Channels("Gr").Values(i) = 4 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 1.368

ElseIf oMyChannels.Channels("Gr").Values(i) = 5 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 1

ElseIf oMyChannels.Channels("Gr").Values(i) = 6 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 0.82

ElseIf oMyChannels.Channels("Gr").Values(i) = 7 Then
oMyChannels.Channels("TxOutTrq").Values(i) = oMyChannels.Channels("EngTrqStatic")(i) * 0.728

End If
Next

Zu deinem 1. Punkt: Ich hasse Schleifen Big Grin deswegen möchte ich die schleife irgendwie umgehen.
Also gibt es einen Befehl, mit dem der Gesamte Kanal Gr durchsucht wird?
Quasi die normale if Funktion wie in der schleife, nur dass ich eben die For schleife bzw. des ".Values(i)" nicht brauche?
Ich habe mal gestoppt. Bei einer Kanallänge von 250.000 Werten braucht diese Schleife ca. 3 Minuten. Allerdings haben meine Kanäle eine Länge von fast 2.000.000 Werten und ich habe über 20 schleifen in meinem gesamten Skript.

Eine andere Schleife sieht folgendermaßen aus:
For i=1 to ChnLength("TxOutTrq)
If oMyData("TxOutTrq")(i)>-500 And oMyData("TxOutTrq")(i)<=-400 then
oMyData("TrqBand0")(i) = oMyData("Ueberrollungen")(i)
If oMyData("Gr")(i)= 1 then
oMyData("Band1")(1) = oMyData("Band1")(1)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 2 then
oMyData("Band1")(2) = oMyData("Band1")(2)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 3 then
oMyData("Band1")(3) = oMyData("Band1")(3)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 4 then
oMyData("Band1")(4) = oMyData("Band1")(4)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 5 then
oMyData("Band1")(5) = oMyData("Band1")(5)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 6 then
oMyData("Band1")(6) = oMyData("Band1")(6)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 7 then
oMyData("Band1")(7) = oMyData("Band1")(7)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 8 then
oMyData("Band1")(8) = oMyData("Band1")(8)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 9 then
oMyData("Band1")(9) = oMyData("Band1")(9)+oMyData("Ueberrollungen")(i)
End If
End If
If oMyData("TxOutTrq")(i)>-400 And oMyData("TxOutTrq")(i)<=-300 then
oMyData("TrqBand1")(i) = oMyData("Ueberrollungen")(i)
If oMyData("Gr")(i)= 1 then
oMyData("Band2")(1) = oMyData("Band1")(1)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 2 then
oMyData("Band2")(2) = oMyData("Band2")(2)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 3 then
oMyData("Band2")(3) = oMyData("Band2")(3)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 4 then
oMyData("Band2")(4) = oMyData("Band2")(4)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 5 then
oMyData("Band2")(5) = oMyData("Band2")(5)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 6 then
oMyData("Band2")(6) = oMyData("Band2")(6)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 7 then
oMyData("Band2")(7) = oMyData("Band2")(7)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 8 then
oMyData("Band2")(8) = oMyData("Band2")(8)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 9 then
oMyData("Band2")(9) = oMyData("Band2")(9)+oMyData("Ueberrollungen")(i)
End If
End If
If oMyData("TxOutTrq")(i)>-300 And oMyData("TxOutTrq")(i)<=-200 then
oMyData("TrqBand2")(i) = oMyData("Ueberrollungen")(i)
If oMyData("Gr")(i)= 1 then
oMyData("Band3")(1) = oMyData("Band3")(1)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 2 then
oMyData("Band3")(2) = oMyData("Band3")(2)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 3 then
oMyData("Band3")(3) = oMyData("Band3")(3)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 4 then
oMyData("Band3")(4) = oMyData("Band3")(4)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 5 then
oMyData("Band3")(5) = oMyData("Band3")(5)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 6 then
oMyData("Band3")(6) = oMyData("Band3")(6)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 7 then
oMyData("Band3")(7) = oMyData("Band3")(7)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 8 then
oMyData("Band3")(8) = oMyData("Band3")(8)+oMyData("Ueberrollungen")(i)
End If
If oMyData("Gr")(i)= 9 then
oMyData("Band3")(9) = oMyData("Band3")(9)+oMyData("Ueberrollungen")(i)
End If
End If
...
...
..
Next

Insgesamt sind in der gesamten Schleife 30 mal diese "txtrqout" abfrage mit jeweils 9 "gr" abfragen.

Ziemlicher Scheiß das ganze. Hast du dazu eine Lösung, wie ich des ganze schneller machen kann?^^

Antworten
29.04.2016, 07:34,
#4
DIAdem-Version: 2014 SP1
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: -
RE: Bessere Performance

Also die erste schleife habe ich jetzt mit hilfe deines Vorschlags, der IIf Anweisung deutlich schneller bekommen =)

Gibt es sowas auch für die zweite Schleife, wo ich zwei Bedingungen hab? chn>0 and chn<=100 zum Beispiel?

Liebe Grüße, Florian

Antworten
29.04.2016, 12:11,
#5
DIAdem-Version: 2014 SP1
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: -
RE: Bessere Performance

Okay ich habs Big Grin Kann eigentlich wieder gelöscht werden hier^^

Antworten
29.04.2016, 12:12,
#6
DIAdem-Version: 2014 SP1
DIAdem-Sprachversion: DE
DIAdem Erfahrung seit: -
RE: Bessere Performance

Vielen Dank nochmal =)

Antworten


Gehe zu: