Vai al contenuto
PLC Forum


Moka7 problemi in lettura


t0nin0

Messaggi consigliati

Buongiorno a tutti, ho un problema in lettura su PLC.

 

Per ovviare alla mancanza di compatibilità con la DBGET per leggere un'intera db, ho provato a leggere una area (metodo ReadArea) dalla posizione 0 per una determinata lunghezza.

 

res = plc.ReadArea(S7.S7AreaDB, dbarea, 0, size, Buffer);
System.out.println(plcAreaKey + " READ DBArea " + dbarea + " Start " + start + " Length " + length+ " Size " + (start+length) + " Result " + S7Client.ErrorText(res));
 

In modo che dopo vado a prendere tramite a ridimensionare il mio array solo con il contenuto che necessito

 

Buffer = Arrays.copyOfRange(Buffer, start, (start+length));

 

Per molti PLC funziona, per altri no.

 

Ricevendo i seguenti errori

 

SCARTO TEMPERATURA NOK READ DBArea 37 Start 44 Length 4 Size 48 Result Unknown error : 0x0

SCARTO PRESSIONE NOK READ DBArea 37 Start 48 Length 4 Size 52 Result Unknown error : 0x0

SCARTO EMERGENZA READ DBArea 37 Start 56 Length 4 Size 60 Result Unknown error : 0x0

STATO READ DBArea 30 Start 2 Length 2 Size 4 Result Unknown error : 0x0

ATTUALE TURNO 1 READ DBArea 38 Start 204 Length 4 Size 208 Result Unknown error : 0x0

ATTUALE TURNO 2 READ DBArea 38 Start 216 Length 4 Size 220 Result Unknown error : 0x0

ATTUALE TURNO 3 READ DBArea 38 Start 228 Length 4 Size 232 Result S7 Error reading data from the CPU.

TOTALE PEZZI BUONI READ DBArea 37 Start 36 Length 4 Size 40 Result Invalid S7 PDU received.

SCARTO COMPENSATORE READ DBArea 37 Start 52 Length 4 Size 56 Result S7 Error reading data from the CPU.

TARGET TURNO 1 READ DBArea 38 Start 200 Length 4 Size 204 Result S7 Error reading data from the CPU.

TARGET TURNO 2 READ DBArea 38 Start 212 Length 4 Size 216 Result S7 Error reading data from the CPU.

TARGET TURNO 3 READ DBArea 38 Start 224 Length 4 Size 228 Result S7 Error reading data from the CPU.

SCARTO PESO READ DBArea 37 Start 60 Length 4 Size 64 Result S7 Error reading data from the CPU.

TOTALE PEZZI READ DBArea 37 Start 40 Length 4 Size 44 Result Invalid ISO PDU received.

SCARTO SPESSORE READ DBArea 37 Start 64 Length 4 Size 68 Result Invalid ISO PDU received.

SCARTO PREFORMATO READ DBArea 37 Start 68 Length 4 Size 72 Result Invalid ISO PDU received.

PLCTURNO READ DBArea 38 Start 106 Length 2 Size 108 Result Invalid ISO PDU received.

 

 

Nello specifico

 

Result S7 Error reading data from the CPU

Result Invalid ISO PDU received

 

Non riesco a capirne il motivo, qualcuno ha avuto questi problemi?

 

Grazie

 

Link al commento
Condividi su altri siti


Prova ClientDemo.exe che trovi nella distribuzione di snap7.

 

Immagino che stai usando un S71200/1500 (sarebbe stata più utile come info che avere 100 righe di log tutte uguali :D )

 

Se ti ritorna Cli:Function refused by the CPU, allora qualche DB è ottimizzata o nel PLC non hai attivato GET/PUT.

Qui trovi maggiori info (al paragrafo S71200/1500)

 

Link al commento
Condividi su altri siti

Ciao Dan

con ClientDemo mi da:

AS Name SIMATIC 400 

Module Name CPU 414-2 DP

 

Quello che mi suona strano è che ad esempio sulla DB 38 riesco a leggere ma quando leggo su una lunghezza di 232 mi da errore (Reading Data from CPU).

 

Quindi non essendo un 1200/1500 e riuscendo a leggere delle variabili sullo stesso data block non mi spiego cosa c'è che non vada.

 

Se poi provo da ClientDemo tramite il tab Data Read/write impostando

Db number 38 

Start 0

Amount 232

Wordlen S7WLByte 

 

NON ricevo errori.

 

Sbaglio qualcosa?

 

Grazie

 

Link al commento
Condividi su altri siti

Ciao,

credo che ci stiamo incartando con Start, Amount e Size.

 

Lavoriamo su ATTUALE TURNO 3 che immagino sia il doppio intero DB38.DBD228

Perchè per leggere 4 byte leggi tutta la DB fino alla fine della variabile e poi estrai solo gli ultimi 4 byte ?

Nella chiamata a ReadArea leggi sempre a partire da 0.

 

ReadArea legge "Amount" bytes a partire dall'offset "Start" e li copia in Buffer sempre a partire dal byte 0

 

Se fai così

 

res = plc.ReadArea(S7.S7AreaDB, 38, 228, 4, Buffer);

 

Avrai

 

Buffer[0]<--DB38.DBB228

Buffer[1]<--DB38.DBB229

Buffer[2]<--DB38.DBB230

Buffer[3]<--DB38.DBB231

 

E non hai bisogno di Arrays.copyOfRange

 

Al limite, se ti può interessare:

AttualeTurno3=S7.GetDIntAt(Buffer,0,4);

 

Ti estrae il doppio intero aggiustando parte alta / parte bassa.

 

Link al commento
Condividi su altri siti

Ciao Dan,

Il motivo per cui leggo l'intera DB è perchè i tempi di lettura sono molto più alti che quelli dell'esecuzione del programma PLC.

 

Per leggere una singola variabile (anche da ClientDemo) ci impiega più di 45ms, il PLC impiega 20ms ad eseguire un ciclo intero.

 

Quindi leggendo una variabile che poi comparerò con l'altra rischio di avere dati sfasati in termini di aggiornamento, esempio

totale pezzi - totale pezzi buoni

 

Per ovviare ciò cercavo di leggere l'intera area (per poi estrarmi con la Arrays.copyOfRange la parte desiderata) considerando il massimo di amount dall'elenco delle variabili, in origine usavo la DBGET ma essa non è supportata da plc 1200 e 1500.

 

Se leggo direttamente l'area come da te indicato nel post precedente il tutto funziona, ma ho il problema descritto di sincronismo

 

Cosa ne pensi?

 

 

Link al commento
Condividi su altri siti

Ora è chiaro,

 

però tu inserisci 2 righe

 

res = plc.ReadArea(S7.S7AreaDB, dbarea, 0, size, Buffer);
System.out.println(plcAreaKey + " READ DBArea " + dbarea + " Start " + start + " Length " + length+ " Size " + (start+length) + " Result " + S7Client.ErrorText(res));

 

e 17 righe di log che provengono da System.out.println, la cosa più ovvia da pensare è che stavi facendo 17 letture consecutive.

 

Poi mi parli di DBGet che non puoi usare su 1200/1500 ma ClientDemo dice che sei connesso a:

AS Name SIMATIC 400 

Module Name CPU 414-2 DP

 

Mica ho la sfera di cristallo :roflmao:

 

Il ragionamento che fai, quello di leggere un blocco e poi elaborarlo è sicuramente giusto, per questo motivo ho creato la classe Helper S7 : prima leggi e poi spacchetti.

 

Il tuo è senz'altro un problema di superamento limite DB.

Nel tuo log fai stampare Size, non quello che ti calcoli ma quello che passi effettivamente a ReadArea e poi verifica che la dimensione della DB sia >= a Size.

 

Poi, ripeto, sei certo che le DB siano tutte non ottimizzate ?

 

 

Link al commento
Condividi su altri siti

Cao Dan,

grazie della tua risposta, e mi scuso perchè non avevo spiegato correttamente i vari punti nei post precedenti al tuo. ;(

 

Quello che non mi spiego e che tu giustamente mi dici:

Il tuo è senz'altro un problema di superamento limite DB.

 

La lettura con il comando

int res = plc.ReadArea(S7.S7AreaDB, 38, 0, 232, Buffer);

 

Dove mi restituisce l'errore:

ATTUALE TURNO 3 READ DBArea 38 Start 228 Length 4 Size 232 Result S7 Error reading data from the CPU.

 

Ma se provo la lettura con Client Demo non mi errore (schermata in allegato)

 

Quale può essere il motivo?

 

Nel tuo log fai stampare Size, non quello che ti calcoli ma quello che passi effettivamente a ReadArea e poi verifica che la dimensione della DB sia >= a Size.

Cosa intendi con la frase sopra? il mio Buffer è inizializzato con una grandezza pari a size (esempio 232)?

 

Grazie mille

 

Tonino

 

 

 

clientdemo.JPG

Link al commento
Condividi su altri siti

Quote

Cosa intendi con la frase sopra? il mio Buffer è inizializzato con una grandezza pari a size (esempio 232)?

 

Si, se leggi un'area di memoria devi passarli un buffer la cui dimensione è >= all'area letta.

Prova a mettere un breakpoint sull'istruzione di lettura.

Prima di chiamare la funzione Size quanto vale e Sizeof(Buffer) quant'è ?

 

E' strano quello che ti accade, ClientDemo usa un buffer interno di 64K, tanto per vedere, prova a definire private byte[] Buffer = new byte[2048] , hai lo stesso errore ?

Link al commento
Condividi su altri siti

int size = start + length;
Buffer = new byte[2048];
System.out.println("Buffer size " + Buffer.length);
res = plc.ReadArea(S7.S7AreaDB, (int) plcArea[0], 0, size, Buffer);
System.out.println(plcAreaKey + " READ DBArea " + db + " Start " + start + " Length " + length + " Size " + size + " Result " + S7Client.ErrorText(res));

 

Sia che metto al posto del 2048 la dimensione di size sia che uso 2048 ottengo

 

Buffer size 232
ATTUALE TURNO 3 READ DBArea 38 Start 228 Length 4 Size 232 Result S7 Error reading data from the CPU.

 

oppure

 

Buffer size 2048
ATTUALE TURNO 3 READ DBArea 38 Start 228 Length 4 Size 232 Result S7 Error reading data from the CPU.

 

 

Link al commento
Condividi su altri siti

ma plcArea[0] cosa contiene ?

Puoi postare il codice "reale" che usi ?

una volta scrivi dbarea, una volta 38 un'altra volta plcArea[0]

 

da quì 

res = plc.ReadArea(S7.S7AreaDB, (int) plcArea[0], 0, size, Buffer);
System.out.println(plcAreaKey + " READ DBArea " + db + " Start " + start + " Length " + length + " Size " + size + " Result " + S7Client.ErrorText(res));

capisco db ed è uguale a 38 ma non so quant'è plcArea[0].

 

Fai un watch delle variabili all'ingresso della funzione cosa contengono ???

Ho appena riprovato Moka7 con gli stessi parametri tuoi, passando S7AreaDB,38,0,Buffer e funziona perfettamente.

 

Puoi provare con un'altra DB ?

Link al commento
Condividi su altri siti

Ciao Dan, hai ragione per rendere più comprensibile il codice nel post avevo tradotto i nomi delle variabili e mi è sfuggito plcArea[0] che è l'elemento di un array dove sono inseriti :

- "indirizzo_area" (posizione 0) 

- "indirizzo_start" (posizione 1)

- "lunghezza" (posizione 2)

- "bit" (posizione 3)

 

https://drive.google.com/file/d/0B8rOQu449I6GQ0M0R3E1b2pNZ1U/view?usp=sharing

 

Qua c'è il codice che uso fatto in jsp (per un test vengono effettuat più letture sulla stessa DB, ma in futuro come già spiegate le ragioni voglio fare solo una lettura per DB), se provo a leggere i dati su un'altra DB (ad esempio la 37 vedi il mio primo post) FUNZIONA, sulla 38 ho  Result S7 Error reading data from the CPU.e su altre  Result Invalid ISO PDU received.

 

Quello che non mi spiego è continuo a non capire è perchè :

- se leggo in maniera mirata la DB per quel determinato punto di start e lunghezza funziona, mentre leggendo la variabile da 0 fino a quel punto di size (punto di start + size) ottengo errori

- sembr che su una DB funzioni  (la 37) mentre su altre no

 

Grazie 

 

Link al commento
Condividi su altri siti

Il codice sambra Ok, d'altra parte su altre DB ti funziona.

Ti rimane da capire cosa ha la DB38 che non va.

 

Quanto è grande DB38 nel PLC ? 

Che PLC usi (non è ancora chiaro) ?

Se non è un S71200/1500 con ClientDemo vai in "Directory", e visualizza Info di DB38. Quant'è "MC7 Size" ?

 

 

Link al commento
Condividi su altri siti

Il PLC dovrebbe essere un  SIMATIC S7-400 con CPU 414-2.

 

Ecco cosa mi dice Block Info sotto directory

 

Block Type   : DB
Block Number : 38
Block Lang   : DB
Block Flags  : 00000001
MC7 Size     : 1000
Load Size    : 1318
Local Data   : 0
SBB Length   : 246
CheckSum     : $5BE6
Version      : 0.0
Code Date    : 2015/12/15
Intf.Date    : 2015/12/15
Author       : 
Family       : 
Header       : 

 

 

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