nur in deinem code schreibt er die werte nicht jede sekunde rein. da er in der schleife bleibt spielt der taktmerker ja keine rolle mehr
Macht Dein Code ja auch nicht. Wenn Dein im EP geposteter Code "laufen" würde, dann würde er ebenfalls bei jedem Sekundenpuls alle 20 Array-Elemente beschreiben.
Ich habe Deinen Code nur so verändert, daß er korrekt mit dem von Dir vorgegebenen Ablauf funktioniert.
Der Taktmerker spielt schon noch eine Rolle, er gibt ja vor, daß nur jede volle Sekunde der Code 1x durchlaufen wird und die ~ 400 anderen Programm-Zyklen dazwischen nicht. Bedenke: ein SPS-Programm wird zyklisch abgearbeitet - daher wohl auch Deine falsche Vorstellung, wie eine Schleife funktioniert.
Wenn Du aber eigentlich jede Sekunde die selbe eine Variable in das nächste Array-Element schreiben wolltest (sowas nennt sich Ringpuffer mit Überschreiben der ältesten Einträge, nur Schreib-Pointer), dann solltest Du das deutlicher schreiben. (Programmieren ist ein "exaktes" Handwerk, wo es sehr darauf ankommt, eine Aufgabe und dann das Programm exakt zu formulieren.)
In dem Fall darf es natürlich keine Schleife geben, sondern von Durchlauf zu Durchlauf (von Sekundenpuls zu Sekundenpuls) wird nur der Index erhöht und nur auf das eine Array-Element Array[Index] geschrieben. Das könntest Du so wie von Paule geändert machen. Da ich bei indirekter Adressierung grundsätzlich den Index VOR Verwendung prüfe, würde ich etwa so schreiben:
Code:
U M 0.5 // taktmerker mit 1s periode
FP M 2.0 // oder anderer freier Merker
SPBN a001
L #index
+ 1 // index weiterstellen und auf
L 20 // Anzahl Array-Elemente
MOD // (0..19) begrenzen
T #index
SLD 5 // *4 wegen REAL-Array + SLD 3 für P#
L P#0.0 // bzw. Anfangsadresse des Array in DB1
+D
LAR1
L MD 10 // der einzuspeichernde REAL-Wert
AUF DB 1
T DBD [AR1,P#0.0]
a001: NOP 0
#index muß eine Variable mit "Gedächtnis" sein (STAT, IN_OUT oder globale Variable).
Der Code erhöht zuerst den Index und schreibt danach auf das indizierte Array-Element, schreibt also beim ersten Durchlauf in das zweite Array-Element Array[1]. Es füllt also das Array in dieser Reihenfolge: Array[1], Array[2], ... Array[19], Array[0], Array[1] ...
Bei Ringpuffern ist dieser Umstand aber meistens unerheblich.
Wenn Dein Ringpuffer unbedingt beim ersten Durchlauf auf das erste Array-Element Array[0] schreiben soll, dann müßtest Du lediglich den Index vor der ersten Verwendung mit -1 (oder 19) initialisieren.
warum schiebst du um 5 nach links?
Das ist ein altes Programmierer-Geheimnis, daß *4 einem SLD 2 entspricht
, und SLD 2 und SLD 3 kann man dann gleich zu SLD 5 zusammenfassen.
Harald