Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Conversione Tempi Simatic


Messaggi consigliati

Inserito:

Buongiorno a tutti,

io posso introdurre da un pannello un valore decimale di un temporizzatore (massino 60.0 secondi) ed ho a disposizione nel plc il suo valore in formato esadecimale.

Come posso metterlo a disposizione in una word con formato intero ? (es 14s30ms = 143)

Leggendo nelle varie discussioni sono riuscito a trovare l'operazione contraria.


Matteo Montanari
Inserita:

ESEMPIO:

//;

// Creazione del timer

//;

UN T 9

L MW 0

SE T 9

//;

// Trasferimento del valore di set-point del timer in un valore intero

//;

L MW 0 // Caricamento del preset del timer (utilizzato sopra)

SLW 4 // Fai scorere parola a sinistra (di 4 bit) per togliere la base dei tempi

SRW 4 // Fai scorere parola a destra (di 4 bit) per "azzerare" i 4 bit piu' significativi

BTI // Converti numero BCD in numero intero

T MW 2 // Valore intero del preset del timer

//;

con il valore: S5T#9s500ms

tradotto in bcd ottieni 2#0000_1001_0101_0000

mentre come valore intero ottieni 950

attenzione perche' togliendo la base dei tempi potresti avere lo stesso risultato per valori diversi:

S5T#20s500ms -> 2#0001_0010_0000_0101 -> 205

S5T#2s500ms -> 2#0000_0010_0000_0101 -> 205

Inserita:

Ciao a tutti

utilizzando il consiglio di Matteo ho effettuato questa modifica per ovviare al problema della base dei tempi :

ESEMPIO:

//;

// Creazione del timer

//;

UN T 9

L MW 0

SE T 9

//;

// Trasferimento del valore di set-point del timer in un valore intero

//;

L MW 0 // Caricamento del preset del timer (utilizzato sopra)

SLW 4 // Fai scorere parola a sinistra (di 4 bit) per togliere la base dei tempi

SRW 4 // Fai scorere parola a destra (di 4 bit) per "azzerare" i 4 bit piu' significativi

BTI // Converti numero BCD in numero intero

T MW 2 // Valore intero del preset del timer

U M0.4 // se la base dei tempi è uno moltiplico il valore per 10

SPBN END

L 10

*I

T MW2

END :NOP 0//;

con il valore: S5T#9s500ms

tradotto in bcd ottieni 2#0000_1001_0101_0000

mentre come valore intero ottieni 950

attenzione perche' togliendo la base dei tempi potresti avere lo stesso risultato per valori diversi:

S5T#20s500ms -> 2#0001_0010_0000_0101 -> 205

S5T#2s500ms -> 2#0000_0010_0000_0101 -> 205

Al supervisore metto così a disposizione un intero che dovrà sempre dividere per 100.

Ho provato con tempi fino a 60 secondi come serve a me e sembra funzionare.

Inserita:

Solo per curiosità, potrei sapere perché devi fare questa conversione?

Inserita:

Ciao Batta

ho dovuto fare questa conversione perchè, attraverso una delle tante schede MPI/Ethernet, un supervisore raccoglie il dato come numero intero.

Inserita:

Ma il dato non viene anche scritto dallo stesso supervisore?

Se così fosse, ti converrebbe scrivere il dato in intero, e convertirlo poi in formato S5Time, piuttosto che fare il contrario.

Altra strada possibile (dipende dal supervisore, ma direi che più o meno tutti sono in grado di farlo), è effettuare la conversione nel supervisore.

Inserita:

;) Il supervisore legge solamente.

I vari dati di processo vengono inseriti nella macchina attraverso un proprio pannello dedicato (GEFRAN) il cui progetto non possiamo ne vedere ne modificare.

Per spiegare velocemente noi verifichiamo se e quando è modificato tale dato (sono parecchi tra temporizzatori,conteggi e altro) perchè questo potrebbe modificare il prodotto.

Inserita:
...noi verifichiamo se e quando è modificato tale dato...

Quindi il supervisore esegue già delle operazioni.

Motivo in più, a mio avviso, per far fare al supervisore anche la conversione da S5Time a INT (DINT se vuoi coprire tutta la scala dei timer in centesimi di secondo).

Questo anche perché nella tua conversione tieni conto solo della base tempi di 10ms o di 100ms. Non effettui controlli per base tempi 1s o 10s.

Se sei sicuro che i tuoi timer non utilizzano base tempi 1s e 10s, può andar bene. Rimane comunque un lavoro "incompleto".

Potresti almeno aggiungere anche il controllo del bit 13 (M0.5 nel tuo esempio) e moltiplicare x100 se è alto.

Avresti quindi le seguenti possibilità:

base tempi 00: nessuna operazione

base tempi 01: moltiplichi x10

base tempi 10: moltiplichi x100

base tempi 11: moltiplichi x100

Nota bene: ti basta moltiplicare x10 se è alto M0.4 e moltiplicare x100 se è alto M0.5, ed hai già coperto tutte le combinazioni.

Il risultato è il tempo in centesimi di secondo.

Rischi però di superare il valore massimo di una variabile INT.

Potresti anche procedere come segue:

base tempi 00: dividi /10

base tempi 01: nessuna operazione

base tempi 10: moltiplichi x10

base tempi 11: moltiplichi x100

Nota bene: ti basta moltiplicare x100 se è alto M0.5 e dividere /10 se è basso M0.4 ed hai già coperto tutte le combinazioni.

Il risultato è in decimi di secondo.

Con la divisione però taglieresti i centesimi di secondo.

Se invece da supervisore leggi semplicemente il dato così com'è (ricorda però che è in BCD), e la conversione la fa il supervisore, risulta un lavoro più completo e più pulito.

Inserita:

Ciao Batta :)

la conversione mi è stato chiesto di farla nel PLC per non sovraccaricare ulteriormente il supervisore.

Deve raccogliere moltissimi dati di produzione e di processo ed eseguire una serie di controlli.

Detto questo farò come tu mi hai suggerito, visto che le cifre da convertire possono andare da 0,0 a 99,9.

Grazie ancora.

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...