Buckler Inserito: 5 aprile 2019 Segnala Share Inserito: 5 aprile 2019 Ciao a tutti, è la prima volta che scrivo sul forum. Vado diritto al punto: sto cercando di utilizzare python-snap7 per leggere dei DB da un plc. Per il momento riesco a leggere e scrivere sulle aree di memoria usando le funzioni write_area e read_area. Tuttavia il metodo snap7.util.DB(..) sembrerebbe essere molto utile e dovrebbe failitare la lettura dell'intero DB. Non riesco però a capire come utilizzare i parametri ed in paricolare il significato specifico di uno di essi. Inoltre vorrei sapere come definire in maniera corretta il layout del DB. Il parametro che non capisco è id_field='ID', # field we can use to identify a row. che nell'esepio della documentazione (https://python-snap7.readthedocs.io/en/latest/util.html) è impostato appunto a 'ID' che corrisponde al secondo campo della prima riga del layout 4 ID INT Perchè? Che cosa sarebbe id_field? Quale significato ha? Va per forza definito nel DB? E se nel DB non è definito tale campo (leggre di seguito)? Nel mio caso ho un DB con il seguente layout: layout = """ 0.0 bitTest1 BOOL # bool test 1 0.1 bitTest2 BOOL # bool test 1 0.2 bitTest3 BOOL # bool test 1 0.3 bitTest4 BOOL # bool test 1 1 bytTest1 BYTE # byte test 2 intTest1 INT # test 4 relTest1 REAL # real test """ e uso la chiamata seguente per leggere i dati dal db client = snap7.client.Client() client.connect('192.168.59.80', 0, 0) # read whole db db_number = 520 all_data = client.db_get(db_number) db1 = snap7.util.DB( db_number, # the db we use all_data, # bytearray from the plc layout, # layout specification 8, # size of the specification 1, # number of row's / specifocations id_field=None, # field we can use to make row layout_offset=0, # sometimes specification does not start a 0 db_offset=0 # At which point in all_data should we start # parsing for data ) Così posso leggere i vari campi in questo modo print(db1[0]['intTest1']) Tuttavia non posso iterare il dizionario usando i classico for key, value in db1.items(): print(db1[0][key]) Traceback (most recent call last): File "/snap/pycharm-professional/125/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec exec(exp, global_vars, local_vars) File "<string>", line 1, in <module> AttributeError: 'DB' object has no attribute 'items' In sostanza vorrei sapere come utilizzare il campo id_fied correttamente e se ci sono delle migliorie che posso fare nel modo di leggere tali DB. Grazie in anticipo Link al commento Condividi su altri siti More sharing options...
del_user_97632 Inserita: 5 aprile 2019 Segnala Share Inserita: 5 aprile 2019 (modificato) prova for key, value in db1.index.items(): print(key, value) Modificato: 5 aprile 2019 da _angelo_ Link al commento Condividi su altri siti More sharing options...
Buckler Inserita: 8 aprile 2019 Autore Segnala Share Inserita: 8 aprile 2019 Ciao grazie per il suggerimento ma non va: Chiamando: db1.index Ottengo (lo stesso con lo snippet suggerito da te): Traceback (most recent call last): File "/snap/pycharm-professional/127/helpers/pydev/_pydevd_bundle/pydevd_exec2.py", line 3, in Exec exec(exp, global_vars, local_vars) File "<input>", line 1, in <module> File "/home/diego/project/Extruder/cable_monitoring/venv/lib/python3.6/site-packages/snap7/util.py", line 390, in __repr__ self.get_value(index, _type)) File "/home/diego/project/Extruder/cable_monitoring/venv/lib/python3.6/site-packages/snap7/util.py", line 409, in get_value byte_index, bool_index = byte_index.split('.') ValueError: not enough values to unpack (expected 2, got 1) Ovviamente andando in debug la variabile db1 non è un classico dizionario (vedi immagine allegata). POtrebbe essere una cosa legata al fatto che non utilizzo correttamente i parametri row_size, size e id_field della classe snap7.util.DB? In effeti non sono sicuro che impostare il numero di righe a 1 come ho fatto sia corretto. riporto il layout di prova che sto usando per ulteriore chiarezza. (come è possibile notare il nome è suddiviso in 2 pati separate da un punto. E' sbagliato pensare che dovrei ottenere un dizionario di dizionari con cui poter recuperare le informazione ad esempio così db1['PO']['a] ? """ 0 PO.a REAL 4 PO.b REAL 8 PO.c INT 10 PO.d BOOL 12 PO.e REAL 16 PO.f REAL 20 PO.g REAL 24 EPV.h INT 26 EPV.i INT 28 EPV.l INT 30 EPV.m INT 32 EPV.n INT 34 EPV.o INT 36 EPV.p INT 38 EPV.q INT 40 EPV.r REAL 44 EPV.s REAL 48 EPV.t REAL 52 EPV.u REAL 56 EPV.v REAL 60 EPV.z REAL 64 EPV.aa INT 66 EPV.bb REAL 70 EPV.cc REAL 74 EPV.dd REAL 78 EPV.ee INT 80 EPV.ff INT 82 EPV.hh INT 84 EPV.ii INT 86 EPV.ll INT 88 EPV.mm INT 90 EPV.non INT 92 EPV.oo REAL 96 EPV.pp REAL 100 EPV.qq REAL 104 EPV.rr REAL 108 EPV.ss REAL 112 EPV.tt REAL 116 EPV.uu INT 118 EPV.vv REAL 122 EPV.zz REAL 126 EPV.aaa REAL 130 CPV.bbb INT 132 CPV.ccc INT 134 CPV.ddd INT 136 CPV.eee INT 138 CPV.fff INT 140 CPV.hhh INT 142 CPV.iii INT 144 CPV.lll INT 146 CPV.mmm INT 148 CPV.nnn REAL 152 CPV.ooo REAL 156 CTPV.ppp INT 158 CTPV.qqq REAL 162 CTPV.rrr REAL 166 LPV.sss REAL 170 LPV.ttt REAL 174 LPV.uuu REAL 178 LPV.vvv REAL 182 LPV.zzz INT 184.0 LPV.aaa BOOL 184.1 LPV.bbb BOOL 186 LPV.ccc INT 188 LPV.ddd REAL 192 LIPV.eee REAL 196 LIPV.fff INT 198 LIPV.hhh REAL 202 LIPV.iii REAL 206 LIPV.lll REAL 210 LIPV.mmm REAL 214 LIPV.nnn INT 216 LIPV.ooo INT 218 LIPV.ppp REAL 222 LIPV.qqq REAL 226 LIPV.rrr REAL 230 TPV.sss REAL 234 TPV.ttt REAL 238 TPV.uuu REAL 242 TPV.vvv REAL 246 TPV.zzz REAL 250 TPV.aaaa INT 252 TPV.bbbb INT 254.0 TPV.cccc BOOL 254.1 TPV.dddd BOOL 256 TPV.eeee REAL 260 TPV.ffff REAL 264 PSP.hhhh REAL 268 PSP.iiii REAL 272 PSP.llll REAL 276 PSP.mmmm REAL 280 ESP.nnnn INT 282 ESP.oooo INT 284 ESP.pppp INT 286 ESP.qqqq INT 288 ESP.rrrr INT 290 ESP.ssss INT 292 ESP.tttt INT 294 ESP.uuuu INT 296 ESP.vvvv REAL 300 ESP.zzzz REAL 304 ESP.aaaaa REAL 308 ESP.bbbbb INT 310 ESP.ccccc INT 312 ESP.ddddd INT 314 ESP.eeeee INT 316 ESP.fffff INT 318 ESP.hhhhh INT 320 ESP.iiiii INT 322 ESP.lllll REAL 326 ESP.mmmmm REAL 330 ESP.nnnnn REAL 334 CSP.ooooo INT 336 CSP.ppppp INT 338 CSP.qqqqq INT 340 CSP.rrrrr INT 342 CSP.sssss INT 344 CSP.ttttt INT 346 CSP.uuuuu INT 348 CSP.vvvvv INT 350 CSP.zzzzz INT 352 CSP.aaaaaa REAL 356 CSP.bbbbbb REAL 360 CSP.cccccc INT 362 CSP.dddddd REAL 366 CSP.eeeeee REAL 370 LSP.ffffff REAL 374 LSP.hhhhhh REAL 378 LSP.iiiiii REAL 382 LSP.llllll REAL 386 LSP.mmmmmm BOOL 388 LSP.nnnnnn INT 390 LSP.oooooo REAL 394 LISP.pppppp REAL 398 LISP.qqqqqq INT 400 LISP.rrrrrr REAL 404 LISP.ssssss REAL 408 LISP.tttttt REAL 412 LISP.uuuuuu REAL 416 LISP.vvvvvv REAL 420 LISP.zzzzzz REAL 424 LISP.aaaaaa REAL 428 LISP.bbbbbb REAL 432 LISP.cccccc REAL 436 TSP.dddddd REAL 440 TSP.eeeeee REAL 444 TSP.ffffff REAL 448 TSP.hhhhhh REAL 452.0 EDPv.iiiiii BOOL 452.1 EDPv.llllll BOOL 452.2 EDPv.mmmmmm BOOL 452.3 EDPv.nnnnnn BOOL 454 EDPv.oooooo REAL 458 EDPv.pppppp REAL 462 EDPv.qqqqqq REAL 466 EDPv.rrrrrr REAL 470.0 EDPv.ssssss BOOL 470.1 EDPv.tttttt BOOL 470.2 EDPv.uuuuuu BOOL 470.3 EDPv.vvvvvv BOOL 472 EDPv.zzzzzz REAL 476 EDPv.uuuuuuu REAL 480 EDPv.vvvvvvb REAL 484 EDPv.zzzzzzz REAL """ Come leggereste voi questo db con la classe snap7.util.DB? Link al commento Condividi su altri siti More sharing options...
del_user_97632 Inserita: 8 aprile 2019 Segnala Share Inserita: 8 aprile 2019 Il dictionary pare sia in index.items ma probabilmente i "value" sono oggetti "row" o qualcosa del genere. Devi studiarti bene l'oggetto. https://github.com/gijzelaerr/python-snap7/blob/master/snap7/util.py Hai un piccolo db su file cosi provo ? Link al commento Condividi su altri siti More sharing options...
Buckler Inserita: 9 aprile 2019 Autore Segnala Share Inserita: 9 aprile 2019 Ciao, ho questo ma non ha i nomi composti come il precedente ( ovvero separati dal punto coe ad esempio 'PO.a') db2_layout = """ 0.0 bitTest1 BOOL # bool test 1 0.1 bitTest2 BOOL # bool test 1 0.2 bitTest3 BOOL # bool test 1 0.3 bitTest4 BOOL # bool test 1 1 bytTest1 BYTE # byte test 2 intTest1 INT # test 4 relTest1 REAL # real test """ vuoi che ti passi qualche altro tipo di file? Purtoppo non ho accesso al PLC e non ho il software per la suo programmazione. Sto cercando di accedere i dati dall'esterno e mi mancano sicuramente dei concetti lato PLC. Per questo chiedevo se era possibile avere una spiegazione dei parametri della funzione snap7.util.DB(..) un po' più dettagliati rispetto alla documentazione che mi hai linkato anche tu. In particolare non riesco a capire il significato dei parametri https://github.com/gijzelaerr/python-snap7/blob/master/snap7/util.py#L53 e https://github.com/gijzelaerr/python-snap7/blob/master/snap7/util.py#L55 (probailmente, spero ehehe, per via delle mie carenze nel modo PLC). PS. Ho notato inoltre che il tipo BYTE (vedi layout qui sopra) non sembra supportato, e andando a sbirciare i sorgenti di python-snap7, non ci sta un altro tipo lungo appunto un solo byte con cui poterlo sostituire. Consigli su questo? Grazie mille Link al commento Condividi su altri siti More sharing options...
Lupinn_III Inserita: 24 aprile 2020 Segnala Share Inserita: 24 aprile 2020 Ciao, sei riuscito a risolvere in qualche modo? Inoltre a questo io aggiungo il problema di dover leggere dei formati DInt, ma trovo documentazione solo per i dati real e Int. Grazie Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 25 aprile 2020 Segnala Share Inserita: 25 aprile 2020 Lupinn_III per favore leggi il regolamento. non ci si può accodare ad altre discussioni, ma bisogna aprire una nuova discussione. Questa poi e ferma da oltre un anno! Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati