Jump to content
PLC Forum


itel

Funzioni matematiche - moltiplica -

Recommended Posts

itel

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

Share this post


Link to post
Share on other sites

pigroplc

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

 

Share this post


Link to post
Share on other sites
batta

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.

Share this post


Link to post
Share on other sites
acquaman

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.

Share this post


Link to post
Share on other sites
itel

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

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
pigroplc

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.

 

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
acquaman
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.

Share this post


Link to post
Share on other sites
acquaman

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.

Share this post


Link to post
Share on other sites
Yiogo

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

Share this post


Link to post
Share on other sites
acquaman

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.

 

Share this post


Link to post
Share on other sites
batta
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)

Share this post


Link to post
Share on other sites
batta
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.

Share this post


Link to post
Share on other sites
leleviola
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

Share this post


Link to post
Share on other sites
batta
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.

Share this post


Link to post
Share on other sites
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. 🙂


 

Share this post


Link to post
Share on other sites
Yiogo

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

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

 

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
batta
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?

Share this post


Link to post
Share on other sites
Yiogo

direi proprio di non e ti spiego il perchè

se lavoro in simbolico perché la variabile non è esposta diventa tutto irrilevante

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

aggiungi a questo che oltretutto modbus ragiona in W non B per cui non ti trovi comunuqe

non ho mai detto che Siemens  non funziona, funziona come tutti gli altri, solo che vive nel suo mondo

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Yiogo

aggiungo un ulteriore aspetto, non si può più come nel passato pensaread un sistema monolitico dove "il padrone" scegle un vendor e tutti si devono accodare

nel presente è necessario che i sistemi comunichino tra loro per cui l'esatta aderenza a ModBusIDA per la comunicazione tra i diversi sistemi è fondamentale, ciò realizzato si liberalizza il vendor

Share this post


Link to post
Share on other sites
batta
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.

 

Share this post


Link to post
Share on other sites
Yiogo

no !

dopo DM100 viene DM101 inn un sistema standard

e su Siemens che è vero il contrario

 

ModBusIDA nelle sue 4 varianti (ModBusAscci, ModBusRTU, ModBusPlus e ModBusTCP) è l'unico standard open accettato da tutti

in origine era proprietario, ModBus non è altro cge la contrazione di Modicon BUS ma è di libero uso ed è riconosciuto da tutti, per noi che facciamo automazione è davvero l'unico vangelo

 

ProfiNET è un bus di campo, non è un bus di alto livello, non è paragonabile con ModBus, semmai lo puoi confrontare con CAN, Devicenet e altri bu di questo tipo

 

codesys sta crescendo in maniera espotenziale sei vuoi fare analisi di mercato

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...