Yet another approach would be to write the routine once using indirect addressing, then loop through it using JMPs or FOR-NEXT. Bear in mind that if you use timers, the TMR would have to be executed every scan (so don't allow a yield), but at least you wouldn't have to repeat the code.
If feasible for the rest of the program, putting everything to do with the fire dampers in instances of a UDT (FireDamper1.Tripped through FireDamper40.ElapsedTime or whatever) would simplify the indirect addressing. UDTs can now contain other structures like timers.