Thanks everyone, lots of food for thought here.
I'll try and digest it and come up with a plan.....
One other thing, with an L16 you only have 384kb of Memory.
If you make a UDT like this:
ID DINT (I´m assuming that an DINT is sufficient maybe this needs to be a string)
FIFO INT
Zone1 Enter Time DINT
Zone1 Leave Time DINT
Zone1 Time Spent DINT
Zone1 Warning Bool
Zone1 Alarm Bool
Zone2 Enter Time DINT
Zone2 Leave Time DINT
Zone2 Time Spent DINT
Zone2 Warning Bool
Zone2 Alarm Bool
Zone3 Enter Time DINT
Zone3 Leave Time DINT
Zone3 Time Spent DINT
Zone3 Warning Bool
Zone3 Alarm Bool
Zone4 Enter Time DINT
Zone4 Leave Time DINT
Zone4 Time Spent DINT
Zone4 Warning Bool
Zone4 Alarm Bool
Thats 58Bytes per UDT (assuming you group all your bools etc)
1500 of them will be basically 84kB so your going to be working with only 300kB. Will that be enough to implement all your code?
You might need to push to an L18 or L24.