Vai al contenuto
PLC Forum


Funzioni matematiche - moltiplica -


itel

Messaggi consigliati

Buongiorno a tutti,

Ho un problema nella restituzione di un dato da Merker (%MW1), in un moltiplicatore.

Allego immagine.

Qualcuno per cortesia sa dirmi perchè il dato non viene restituito ? Immagine.thumb.jpg.e1c024a3d2d18412e16e535f58a981fd.jpg

Link al commento
Condividi su altri siti


semplice:

definisci due variabili che si sovrappongono per un byte, che è quello che hai scritto.
ricabla MW1 e MW3 invece di MW2 e vedrai che funziona. Tipico errore da principiante.......

 

Link al commento
Condividi su altri siti

Come dice Pigroplc, sovrapponi le variabili.

Prima di buttare giù del codice, bisognerebbe studiare un po' i manuali.
Dato che in Siemens l'indirizzamento è a byte, e che un intero occupa due byte, quando scrivi MW1 significa che vai ad utilizzare MB1 e MB2; MW2 occupa MB2 e MB3, e così via.
Proprio per questo, anche se non è obbligatorio, si preferisce usare sempre indirizzi pari per le variabili di dimensione superiore al byte.
Poi, anche se sei alle prime armi, con Siemens abbandona subito la pessima abitudine di usare l'area M per i calcoli.
Creati dei blocchi dati (DB), e dichiara all'interno dei DB le variabili di cui hai bisogno.

Link al commento
Condividi su altri siti

Siemens utilizza i byte come standard, quindi la MW1 comprende i byte 1 e 2, la MW2 i Byte 2 e 3 e la MW3 i Byte 3 e 4, quindi nelle varie operazioni che si succedono sovrascrivi alcuni byte della word precedente, quindi quando usi le word devi saltare di 2 in 2, quando usi un reale o una Dword di 4 in 4.

 

Nel tuo programma prova ad usare le MW0, MW2 e la MW4 vedrai che funziona.

Link al commento
Condividi su altri siti

Chiedo venia,

ammetto di essere alle prime armi.

Grazie delle risposte tutte esauriente al problema.

Accetto il consiglio di Batta, per quando concerne l'uso dei blocchi dati, e di studiarmi di più i manuali. 

 

Saluti e grazie a tutti

Link al commento
Condividi su altri siti

ivan.bortolin
1 ora fa, acquaman scrisse:

Siemens utilizza i byte come standard, quindi la MW1 comprende i byte 1 e 2, la MW2 i Byte 2 e 3 e la MW3 i Byte 3 e 4, quindi nelle varie operazioni che si succedono sovrascrivi alcuni byte della word precedente, quindi quando usi le word devi saltare di 2 in 2, quando usi un reale o una Dword di 4 in 4.

 

Nel tuo programma prova ad usare le MW0, MW2 e la MW4 vedrai che funziona.

 

Una domanda da principiante. Ma con il TIA Portal, non va in automatico a definire le aree di memori quando dichiari i Merker, di qualsiasi natura siano?

Link al commento
Condividi su altri siti

Se compili la prima variabile nella tabella dei tag e poi usi il mouse in discesa come si usa per excel ti indirizza le variabili successive in modo da non generare conflitti.

Devi mettere il mouse nell'angolo in basso a destra nella colonna del nome simbolico.

 

Link al commento
Condividi su altri siti

ivan.bortolin
1 ora fa, pigroplc scrisse:

Se compili la prima variabile nella tabella dei tag e poi usi il mouse in discesa come si usa per excel ti indirizza le variabili successive in modo da non generare conflitti.

Devi mettere il mouse nell'angolo in basso a destra nella colonna del nome simbolico.

 

 

È quello che mi hanno insegnato al corso e non ho mai avuto problemi. Grazie della precisazione.

Link al commento
Condividi su altri siti

Quote

 

Una domanda da principiante. Ma con il TIA Portal, non va in automatico a definire le aree di memori quando dichiari i Merker, di qualsiasi natura siano?

 

 

Le DB si, i merker no, puoi accedere alla stessa area merker come byte, work dword o addirittura bool nello stesso progetto.

Link al commento
Condividi su altri siti

Ho sbagliato, anche una DB non ottimizzata puoi puoi leggere la stessa area in formati diversi usando l'indirizzamento.

 

L'esempio più classico è usi una word di bit per gli allarmi e controlli la word per vedere se la macchina è in allarme.

Link al commento
Condividi su altri siti

Questione di gusti, ricordarsi che la word 0.2 occupa il byte 0.5 e 0.6 lo trovo macchinoso, e chissà quali byte occupa la word 256?

con siemens 

MW2 usa i byte 2 e 3

MW4 usa i byte 4 e 5

 

Come dice Batta per convenzione non si usano le word dispari e non ci trovo nulla di complicato.

 

Link al commento
Condividi su altri siti

Quote

tremendo, per fortuna non uso siemens

nel codesy è molto più furbo

%MW0.0 occupa %MB0.0 e %MB0.1

%MD0.0 occupa %MB0.0, %MB0.1, %MB0.2 e %MB0.3 che poi è %MW0.0 e %MW0.1

ma 

%MW0.2 occupa %MB0.5 e %MB0.6

%MD0.2 occupa %MB0.8, %MB0.9, %MB0.10 e %MB0.11 che poi è %MW0.5 e %MW0.6

molto più razionale perché rispetta l'identità delle locazioni

Come dice Acquaman, questione di gusti. Non vedo proprio cosa ci sia di tremendo.
Anzi, sinceramente, sarà perché ci sono abituato, ma mi pare più semplice l'indirizzamento a byte di Siemens. Che poi non si tratta di un indirizzamento "di Siemens", ma di un normalissimo indirizzamento a byte.

Se dichiaro una variabile DWord che parte dal byte n, so che occuperà i byte n, n+1, n+2, n+3, ovvero occupa 4 byte molto semplicemente a partire dall'indirizzo della dword.

Mi pare più comodo del dover calcolare che una DWord con indirizzo %MD0.n va ad occupare 4 byte a partire dall'indirizzo n*4, oppure due word a partire dall'indirizzo n*2.

 

Inoltre, se utilizzi i DB con attributo "Ottimizzato", usi solo il nome della variabile, e l'indirizzo addirittura sparisce. E questa è la tendenza generale non solo di Siemens: basta lavorare con gli indirizzi, si lavora solo col simbolico.

 

Poi, anche in Siemens puoi scrivere cose del tipo (valide anche con DB ottimizzato):

myWordDInt
myWordDInt.%Xn (dove n definisce il bit all'interno della dword)
myWordDInt.%Wn (dove n definisce la variabile INT all'interno della dword)
myWordDint.%Bn (dove n definisce il byte all'interno della dword)

Link al commento
Condividi su altri siti

Quote

L'esempio più classico è usi una word di bit per gli allarmi e controlli la word per vedere se la macchina è in allarme.

Questo si può ancora fare, ma nel TIA l'accesso con l'indirizzo assoluto viene visualizzato in giallo, ad indicare una procedura non ottimale.
Tra l'altro, inspiegabilmente, il cross reference del TIA è ancora lacunoso (uso un eufemismo) nel caso di accesso allo stesso indirizzo come word o come bit.
Soprattutto dalla V15, dove le istruzioni GATHER e SCATTER lavorano anche sulle strutture e non solo sugli array (come era nelle versioni precedenti), preferisco servirmi di queste istruzioni per gestire bit e word di allarme (o per altri usi). Tra l'altro, ti permettono anche di mantenere il DB ottimizzato, con vantaggi notevoli sui tempi di scansione.

Link al commento
Condividi su altri siti

2 ore fa, batta scrisse:


Soprattutto dalla V15, dove le istruzioni GATHER e SCATTER lavorano anche sulle strutture e non solo sugli array (come era nelle versioni precedenti), preferisco servirmi di queste istruzioni per gestire bit e word di allarme (o per altri usi). Tra l'altro, ti permettono anche di mantenere il DB ottimizzato, con vantaggi notevoli sui tempi di scansione.

a me sembra che vogliano solo complicarti l'esistenza, a volte rimpiango sempre di più il vecchio STEP7, nel farla facile sembra la voglian fare sempre più difficile

Link al commento
Condividi su altri siti

Quote

a me sembra che vogliano solo complicarti l'esistenza, a volte rimpiango sempre di più il vecchio STEP7, nel farla facile sembra la voglian fare sempre più difficile

Perché dici questo? Abbandonare gli indirizzi risulta molto comodo.
Riguardo poi il rimpiangere il vecchio Step 7, che dire...
A suo tempo, nel passaggio da Step 7 classico a TIA, anch'io, come tutti, ho inveito contro Siemens in lingue che nemmeno sapevo di conoscere.
Ora però, con un TIA ben più maturo e con una migliore conoscenza del TIA stesso, devo dire che non c'è un solo motivo per rimpiangere il vecchio Step 7.
Quando mi trovo a lavorare su progetti in Step 7, la prima cosa che faccio è controllare se l'hardware è supportato da TIA e, in caso positivo, faccio subito la migrazione.

Link al commento
Condividi su altri siti

Cesare Nicola
il 17/4/2019 at 09:10 , batta scrisse:

Abbandonare gli indirizzi risulta molto comodo.

Condivido al 100%. Lavorare con indirizzi, è una cosa che ormai mi sembra vecchia, seppure ci ho a che fare quotidianamente, per esempio per vecchi progetti STEP7 su cui si deve mettere mano o perché si usano PLC e pannelli non integrati nello stesso ambiente. Non capisco cosa ci sia di comodo nel doversi ricordare un numero, quando un nome tipo "Pulsante_marcia_pompa" dice già tutto: parla come mangi, insomma. 🙂 Questione di gusti, comunque, in ditta c'è chi usa, che ne so, M10.0 per il bit "manuale" da 20 anni e guai a cambiare. 🙂


 

Link al commento
Condividi su altri siti

Cesare Nicola
12 minuti fa, Yiogo scrisse:

non è una questione di gusti

la veriabili locali si gestiscono in simbolico perché comunque sono gestite solo dal programma stesso

diverso è il caso di quelle globali, se sono sono interne si può sempre lavorare con il simbolico ma se devo essere accessibili dall'estrno devo essere identificate con indirizzi, tipicamente mobbus

Certo, infatti specificavo che spesso non si può fare a meno di utilizzare gli indirizzi; per esempio, in questi giorni, sto lavorando a progetti con PLC Mitsubishi e pannello Kinco ed ovviamente ogni variabile che deve essere letta o scritta da Kinco, deve avere un suo indirizzo noto.

 

14 minuti fa, Yiogo scrisse:

poi attenzione  a non confondere l'indirizzo assoluto con l'indirizzo delle variabili che non è assolutamente la stessa cosa

l'indirizzo delle variabili è quello che dall'esterno le raggiunge, tipicamente %MW0.XXX, l'indirizzo assoluto è invece la locazione di memoria che contiene quel dato tipicamente espresso con un UDINT che punta alla locazione stessa, il protocollo nella comunicazione a livello di firmware riceve una chiamta all'indirizzo nominale della memoria e lo connette all'indirizzo assoluto che in fase di compilazione è implicitamente ottimizzato

OK, il PLC da qualche parte memorizza la variabile con un indirizzo, però questo, se ho ben inteso cosa intendi, per me è una cosa trasparente, non me ne devo interessare. Tornando all'esempio sopracitato, se una variabile in Mitsubishi so per certo che non andrà "all'esterno", non gli assegno alcun device ("indirizzo", in Mitsubishese); in realtà so che gli viene assegnato comunque, viene preso da un'area riservata e da qualche parte, non ricordo, è pure visibile, ma non me ne preoccupo.

Link al commento
Condividi su altri siti

Quote

che poi Siemens sia diverso da tutti gli altri è una storia vecchia, ma lo sappiamo, ma la cosa curiosa non è tanto il fatto che sia diverso dalla visione statunitense ma che sia anche molto diverso da codesys

Guarda che Siemens adotta un indirizzamento standard. Unica cosa che a volte dà un po' fastidio, è che lo standard scelto sia il Big endian, e quindi a volte sia necessario swappare i byte.
Ma, a parte questo, ripeto che mi pare molto più logico l'indirizzamento di Siemens rispetto quello del Codesys.
Perché devo fare i calcoli, se uso una INT o una DINT, per sapere quali byte vado ad occupare?

Non è più comodo definire, indipendentemente dalla dimensione della variabile, il byte da dove comincia?

Link al commento
Condividi su altri siti

Roberto Gioachin
20 ore fa, batta scrisse:

Ma, a parte questo, ripeto che mi pare molto più logico l'indirizzamento di Siemens rispetto quello del Codesys.

Non amo particolarmente Siemens ma mi tocca dire che sono d'accordo, naturalmente poi è una questione di abitudine, nessuno dei due sistemi è penalizzante rispetto l'altro.

Ma direi alla Siemens: per quale motivo durante la compilazione non è possibile rilevare la sovrapposizione di indirizzi espliciti su diverse variabili? altri costruttori lo fanno da anni.

Sarebbe sufficiente anche solamente un avviso, poi uno decide se intervenire o meno.

Link al commento
Condividi su altri siti

Quote

se associo la variabile ad un registro mobbus è impostante evitare gli overlap per cui mi interessa attribuire lesatta poszione

di fatto MD0.100 è davvero su MW0.200 ed MW0.201 non vedoperchè dovrei simulare che sia da un'altra parte

Appunto! Devo fare i calcoli per sapere che MD0.100 occupa MW0.200 e MW0.201.
Spiegami perché questo ti pare più semplice rispetto a MD100 che occupa MW100 e MW102 ovvero MB100, MB101, MB102, MB103? Non sto "simulando" che sia da un'altra parte, è esattamente lì. Non capisco dove sia la difficoltà. Forse nel dover tener conto che la prossima MD non sarà MD101 ma MD104? Non mi pare un gran problema.

Poi, torno a ripetere, l'indirizzamento adottato da Siemens non l'ha inventato Siemens, ma è solo uno dei vari tipi di indirizzamento comunemente usati.

 

Quote

nel presente è necessario che i sistemi comunichino tra loro per cui l'esatta aderenza a ModBusIDA per la comunicazione tra i diversi sistemi è fondamentale

Ma dove sta il problema? Leggo delle variabili da un sistema e le scrivo in un altro sistema. In qualsiasi sistema le variabili sono sempre a 1 bit, 8 bit, 16 bit, 32 bit, 64 bit... Al massimo, la cosa più complicata che devo fare è lo swap dei byte. Chi ha deciso che che il Vangelo deve essere ModBusIDA? Allora, io ti potrei dire: ma perché non usano tutti Profinet e basta? Ma poi, ripeto, se devo leggere un intero, significa che devo leggere 16 bit. E sono sempre 16 bit, in qualsiasi sistema.
Estendendo il discorso non solo agli indirizzamenti ma al linguaggio in generale, in modo da uniformare il codice (per quanto possibile), in base a quale principio si dovrebbe adottare Codesys piuttosto di un altro?
Se Codesys è il migliore, sarà il mercato a decretare la sconfitta degli altri. Per ora, non mi pare stia accadendo.

 

Link al commento
Condividi su altri siti

Quote

no !

dopo DM100 viene DM101 inn un sistema standard

e su Siemens che è vero il contrario

Ma chi l'ha deciso, continuo a chiedere. In questo standard, dopo MD100 viene MD101 (e mi devo sbattere per capire che MD100 si sovrappone a MW200, MW201, MB400,MB401, MB402, MB403.
Secondo un altro standard (che, ripeto, NON è uno standard Siemens), dopo MD100 viene MD104.
Non mi dire che basta così poco per crearti problemi, perché non ci credo.
Poi, a livello di comunicazione, che si usi un protocollo piuttosto che un altro, per chi programma non cambia assolutamente nulla.

Link al commento
Condividi su altri siti

5 ore fa, Yiogo scrisse:

per noi che facciamo automazione è davvero l'unico vangelo

non essere blasfemo visto che è Pasqua.

Casomai è un protocollo utilizzato da talmente tanto tempo che ha avuto molte applicazioni.

Comunque visto che definisci così ostico Siemens, io penso che sia altrettanto ostico pensare di usare la funzione 01 con indirizzo da 1 a 9999 per leggere dei bit di uscita, utilizzare la funzione 02 con indirizzo 10001 a 19999 per leggere input bit eccetera. 

L'unica volta che ho utilizzato Nodbus TCP l'ho trovato così poco intuitivo e così antiquato che l'indirizzamento Siemens è acqua minerale.

 

 

Link al commento
Condividi su altri siti

8 ore fa, Yiogo scrisse:

pensa che io numero anche i miei disegni ed i files di progetto  in esadecimale, presa l'abitudine è del tutto naturale

 

Scusami, ma io credo che sia puro masochismo. Poi pensa alle maledizioni che ti manderà chiunque avrà a che fare con i tuoi disegni:smile:

Link al commento
Condividi su altri siti

12 ore fa, Yiogo scrisse:

ti sembra difficoltoso perché insisti a ragionare in decimale,

si si infatti si tratta del mio personale punto di vista, anche se stupivo gli amici contando fino a 31 con le dita di una mano e ho memorizzato il pin del mio bancomat in esadecimale, ritengo che sia poco intuitivo....

Link al commento
Condividi su altri siti

La scelta della base è una pura convenzione. In informatica risulta comodo usare base 16 perché è base 2^4.

Per molti aspetti la base 16 è più efficiente della base 10.

Ma, informatica a parte, tutto il mondo usa una numerazione con base 10, e gli esseri umani imparano a contare sin dall'infanzia con questo sistema.

Quindi, quando esprimo un numero in formato decimale, ho ben presente a cosa corrisponda. Questo non accade col sistema esadecimale, perché non lo usiamo dalla nascita.

Se dico 100 in decimale, ho immediata percezione di quanti oggetti siano. Non c'è questa immediata percezione se dico 64Hex.

Prova poi ad incassare un assegno di FF euro, se ci riesci. O se un tuo fornitore ti presentasse un'offerta con gli importi in base 16. No mi dire che non faresti immediatamente la conversione in decimale.  

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