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




Calcoli Awl,


Messaggi consigliati

Inserito: (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: da Gabriele Riva
Sistemato codice

  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • coquinati

    34

  • batta

    17

  • JumpMan

    12

  • floydfan

    3

Top Posters In This Topic

Posted Images

Inserita:

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

Inserita:

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

Inserita: (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 :P)

Modificato: da JumpMan
Inserita:

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 :P)

. Ciao jump
Inserita:
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

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?

Inserita: (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: da coquinati
Inserita:

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...

Inserita:

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

Inserita:

cambia la M0.7 con altro merker..perché potrebbe essere un bit del byte di clock della CPU...

Inserita:

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......

Inserita:

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.....

Inserita:

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?

post-2480-0-89758400-1393098259_thumb.jp

Inserita:

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

Inserita: (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: da coquinati
Inserita: (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 :lol:

sicuro che non sovrapponi qualche byte ?

ti consiglio di usare sempre i simbolici

Modificato: da JumpMan
Inserita:

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 :lol:

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

Inserita:

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.

Inserita:

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.
Inserita:

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..

Inserita:

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 :(
Inserita:

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.

Inserita:

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
Inserita:

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

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

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




×
×
  • Crea nuovo/a...