Vai al contenuto
PLC Forum


Convertire da int a s5time


nietzsche1979

Messaggi consigliati

nietzsche1979

Buongiorno,

avrei bisogno di convertire un valore intero che mi arriva da un supervisore esterno in S5Time.

Il valore che mi arriva rappresenta il numero di minuti oltre al quale devo fare scattare un allarme.

 

Googolando ho trovato del codice e ho provato ad adattarlo:

 


// Moltiplica * 60 per passare dai minuti ai secondi (intero)
      L     #INT_Tempo_bilancella
      L     60
      *I    
      T     #app_tempo_bilancella
      NOP   0


// Valorizza il valore in minuti 5STime
      L     #app_tempo_bilancella       // value in seconds (INT)
      ITB                               // ? BCD 
      L     2#10000000000000            // base in seconds 
      OW    
      T     #S5Time_bilancella_01       // = s5t#10s (S5TIME)

 

Nella prima parte moltiplico il numero di minuti per ottenere i secondi, e nella seconda dovrei ottenere la conversione in S5TIME (la seconda l'ho trovata e ignoro per quale morivo si ottenga un S5Time, anzi se qualcuno potesse spiegarmelo ne sarei molto grato).

Comunque sembrava andare ed ero molto contento.

Facendo dei test purtroppo mi sono accorto che funziona solo fino a 16 minuti, ovvero fino a 16 minuti converte correttamente:

15 minuti => S5T#15m0ms  in binario 2#0010_1001_0000_0000

16 minuti => S5T#16m0ms  in binario 2#0010_1001_0110_0000

ma 

17 minuti => W#16#23FC   in binario 2#0010_0011_1111_1100

 

Pensavo di aver violato l'upper bound per il tipo di dato S5Time, ma ho visto che è pari a 2 ore e 46 minuti, quindi non può essere.

Evidentemente la "formula" che ho trovato funziona bene fino a 16 minuti e non oltre, anche se non saprei il perchè.

Qualcuno sa indicarmi come cambiare il codice per far funzionare questa conversione anche per più di 16 minuti?

 

Grazie anticipatamente a tutti.

 

 

P.S.:

La Cpu del plc è 317F-2 PN/DP

Io lavoro con Step 7 versione v5.5 + SP4 + HF8 release k5.5.4.8

 

 

 

 

 

 

 


 

 


 

Link al commento
Condividi su altri siti


Ciao,

se ti arriva in formato int, solo con i minuti (ad esempio, 5, indicanti 5 minuti), senza scervellarti troppo per fare le conversioni a basi temporali, sfrutta quanto messo a disposizione da mamma siemens ;)2016_07_06_09_28_14_Var_Tabella_delle_variabili1_ONLINE_.gif

 

FC40 TIM_S5TI è un blocco standard che trovi in "Standard Library -> IEC Function Blocks"

Link al commento
Condividi su altri siti

nietzsche1979

Trovato, basta trascinarla, scusate

 

 

Scusa l'ignoranza, ma scrivendo

 

call "TIM_S5TI" me la evidenzia di rosso come se non la riconoscesse, quindi essendo nella  Standard Library -> IEC Function Blocks"

immagino che debba "includerla"

Vengo dal mondo della programmazione C, C#, dove per richiamare librerie esterne si usa la direttiva al processore #include, per AWL come devo fare?

Grazie mille

Link al commento
Condividi su altri siti

Dalla finestra sul lato sinistro, trovi le varie istruzioni di programmazione.

Vai su biblioteche, standard library, iec functions, doppio click su fc40 (oppure clicca e trascina nel blocco fc dove stai scrivendo il codice).

Se hai già un fc40 ti chiederà di rinominare l'fc.

Dovrai poi caricare prima l'fc 40 (tim_s5ti) nella cpu e poi caricare il blocco nel quale lo richiami per evitare che richiami un blocco non presente nella cpu.

Ciao!

Link al commento
Condividi su altri siti

nietzsche1979

Grazie mille.

Ma devo aver sbagliato qualcosa, anche se non vedo cosa e mi sembra tutto come quello che mi hai postato:

 

Cattura.PNG

 

 

E anche se immetto valori diversi da 25, mi da sempre valori diversi da quelli aspettati, mi sembra uguale al tuo codice, ma ci sarà qualcosa sotto ai miei occhi che non vedo!

 

 

 

Link al commento
Condividi su altri siti

nietzsche1979

Scusate lo spam, ma ho trovato, non avevo scaricato la FC40, anche se non ho ben capito cosa elaborasse prima, e per quale motivo se richiamava un FC non presente il PLC non sia andato in blocco (di solito a me fa così).

 

Grazie mille DesmoGiec

 

Link al commento
Condividi su altri siti

è molto più semplice


     L     DB23.DBW    0               // timer da monitor [0.1s]                                         
      ITB   
      L     W#16#1000                 // per avere il timer in decimi di secondo 
      OW    
      T     DB23.DBW    2               // s5time

 

Base di tempo    Codice binario per la base di tempo
10 ms                      00   W#16#0000
100 ms                    01   W#16#1000
1 s                          10    W#16#2000
10 s                        11    W#16#3000

 

Link al commento
Condividi su altri siti

Certo, hai ragione.

Volendo si prende il suo valore int in minuti, moltiplica *6 e fa un ow a #3000 e funzionerebbe uguale.

Sinceramente non mi ricordavo più dell'esistenza a base 10 secondi ^^"

 

Link al commento
Condividi su altri siti

  • 3 weeks later...
nietzsche1979

Ciao ragazzi, scusate ancora, ho un altro problema di conversione più semplice, ma non volevo aprire un'altro thread e quindi provo a chiedere qui:

 

un fornitore memorizza un numero intero identificante una tratta in un byte, ma io ho un problema nel vederlo correttamente nei valore con o senza segni.

Mi spiego meglio:

il dato viene memorizzato in un byte, quindi ad esempio 

 

il numero 14 è   |0000|1110|  8+4+2 = 14

il numero 164 è |1010|0100| 128+32+4 = 164

 

ma se vado a vedere nella vat mettendo come formato di visualizzazione DEC in realtà io vedo -92

infatti 92 è |0101|1100| => complemento a 2 |1010|0011| => si somma 1 => |1010|0100| che è -92 (che in  bit coincide con 164 senza segno)

 

Vi è la maniera di vedere nella vat tutti i valori decimali senza segno, oppure devo fare "a mano" la conversione di tutti?

 

Sperando di essere stato abbastanza chiaro ringrazio tutti anticipatamente

 

 

 

Cattura.PNG

Link al commento
Condividi su altri siti

Dalla vat non credo tu possa fare molto.

O appoggi i valori in delle mw così non sei vincolato in vat al max valore di 127 per i byte, oppure visualizzi in hex e con calcolatrice scrivi hex e converti in dec, oppure prendi 128, sottrai il tuo valore (-92 ad esempio), e sommi il risultato nuovamente per 128.

128-92=36+128=164

 

Ciao!

Link al commento
Condividi su altri siti

  • 10 months later...
Matteo Benatti

Ragazzi scusate sono incappato anche io in sta storia, ma come faccio a convertire in un numero intero s5time cioè s5time = int ????

 

sono riuscito a farlo in modo inverso e funziona, devo confrontare s5time in un numero intero..

Link al commento
Condividi su altri siti

Non è consentito accodarsi ad altre discussioni perchè si causa confusione nelle risposte; inolte questa è una discussione ferma da circa 1 anno e difficilmente otterrai suggerimenti.

 

Apri, se vuoi, una nuova discussione sull'argomento di tuo interesse.

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...