Vai al contenuto
PLC Forum


Snap7 E S7-1200 - Lettura Db E Merker


Messaggi consigliati

Ciao a tutti,

sto provando l'ottimo Snap7, ma ho problemi nella lettura dei DB e Merker presenti nella CPU.

Avendo pochissima pratica di S7, il problema dipende sicuramente dalla mia scarsa conoscenza

(io mi occupo solo del software sul PC, i programmi sulla CPU sono sviluppati e caricati da altri).

Ho dapprima fatto alcuni test con la demo presente nella cartella "rich-demos" della versone 1.2.1.

Mi sono collegato alla CPU con clientdemo (sulla CPU è caricato un semplicemente programma di test con un solo DB e tre Merker):

Dunque se uso clientdemo.exe e mi collego alla CPU (rack=0, slot=0) tutto va bene se provo a leggere le "system info" e i "digital imput".

Se invece provo a leggere un DB dalla tab "Data read/write" (DB Number =1, Start= 0, Amount=1) , ottengo il messaggio "CPU: Address out of range" ed una sfilza di zeri. Anche se cambio i parametri Start e Amount non succede niente. Se metto invece DB Number =2, ottengo "CPU: Item not available".

Se poi leggo i Merkers, nella barra di stato leggo "OK", ma tutti i campi riportano ancora uno $00.

I tre Merkers presenti nella CPU sono collegati a dei valori che posso cambiare tramite pannello KTP400. Ma comunque cambi questi valori, i Merkers letti con clientdemo.exe sono sempre tutti pari a zero. I digital inputs, invece, li leggo e cambiano coerentemente con i valori degli switch presenti sulla morsettiera.

Ho provato anche a scrivere un piccolo programmino in c# col wrapper dotnet, ma ottengo gli stessi risultati: ok per i digital imput, valori nulli per DB e Merkers.

C'è qualcosa che mi sfugge in merito ai DB e Merkers?

Grazie in anticipo per l'aiuto!

Link al commento
Condividi su altri siti


Ciao,

"Address out of range" sembra indicare un indirizzo fuori da quelli definiti nel DB, mentre con "CPU: Item non available" leggendo un DB, sembrerebbe indicare che il DB non esiste nel PLC; per i merker, invece, non capisco.

Prova a postare i pezzi di codice utilizzati per la lettura, specificando anche gli indirizzi definiti nei DB ...

Link al commento
Condividi su altri siti

Posso postare il codice volentieri, ma non credo dipenda da quello, perchè lo stesso comportamento ce l'ho con il demo già compilato (clientdemo.exe) che si trova nel pacchetto Snap7

Ecco nel frattempo degli screen shots che illustrano quanto detto: solo nel caso del digital input riesco a leggere qualcosa diverso da zero (fra l'altro gli otto bit della digital input sono associati ad un Merker di tipo Byte che però non riesco proprio a vedere)

DB:
http://tinypic.com/r/b7jedu/8

Merker:

http://tinypic.com/r/dy4nbc/8

Digital Input
http://tinypic.com/r/20gboy8/8

Poi, se serve, preparo gli spezzoni di codice.

Modificato: da gianorione
Link al commento
Condividi su altri siti

Snap7 l'ho usato in C++ con MFC in una applicazione che sta girando da agosto; purtroppo, non ho mai provato clientdemo, ma sono partito subito con il codice con una appicazione di prova che trovi (è parecchio disordinata ...); invece, trovi una raccolta di funzioni di ausilio alla Snap7.

Link al commento
Condividi su altri siti

Ciao,

Clientdemo è l'applicazione di riferimento, quella da lanciare se qualcosa sembra non andare nel nostro codice (anch'io faccio così).

Andiamo con ordine.

Problema DB:

L'errore "CPU: Address out of range" lo ottieni quando cerchi di leggere dei dati oltre il limite di esistenza, oppure, nel caso dei sistemi S71200/1500, quando il blocco è ottimizzato.

Qui, nel paragrafo S7 1200/1500 Notes trovi tutte le informazioni, al limite passale al programmatore PLC.

http://snap7.sourceforge.net/snap7_client.html#target_compatibility

L'errore "CPU: Item not available", come ti ha scritto drugo66 deriva dal fatto che DB 2 non esiste in memoria, è come se in un tuo programma facessi riferimento ad un'array non dichiarato.

Problema Merkers:

Quasi sicuramente MB0 viene sovrascritta nel programma PLC.

Prova a scrivere e successivamente leggere un'altra merker byte ad esempio MB100 (chiedi ai programmatori PLC se puoi farlo in sicurezza o fatti dare l'indirizzo di una parola non utilizzata nel programma).

Nella casella Start imposti 100, nella griglia valori scrivi $FF al byte 0, poi scrivi e successivamente leggi. Cosa accade ?

Saluti

Davide

Link al commento
Condividi su altri siti

Grazie ad entambi per le risposte.

Questione Merkers:
allora mettendo Start=100, ho scritto $FF al byte 0 e successivamente riletto il valore che è rimasto $FF
Ho spento e riaccesso la CPU ed il valore è tornato a $00, ma questo dovrebbe essere normale (credo).

le stesse cose accadono (ovviamente) anche col mio codice in C# usando il tuo wrapper per dotnet.

Modificato: da gianorione
Link al commento
Condividi su altri siti

Questione DB:

Non so quali siano le impostazioni del TIA portal sul suo PC, verificherò col programmatore.

Ora tornando al DB1, so che il programmatore PLC ne ha messo uno solo (lo ha fatto davanti a me ed ho seguito i passi).

Il DB si chiama "DB1_PC" e ci ha messo dentro tre Merkers di esempio:

1. merker di tipo bit associato ad un semplice codice che tramite KTP400 ne cambia lo stato toccando un bottone sul pannello TFT.

2. merker di tipo word 16 bit associato ad un campo di input sul KTP400: ci posso inserire un valore numerico sul pannello per cambiare il valore del merker

3. merker di tipo byte associato alla digital port: quando cambio gli ingressi digitali, cambia il valore del merker che posso leggere anche sul KTP400 associato ad un altro campo di tipo numerico.

Puo' essere che l'abbinamento dei Merkers ai campi del KTP00 ne impedisca la lettura? Staccando il KTP400, non cambia nulla però.

Comunque il DB in realtà non ci interessa per i miei scopi lato PC. L'unica cosa che ci serve per il nostro progetto è quella di poter leggere e/o scrivere dei Merkers al fine di poter comunicare tra PC e PLC.

Se i Merker vengono usati in un DB, devo poter aver accesso anche a tale DB per leggerli/scriverli, oppure mi basta solamente risolvere la questione dei Merkers?

Modificato: da gianorione
Link al commento
Condividi su altri siti

allora mettendo Start=100, ho scritto $FF al byte 0 e successivamente riletto il valore che è rimasto $FF

E' quello che immaginavo, quindi il programma PLC o quello nel pannello, azzerano MB0. Per conoscere il "colpevole" prova a disconnettere il pannello, scrivi e leggi MB0. Se leggi qualcosa !=0 allora è il pannello, altrimenti è il PLC.

Ho spento e riaccesso la CPU ed il valore è tornato a $00, ma questo dovrebbe essere normale (credo).

Si è normale, devi espressamente dichiarare le variabili merker che usi come ritentive o impostare nella configurazione del PLC il numero di bytes a partire da MB0 che vuoi rendere ritentivi.

Facci sapere

Link al commento
Condividi su altri siti

Ha ragione Dan, mi ero dimenticato del fatto che se i DB sono ottimizzati, Snap7 non li legge: dovresti dire al programmatore PLC di togliere il segno di spunta da "Blocco ottimizzato" nelle proprietà del blocco DB (tasto destro del mouse sul nome e poi Proprietà) che vuoi utilizzare, poi dovrà ricompilare e caricare il blocco così modificato.

Se i Merker vengono usati in un DB, devo poter aver accesso anche a tale DB per leggerli/scriverli, oppure mi basta solamente risolvere la questione dei Merkers?

I dati che crei in un DB globale non sono merkers, ma dati globali; i merkers esistono anche se non li usi, mentre i dati nei DB li devi creare compilando la tabella del blocco DB. Dovresti metterti d'accordo con chi ha scritto il programma PLC su cosa utilizzare: Snap7 è in grado di leggere e scrivere entrambi.

Ancora una cosa: se il dato è più grande del byte, devi creati una funzione che inverte i byte (swap - vedi i link che ti postato in #4), perchè SIemens lavora con i byte invertiti.

Link al commento
Condividi su altri siti

E' quello che immaginavo, quindi il programma PLC o quello nel pannello, azzerano MB0. Per conoscere il "colpevole" prova a disconnettere il pannello, scrivi e leggi MB0. Se leggi qualcosa !=0 allora è il pannello, altrimenti è il PLC.

Usando clientdemo ho provato a scrivere e rileggere MB0, con e senza pannello. In entrambi i casi leggo valori !=0.

Insomma con clientdemo riesco a modificare i valori del MB0, anche quando il pannello è attaccato.

Il mio problema è che ho tre merker nel PLC, questi sono diversi da zero perchè ne imposto i valori tramite pannello, ma semplicemente non riesco a vederli.

A quale indirizzo dovrebbero trovarsi? E possibile leggere l'indirizzo di un Merker col TIA portal? Io ne ho solo i nomi, il programmatore PLC mi ha dato solo quelli pensando che potessi accedere ai merker semplicemente tramite i loro nomi.

Modificato: da gianorione
Link al commento
Condividi su altri siti

I dati che crei in un DB globale non sono merkers, ma dati globali; i merkers esistono anche se non li usi, mentre i dati nei DB li devi creare compilando la tabella del blocco DB. Dovresti metterti d'accordo con chi ha scritto il programma PLC su cosa utilizzare: Snap7 è in grado di leggere e scrivere entrambi.

Il programmatore PLC ha creato tre "variabili" nel DB al quale ha associato i campi sul pannello KTP400. Lui li ha chiamati Merker e mi ha dato il nome ed il tipo. Pensavo di poterli leggere facilmente.

Nei prossimi giorni mi incontro col programmatore PLC per chiarire bene la cosa. Se avessi una licenza per il TIA un programmino semplice per fare le prove me lo potrei fare pure io da solo, fino a quel punto ci arrivo con step7.

Modificato: da gianorione
Link al commento
Condividi su altri siti

Usando clientdemo ho provato a scrivere e rileggere MB0, con e senza pannello. In entrambi i casi leggo valori !=0.

Insomma con clientdemo riesco a modificare i valori del MB0, anche quando il pannello è attaccato.

allora, tornando al primo post, funziona tutto : se leggi zero vuol dire che nei merkers c'è zero.

Lui li ha chiamati Merker

:o questo è un tantino strano per un programmatore PLC.

Ricapitoliamo qualche concetto, credo di aver capito la tua confusione, stai confondendo i merkers con i simboli.

I Merkers e le DB (Data Block) sono due aree di memoria distinte, non ha senso di parlare di "mettere dei merker all'interno di una DB.

I Merkers sono memoria statica, esistono sempre anche se non li dichiari esplicitamente.

Le DB esistono solo se le crei e le carichi all'interno del PLC.

All'interno del programma PLC puoi accedere a queste variabili in due modi : assoluto o simbolico.

Se dichiari un simbolo "temperatura" di tipo real all'inizio di una DB puoi referenziarlo come DB1."temperatura" oppure come DB1.DBD0 : doppia word (i real sono a 32 bit) a partire dall'indirizzo 0.

L'elenco dei simboli ed il loro indirizzo è nel database del programma, il PLC in memoria non lo conosce, quando il programma viene compilato lui lavorerà sempre con DB1.DBD0.

Snap7 non ha a disposizione i simboli del programma, per cui può accedere solo a DB1.DBD0.

Stesso discorso per i merkers, puoi associare ad essi un simbolo oppure referenziarli in modo assoluto MB0 (merker byte 0) MW0 (merker word 0) ecc..

Anche qui Snap7 vede solo gli indirizzi assoluti.

Infine, per mantenere il rapporto 1:1 fra simbolo della variabile e suo indirizzo fisico, bisogna evitare che TIA Portal ottimizzi l'area di memoria, motivo della spunta sulle proprietà delle DB.

Spero che ora sia più chiaro (altrimenti possiamo approfondire)

Ciao

Link al commento
Condividi su altri siti

Ti ringrazio, sei stato molto chiaro!

Lui ha denominato le tre variabili che ha usato nel DB come "merkerword", "merkerbit" e "merkerbyte"
Forse ho capito io male oppure questi nomi mi hanno confuso.

A questo punto mi leggo un po' di teoria, almeno di base sul simatic7, poi parlo col programmatore e ritorno qui.

Magari, se conoscete un tutorial base (lingua: ita, eng, deu) , giusto per capire questi concetti base, vi sarei grato... altrimenti mi sfoglio il manuale ufficiale siemens.

Mi occupo solo della programmazione lato PC, però un minimo di infarinatura s7 mi pare di capire che mi serve.

Grazie... per il momento :-)
Ciao.

Link al commento
Condividi su altri siti

Problema DB risolto:

L'errore "CPU: Address out of range" lo ottieni quando cerchi di leggere dei dati oltre il limite di esistenza, oppure, nel caso dei sistemi S71200/1500, quando il blocco è ottimizzato.

Effettivamente il blocco era ottimizzato. Con la trial del TIA mi sono scaricato in locale il programma della CPU, ho spuntato l'impostazione del blocco ottimizzato, ho inviato nuovamente il programma alla CPU e dopo queste operazioni sono riuscito a leggere il DB con SNAP7. Ora riesco a leggere e/o modificare le variabili presenti nel DB.

In allegato uno screen shot di quello che ho trovato nel DB.
L'uso della parola Merker mi aveva indotto a cercare nei Merkers, invece dovevo cercare nel DB che però non era accesibile per l'ottimizzazione.

Volevo chiedervi se l'uso di blocchi non ottimizzati può creare qualche drawback ai programmatori del PLC. Ora dovrò chiedergli di spuntare l'opzione nei loro programmi, ma non vorrei che questo gli possa procurare dei problemi.

Altrimenti dobbiamo provare a scambiarci le informazioni usando i Merkers (quelli veri).

Ancora grazie per le indicazioni.



post-211012-0-43837300-1413292267_thumb.

Link al commento
Condividi su altri siti

Con la trial del TIA mi sono scaricato in locale il programma della CPU, ho spuntato l'impostazione del blocco ottimizzato, ho inviato nuovamente il programma alla CPU

Lavoro notevole per un principiante del plc :thumb_yello:

Che io sappia non ci sono controindicazioni per l'uso di DB non ottimizzate, in ogni caso è sufficiente "non ottimizzare" solo la DB di scambio dati.

Link al commento
Condividi su altri siti

Lavoro notevole per un principiante del plc

;)

Già, mi sono dovuto arrangiare, altrimenti non riuscivo ad andare avanti, visto che quello del PLC mi ha detto che sarebbe venuto in settimana!

Ora cerco di farmi una full immersion di S7 nelle due settimane della trial :smile:... giusto quello che mi serve per capirci di più lato PC.

Modificato: da gianorione
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...