Faccio una premessa su come interagiscono tra di loro le varie tasks, normalmente è eseguita la task Back che viene interrotta ogni tempo definito (Default 10mS) dalla escuzione della task Slow, entrambe le tasks sono interrotte ogni tempo definito (Default 1mS) dalla esecuzione della task Fast.
Detto questo è importante che tutte le variabili condivise tra le varie tasks siano gestite in modo atomico, se per esempio una variabile INT che usa 2 bytes viene settata dalla task Back accedendo sui suoi singoli bytes può essere che arrivi l’esecuzione della task Slow proprio mentre si è modificato solo uno dei due bytes del valore e quindi il valore che “vede” la task è un valore diverso da quello settato dalla task Back.
Per capire perchè questo acccade nel tuo programma occorrebbe eseguire tests sul programma, ma in generale statements di assegnazione su variabili da 1 a 4 bytes (Quindi sono escluse quelle a 8 bytes e le stringhe) operano in modo atomico. Se in un programma ST in Back utilizzo una variabile globale di tipo UDINT per una somma Var:=Var+1, sono sicuro che questa variabile nella task Slow ha sempre valori coerenti.
Quindi quando non si è certi della atomicità di una variabile in una task per utilizzarrla in un’altra task è consigliabile trasferirne il valore su un’altra variabile. Per le variabili fino a 4 bytes basta fare una assegnazione VarSlow:=VarBack, mentre per le variabili di dimensioni maggiori e per le stringhe consiglio di utilizzare la funzione Sysmemmove.