Vai al contenuto
PLC Forum


Moltiplicazioni/addizioni/sottrazione/divisione


Dragonfly

Messaggi consigliati

Ciao ragazzi oggi sono qui per farvi una domanda forse stupida per voi ma per me molto importante.Prima di tutto a volte vedo moltiplicazioni/sottrazioni/addizioni/divisioni per esempio di un numero intero,reale ecc,a cosa serve questa operazione?E poi se volessi fare 2+2 come faccio nello step7 ?Grazie mille in anticipo 

 

Link al commento
Condividi su altri siti


Quote

.....addizioni/divisioni per esempio di un numero intero,reale ecc,a cosa serve questa operazione?

 

Quote

E poi se volessi fare 2+2 come faccio nello step7

 

Con l'istruzione di addizione, così ti rispondi anche alla prima domanda cjje tisei fatto.

 

Le faccio io a te un paio di domande.

Hai mai sentito parlare di di manuali di istruzione?

Hai mai pensato di leggerli/consultarli o, almeno, a leggere l'help in linea dello step7?

Link al commento
Condividi su altri siti

Si ho letto  se uso add_r  sommo nu

eri interi in virgola mobile cioè per esempio

L EW10

L MW14

+I
T DB1.DBW25  

E ok ma a cosa mi serve questo?Grazie

 

Link al commento
Condividi su altri siti

Se hai un programma che pesa le mele in una cassa e un'operatore da un pannello operatore dice al plc che vuole aggiungere nella cassa 10 kg di mele, l'operazione di somma dice al plc che il peso che dovrà raggiungere al prossimo step è PESO PRESENTE NELLA CASSA + PESO IMMESSO DALL'OPERATORE...

il plc non serve solo per accendere le lampadine da più punti...

Link al commento
Condividi su altri siti

Comunque qui ci sono parecchi errori:

Quote

Si ho letto  se uso add_r  sommo nu

eri interi in virgola mobile cioè per esempio

L EW10

L MW14

+I
T DB1.DBW25  

E ok ma a cosa mi serve questo?Grazie

 

ADD_R è una funzione KOP corrispondente a +R in AWL. e tratta numeri in virgola mobile, nell'esempio invece hai sommato numeri interi a 16 bit (+I).

I numeri non possono essere interi in virgola mobile, o sono interi o sono in virgola mobile.

EW10 è un valore a 16 bit, non potrà mai essere un numero in virgola mobile (REAL a 32 bit) e lo stesso dicasi per MW14 e DB1.DBW25, le 3 righe che hai scritto sono comunque corrette ma trattano numeri interi a 16 bit.

Quando usare INT e quando REAL? dipende da quello che vuoi fare, per esempio se devi solo contare le auto che entrano in un parcheggio userai una variabile INT (intero a 16 bit), se vuoi contare le auto che passano in una autostrada è meglio che usi una DINT (intero a 32 bit), ma se devi pesare le arance che stanno in una cassa userai una variabile REAL (32 bit virgola mobile).

 

 

 

 
Link al commento
Condividi su altri siti

Grazie jump man ho sbagliaro a scrive volevo dire add_i....ascolta perche se uso +R e scrivo

L 4

T md10

L 2

T md20

L md10

L md20

T db1.dbd0

ho come valore 6 ed è giusto e se moltiplico non ho 8.Dove sbaglio?

Link al commento
Condividi su altri siti

Anche le costanti hanno vari formati, se vuoi caricare in ACCU1 una costante in virgola mobile devi scrivere mantissa ed esponente, oppure scrivi un numero con il punto (p.es. se scrivi L 4.0 appena dai invio apparirà L  4.000000e+000 che è una costante in virgola mobile)

 

Comunque ti consiglio vivamente di dichiarare il simbolico di ogni variabile che usi e di non usare indirizzi assoluti, in questo modo oltre a dover dichiarare il formato eviterai anche errori di sovrapposizione di variabili ed il programma sarà più leggibile.

 

Posso chiederti se c'è un motivo che ti spinge a programmare in AWL? E' solo per poter esporre sul forum o stai imparando solo quello ?

AWL è un linguaggio di basso livello, se lo usi lo devi conoscere  bene, altrimenti è possibile sommare patate con carote e ti esce un bel minestrone :lol:. Non nego comunque che sia una buona cosa che tu sia interessato a conoscerlo perchè è alla base del funzionamento interno della cpu, ma un programma scritto interamente in AWL non avrebbe alcun senso e sarebbe pesante da leggere.

Link al commento
Condividi su altri siti

Premetto che sto imparando a programmare in awl,era solo una curiosita,prediligo il kop però sai mi sto cimentando anche in awl e fup...comunque grazie per i tuoi preziosi suggerimenti jump man

Link al commento
Condividi su altri siti

Quindi se addiziono e scrivo 

L 4

t md10

l 4

t md20

l md10

l md20

+r

t db1.dbd0

leggo 8 e ok

se moltiplico devo scrivere

l 4.0

t md10

l 4.0

t md20

l md10

l md20

t db1.dbd0

dovrei leggere 16

perche pero' per la moltiplicazione devo mettere 4.0?

Link al commento
Condividi su altri siti

Giusto per semplificarti un pò la scrittura, puoi anche:

L 4.0    //Carico 4 nell'accumulatore 1

L 4.0    //Carico 4 nell'accumulatore 1 e sposto il dato caricato in precedenza sull'accumulatore 2

+R     //Sommo i valori dei 2 accumulatori 4+4

T DB1.DBD0

 

Anche per la somma devi scrivere 4.0 altrimenti si vedi 8 nella db ma in DINT non in REAL, nella tabella delle variabili, prova a guardare le differenze nella disposizione dei bit nella doppia parola del db1.dbd0.

Link al commento
Condividi su altri siti

Non devi mai mescolare i formati!

Nel primo esempio hai 2 interi e li sommi con una istruzione real, se vuoi puoi farlo ma prima devi usare l'istruzione di conversione DTR (double to real).

Così è corretto:

L 4     // INT

ITD     // INT to DOUBLE

DTR  // DOUBLE to REAL

t md10

l 4

ITD

DTR

t md20

l md10    //REAL

l md20    //REAL

+r         // somma di 2 REAL

t db1.dbd0    /REAL

 

Anche così:

L L#4    //DOUBLE

DTR

t md10   // REAL

l L#4

DTR

t md20

l md10   // REAL

l md20   // REAL

+r      // somma di 2 REAL

t db1.dbd0  //REAL

 

Anche così:

L 4.0   // REAL

t md10

l 4.0     // REAL

t md20

l md10

l md20

+r      // somma di 2 REAL

t db1.dbd0

 

Anche così:

L L#4

t md10

l L#4

t md20

l md10 // DOUBLE caricato in ACCU 1

DTR     // diventa REAL

l md20  // ACCU1 va in ACCU2 e carica un nuovo DOUBLE in ACCU1

DTR     // che diventa anche lui REAL

+r        // somma di 2 REAL

t db1.dbd0   // risultato REAL

 

 

(Solo se usi un Allen Bradley puoi permetterti di fregartene del formato perchè lo converte lui in automatico e puoi tranquillamente sommare un INT con un DINT e avere il risultato in REAL in una unica istruzione).

 

Comunque giusta l'osservazione di beppo che non serve ogni volta appoggiare il valore su una variabile, basta sapere bene come lavorano gli accumulatori...

Link al commento
Condividi su altri siti

A prescindere da AWL o KOP ritengo che il consiglio del Sig. Livio di studiare un po' prima, sia sacrosanto. Per programmare devi avere un'idea anche di rappresentazione numerica sui calcolatori, logica combinatoria, numeri esadecimali, BCD, Byte, Word, Dword, Virgola mobile (rappresentazione di numeri reali) ecc.

Domandare a cosa serve fare operazioni aritmetiche in un PLC da l'idea che ti occorra studiare parecchio. Trovi tutti i manuali nei vari siti. Pazienza e tempo sono propedeutici.

Link al commento
Condividi su altri siti

A me sembra comunque pieno di buona volontà, non bisogna aver paura a chiedere, poi spero anch'io che legga anche i libri e le guide.

Link al commento
Condividi su altri siti

Quote

(Solo se usi un Allen Bradley puoi permetterti di fregartene del formato perchè lo converte lui in automatico e puoi tranquillamente sommare un INT con un DINT e avere il risultato in REAL in una unica istruzione).

Anche i 1200 e 1500, se si usa il KOP, fanno molte conversioni implicite. Cosa che, quasi sempre, cerco di evitare.

 

Quando si utilizzano le variabili in AWL si va ad agire sugli accumulatori, e si eseguono operazioni sul contenuto degli accumulatori.

Se negli accumulatori carico valori non coerenti, avrò un risultato sbagliato. Ed è giusto che sia così.

Link al commento
Condividi su altri siti

Ma le eviti perchè non usi KOP sulle operazioni o per altri motivi? Io l'ho trovato comodo.

Ho usato anche altri controllori simil-codesys che avevano istruzioni tipo: ANY_TO_REAL, ANY_TO_INT ecc.ecc. sempre meglio che dover fare 2 passaggi (ITD , DTR ecc. ecc.).

Link al commento
Condividi su altri siti

Premetto che cerco di evitare di utilizzare il KOP per fare i calcoli. Per i calcoli, molto meglio utilizzare AWL o SCL.

Certo che se, in un segmento scritto in KOP, mi serve una moltiplicazione, non vado certo ad aggiungere un segmento in AWL solo per un banalissimo calcolo, ma utilizzo l'istruzione in KOP. E, nel caso le variabili in ballo non avessero lo stesso formato, non aggiungo inutili conversioni ma mi affido alla conversione implicita.

Però, proprio da un punto di vista concettuale, non mi piace moltiplicare un INT con un REAL.

Aggiungere le istruzioni ITD e DTR non mi pare una grande fatica, e mi permette di avere il controllo totale sui formati delle variabili.

Ma non sto certo sostenendo che sfruttare le conversioni implicite sia sbagliato. È solo una mia abitudine.

Pensa che, per esempio, se devo azzerare una variabile INT generalmente non mi accontento di assegnare semplicemente il valore 0, ma scrivo INT#0, se devo azzerare una DINT assegno il valore DINT#0, se devo azzerare una Sint scrivo SINT#0, se devo azzerare una WORD scrivo WORD#0 (oppure 16#0), anche se il risultato, in realtà, non cambia.

Cosa vuoi, ognuno ha le sue piccole manie ;)

Link al commento
Condividi su altri siti

Con le tue abitudini di sicuro eviti errori subdoli che a volte ti fanno perdere del tempo a trovarli perchè sei convinto di aver scritto tutto giusto e poi scopri che l'errore è dovuto a una conversione errata.

A dirla tutta per non sbagliare sarebbe bene anche nominare i simbolici con un prefisso che ricordi il formato (iVelMot_1 = INT Velocità Motore 1 oppure rTemAmb = REAL Temperatura Ambiente).

 

Per contro ti dico che ho usato solo una volta Rockwell, sono partito da zero con un minicorso di 8 ore scarse per fare 3 progetti diversi con regolazioni PID di temperatura e di modulazioni di valvole, tutto scritto in KOP (in una cella KOP si possono scrivere anche formule complesse) , senza tante menate e preoccupazioni di sbagliare formati, e mi sono trovato benissimo.

 

Tornando a S7 a me dà un po fastidio, per esempio, che un blocco o una operazione kop non accetti una Word in un ingresso programmato come INT, e non c'è (ovviamente) nessuna istruzione che converte INT in WORD (anche perchè non ha senso).

 

Link al commento
Condividi su altri siti

Quote

Tornando a S7 a me dà un po fastidio, per esempio, che un blocco o una operazione kop non accetti una Word in un ingresso programmato come INT, e non c'è (ovviamente) nessuna istruzione che converte INT in WORD (anche perchè non ha senso).

Ma non è così. Guarda l'esempio.

 

 

esempio.jpg

Link al commento
Condividi su altri siti

Quote

Tornando a S7 a me dà un po fastidio, per esempio, che un blocco o una operazione kop non accetti una Word in un ingresso programmato come INT, e non c'è (ovviamente) nessuna istruzione che converte INT in WORD (anche perchè non ha senso).

Ma non è così. Guarda l'esempio.

 

Link al commento
Condividi su altri siti

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