coquinati Inserito: 22 febbraio 2014 Segnala Inserito: 22 febbraio 2014 (modificato) ciao ragazzi da poco ho iniziato a scrivere con awl , stavo eseguendo delle operazioni per esercitarmi , ma ho un problema che non riesco capire, ecco il codice;: U E 124.2 //start SPBN a000 U M 8.6 //merker clock 1s FP M 0.7 L DB1.DBD 6 //risultato L 1.000000e+000 +R T DB1.DBD 6 //risultato a000: NOP 0 facendo cosi appena premo I124.2 il risultato inizia a salire in maniera pazza, però il fronte di salita è presente. come mai questo?? logicamente quando do il start il RLC=1 quindi non salta, merker di clock ogni secondo si chiude , il fronte mi rileva il passaggio da 0 a 1 del clock e mi esegue il calcolo. poi ho un altro dubbio con questo codice: U E 124.2 //start U M 8.6 //merker clock 1s FP M 0.7 SPBN a001 L DB1.DBD 2 //risulato L 1.000000e+000 +R T DB1.DBD 2 //risultato a001: NOP 0 qua succede che il conteggio va avanti per i fatti suoi (senza premere start) ma in maniera corretta.. dovrebbe saltare ,però non lo fa ,come è possibile se il rlc è =0*1*1 quindi 0 , grazie mille ragazzi , mi scuso per incepparvi il forum con le mie cavolate.. Modificato: 22 febbraio 2014 da Gabriele Riva Sistemato codice
gfabrizio Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 Se i due segmenti che hai postati si trovano nel medesimo programma ti ritrovi con due fronti che utilizzano il medesimo merker e così non possono funzionare. Ciao G.Fabrizio
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Fabrizio grazie della risposta , comunque il calcolo non si trova nello stesso programma. Ho controllato su altra funzione se per sbaglio usavo lo stesso indirizzò ma niente , Inviato dall'app. Mobile di PLC Forum da iPhone6,2
JumpMan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 (modificato) Nel primo codice, tu generi un fronte ma non hai messo nessun salto dopo il fronte, devi mettere SPBN a000 perchè le istruzioni L, +R e T non sono RLC dipendenti. Il secondo codice è corretto e deve funzionare (a parte che il clock che hai messo è di 1.6s. anzichè 1s., e che per un contasecondi sarebbe meglio usare DINT piuttosto che real ) Modificato: 22 febbraio 2014 da JumpMan
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Nel primo codice, tu generi un fronte ma non hai messo nessun salto dopo il fronte, devi mettere SPBN a000 perchè le istruzioni L, +R e T non sono RLC dipendenti. Il secondo codice è corretto e deve funzionare (a parte che il clock che hai messo è di 1.6s. anzichè 1s., e che per un contasecondi sarebbe meglio usare DINT piuttosto che real ). Ciao jump
JumpMan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 U E 124.2 //startU M 8.6 //merker clock 1sFP M 0.7SPBN a001L DB1.DBD 2 //risulatoL 1.000000e+000+RT DB1.DBD 2 //risultatoa001: NOP 0 ti riconfermo ancora una volta che questo codice è corretto, il contatore non deve incrementarsi se E124.2 è a 0, ma stai provando col simulatore o col plc?
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 (modificato) Con il plc , ho provato anche in questo istante , inserendo sotto a (u. 124.2) un un'istruzione di questo genere (s. M 10.0) .. Lo so che non ha senso , però quando io tolgo l'ingresso non dovrebbe contare . Invece conta . Inviato dall'app. Mobile di PLC Forum da iPhone6,2 Modificato: 22 febbraio 2014 da coquinati
JumpMan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 fai una cosa, al posto di U E 124.2 scrivi U M 100.0 (o un altro M che non hai usato da nessuna parte), poi quando sei in stato clicchi col destro su M100.0 e lo forzi a 1 o a 0 e vedi se va. Assicurati inoltre di non aver usato M0.7 da altre parti...
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Provato ma nulla , ho fatto anche un nuovo programma , ora succede che mi salta il tutto quando RLC e 1 con SPBN , e con SPN non salta però il risultato non cambia ( sembra che si siano invertite le istruzioni, ho provato a spegnere a riaccendere ma niente , ho controllato se il vecchio programma era totalmente cancellato e lo è, ho un op3 collegato ma spento . Però non trovo più i cacciAvide per toglierlo fisicamente dalla cpu ,! Magari crea problemi ,, sta cpu mi sa che sta partendo ... Ma è normale che con un addendo di 0,1 , mi dia un calcolo non completamente preciso per esempio 5, 107 oppure 10,699 . ? Sembra quasi che se lo arrotonda ...Comunque grazie mille per ora se ho novità vi faccio sapere .... Inviato dall'app. Mobile di PLC Forum da iPhone6,2
floydfan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 cambia la M0.7 con altro merker..perché potrebbe essere un bit del byte di clock della CPU...
floydfan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 ritiro il post mio precedente....va bene la M0.7...devi cambiare l'incremento... L 1.000000e-001... e in forzamento variabile devi visualizzare la DB1.DBD2 in "virgola mobile" e non in "decimale" .....percheè effettivamente in decimale da numeri strani......
floydfan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 ulteriore precisazione ... con L 1.000000e+000 incrementi il valore di 1... con L 1.000000e-001 incrementi di 0,1... spero di esserti stato di aiuto.....
JumpMan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 coquinati, quando dici: U M 8.6 //merker clock 1s intendi che hai impostato la MB8 come MB di clock nell'hardware, giusto? come ti ho detto prima M8.5 è un clock da 1.6s. dovresti usare M8.5, ma questo è l'ultimo dei tuoi problemi... ho caricato il codice nel simulatore e funziona (non avevo dubbi) ti confermo che i decimali nelle REAL si perdono un po per strada, ma tu cosa devi fare con questo counter?
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Si esatto jump ho impostato il byte 8 come merker di clock. Ho provato fare il calcolo con un numero intero e funziona !! Con i numeri reali no , che casino ragazzi , alla fine vorrei creare un contatore che inizia da. 0,0 e va a 50,0 e viceversa con un coefficiente di 0,1 . Però non mi va nemmeno una addizione . Intanto grazie mille ragazzi Inviato dall'app. Mobile di PLC Forum da iPhone6,2
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 (modificato) ritiro il post mio precedente....va bene la M0.7...devi cambiare l'incremento... L 1.000000e-001... e in forzamento variabile devi visualizzare la DB1.DBD2 in "virgola mobile" e non in "decimale" .....percheè effettivamente in decimale da numeri strani...... Io uso di solito controllo il blocco dati online , sono più veloce , comunque si io ho inserito 1 per le prove , per togliermi qualsiasi dubbio , comunque grazie anche a te , il byte lo portato ad 8 per comodità Modificato: 22 febbraio 2014 da coquinati
JumpMan Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 (modificato) vorrei creare un contatore che inizia da. 0,0 e va a 50,0 e viceversa con un coefficiente di 0,1 Se devi solo visualizzarlo sull'OP3 puoi impostare su quest' ultimo che abbia una cifra decimale e sul plc usare una word INT. Se devi usarlo altrove e ti serve proprio REAL puoi comunque fare il contatore INT, basta che aggiungi queste istruzioni: L #Contatore_Intero ITD DTR L 10.0 /R T #Contatore_Real Ho provato fare il calcolo con un numero intero e funziona !! Con i numeri reali no , comunque deve funzionare anche con i numeri reali, non è che la cpu diventa vecchia e rimbambita col passare degli anni sicuro che non sovrapponi qualche byte ? ti consiglio di usare sempre i simbolici Modificato: 22 febbraio 2014 da JumpMan
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Se devi solo visualizzarlo sull'OP3 puoi impostare su quest' ultimo che abbia una cifra decimale e sul plc usare una word INT. Se devi usarlo altrove e ti serve proprio decimale puoi comunque fare il contatore INT, basta che aggiungi queste istruzioni: L #Contatore_Intero ITD DTR L 10.0 /R T #Contatore_Real comunque deve funzionare anche con i numeri reali, non è che la cpu diventa vecchia e rimbambita col passare degli anni Ahahahahah, avrà 12 anni sta cpu , sui cani 1 anno vale 7 , sulle cpu quante vale ? ,, scherzo ragazzi , piuttosto che piangere scherzo .. Sembra un problema serio . Comunque jump la tua soluzione con i numeri interi è geniale , grazie mille ,Per la sovrapposizione dei byte sono sicurissimo ,addirittura ho creato un altro progetto per dedicarlo solo ad una addizione. Grazie mille
batta Inserita: 22 febbraio 2014 Segnala Inserita: 22 febbraio 2014 ho letto che siemens garantisce la precisione di calcolo fino a 6 numeri dopo la virgola Non è un limite di Siemens, ma del formato virgola mobile a 32 bit.
coquinati Inserita: 22 febbraio 2014 Autore Segnala Inserita: 22 febbraio 2014 Non è un limite di Siemens, ma del formato virgola mobile a 32 bit. Ma allora su qualsiasi logica programmabile se è possibile utilizzare un numero a 32 bit a virgola mobile c'è questo limite , anche se Pensandoci bene è più che ottima come risoluzione , grazie mille della precisazione batta . Ora sto cercando di capire perché la cpu non esegue più calcoli con numeri reali .... Ma non riesco trovare niente a riguardo .ho fatto anche una diagnostica HW ma non risulta niente di strano.
batta Inserita: 23 febbraio 2014 Segnala Inserita: 23 febbraio 2014 Ma allora su qualsiasi logica programmabile se è possibile utilizzare un numero a 32 bit a virgola mobile c'è questo limite , anche se Pensandoci bene è più che ottima come risoluzione Sì, non dipende dal PLC. Per avere maggior precisione si deve passare ai 64 bit. Tieni presente che il 1200 e il 1500 gestiscono anche il formato LREAL (64 bit). Onestamente, non ho mai sentito il bisogno di utilizzarlo..
coquinati Inserita: 23 febbraio 2014 Autore Segnala Inserita: 23 febbraio 2014 Sì, non dipende dal PLC. Per avere maggior precisione si deve passare ai 64 bit. Tieni presente che il 1200 e il 1500 gestiscono anche il formato LREAL (64 bit). Onestamente, non ho mai sentito il bisogno di utilizzarlo.. Ci credo:) nel mondo sono andati avanti fino adesso con i 32 bit e mi sembra di vedere che anche i grossi impianti di automazione girano senza problemi , però il fatto che provando a fare un calcolo con un coefficiente di 0,1 poi dopo un po' trovarmi il risultato non preciso ( anche se praticamente insignificante es:5,6999 o es:8,70077, poi sta cpu va e non va ) non mi convince molto come precisione massima di calcolo
batta Inserita: 23 febbraio 2014 Segnala Inserita: 23 febbraio 2014 poi sta cpu va e non va A me non è mai capitata una cpu che "va e non va". O va, oppure non va. Io credo ci sia qualche errore nel tuo progetto. Se vuoi, me lo puoi inviare via mail (vedi il mio indirizzo nella firma), e ti prometto che gli darò un'occhiata.
coquinati Inserita: 23 febbraio 2014 Autore Segnala Inserita: 23 febbraio 2014 A me non è mai capitata una cpu che "va e non va". O va, oppure non va. Io credo ci sia qualche errore nel tuo progetto. Se vuoi, me lo puoi inviare via mail (vedi il mio indirizzo nella firma), e ti prometto che gli darò un'occhiata. Volentieri batta , devo inviarti la cartella completa dove è contenuto il programma ? . Grazie mille davvero
coquinati Inserita: 23 febbraio 2014 Autore Segnala Inserita: 23 febbraio 2014 batta ti ho inviato il tutto grazie mille
batta Inserita: 24 febbraio 2014 Segnala Inserita: 24 febbraio 2014 Ho dato un'occhiata ai due progetti. Partiamo quindi subito con alcuni consigli: 1) Quando generi un nuovo DB, il sistema ti propone sempre una variabile di tipo INT (che chiama variabile jolly provvisoria). Non sei assolutamente obbligato a tenerla. Anzi, non serve proprio a nulla e ti consiglio di eliminarla. 2) Dai sempre un nome simbolico ai DB, così nel codice che andrai a scrivere potrai vedere anche le variabili con il nome simbolico. 3) Se per il richiamo di una variabile utilizzi la sintassi "DB".Var (come hai fatto e come ti consiglio di continuare a fare) non serve mettere l'istruzione di apertura del DB (AUF DBnnn). Questa istruzione era obbligatoria nei vecchi S5, perché non si poteva indicare nella stessa istruzione numero del DB e indirizzo della variabile. Questo era, a mio avviso, il più grande difetto dei PLC S5. 4) Quando fai delle comparazioni per verificare se è stato raggiunto un valore, non usare il confronto solo per "=", ma usa ">=" oppure "<=", in modo da poter rilevare il raggiungimento (o il superamento) del valore anche se questo valore venisse scritto da altre parti del programma, oppure da una VAT. Se questo vale quando lavori con numeri interi, vale ancora di più se lavori con numeri in virgola mobile che, come abbiamo visto, sono approssimati (49.99999 è diverso da 50.0). 5) Lavora in virgola mobile solo quando è necessario. Nel caso specifico (conteggio da 0.0 a 50.0 e viceversa con step di 0.1) ti converrebbe lavorare con interi con valori da 0 a 500 e step di 1. Veniamo ora ai tuoi due progetti. Il secondo, quello con il semplice incremento, funziona. Se sulla tua CPU non va, devi controllare se in online nel programma lo stato dell'ingresso E124.0 lo vedi alto oppure no. Se vedi il led accendersi ma sul PC vedi sempre l'ingresso basso, significa che ti manca un comune +24Vdc su qualche morsetto della CPU. Consulta il manuale per vedere quali sono i collegamenti da fare. Nel primo direi che hai fatto un bel casino. Non ti preoccupare, per i principianti è normale rendere complicate le cose semplici. Prova questo codice: //Segmento 1: Fronte salita merker di clock U "merker_clock" FP "XFS_ClockConteggio" = #FS_Clock //Variabile TEMP //Segmento 2: Start/Stop conteggio U "start conteggio" S "AbilitaCnt" U "stop conteggio" R "AbilitaCnt" NOP 0 //Segmento 3: Incremento/Decremento e controllo limiti ON "AbilitaCnt" ON #FS_Clock SPB M000 L "DB_Test".Risultato_1 L 1.000000e-001 U "CntUpDw" //Se devo incrementare, salto a etichetta INC SPB INC //altrimenti decremento -R SPA M001 INC: +R M001: T "DB_Test".Risultato_1 //Se ho raggiunto o superato il valore massimo, //predispongo per il decremento e imposto il valore //massimo nella variabile di conteggio. In questo modo, //se a causa di approssimazioni supero il valore massimo, //reimposto il valore corretto L 5.000000e+001 <R SPB M002 T "DB_Test".Risultato_1 R "CntUpDw" M002: L "DB_Test".Risultato_1 //Stessa cosa, al contrario, per valore minimo L 0.000000e+000 >R SPB M000 T "DB_Test".Risultato_1 S "CntUpDw" M000: NOP 0
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