In der DB- Tabelle... sind die beiden Variablen Tab_Len und Tab_Idx mit dem Anfangswert vorbelegt ... quasi die 100 und die 99 in die Tabelle als Anfangswert eintragen, oder??
Ja richtig. Die 100 und die 99 sind die Anfangswerte, mit denen auch der Aktualwert initialisiert sein muß. (DB Ansicht > Datensicht + Bearbeiten > Datenbaustein initialisieren)
Die Vorbelegung von Tab_Len ist wichtig und darf nicht größer als die tatsächliche Arraygröße sein. Du könntest auch statt der Variable im Programm eine konstante feste Größe eintragen. Die Verwendung der Variable macht das ganze aber universeller und leichter für andere Arraygrößen änderbar.
Die Vorbelegung von Tab_Idx ist optional, beim Start des Loggings wird geprüft, ob der Wert innerhalb des Arrays liegt (ob er 0 .. Tab_Len - 1 ist). Bei Vorbelegung mit 99 (Tab_Len - 1) beginnt das erste Logging freundlicherweise im ersten Array-Element.
Worauf ich mir auch noch nicht 100 Prozentig einen Reihm bilden kann ist der erste Abschnitt des Programms
Bei der steigenden Flanke von #IN_Messreihe_Aktiv (Start der Messreihe) wird gelesen, welcher Wert im Schreibindex Tab_Idx (DBW2) steht (von der Messreihe vorher), der Wert wird um 1 erhöht (auf das nächste Array-Element weitergestellt), und dann mittels MOD mit Tab_Len (DBW0) dafür gesorgt, daß der Index nur Werte von 0..99 (Tab_Len - 1) hat und in wieder Tab_Idx (DBW2) gespeichert (gemerkt für die Verwendung in dieser Messreihe).
Wenn bei dem Erhöhen ein Ergebnis größer Arraygröße rauskommt (>= Tab_Len), dann wird durch das MOD der Wert auf 0..99 "gemappt" und das Array wieder von unten her neu überschieben (Ringpuffer).
"SLD 5": zusammengefasst Multiplikation * 8 (um aus dem Index eine Byteadresse P#<Index>.0 zu machen) und weitere * 4 (weil es ein REAL-Array ist und ein REAL-Wert 4 Byte belegt)
Danach wird noch die Anfangsadresse des Arrays im DB dazuaddiert (+ P#4.0) --> ergibt die Adresse von [IN_LogDBNr].MaxWert[Tab_Idx]
Wenn ich das ganze Starte über "U #IN_Messreihe_Aktiv" wird der Maxwert in die erste Adresse eingetragen ... sonst passiert nichts. Auch wird nichts in Adresse 0.0 und 2.0 eingetragen.
Das DBW2 muß beim ersten Durchlauf mit #IN_Messreihe_Aktiv = TRUE verändert worden sein: das gerade oben beschriebene Weiterstellen um 1 auf das nächste Array-Element.
Solange #IN_Messreihe_Aktiv = TRUE ist wird bei jedem Durchlauf geprüft, ob der #IN_Messwert größer als der bisher in [IN_LogDBNr].MaxWert[Tab_Idx] gespeicherte Wert ist und ggf. in [IN_LogDBNr].MaxWert[Tab_Idx] geschrieben.
Du mußt nun von außen dafür sorgen, daß #IN_Messreihe_Aktiv genau so lange TRUE ist wie Deine Messreihe andauert. Danach muß #IN_Messreihe_Aktiv FALSE werden und bei der nächsten Messreihe wieder TRUE --> dadurch wird wie beschrieben Tab_Idx auf das nächste Array-Element weitergestellt und der MaxWert der nächsten Messreihe mitgeloggt.
Spiele mal mit Deiner Variable, welche Du an #IN_Messreihe_Aktiv angegeben hast (0, 1, 0, 1 ...) und beobachte Tab_Idx. Dann spiele mit dem Messwert bei aktivem #IN_Messreihe_Aktiv und beobachte [IN_LogDBNr].MaxWert[Tab_Idx].
Harald