Forum: PC-Programmierung Diadem- Schleife


von Peters D. (dagmar)


Lesenswert?

Hallo,
ich versuche momentan ein Skript in Diadem zu pflegen, das mir die 
Minimumwerte in einem Zeitkontinuierlichen Signal(Spannungseinbrüche 
wegen mehreren Autostart) ermittelt. Der Code funktionniert nicht. Kann 
mir jemand sagen warum. Ich wäre super dankbar für jede Hilfe. Den CODE 
habe ich reichlich mit Kommentare versehen:

DIM Num_C(100), zaehl, start, peak_index I
start       = 1     ' Initialisierung: Anfang des ersten Startvorgangs
peak_index  = 1     ' Initialisierung: Annahme für das erste Minimum
Num_C(1)  = CNo("Spannung")
Num_C(2)  = CNo("Time") '1KHz Spannungsmessung
Num_C(3) =  CNo("PeakY")
Num_C(4) =   CNo("PeakX")
Num_C(5) =  CNo("Motor_laeuft") '(=0 Motor AUS)
                               '(=1 Motor AN)

        I=ChnLength(Num_C(4))

        FOR zaehl = 1 TO I
 IF (chd(zaehl,Num_C(4))-chd(start,Num_C(4))) <0.5 THEN 
'Betrachte nur Minima innerhalb eines kurzen Zeitraums/Startvorgangs
' Finde abs. Minimum im Zeitraum.
            IF (chd(peak_index,Num_C(3)) > chd(zaehl,Num_C(3))) THEN
              chd(peak_index,Num_C(3))= NOVALUE
              peak_index               = zaehl
            ELSE
              chd(zaehl,Num_C(3))     = NOVALUE 
' Lösche/markiere lokale Minima.
            END IF

          ELSE 
' Starte je Suche in weiterem Zeitraum von Neuem.
            start       = zaehl
            peak_index  = zaehl
          END IF
        Next

        FOR zaehl = 1 TO L1
          IF chd(zaehl,Num_C(3))= NOVALUE THEN 
'Sofern y-Wert mit NOVALUE markiert wurde,
            chd(zaehl,Num_C(4))= NOVALUE 
'setze nachträglich auch Zeit-Werte zu NOVALUE.
          END IF
        Next

        ' NOVALUES löschen...
        CALL ChnNovHandle("PeakX","PeakY","Delete","XY",1,0,0)


        ' Alle gefundenen Peaks betrachten:
        FOR peak_index = 1 TO ChnLength("PeakX")

'Nächststehenden Zeitpunkt des Peaks in der 10Hz-Domäne finden:
          zaehl = Find( "abs( Ch(""Daten_L_10Hz: Time"") - " & 
str(CHV(peak_index,"PeakX")) & " ) < 0.1 ")


'Diejenigen Peaks löschen, bei denen Motor_laeuft = 1 gültig ist
           IF chd(zaehl,Num_C(5))=1 THEN
          chd(peak_index, Num_C(3)) = NOVALUE

        ELSE
'Berechnung zwischen letztem "Motor-geht-Aus" und aktuellen "PeakX".
            start= zaehl 
'Von PeakX rückwärts zählen bis zu Zeitpunkt, an dem Motor aus geht
            IF start>1 THEN
              WHILE (chd(start-1,Num_C(5))=0) AND (start > 1)
                start = start -1
              WEND

            END IF
           END IF
        Next

         ' NOVALUES löschen...
CALL ChnNovHandle("PeakX","PeakY","Delete","XY",1,0,0)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peters dada schrieb:
> Der Code funktionniert nicht.

Das ist ja mal eine ausführliche Fehlerbeschreibung.

von Peters D. (dagmar)


Lesenswert?

Die Ausführung des Skriptes ergibt "Gruppen" von Minimas innerhalb von 
Zeitintervallen. D.h.
20s...21s--->3 Minimas
90s...91s--->3 Minimas
.
.
.
Bis Ende der Zeitaxe Num_C(2) = CNo("Time")
Was ich aber gerne bräuchte ist "ein" Minima. Dafür braucht das Program 
nach dem es die Minimumwerte ermittelt hat noch eine Methode die mir den 
kleinsten Minima in den einzelnen Zeitintervallen sucht. Jemand eine 
Idee?

von Wolfgang (Gast)


Lesenswert?

Peters dada schrieb:
> Jemand eine Idee?
Hysterese für deine Peakerkennung oder die automatische Peaksuche von 
DIAdem?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.