Andrea_hmi Inserito: 24 settembre 2021 Segnala Inserito: 24 settembre 2021 Buongiorno a tutti Chiedo aiuto per questa cosa... Con CJ utilizzo per un DM assegnata come UINT per un contatore di posizionamento Con le istruzioni ++ e -- incremento e decremento il valore della DM Succede che sottraendo, il valore della DM vada sotto lo 0 , però anche se assegnata come UINT io non vedo il numero con segno - , la DM assume valore 36535 e da li continua a diminuire. Quindi se io uso una funzione ad esempio CF113 DM<0 OUT , la condizione che dovrebbe attivare OUT non si verifica mai. Come posso elaborare il dato con segno negativo o positivo? Grazie
leleviola Inserita: 24 settembre 2021 Segnala Inserita: 24 settembre 2021 Scusami ma UINT non è un intero senza segno? U sta per Un e INT sta per intero con segno se la definisci UINT non dovrebbe avere segno ed è per quello che non la vedi andare in negativo, non so come usi il contatore veloce ma il contatore lavora a doppia parola e quindi non puè essere un Intero ma un doppio Intero a 32 bit, aggiungo che il valore del contatore mi sembra che Omron lo metta sui registri di stato A e quindi li dovresti leggere il valore del contatore, penso tu usi un registro di appoggio per trasferire il valore giusto?
Ctec Inserita: 24 settembre 2021 Segnala Inserita: 24 settembre 2021 Ovviamente lavorando con gli interi senza segno, non potrai mai avere un numero negativo (è nel nome...) ed è giusto che arrivati a 0 si ricominci da 65535... Se vuoi che il valore non vada mai al di sotto di 0 con un UINT, dovrai fare un confronto e se il valore della D (le DM erano dei vecchi Cxxx) è uguale a 0, inibisci il conteggio (ci sono dei bit di abilitazione per i contatori veloci, e disattivi il contatore se normale Cxxx). Altrimenti hai due strade: utilizzare gli INT (a 16 bit) se ti bastano valori da -32768 a +32767, oppure usare i DINT (a 32bit) che contengono valori da - a + 2 miliardi circa. E poi se il valore va sotto 0, lo riporti te a 0.
Andrea_hmi Inserita: 24 settembre 2021 Autore Segnala Inserita: 24 settembre 2021 52 minuti fa, Ctec ha scritto: Ovviamente lavorando con gli interi senza segno, non potrai mai avere un numero negativo (è nel nome...) ed è giusto che arrivati a 0 si ricominci da 65535... Se vuoi che il valore non vada mai al di sotto di 0 con un UINT, dovrai fare un confronto e se il valore della D (le DM erano dei vecchi Cxxx) è uguale a 0, inibisci il conteggio (ci sono dei bit di abilitazione per i contatori veloci, e disattivi il contatore se normale Cxxx). Altrimenti hai due strade: utilizzare gli INT (a 16 bit) se ti bastano valori da -32768 a +32767, oppure usare i DINT (a 32bit) che contengono valori da - a + 2 miliardi circa. E poi se il valore va sotto 0, lo riporti te a 0. Scusatemi, mi sono espresso male La variabile è assegnata INT lunghezza 16 bit es DM300 Uso un ++ e -- con CF100 0,1 sec per contare. Anche con INT se seleziono la visualizzazione con segno la vedo espressa correttamente, ma su uso la ISTRUZIONE < D300 &0 , OUT non funziona
Ctec Inserita: 24 settembre 2021 Segnala Inserita: 24 settembre 2021 Ah, ora capisco. E' perché la "<" è un confronto da UINT. Se confronti due valori INT, devi usare "<S" (la S sta per Signed).
Andrea_hmi Inserita: 24 settembre 2021 Autore Segnala Inserita: 24 settembre 2021 6 minuti fa, Ctec ha scritto: Ah, ora capisco. E' perché la "<" è un confronto da UINT. Se confronti due valori INT, devi usare "<S" (la S sta per Signed). Proverò Grazie
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora