Rich,
You do not Copy before Move. If you do then you will get a double entry.
New Data Moved into Array[120] will be shifted by the copy to Array[119]. Array[120] will still have the Data that was Moved into it.
You have to Move new data into Array[120] which overwrites the old data that was shifted to Array[119].
Array[120] is for New Data Entry Only!
Array[0]-[119] Contains the past 120 minutes of Data Entries.
I am going to have to disagree with you on this MOV before COP debate.
If you put your new data into [120] and then do the COP (shift), then you have made array element [119] the same as the new entry that was put into [120]. It will appear in [0] too early.
Here's a proof, derived by reducing the size of the problem....
Assume he wants his data exactly
2 minutes old instead of 120 minutes...
You would then suggest a 3-element array, and you would...
MOV New_Data Array[2]
COP Array[1] Array[0] 2
On the first timed trigger, the new data would go into [2] and immediately get copied into [1]. It will then only take 1 more timed trigger to get that data into [0].
So there is only 1 minute between the new data being presented to the array, and it appearing in element [0] - ergo, it is not 2 minutes old, it is 1 minute old.
Now try it with COP (or CPS)
before the MOV, and NewData arrives at [0] exactly 2 trigger periods later, not 1.