насчет выставления переменных на передачу данных в конце цикла - истину глаголешь. У меня в проге так сделано. Более того - я параноидально завел две переменные - сurr_value и new_value. В проге все вычисления делаются для new_value, а вот в самом конце сравниваются new_value и curr_value и если они различаются, то

var
DO_1 AT %QX..... : BOOL;
DO_2 AT %QX..... : BOOL;
...
DO_N AT %QX..... : BOOL;

curr_value1 : BOOL := false;
curr_value2 : BOOL := false;
...
curr_valueN : BOOL := false;
end_var

new_value1:=................;
new_value2:=................;
...
new_valueN:=................;

if new_value1 <> curr_value1 then
curr_value1 := new_value1;
DO_1:= curr_value1;
end_if

if new_value2 <> curr_value2 then
curr_value2 := new_value2;
DO_2:= curr_value2;
end_if

...

if new_valueN <> curr_valueN then
curr_valueN := new_valueN;
DO_N:= curr_valueN;
end_if