t0nin0 Inserito: 7 dicembre 2016 Segnala Share Inserito: 7 dicembre 2016 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 More sharing options...
dan64100 Inserita: 7 dicembre 2016 Segnala Share Inserita: 7 dicembre 2016 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 ) 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 More sharing options...
t0nin0 Inserita: 9 dicembre 2016 Autore Segnala Share Inserita: 9 dicembre 2016 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 More sharing options...
dan64100 Inserita: 9 dicembre 2016 Segnala Share Inserita: 9 dicembre 2016 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 More sharing options...
t0nin0 Inserita: 9 dicembre 2016 Autore Segnala Share Inserita: 9 dicembre 2016 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 More sharing options...
dan64100 Inserita: 9 dicembre 2016 Segnala Share Inserita: 9 dicembre 2016 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 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 More sharing options...
t0nin0 Inserita: 13 dicembre 2016 Autore Segnala Share Inserita: 13 dicembre 2016 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 Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 13 dicembre 2016 Segnala Share Inserita: 13 dicembre 2016 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 More sharing options...
t0nin0 Inserita: 13 dicembre 2016 Autore Segnala Share Inserita: 13 dicembre 2016 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 More sharing options...
dan64100 Inserita: 13 dicembre 2016 Segnala Share Inserita: 13 dicembre 2016 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 More sharing options...
t0nin0 Inserita: 14 dicembre 2016 Autore Segnala Share Inserita: 14 dicembre 2016 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 More sharing options...
dan64100 Inserita: 14 dicembre 2016 Segnala Share Inserita: 14 dicembre 2016 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 More sharing options...
t0nin0 Inserita: 14 dicembre 2016 Autore Segnala Share Inserita: 14 dicembre 2016 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora