nietzsche1979 Inserito: 6 luglio 2016 Segnala Share Inserito: 6 luglio 2016 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 More sharing options...
DesmoGiec Inserita: 6 luglio 2016 Segnala Share Inserita: 6 luglio 2016 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 FC40 TIM_S5TI è un blocco standard che trovi in "Standard Library -> IEC Function Blocks" Link al commento Condividi su altri siti More sharing options...
nietzsche1979 Inserita: 6 luglio 2016 Autore Segnala Share Inserita: 6 luglio 2016 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 More sharing options...
DesmoGiec Inserita: 6 luglio 2016 Segnala Share Inserita: 6 luglio 2016 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 More sharing options...
nietzsche1979 Inserita: 6 luglio 2016 Autore Segnala Share Inserita: 6 luglio 2016 Grazie mille. Ma devo aver sbagliato qualcosa, anche se non vedo cosa e mi sembra tutto come quello che mi hai postato: 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 More sharing options...
nietzsche1979 Inserita: 6 luglio 2016 Autore Segnala Share Inserita: 6 luglio 2016 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 More sharing options...
ken Inserita: 6 luglio 2016 Segnala Share Inserita: 6 luglio 2016 è 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 More sharing options...
DesmoGiec Inserita: 6 luglio 2016 Segnala Share Inserita: 6 luglio 2016 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 More sharing options...
nietzsche1979 Inserita: 22 luglio 2016 Autore Segnala Share Inserita: 22 luglio 2016 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 Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 22 luglio 2016 Segnala Share Inserita: 22 luglio 2016 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 More sharing options...
Matteo Benatti Inserita: 11 giugno 2017 Segnala Share Inserita: 11 giugno 2017 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 More sharing options...
Livio Orsini Inserita: 12 giugno 2017 Segnala Share Inserita: 12 giugno 2017 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 More sharing options...
Messaggi consigliati