labri95 Inserito: 8 settembre 2016 Segnala Inserito: 8 settembre 2016 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
walterword Inserita: 8 settembre 2016 Segnala Inserita: 8 settembre 2016 l'oggetto "plc" oltre ai metodi connect() e getconnected() , quali altri metodi offre?
labri95 Inserita: 8 settembre 2016 Autore Segnala Inserita: 8 settembre 2016 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( )
walterword Inserita: 8 settembre 2016 Segnala Inserita: 8 settembre 2016 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
labri95 Inserita: 8 settembre 2016 Autore Segnala Inserita: 8 settembre 2016 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..
walterword Inserita: 8 settembre 2016 Segnala Inserita: 8 settembre 2016 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
walterword Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 se vai qui http://python-snap7.readthedocs.io/en/latest/client.html e premi "source" per ogni relative funzione vedrai degli esempi di come usarla.
dan64100 Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 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ì
Livio Orsini Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 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.
walterword Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 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.
labri95 Inserita: 9 settembre 2016 Autore Segnala Inserita: 9 settembre 2016 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
walterword Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 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....
labri95 Inserita: 9 settembre 2016 Autore Segnala Inserita: 9 settembre 2016 questa sera al rientro a casa ti aggiorno. grazie..
labri95 Inserita: 9 settembre 2016 Autore Segnala Inserita: 9 settembre 2016 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)
walterword Inserita: 9 settembre 2016 Segnala Inserita: 9 settembre 2016 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
labri95 Inserita: 9 settembre 2016 Autore Segnala Inserita: 9 settembre 2016 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 avere un esempi scritto in c e chiederti troppo?
walterword Inserita: 11 settembre 2016 Segnala Inserita: 11 settembre 2016 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
dan64100 Inserita: 12 settembre 2016 Segnala Inserita: 12 settembre 2016 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.
labri95 Inserita: 12 settembre 2016 Autore Segnala Inserita: 12 settembre 2016 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.
walterword Inserita: 12 settembre 2016 Segnala Inserita: 12 settembre 2016 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
labri95 Inserita: 16 settembre 2016 Autore Segnala Inserita: 16 settembre 2016 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()
walterword Inserita: 17 settembre 2016 Segnala Inserita: 17 settembre 2016 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 .
labri95 Inserita: 17 settembre 2016 Autore Segnala Inserita: 17 settembre 2016 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()
labri95 Inserita: 19 settembre 2016 Autore Segnala Inserita: 19 settembre 2016 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)
Messaggi consigliati