Vai al contenuto
PLC Forum


Plc Nuovi Con Allocazione Dinamica Della Memoria - come si fa poi a fare l'HMI ?


MrC

Messaggi consigliati

I nuovi ambienti di sviluppo PLC permettono un'allocazione automatica delle aree di memoria, e quindi di lavorare semplicemente con nomi simbolici, senza sapere effettivamente quale sia l'indirizzo fisico della variabile, che appunto viene deciso dal compilatore prima di scaricare l'applicazione nel PLC.

In questa situazione, come si fa a progettare l'HMI ?

Link al commento
Condividi su altri siti


Claudio Monti

Io sto utilizzando gia' da tempo Unity della =S= che ti permette questo, ma anche altri produttori si stanno muovendo in questa direzione.

La comodita' e' enorme, le possibilita' che offre sono molteplici... pero' come giustamente dici tu rompe le balle x lo scambio dati con HMI.

Io mi comporto cosi':

forzo un'allocazione di memoria per tutto cio' che riguarda lo scambio con aventuali HMI.

L'altra soluzione sarebbe quella di usare un OPCserver, ovviamente devi avere anche il terminale che ti permette di utilizzarlo.

Link al commento
Condividi su altri siti

Il vecchio protool Siemens permetteva di integrare il progetto di Step7, in modo da condividerne le variabili ...

Forse i tempi non erano maturi, ma sarebbe auspicabile che i produttori di HMI si muovessero in questa direzione: bisogna che in qualche modo si lavori in simbolico (magari importando le variabili dal sw PLC) e che poi in qualche modo riescano a leggere le locazioni di memoria assegnate dal compilare del PLC, altrimenti questo diventa un limite abbastanza fastidioso!

Link al commento
Condividi su altri siti

Il vecchio protool Siemens

il nuovo wincc flex , lo fa' ancora meglio

uno dei punti a favore di siemens credo sia proprio il fatto di poter lavorare con simbolico o con indirizzo fisico allo stesso momento , utilizzando uno o l'latro metodo a seconda del piacere personale ( o della velocita' in base a quello che si sta facendo )

Ciao Claudio

Luca

Link al commento
Condividi su altri siti

Claudio Monti

OK, ma mi sembra che il quesito iniziale fosse un altro:

non si tratta di avere la pox di importare le variabili dal progetto o di scegliere se usarle solo con simbolico o con indirizzo... questo lo fanno tutti i sw (piu' o meno...)

Pensa che il buon vecchio XBTL1000 della Schneider, anche versioni vecchissime, potevi condividare le variabili del progetto PLC e se lo variavi te lo aggiornava direttamente...

Il discorso e':

se ho delle variabili NON allocate, cioe' senza indirizzo fisico %MWx, ome faccio a scambiarle con il pannello operatore?

Dalle info che ho lo si puo' fare SOLO attraverso un OPC, ma non ho provato quindi riporto cio' che ho solo sentito dire... :(

Link al commento
Condividi su altri siti

Il discorso e':

se ho delle variabili NON allocate, cioe' senza indirizzo fisico %MWx, ome faccio a scambiarle con il pannello operatore?

Si, il discorso è questo, appunto ...

Quasi tutti possono usare il simbolico, ma poi, queste variabili simboliche, le devi scambiare con degli indirizzi del PLC che DEVI CONOSCERE .. altrimenti .. se ti vengono proposti e cambiati automaticamente dal software PLC .... resti fregato ogni volta!

Modificato: da MrC
Link al commento
Condividi su altri siti

Claudio Monti

Da quello che so e che ho provato, se tu una variabile di tipo INT la chiami Pippo questa rimane cosi' ed il sw del PLC la alloca dove meglio crede (e a te non interessa).

Se la devi scambiare con un HMI la chiami Pippo ed in piu' le associ un indirizzo di memoria specifico (ad es. %MW100).

A questo punto il tuo HMI leggera' la %MW100 e fin qui rimane tutto come prima.

Se ti appoggi ad un OPC, devi dirgli che la variabile Pippo del PLC Pluto la puoi scambiare con l'HMI Paperino (e qui non so darti delle dritte perche' non l'ho mai provato, forse devi anche associargli un indirizzo... :( )

Link al commento
Condividi su altri siti

Confermo che con OPC devi solo indicare il nome della/delle variabili.

Non importa dove sono allocate.

Il PLC che uso normalmente alloca automaticamente le variabili, e la differenza tra usare OPC e usare un HMI "normale" sta tutta qui: se usi OPC e aggiungi una variabile, lui te la linka ( linka ??? ) correttamente, se usi HMI e la nuova variabile viene messa, ad esempio, a metà della zona di memoria dedicata, tutte le variabili sucessive sono shiftate, e se non ci pensi prima puoi combinare un bel casino.

Link al commento
Condividi su altri siti

Cristina Fantoni

Anche CoDeSys ha l'allocazione automatica delle variabili, ed e' semplicissimo, quando e' necessario metterle a disposizione di altri PLC e/o HMI, allocarle in un indirizzo di memoria.

In CoDeSys funziona cosi':

Mw_Pippo AT %MW250: WORD; (*commento: variabile allocata*)
Mf_Pluto: REAL:=0.1; (* commento: variabile non allocata con inizializzazione*)

Di primo acchito sembra una complicazione, ma quando ci hai fatto la mano, poi se non c'e' ti manca :unsure:

:wub:

Link al commento
Condividi su altri siti

Brava Cristina, :clap: .

Non ho mai provato sul sistema che uso quel tipo di definizione.

Mi sembra un'ottima idea, appena ne ho l'occasione proverò a "fissare" qualche variabile in quel modo, così, giusto per sapere se anche in altri sistemi funziona.

Link al commento
Condividi su altri siti

Vebbè ma scusate .. se associamo le variabili ad indirizzi fissi, non usiamo più l'allocazione automatica delle aree di memoria, e quindi non si utilizza questa funzionalità, che è una delle poche novità degli ultimi anni ...

Forse la soluzione buona è quella di Caludio, che ne associa solo alcune, e cioè quelle che intende poi usare nell'HMI !!!

Tuttavia, spero che i produttori di HMI ci pensino, e trovino il modo di far interagire i loro prodotti con il compilatore del Sw plc (anche se penso che questo potrebbe avvenire solamente tra prodotti della stessa marca ..)

Link al commento
Condividi su altri siti

Io attualmente faccio come Claudio..

Dichiaro un'area di memoria fissa in continuo scambio coll'HMI...le allocazioni automatiche le appoggio a tale area...

Utilizzo aree di memoria contigue per non fare saltare la supervisione in lettura da un area all'altra.......

Quindi per esempio

DM0-DM1000= aree di memoria di interfaccia.

Mov IR0-IR10=DM0-DM10

Mov DM4000-DM4010=DM11-DM21

Mov pippo =DM22..

E cos'ì via....fino adesso mi è sembrato l'unico modo per ovviare al cambio di allocazione memoria deciso dal PLC in fase di download.

Link al commento
Condividi su altri siti

se associamo le variabili ad indirizzi fissi, non usiamo più l'allocazione automatica delle aree di memoria, e quindi non si utilizza questa funzionalità, che è una delle poche novità degli ultimi anni ...

Hai ragione , questa si chiama Mappatura, nei protocolli nativi NON SERVE, non c'entra niente OPC (caso A.B) , ma la sintassi del protocollo richiama la variabile strutturata dichiarata dal lato controller, in questo caso si punta al nome e non ad un file (N,B o altro)

Link al commento
Condividi su altri siti

Cristina Fantoni
Vebbè ma scusate .. se associamo le variabili ad indirizzi fissi, non usiamo più l'allocazione automatica delle aree di memoria, e quindi non si utilizza questa funzionalità, che è una delle poche novità degli ultimi anni ...

In effetti io ho scritto:

quando e' necessario metterle a disposizione di altri PLC e/o HMI

il che significa che non si fa l'allocazione di tutte, ma solo di quelle che devi scambiare, che sono una minima parte.

Ora, per esempio, sto collaudando un impianto con 3 PLC, con il pannello operatore, ogni CPU funziona per suo conto e le variabili allocate sono solo quelle che devono essere lette/scritte tramite il pannello, che sono un numero limitato, idem ho fatto in un impianto dove di PLC ce ne erano 11... :)

Tutto il resto delle variabili del programma e' gestito internamente al PLC

Brava Cristina, .

Non ho mai provato sul sistema che uso quel tipo di definizione.

Grazie, troppo buono... :blush:

Ti riferisci forse alla definizione 'Mw_pippo' e 'Mf_pluto'??? In effetti so che sono molto originali... :lol:

:wub:

Modificato: da Cristina Fantoni
Link al commento
Condividi su altri siti

Ti riferisci forse alla definizione 'Mw_pippo' e 'Mf_pluto'??? In effetti so che sono molto originali...

:blink: ..... :rolleyes: ........ :lol::lol: ...... :roflmao:

No Cristina, parlando seriamente mi riferivo a:

.....AT %MW250: WORD;

E' quel " AT %... " che non mi era mai venuto in mente di provare...

Link al commento
Condividi su altri siti

In Passato ho lavorato con pannelli che importavano la dichiarazione delle variabili dal plc (o controllo che dir si voglia).

Bello: in realtà il compilatore generava durante la compilazione un piccolo file di testo contenente gli identificatori e loro indirizzo fisico... Il software del pannello importava quel file associando simbolo ad indirizzo.

Quando si ricompilava sul controllo bisognava re-importare il file dei simboli, e riscaricare il progetto del pannello (anche se nel pannello non si era variato niente).

In pratica tanto bello non era: si sprecava un sacco di tempo a riscaricare il pannello senza averlo modificato.

Adesso lavoro con oggetti che richiedono la dichiarazione esplicita degli indirizzi delle varibili coinvolte nella comunicazione e relativa ridichiarazione delle variabili nel pannello...

A conti fatti spreco meno tempo.

Saluti a tutti

Link al commento
Condividi su altri siti

I nuovi ambienti di sviluppo PLC permettono un'allocazione automatica delle aree di memoria
Beeh, non solo i nuovi.. anche i vecchi da 20 anni fa'.

Poi, direi che tutti i PLC permetterebbero un'allocazione automatica delle aree di memoria... bastarebbe che il SW d'interfaccia lo permetta. Ad esempio Simatic APT emula l'allocazione automatica su la famiglia di CPU Simatic Ti CPU 505-575... quando incambio il SW Tisoft non lo consenterebbe.

se ho delle variabili NON allocate, cioe' senza indirizzo fisico %MWx, ome faccio a scambiarle con il pannello operatore?
Comunque non vedo il problema... perche il HMI dovrebbe puntare su dei tags allocati su queste aree che sarebbero piuttosto delle aree globali private oppure locali delle funzioni del PLC e non d'interfaccia col HMI ??
Dalle info che ho lo si puo' fare SOLO attraverso un OPC, ma non ho provato quindi riporto cio' che ho solo sentito dire
molto interessante...

Col vecchio OPCAutoSA2.dll della Schneider : L"Schneider-Aut.OFS" impostavo l'indirizzo fisico..

OPCITEMDEF ItemDef[1]; // Crea l'item
BSTR bsItem = NULL;
CString    m_strItem1;
m_strItem1 = _T("UNTLW01:0.254.0!%MW200"); // locazione del byte da leggere
bsItem = m_strItem1.AllocSysString();// alloca memoria per un byte
ItemDef[0].szItemID     = bsItem; // legge byte
..

Comunque, se si vorebbe indirizzare un area di allocazione automatica, si dovrebbe avere la specifica della stringa variabile che rapressentarebbe l'offset per l'area PLC assegnato ..Specification, logic and matemathics..!

Link al commento
Condividi su altri siti

X MR69:

Interessante la tua esperienza .. l'idea mi sembra molto buona, ok, bisogna aggiornare ogni volta il pannello, ma attualmente una connessione usb permetterebbe un update veloce, rispetto ad una porta seriale, quindi il problema potrebbe essere risolto abbastanza semplicemente!

Potresti per favore citare quale marca usava questo sistema?

Grazie

Link al commento
Condividi su altri siti

OPCITEMDEF ItemDef[1]; // Crea l'item

BSTR bsItem = NULL;

CString m_strItem1;

m_strItem1 = _T("UNTLW01:0.254.0!%MW200"); // locazione del byte da leggere

bsItem = m_strItem1.AllocSysString();// alloca memoria per un byte

ItemDef[0].szItemID = bsItem; // legge byte

Scusate, forse qualche commento non e' a posto..

OPCITEMDEF ItemDef[1]; // Define l'item
BSTR bsItem = NULL;
CString    m_strItem1;
m_strItem1 = _T("UNTLW01:0.254.0!%MW200"); // locazione del byte da leggere
bsItem = m_strItem1.AllocSysString();// alloca memoria per un byte
// setup
ItemDef[0].szAccessPath = L"";
ItemDef[0].szItemID     = bsItem;
ItemDef[0].bActive      = TRUE;
ItemDef[0].hClient      = 1;
ItemDef[0].dwBlobSize   = 0;
ItemDef[0].pBlob        = NULL;
ItemDef[0].wReserved    = 0;
ItemDef[0].vtRequestedDataType = VT_EMPTY;
// Crea item
HRESULT hr;
hr = m_IOPCItemMgt->AddItems(1, ItemDef, ...., ....);
    ::SysFreeString(bsItem);
....
..
// legge byte
hr = m_IOPCSyncIO->Read(OPC_DS_DEVICE, .......)
.......
..etc..

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