Il tuo è un problema di calcolo quota su rapporto circolare, argomento che ho trattato in questo topic ed in questo topic. In pratica acquisendo il valore di quota encoder su loop successivi di esecuzione programma si calcola lo spostamento in tacche che ha fatto l’encoder e si somma lo spostamento ad un valore di quota espresso in UDINT. Tutto il succo è in queste semplici operazioni:
EAcq(); (* Encoder acquisition *)
EOfs:=TO_INT(EAcq.EQuote-QteBf); (* Encoder offset (Pulses) *)
EQuote:=EQuote+TO_DINT(EOfs); (* Encoder quote (Pulses) *)
QteBf:=EAcq.EQuote; (* Quote buffer *)
E’ importante che le variabili utilizzate siano del tipo indicato sotto, in caso contrario non funziona:
EOfs : INT; (* Encoder offset (Pulses) *)
QteBf : UINT; (* Quote buffer *)
EQuote : DINT; (* Encoder quote (Pulses) *)
Nell’esempio uso una variabile DINT per la quota così può andare anche in negativo. Se la tua quota è solo positiva puoi usare una variabile UDINT modificando:
EQuote:=EQuote+TO_UDINT(EOfs); (* Encoder quote (Pulses) *)