A partire dalla versione V2.3.56, la compilazione di vecchi progetti può condurre al seguente problema: un temporizzatore che in una versione precedente era stato collocato dal compilatore nell'area ritentiva, a partire dalla versione V2.3.56 viene collocato nell'area non ritentiva.
Il motivo sta nel fatto che iniziando con la versione V2.3.56 potete allocare istanze di Function Block alle aree ritentive o non ritentive. Nel farlo il compilatore alloca un temporizzatore di sistema a partire dalla fine dell'area di memoria (registro di sistema 5 - 1) fino all'inizio dell'area ritentiva (registro di sistema 6) per ogni istanza VAR_RETAIN del Function Block TM_xxxs_FB. Per ciascuna istanza della classe VAR il compilatore alloca un temporizzatore di sistema dalla fine dell'area non ritentiva (valore del registro di sistema 6 - 1) fino a 0.
Se i registri di sistema 5 e 6 sono impostati come nell'esempio qui sotto, si verifica quanto descritto sopra. I registri di sistema 5 o 6 devono essere adeguati opportunamente oppure si deve cambiare la classe dell'istanza del Function Block.
In una versione precedente alla V2.3.56, al temporizzatore era allocato il numero 2999 che si trova nell'area ritentiva. A partire dalla versione V2.3.56, il compilatore cerca di allocare il temporizzatore nell'area non ritentiva. Il compilatore alloca il numero 2499.
Soluzione: cambiare la classe nell'intestazione del programma affinché l'istanza sia allocata nell'area ritentiva.