labri95

Snap 7 Python Logo siemens

30 messaggi in questa discussione

ciao a tutti
ho comprato queste estate mentre ero in ferie un raspberry e ho incominciato a leggere qualcosina su python. ho scoperto poco dopo che addirittura lo potevo interfacciare con il logo. BELLISSIMO!! ma non riesco...


import snap7
plc=snap7.client.Client()
plc.set_connection_params("192.168.1.102",0x0300,0x0200)
plc.connect("192.168.1.102",0,1)
plc.get_connected()
True
arrivo fino a qui ...

 

come posso comandare uscita Q1 tramite la variabile NI1

 

sono ormai giorni che tento di leggere o di poter scrivere una variabile con python ma senza sucesso. 
per capire meglio come funziona posso avere un esempio ??

Grazie 
 

Immagine.png

Condividi questa discussione


Link discussione
Condividi su altri siti

l'oggetto "plc" oltre ai metodi  connect()  e getconnected() , quali altri metodi offre?

 

Condividi questa discussione


Link discussione
Condividi su altri siti

mi fai una domanda che non ti so rispondere..

 

ho provato un infinita di volte a scrivere:

plc.db_write( ma qui non conosco la sintassi)

plc.db_read(          )

Condividi questa discussione


Link discussione
Condividi su altri siti

1) stai guardando la documentazione di snap7 ?

2) logo è supportato da snap7 ?

3) sempre che sia possible , nel logo quale area viene utilizzata , tipo DB1 o altro ...?

4) se usi plc.dbwrite() , dopo l'apertura della prima parentesi vedrai la lista e il tipo di parametri da passare , questo se usi visual studio che ha l'intellisense

Ovviamente se usi IDLE per python non vedrai nulla ed avrai maggiori difficoltà .

Puoi installare visual studio 2015 che è gratis ed usare c# , oppure installare il plugin di python che ha l'intellisense

Diversamente devi leggerti e capire la documentazione.

Il plc.dbwrite()  vuole come parametri alcuni oggetti che chiama 

Result = Client.DBWrite(DBNumber, 0, Size, DB702);

questo è una parte di codice che sto utilizzando in c# , i parametri sono oggetti di tipo array di byte etc 

 

Condividi questa discussione


Link discussione
Condividi su altri siti

ho iniziato a leggere qualcosa cu questo sito: http://python-snap7.readthedocs.io/en/latest/

si il logo e supportato da snap7

per il resto non so risponderti devo documentarmi ancora di piu. se hai qualche link che mi possa aiutare

anche con esempl semplici sarebbe utile per me.

torno a ripetere e un mese che ho raspberry e con pythom mi sono divertito a 

spegnere e accendere qualche led, anche le mie basi di python sono uguali a zero ma piano piano mi

piacerebbe saperne di piu..  

Condividi questa discussione


Link discussione
Condividi su altri siti

bravo , piano piano imparerai .Leggi bene la documentazione e cerca di capire se logo offre un DBn , n=numero del DB, che poi lo facciamo funzionare non ti preoccupare.

Può essere che il logo non supporta il writeDB, vedi che ci sono altri metodi con suffisso write ma con prefisso diverso da DB ....provane qualcuno

Condividi questa discussione


Link discussione
Condividi su altri siti

Per intanto grazie. 

Condividi questa discussione


Link discussione
Condividi su altri siti
plc.set_connection_params("192.168.1.102",0x0300,0x0200)
plc.connect("192.168.1.102",0,1)

Non è corretta, quando usi set_connection_params devi usare connect() altrimenti vai a sovrascrivere i TSAP.

Premesso che non programmo in Python per motivi religiosi, mi sono accorto che chi ha scritto il wrapper ha dimenticato di mappare la funzione Cli_Connect(), per cui dovresti aggiungere nella libreria base:

 

@error_wrap
    def connect(self):
        """
        Connect to a S7 server using previous set parameters
        """
        logger.info("connecting")

        return self.library.Cli_Connect(
            self.pointer)

Ho mandato comunque una notifica a Gijs.

 

Per la lettura/scrittura la sintassi  segue quella della libreria base che trovi quì e nel manuale.

In particolare, se la connessione è andata a buon fine, ti conviene usare db_read(NumeroDB,Start,Size) e db_write(NumeroDB,Start,Size,Data).

 

NumeroDB è sempre 1 perchè il LOGO mappa tutte le risorse in un'area di memoria che viene vista dall'esterno come DB1:

http://snap7.sourceforge.net/logo.html

 

Start è l'offset dal quale cominciare a leggere/scrivere e Size è il numero di byte che vuoi leggere/scrivere.

db_read ti ritorna un buffer con i dati che hai richiesto

in db_write i dati li devi precedentemente inserire in Data

 

Qualche esempio lo trovi quì

 

Condividi questa discussione


Link discussione
Condividi su altri siti
Quote

Premesso che non programmo in Python per motivi religiosi,

 

 

Perbacco è la prima volta che sento di precetti religiosi che vietano l'uso di determinati linguaggi di programmazione.:smile:

Condividi questa discussione


Link discussione
Condividi su altri siti
Quote

NumeroDB è sempre 1 perchè il LOGO mappa  .....

E' come pensavo ,DB1 come fu per S7-200 con micro-computing , opc server e quindi anche Snap7.

 

Condividi questa discussione


Link discussione
Condividi su altri siti

Gentilissimi tutti.

mi mettero a leggere e documentarmi il piu possibile e un ambente che mi affascina e vorrei davvero comprenderlo..

per intanto qualcosa inizia e essere un po piu chiaro.

 

Grazie Mille

 

 

 

Condividi questa discussione


Link discussione
Condividi su altri siti
plc = snap7.client.Client()
plc.connect('192.168.200.24', 0, 3)

reading = plc.db_read(1, 0, 1)       # leggi 1 byte dal db 1 a partire dal byte 0
snap7.util.set_bool(reading, 1, 1)   # imposta a 1 il bit 1 del byte 0
plc.db_write(reading, 1, 0, 1)       # write back the bytearray and now the boolean value is changed 
                                     #  in the PLC.

prova a vedere se fa qualcosa....

Condividi questa discussione


Link discussione
Condividi su altri siti

questa sera al rientro a casa ti aggiorno.

grazie..

Condividi questa discussione


Link discussione
Condividi su altri siti

ho provato il tuo esempio:

 

import snap7

plc = snap7.client.Client()

plc.connect("192.168.1.102",0,1)

plc. get_connected()

reading = plc.db_read(1, 0, 1)

snap7.util.set_bool(reading, 1, 1)

plc.db_write(reading, 1, 0, 1)

 

ottengo questo tipo di messaggio:

Traceback (most recent call last) ;

    File "/home/pi/Esempio.py" line 6. in <module>

        snap7.util.set_bool(reading, 1, 1)

TypeError: set_bool() takes exactly 4 arguments (3 given)

 

 

Condividi questa discussione


Link discussione
Condividi su altri siti

dice che manca un parametro alla funzione set_bool .....

comunque considera di creare un DB e lo chiami  DB1 che deve essere un array di bytes , in python vedi tu .

Prima di scrivere l'array di bytes , che contiene anche i tuoi bits, con questo metodo ( io uso c# tu adattalo a python) 

 Result = Client.DBWrite(DBNumber, 0, Size, DB1);

Dove : 

DBNumber=1

0=inizio 

Size=dimensione dell'array , se vuoi spedire tutto l'array

DB1=array di byte di dimensione Size

Devi riempire ogni singolo byte con i singoli bit in base alle tue logiche con questa, prima di spedire l'array di bytes, per cui

 S7.SetBitAt(ref DB1, Pos, Bit, Value);

Dove:

DB1 = il tuo array di bytes

Pos= intero, indica quale byte dell'array stai manipolando

Bit=short, indica quale bit del byte indicato sopra vuoi impostare

Value=Valore da attribuire al bit , che puo' essere 0-1 o false-true 

1) crei i tuoi oggetti , array etc

2) riempi i bit di ogni byte dell'array

3) spedisci l'array di byte 

Pero' se non hai cooscenze sulla programmazione tipo C o C++, java o C# , o men che meno python ...la vedo dura fare queste cose .Prova

Condividi questa discussione


Link discussione
Condividi su altri siti

non vorrei arrendermi ma un po e complicato. senza un esempio che mi possa far capire 

lo e ancora di piu. cerchero di leggere il piu possibile ma mancano le basi :wallbash: 

avere un esempi scritto in c e chiederti troppo?

 

 

Condividi questa discussione


Link discussione
Condividi su altri siti

di sopra è in C# .

Senza le basi gli esempi servono a ben poco, sono solo un'illusione perchè al primo problemino sei di nuovo fermo 

Nella cartella examples di snap 7 ci sono esempi in diversi linguaggi come C++ etc

Condividi questa discussione


Link discussione
Condividi su altri siti

Concordo con Walter.

 

Se chiami:

snap7.util.set_bool(reading, 1, 1)

 

quando il prototipo della funzione è:

def set_bool(_bytearray, byte_index, bool_index, value):
    """
    Set boolean value on location in bytearray
    """

 

E non ti spieghi il perchè del messaggio:

TypeError: set_bool() takes exactly 4 arguments (3 given)

( set_bool() richiede esattamente 4 argomenti (gliene sono stati passati 3) )

 

Con gli esempi non ci fai nulla.

Oltretutto ti ho postato il link degli esempi phyton e nel package, come ha scritto Walter, ci sono esempi in C/C++/C#/VB/Pascal .

 

Snap7 purtroppo è una libreria per programmatori (PC), se non hai un minimo di basi di programmazione la vedo nera.

Condividi questa discussione


Link discussione
Condividi su altri siti

sto leggendo il piu possibile non e facile ma non sono il tipo che guarda la tv la sera.

ogni sera anche se a piccoli ,piccoli, piccolissimi passi comunque qualcosa appendo.. 

sicuro mi faro risentire. 

intanto grazie.

Condividi questa discussione


Link discussione
Condividi su altri siti

bravo , non guardare la TV che tanto è tutta spazzatura. Prenditi qualche libro buono e armati di pazienza a buona volontà e picchia dentro ore , ore e ore a studiare, provare , riprovare e riprovare sempre. Però prima impara la sintassi di un linguaggio , la programmazione ad oggetti e fai degli esercizi senza snap7 .

Quello viene dopo , quando hai capito con che cosa ha a che fare .In rete trovi delle ottime guide , libri e tutorial su youtube

ciao

Condividi questa discussione


Link discussione
Condividi su altri siti

qualcosa ho iniziato a capire sono riuscito a leggere e scrivere gli ingressi I e le uscite Q e i merker del LOGO

 

from time import sleep
import snap7
from snap7.util import *
import struct
import time

plc = snap7.client.Client()
plc.connect("192.168.1.102",0,1)

area = 0x82   # area for Q memory
start = 0   # 0= da Q1 a Q8 1= da Q9 a Q16 2 da Q17 a Q24
length = 1                             # l lunghrezza in byte di lettura+
bit = 0                                   # numero del bit che si vuole leggere

data = plc.read_area(area,0,start,length)
print "Q1:",get_bool(data,0,bit)
set_bool(data,0,start,False)                    #False o True per settare l'uscita 
plc.write_area(0x82,0,start,data)
print "Q1:",get_bool(data,0,bit)
time.sleep(1)
set_bool(data,0,start,True)                   #False o True per settare l'uscita 
plc.write_area(0x82,0,start,data)
print "Q1:",get_bool(data,0,bit)
plc.disconnect()


 

Condividi questa discussione


Link discussione
Condividi su altri siti

Bene.Adesso dovresti , come passo successivo,mantenere la tua applicazione funzionante e poter leggere e scrivere all'infinito ...problemi permettendo

Per cui metti giu un bel form con pulsanti e visualizzazioni varie ed inizia a studiare la programmazione multithreading con python in modo tale da poter leggere e scrivere a prescindere dal resto e soprattutto lasciare l'applicazione libera da vincoli di blocco .

;)

Condividi questa discussione


Link discussione
Condividi su altri siti

correggo ce un errore in set_bool(data,0,start,False)   al posto di start bisogna mettere bit 

 

il codice corretto e questo:

 

from time import sleep
import snap7
from snap7.util import *
import struct
import time

 

plc = snap7.client.Client()
plc.connect("192.168.1.102",0,1)

 

area = 0x82   # area for Q memory
start = 0   # 0= da Q1 a Q8 1= da Q9 a Q16 2 da Q17 a Q24
length = 1                             # l lunghrezza in byte di lettura+
bit = 0                                   # numero del bit che si vuole leggere

 

data = plc.read_area(area,0,start,length)       #leggo lo stato di Q1
print "Q1:",get_bool(data,0,bit)                       # stampo lo stato di Q1


set_bool(data,0,bit,False)                           
plc.write_area(0x82,0,start,data)                   # setto a 0  uscita Q1 
print "Q1:",get_bool(data,0,bit)                       # stampo uscita Q1


time.sleep(1)                                   


set_bool(data,0,bit,True)                                  
plc.write_area(0x82,0,start,data)                     # setto a 1 uscita Q1
print "Q1:",get_bool(data,0,bit)                        # stampo uscita di Q1
plc.disconnect()


 

Condividi questa discussione


Link discussione
Condividi su altri siti

ciao Walter sono riuscito a utilizzare il multhithreading e con la libreria tkinter creare 2 pulsanti che

vanno a comandare le uscite del logo, al variare dell'uscita il colore del pulsante passa da blu se l'uscita e a 0 a giallo se l'uscita e a 1. fino a qui tutto funziona bene, e sono nel mio piccolo anche un po soddisfatto.

il problema nasce quando voglio leggere lo stato di un uscita, se eseguo un ciclo while sulla lettura di un uscita a un certo punto ottengo questo tipo di errore:

 

ERROR:snap7.common: ISO : An error occurred during recv TCP : Connection timed out
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/home/pi/sala.py", line 18, in run
    plc.connect("192.168.1.102",0,1)
  File "/usr/local/lib/python2.7/dist-packages/snap7/client.py", line 25, in f
    check_error(code, context="client")
  File "/usr/local/lib/python2.7/dist-packages/snap7/common.py", line 65, in check_error
    raise Snap7Exception(error)

 

Condividi questa discussione


Link discussione
Condividi su altri siti

Registrati o accedi per inserire messaggi

Devi essere un utente registrato per lasciare un messaggio. La registrazione è GRATUITA.

Crea un account

Iscriviti alla nostra comunità. È facile!


Registra un nuovo account

Connettiti

Hai già un account? Connettiti qui


Connettiti adesso