I would agree whole-heartedly Paul, simple is best, when simple suits.
As JeremyM is pointing out, using the above logic it's possible to index through many elements using more concise logic instead of many individual rungs, which of course is also fine and can be edited in quite quickly and easily using a word processor.
I suppose I was tempted, as we often are, to solve the riddle using ladder logic in as concise a method as possible, but not necessarily the simplest.
However, what is missing from my rungs, and would normally always be present, is VERY detailed comments. These would describe exactly what each rung and its instructions are doing.
Another option is to can the logic into an AOI.
Structured Text I feel though would probably be best here, as Ken pointed out, but that option is not available to most general users, so I stuck with ladder logic.
Pay attention in class!
As JeremyM has also pointed out (you're doing a lot of that here!), and as was my very point in the above post, you cannot, successfully, copy a Source element of one data type to a Destination element of the same data type, if that Destination element resides in an array.
The resultant data will be erroneous.
First...
MOV MASTER_MOVE_TIMER to VALVE_ALARMS[0] (assuming VALVE_ALARMS is an array of TIMER data type elements?)
Then...
COP VALVE_ALARMS[0] to VALVE_ALARMS[1] for Length 59 (not 60)
The Length is decremented by 1 because the first element VALVE_ALARMS[0] is already copied to and the remaining 59 just need copying.
The resultant data will be valid.
Regards,
George