cristian.magrini Inserito: 29 agosto 2014 Segnala Share Inserito: 29 agosto 2014 Salve a tutti, sto utilizzando il pacchetto Snap7 per potermi interfacciare al PLC 1500 Siemens attraverso una piccola applicazione VB. Vorrei capire prima di tutto il metodo che devo utilizzare per poter stabilire la connessione, e se devo sviluppare una particolare FC all'interno del PLC Ora come ora ho definito un FC che mi permette di settare il PLC in ascolto sulla porta 2000 Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 29 agosto 2014 Autore Segnala Share Inserita: 29 agosto 2014 Ora sto aggiungendo nella parte riferimenti del mio progetto in VS 2010 la dll snap7.dll ma ottengo questo errore: Impossibile aggiungere un riferimento a "C:\......." Verificare che il file sia accessibile e che l'assembly o il componente COM sia valido Link al commento Condividi su altri siti More sharing options...
drugo66 Inserita: 29 agosto 2014 Segnala Share Inserita: 29 agosto 2014 Ciao, ... se devo sviluppare una particolare FC all'interno del PLC ... assolutamente no, nel PLC non devi fare nulla: l'unica cosa che devi verificare e che esistano le variabili nel PLC, altrimenti ti ritorna un errore (esempio: il DB non esiste). ... impossibile aggiungere un riferimento a "C:\......." ... Qui ti puo' rispondere meglio l'autore: io l'ho usato con VC++ e MFC, ho dovuto solo modificare il file header per un paio di errori (la variabile byte esista già nelle MFC, quindi l'ho rinominata e ho dovuto aggiungere l'header di libreria delle MFC). Verifica solo che stai utilizzando la libreria corretta (quella per C#, presumo) Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 29 agosto 2014 Segnala Share Inserita: 29 agosto 2014 Non devi aggiungere snap7.dll ma snap7.net.dll cioè l'assembly d'interfaccia. Snap7.dll la devi copiare nella cartella del tuo eseguibile. Leggi attentamente questo thread per capire come generarla correttamente. Per i parametri di connessione, per il 1500 oltre all'IP devi specificare Rack=0 e Slot=0 Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 30 agosto 2014 Segnala Share Inserita: 30 agosto 2014 ciao dan ti ho trovato su FB Vorrei anche io capire qualcosa riguardo il favoloso lavoro che hai fatto Presumo ci sia qualcosa tipo documentazione giusto per infarinarmi un po .... ciao Walter Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 30 agosto 2014 Segnala Share Inserita: 30 agosto 2014 Ciao, Certo c'è la documentazione online direttamente sul sito: http://snap7.sourceforge.net Ed il manuale in PDF nel package quando lo scarichi, il quale in più ha il reference dettagliato di tutte le funzioni. Sono circa 300 pagine, ma se hai qualche domanda particolare, prima di leggerti il "pappone", chiedi pure Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 30 agosto 2014 Segnala Share Inserita: 30 agosto 2014 ok grazie per l'interesse Una domanda l'avrei .... Sul pc dove gira l'applicazione client che comunica col plc server , esempio di configurazione , bisogna installare qualche dll di Step 7 o qualcosa tipo opc server ? oppure e' sufficiente la dll che menzionavi sopra ? Esempio client ... 1 pc 1 applicazione .NET in C# 1 o piu dll snap7 questa configurazione e' sufficiente per scrivere e leggere dati da e verso un plc ? ciao e grazie Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 1 settembre 2014 Autore Segnala Share Inserita: 1 settembre 2014 Quindi se ho ben capito per VS2010 devo generare io stesso snap7.net.dll Oppure lo trovo direttamente all'interno del pacchetto? Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 Sul PC hai bisogno solo di Snap7.net.dll e Snap7.dll, nient'altro. La prima contiene le classi C# che si interfacciano con la DLL non gestita, se programmavi in C# potevi importare direttamente Snap7.net.cs nel tuo programma. Per tutti i client creati nella stessa applicazione hai bisogno solo di una dll da copiare nella cartella del tuo eseguibile. Se hai più applicazioni differenti puoi scegliere di copiare Snap7.dll in ogni cartella, come sopra, oppure puoi copiare la dll in una cartella di sistema. Snap7.net.dll non è legata al compilatore ma al Framework e/o Architettura che usi. Dato che programmi in VB hai bisogno di questa Assembly .net compilata (essendo il wrapper scritto in C#), la quale deve essere "compatibile" con il tuo programma, cioè stesso framework e stessa architettura CPU. Questo è un grosso problema che affligge i programmatori .NET che vogliono usare librerie di classi di terze parti compilate e di conseguenza i produttori di librerie commerciali che non forniscono i sorgenti. Quindi devi ricompilare Snap7.net.dll con il tuo framework e la tua architettura usando il file batch come già spiegato altre volte, oppure crei una soluzione "mista" composta da un progetto C# per l'assembly e il tuo progetto in VB e compili tutto insieme usando le stesse proprietà. Infine, e anche per questo devi ringraziare i progettisti Microsoft, non esiste in .NET alcuna direttiva di compilazione che agevola il detect della CPU utilizzata, per cui se produci codice nativo x64 oppue AnyCPU che gira su macchine con Win64 devi usare Snap7.dll a 64 bit, nel caso contrario Snap7.dll a 32 bit, per le dll binarie non esiste il concetto di "AnyCPU" Se ti può consolare, ogni giorno su Stackoverflow.com ci sono una decina di thread aperti alla ricerca di una soluzione "decente" a questo problema (che non è specifico di Snap7 ovviamente). Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 ok grazie Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 1 settembre 2014 Autore Segnala Share Inserita: 1 settembre 2014 effettuando numerose prove non riesco tuttavia a capire quale metodo devo utilizzare e/o creare per connettermi al plc.. sono riuscito a capire che le variabili che dovrò utilzzare sono IP rack e slot, ma poi come stabilisco la connessione? Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 se hai creato l'oggetto client , per esempio , dovresti avere il metodo Connect(..) o connectTo(..) Dopo aver creato l'oggetto con l'operatore new , digita il nome dell'oggetto e premi "." , l'intellisense dovrebbe darti la lista delle proprietà , metodi , eventi e delegati ect Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 1 settembre 2014 Autore Segnala Share Inserita: 1 settembre 2014 L'oggetto client mi basta definirlo così? Client c = new Client() Perdonatemi ma sono alle prime armi... Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 (modificato) Premetto che tu debba avere un minimo di pratica e conoscenza con la OOP , programmazione orientata agli oggetti .Imparati java o C# che sono quelli piu "semplici" rispetto al C++ .... Credo che la risposta al tuo problema sia la seguente Questo frammento di codice , in C#, crea un buffer , un oggetto client che si connette ad un server (al plc ) , inizializza l'oggetto client con il costruttore che richiede l'ip address del server , la porta credo e la modalità. Poi , intuitivamente credo che legga dal DB32 a partire dalla prima word , un'area contgua di 16 interi e li metta nel buffer precedentemente creato Poi distrugge l'oggetto client ... Analizzando bene , i dati vengono copiati in un buffer di bytes , poi credo si debba ricomporre le word prendendo il byte piu significativo e quello meno e tramite maschere e shift bit ricomporre la word , oppure puntare direttamente ma in c#... Ricorda che l'assembly che importi con la direttiva using deve essere aggiunto nella cartella riferimenti del tuo progetto , se usi visual studio .NET. Appena ho tempo voglio mettermi anche io un po a giocare Il fatto che poi ci si possa collegare con arduino ect mi fa pensare che questo progetto Snap7 sia qualcosa di veramente grandioso e meraviglioso Using Snap7; byte[] MyDB32 = new byte[256]; static S7Client MyClient; static void SymplyGet() { MyClient = new S7Client(); MyClient.ConnectTo(“192.168.10.100”,0,2); MyClient.DBRead(32, 0, 16, MyDB32); MyClient = null; } Modificato: 1 settembre 2014 da walterword Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 (modificato) Dan , credi possa essere utile Riwrappare il tutto e creare un opc server ? Certo e' un lungo lavoro pero' conoscendo le specifiche della OPC foundation tutto sommato non sarebbe male creare un editor per le connessioni e le tag .... In realtò questa libreria e' gia un opc server ,per cui appesantire con strati di sw aggiuntivi non mi sembra il caso . Dovrei guardare bene i sorgenti ....per capire se ci sono funzioni bloccanti e/o eventi che si possono delegare ... Modificato: 1 settembre 2014 da walterword Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 1 settembre 2014 Autore Segnala Share Inserita: 1 settembre 2014 Perfetto ti ringrazio per la tua pazienza, sto utilizzando il VB perchè al momento mi sembra il linguaggio più immediato anche perchè poi lego il tutto ad una interfaccia una curiosità se nel mio Form vado a caricare ad esempio: Cli_Connect() e ottengo il seguente errore: Cli_Connect() non dichiarato Non è accessibile a causa del livello di protezione Da cosa dipende da un errato caricamento della libreria? eppure in alto uso: Imports Snap7 e come indicato dall'autore colloco snap7.net.dll nelle risorse del progetto da cosa può dipendere? Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 (modificato) se il metodo connect ha degli oveloading che sono pubblici e il metodo connect() che e' protetto oppure private potrebbe essere che ti dia questo errore. Se pero ' di sopra ti ho scritto che il connect e' in overload o sovraccarico ed accetta 3 parametri che sono specificati come sopra non capisco perche' ti ostini a volerlo chiamare senza parametri Linguaggio ad oggetti non lo conosci , usi VB che e' una tristezza , in quanto su .NET dovresti fin da subito imapare il C# e poi usi i metodi a modo tuo , poi chiedi anche perche non va ....non ti capisco Io on ho mai usato questa libreria , ma agendo da ignorante per prima cosa mi adeguo agli esempi che trovo in c++ o c# o pascal In questo caso c# , quindi prova a richiamare connect con i 3 parametri , essere sicuro che il DB 32 esiste e che abbia la lunghezza desiderata nel plc e se poi non va prova con un nuovo progettino in C# spesso . nei linguaggi ad oggetti , si usa un metodo dichiarato privato o protetto per fare le cose che dal di fuorni non devono essere viste o capite e si espongono dei metodi che fungono da interfaccia verso il programmatore , richiedendo i parametri che poi andranno a sovrascrivere i campi privati che agiranno sul metodo protetto o privato . per cui usa connectTo come da esempio sopra , cioe passandogli i 3 parametri Modificato: 1 settembre 2014 da walterword Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 1 settembre 2014 Segnala Share Inserita: 1 settembre 2014 il codice MyClient.ConnectTo(“192.168.10.100”,0,2); si connette al plc-server con indirizzo 192.168.10.100 che ha rack #0 e slot #2 , parametri spesso usati anche con altri opc o comunicazioni tcp o iso .... Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 2 settembre 2014 Autore Segnala Share Inserita: 2 settembre 2014 Imports Snap7 Public Class Form1 Dim IP Dim Rack Dim Slot Dim S7Client MyClient = new S7Client() Dim StatoCPU As Integer Private Sub ToolStripMenuItem1_Click(sender As System.Object, e As System.EventArgs) Handles Connetti.Click MyClient.ConnectTo(IP, Rack, Slot) Me.Label2.Text = "Connesso" Me.Label4.Visible = True End Sub end Class La riga Dim S7Client MyClient = new S7Client() mi da errore: Prevista fine istruzione Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 2 settembre 2014 Segnala Share Inserita: 2 settembre 2014 Dan , credi possa essere utile Riwrappare il tutto e creare un opc server ? OPC Server si colloca ad uno strato più alto, dove esistono concetti di Tag, allarmi ecc.. cioè dati "presentati", Snap7 è lo strato a basso livello che si occupa solo della comunicazione. Creare un OPC Server con Snap7 è possibilissimo, ma a quel punto vedrei Snap7 inglobato nel progetto (direttamente come sorgenti se il progetto è C++ o come dll esterna). Oltretutto se tutto il progetto diventasse un OPC server si perderebbero automaticamente tutte le piattaforme UNIX (in quanto OPC si basa su COM) e attualmente sono in tanti ad usarle. Ci sono poi il server e il partner che non hanno corrispettivi nella logica OPC. Per applicazioni verticali magari il discorso cambia, come dicevo in un'altro thread, c'è un programmatore che con Snap7 ha creato un miniserver all'interno di un router equipaggiato con OpenWRT, lo monta come standard sulle sue macchine e sembra che gli faccia da front-end/preelaborazione dei dati. Non mi è assolutamente chiaro a cosa gli serve ma è contentissimo di avere dei router da 30€ S7 compatibili. Cristian, devi usare Dim Client As Snap7.S7Client = New S7Client L'ambiente .NET è gestito, non puoi chiamare direttamente le funzioni di una libreria binaria, hai bisogno di un wrapper: http://snap7.sourceforge.net/snap7_lib_api.html Per agevolarti : crea un form, metti 3 pulsanti, due textbox e copia questo codice: Imports System Imports Snap7 Public Class Form1 ' Variabile Handle del Client Dim Buffer(1024) As Byte Dim Client As Snap7.S7Client Private Sub ShowResult(Errore As Integer) ' This function returns a textual explaination of the error code TextBox2.Text = Client.ErrorText(Errore) End Sub ' Button1 : Connessione Private Sub Button1_Click() Handles Button1.Click ' This function connects to the PLC using IP, Rack and Slot ' Can be used for all S7300/400/1200/1500/WinAC, Drive SINAMICS systems. ' For LOGO! S7200 use SetConnectionParams() followed by Connect(). See the manual ' ' For S7300 Rack = 0 , Slot = 2 ' For S71200/1500 Rack = 0 , Slot = 0 Dim Result As Long Result = Client.ConnectTo("192.168.0.72", 0, 2) ' <-- Your PLC IP, Rack and Slot (see above) ShowResult(Result) If Result = 0 Then Button1.Enabled = False Button2.Enabled = True Button3.Enabled = True End If End Sub ' Button2 legge 16 bytes da DB 1 Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click Dim i As Integer Dim Result As Integer Result = Client.DBRead(1, 0, 16, Buffer) ' DB 1 from byte 0 for 16 bytes ShowResult(Result) If Result = 0 Then TextBox1.Text = " " For i = 0 To 15 TextBox1.Text = TextBox1.Text + Hex$(Buffer(i)) + " " Next End If End Sub ' Button3 : disconnessione Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Client.Disconnect() Button1.Enabled = True Button2.Enabled = False Button3.Enabled = False End Sub Public Sub New() ' Chiamata richiesta dalla finestra di progettazione. InitializeComponent() ' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent(). ' Creazione del Client Client = New S7Client End Sub End Class Questa è la quantità massima di codice che riesco a scrivere in VB prima di dover prendere il Zyprexa Poi magari una lettura alla documentazione non ti farebbe male Ciao Davide Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 2 settembre 2014 Autore Segnala Share Inserita: 2 settembre 2014 Grazie!!!!! Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 2 settembre 2014 Segnala Share Inserita: 2 settembre 2014 si in effetti e' meglio usare la dll cosi , opc server implica troppe restrizioni oltreche sbattimenti Alla fine con snap7 , si puo' vedere un plc siemens come un container di dati bidirezionale ad un livello di astrazione gia soddisfacente Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 2 settembre 2014 Autore Segnala Share Inserita: 2 settembre 2014 Andando ora avanti nel mio progettino caricando tutto il dovuto quando lancio in esecuzione riscontro questo: Errore: Impossibile caricare la DLL 'snap7.dll': Impossibile trovare il modulo specificato. (Eccezione da HRESULT: 0x8007007E) Premetto che ho seguito i passaggi: Soluzione 2 Crei un nuovo progetto (preferibilmente nella tua soluzione, così passi dalle proprietà di un progetto all'altro velocemente) del tipo Libreria di classi Visual c#, Che chiami Snap7. Ti verrà creata di default Class1.cs (che conterrà il namespace Snap7). Nella cartella di Class1.cs vai a copiare snap7.net.cs. Rimuovi dal progetto Class1 e aggiungi "Elemento esistente..." snap7.net.cs. A questo punto puoi settare tutte le proprietà in accordo a quelle del tuo progetto : framework, piattaforma, ecc.. Non è necessario che tu conosca C# (è questo il bello di .net) compili il progetto ed importi Snap7.net.dll come hai già fatto. Per aggiungere la libreria Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 2 settembre 2014 Segnala Share Inserita: 2 settembre 2014 Hai copiato Snap7.dll nella cartella del tuo eseguibile come già spiegato nel #4 di questo thread ? Link al commento Condividi su altri siti More sharing options...
cristian.magrini Inserita: 2 settembre 2014 Autore Segnala Share Inserita: 2 settembre 2014 Si confermo di aver copiato il file snap7.dll nella cartella del progetto Mi stavo eventualmente chiedendo se fosse compatibile con il :Net Framework 4.0 Ho risolto grazie 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