Vai al contenuto
PLC Forum


spiegazione python-snap7 del metodo snap7.util.DB(..)


Buckler

Messaggi consigliati

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


del_user_97632

prova

 

for key, value in db1.index.items():

  print(key, value)

 

 

Modificato: da _angelo_
Link al commento
Condividi su altri siti

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?

debug_db1.png

Link al commento
Condividi su altri siti

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

  • 1 year later...

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

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

Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...