Vai al contenuto
PLC Forum


Snap7 & Vb.net


Messaggi consigliati

Ciao a tutti.

Ho scaricato Snap7 1.2.0 per fare delle prove con VB.Net,

ma ho problemi con il caricamento della libreria in un progetto Windows form di Visual Studio.

Con VS 2008 (standard) su PC con WinXP, dopo aver caricato la libreria (tramite Project -> Add reference)

sono andato nella sezione del codice e mi sottolinea tutti i riferimenti alla libreria (chiaro segno che non riconosce i nomi nseriti)

Passando il mouse sopra, l'avviso è relativo al fatto che il Namespace non contiene alcun membro pubblico ...

Controllando le "References" del progetto, la libreria snap7.net ha come numero di versione 0.0.0.0 ed il path riporta un errore (il sistema non trova il riferimento specificato).

Quando ho inserito la referenza, non ho avuto nessun messaggio di errore.

Con VS 2013 (express) su PC con Win8.1, carico la libreria correttamente,

nella sezione di codice i riferimenti della libreria non hanno alcun errore, ma quando lancio il programma, ho come errore:

Impossibile aggiungere un riferimento a ...snap7.dll Verificare che il file sia accessibile e che l'assembly o il componente COM sia valido.

Per quanto ne capisco, sto commettendo lo stesso errore con entrambi gli strumenti.

Non riesco a capire come intervenire.

Ho guardato gli esempi allegati al progetto, ma oltre ad essere in C#, non sono progetti per Form.

Qualcuno sa darmi qualche lume?

PS: Uso VB.Net e libnodave, ho caricato la libreria del Snap7 allo stesso modo.

Link al commento
Condividi su altri siti


Ciao,

la tua procedura è corretta, è un problema di framework e/o piattaforma (CPU).

Snap7.net.dll che hai usato è stata compilata con .NET framework 4.5 e architettura "AnyCpu".

Devi semplicemente ricompilare la libreria di classi, non ho ritenuto necessario distribuire varie release (.net 3.5 sp1, .net 4.5 ecc..) per non ingigantire ulteriormente la distribuzione, inoltre qualunque ambiente .net (visual studio o mono) si usi, c'è tutto pronto per farlo.

E' molto semplice, hai due soluzioni, la prima rapidissima, la seconda un po' più fastidiosa all'inizio ma che può tornarti comoda quando cambierai framework/piattaforma delle tue applicazioni.

Soluzione 1

Lanci dotnet.bat sullo stesso pc in cui compili il tuo programma (ricorda di farlo dal prompt di Visual Studio : Programmi->Microsoft Visual Studio->Visual Studio Tools->Prompt.... ed usi snap7.net.dll che trovi in winbin. Se ti leghi ad una piattaforma in particolare, x86 o x64 (cosa che ti sconsiglio comunque di fare) devi modificare dotnet.bat cambiando /platform:anycpu con quello che ti serve.

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.

Fammi sapere

post-875-0-56649500-1389104257_thumb.jpg

Link al commento
Condividi su altri siti

Ciao,

grazie mille :thumb_yello: .

Ho provato (per il momento solo con VS 2008 ed XP) e funziona.

(in realtà la compilazione con il dotnet.bat la avevo provata,

solo che poi andavo a pescare il file snap7.net.dll nella cartella originale della distribuzione

e non nella cartella di copia che mi ero creato per non "sporcare" l'originale :whistling: ).

Ho ancora due segnalazioni sull'uso di Snap7 e VB.Net

:wacko: Sono ai primi approcci con il forum non so se iniziare una nuova discussione o continuare questa,

ma trattandosi sempre di Snap7 e VB.Net, ...

Dopo aver creato il client sono andato ad interrogare lo stato degli ingressi e di qualche Merker byte.

Risultato: tutto a zero. Per i Merker nessun problema, non c'era niente che scriveva valori,

ma alcuni ingressi erano cablati e quindi avrei dovuto vedere qualche stato alto.

Morale della favola, non funzionava perchè nel progetto caricato nella CPU, era impostata una password.

La domanda quindi è:

C'è un qualche messaggio di errore che possa farmi capire che sto accedendo ad una CPU protetta?

La CPU è protetta perchè usata in un test di scrittura variabili con pagine html,

lo scrivo perchè in questo caso Siemens dice che se provi a scrivere senza accedere con password,

non ottieni alcun messaggio di errore e l'operazione non viene eseguita (e temo di essermi appena risposto :blink: )

Una seconda segnalazione è invece riferita ad un errore in fase di esecuzione che si è verificato cercando di ottenere lo stato della CPU.

Dim S7_CPU As S7Client
Dim StatoCPU As Integer

Dim res As Integer = S7.ConnectTo(IP, Rack, Slot)
S7_CPU.PlcGetStatus(StatoCPU)

L'ultima riga la ho scritta con l'autocompletamento del VS.

Genera un'eccezzione a runtime dovuta al fatto che non viene trovato l'entry point Cli_PlcGetStatus

Il problema che nel manuale compare la descrizione della funzione Cli_GetPlcStatus

Temo ci sia un errore di battitura nei nomi funzione.

Ringrazio anticipatamente.

Link al commento
Condividi su altri siti

Ciao,

andiamo con ordine.

Innanzitutto hai ragione c'è un'errore nel wrapper :toobad:, la funzione importata dev'essere Cli_GetPlcStatus, puoi tranquillamente correggerlo.

Snap7, al contrario di altre librerie ( :smile:) permette il controllo completo della sicurezza del PLC, trovi tutto nel gruppo "security functions".

  • GetProtection() ti permette di conoscere il livello di protezione corrente (password/selettore ecc..)
  • Con SetSessionPassword() puoi effettuare il login per la sessione corrente ed elevare il livello di sicurezza della tua applicazione cosicché tutte le funzioni avranno esito positivo.
  • Con ClearSessionPassword() effettui il logout.

Sul manuale trovi tutto, inoltre ClientDemo che trovi nei rich-demos ha una pagina dedicata che ti permette di testare tutte queste funzioni.

Saluti

Davide Nardella

p.s.

Come spiego nella documentazione SetSessionPassword() funziona a patto che tu conosca la password impostata.

Link al commento
Condividi su altri siti

Grazie,

mi ero accorto che la libreria è piuttosto vasta e ben articolata,

non resta che rituffarsi nel manuale ;).

Quanto al wrapper, provo a correggere :rolleyes:

Link al commento
Condividi su altri siti

  • 2 months later...
singh_schneider
Solo per l'aggiornamento ..
Avevo solo bisogno di tirare fuori i dati da S7-1200. C'è una libreria denominata S7.Net.
Ho usato il tipo di CPU S7300 e il suo lavoro con S71200.
Grazie a tutti voi un sacco
Link al commento
Condividi su altri siti

Ciao a tutti, ho seguito il procedimento 1, eseguo il dotnet dal prompt di Visual Studio, mi prendo la snap7.net.dll compilata in winbin la metto nella cartella del mio progetto, la aggiungo ai riferimenti.

Il mio problema viene quando cerco di connettermi al plc otengo il seguente errore:

Impossibile caricare il tipo 'Snap7.S7Client' dall'assembly 'Snap7.net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Sto utilizzando Visual Studio 2012 su Windows 7 64 bi, il framework del progetto è il 4.5 quindi non dovrebbero esserci problemi, o sbaglio?

Link al commento
Condividi su altri siti

Ciao,

All'inizio del tuo file (ad esempio form1.vb) hai inserito Imports Snap7 ?

L'aggiunta della classe compilata è come in figura ?

E' sicuramente qualche settaggio. Se non ne vieni fuori mandami un m.p. con un'indirizzo che può ricevere allegati e ti invio un progetto VS2012 VB (molto semplice, non ti aspettare granchè) che ho già inviato a molte persone che avevano difficoltà con le parametrizzazioni di VS.

Non lo includo nei demo perché è solo un form con qualche pulsante e legge un po' di bytes, ma serve come "startup".

Fammi sapere

post-875-0-13809500-1395855111_thumb.png

Link al commento
Condividi su altri siti

  • 1 month later...

Nella 1.2.1 è già sistemato, in ogni caso non devi cambiare il nome del metodo (PlcGetStatus) ma il nome della funzione importata quindi devi modificare le righe 894 e 897 sostituendo Cli_PlcGetStatus con Cli_GetPlcStatus. (come ho scritto 7 risposte più sopra)

In riferimento al mp, si, per mandare il PLC in run puoi usare PlcHotStart o PlcColdStart.

Dato che le richieste sono spesso molto simili, ricordo a tutti che preferisco rispondere sul forum in modo da condividere i consigli.

Modificato: da dan64100
Link al commento
Condividi su altri siti

Già avrei dovuto leggere meglio effettivamente, per quanto la documentazione sia davvero completa ho ancora dei problemi con lo stop e il run del plc da codice, sara che sono un po negato...

Condivido qui di seguito un semplice progetto di prova in modo tale che chi si trovi nella mia stessa situazione possa risolvere anche lui i miei stessi problemi, all'interno di questa cartella infatti vi è infatti lo schema da caricare su LOGO0BA7 e un progetto in c# ampiamente commentato.

Mi piacerebbe che dal click di quel tasto si potesse settare lo stato del plc

In Particolare mi da sempre l'errore "ISO : An error occurred during send TCP : Connection timed out"

78pl.png

Non voglio che qualcun altro mi faccia il lavoro per me, mi piacerebbe solo un aiutino sul capire come mai mi dia questo errore, e allo stesso tempo offrire una semplice base su cui lavorarci magari.

E qui di seguito il progetto in c# sviluppato grazie alla libreria Snap7

link depositfile:

http://dfiles.eu/files/65a589kit

Modificato: da EnryPLC
Link al commento
Condividi su altri siti

Ciao,

andiamo con ordine:

1) La pancia che balla nella pubblicità del depositfile mi ha fatto impazzire :roflmao: , paccato che cambia ogni volta altrimenti mettevo la pagina fra i preferiti.

2) Bello il programma ;) devi ingrandire un pochino la Form ReadOut (quella della foto) perchè la barra di stato ed il pulsante di update non si vedono (ho un tema standard di W7).

3) Non potrai mai fare il run/stop per 2 motivi:

3.1) Per ogni operazione fai una connessione/disconnessione cosa che ti sconsiglio perchè comunque porta via tempo, nelle procedure di run/stop ti sei dimenticato di inserire Client.Connect() e Client.Disconnect() :P.

3.2) Se guardi a pag. 74 del manuale, trovi che per il LOGO il protocollo S7 è solo per il trasporto dati, il controllo può essere fatto solo con il protocollo AG nativo (quello che usa il LOGO Comfort per capirci).

Comunque l'approccio è corretto : programma di test (ben fatto) e prove sul campo.

Una sola curiosità, dato che mi arrivano letteralmente decine di mail per fare il run/stop con il LOGO (probabilmente chi lo fa con il 300/400 non mi scrive perchè funziona).

La mia domanda è : PERCHE' c'è questa pulsione irrefrenabile al run/stop, caricare SDB ed altre cose così poco igieniche ??? :superlol:

p.s.

in C# non hai bisogno di snap7.net.dll, includi direttamente snap7.cs nel tuo progetto e copia snap7.dll (quella win32 o win64) nella cartella di output, risparmi rogne se cambi framework ;)

Modificato: da dan64100
Link al commento
Condividi su altri siti

Mmm grazie per il consiglio, per quanto riguarda il discorso del RUN e STOP non ne ho idea, è un pallino che mi rimane in testa, mi piace l'idea di poterlo fare

ora proverò con eclipse e una tool chiamata Sharpen per decompilare il codice di LOGO Comfort e convertirlo in C#, non appena finirò posterò la soluzione

mi piacerebbe l'idea di verificare lo status del plc, se in run poterlo stoppare e viceversa, e devo trovare una soluzione piu pulita per accendere Q1,

in ogni caso grazie per i consigli, ora ho un po da lavorarci su :smile:

Modificato: da EnryPLC
Link al commento
Condividi su altri siti

Ecco, era DesTeansfer la libreria.

Purtroppo non ci sono i sorgenti (o almeno io non li ho trovati nemmeno nel demo che il programmatore ha rilasciato sul forum Siemens).

A questo punto se hai necessità del run/stop potresti usare destransfer per fare tutto dato che mi sembra che ha anche le funzioni per il trasferimento dei dati.

Link al commento
Condividi su altri siti

Purtroppo senza sorgenti il problema e' quello, o ti aiuta il programmatore o non hai speranze.

Ricordo comunque una discussione per cui c'era la possibilità di modificare il timeout attraverso una funzione.

Per i blocchi non saprei...

Link al commento
Condividi su altri siti

  • 1 year later...

Salve a tutti, ho scritto molto poco su questo forum, che seguo però con tanto interesse, diciamo che mi trovo spesso a risolvere i problemi soltanto

guardando come li hanno risolto gli altri ( un pò parassita, chiamatemi pure così) adesso però comincio ad avere la necessità di andare in fondo all'argomento

di questa discussione, cioè riuscire a creare un programma in Vb.net ( che è quello che conosco di più) che connetta diversi Logo 0BA8 per analisi varie a distanza.

prometto che pubblicherò qualsiasi cosa in più che eventualmente riesco a fare.

Mi piacerebbe che qualcuno che ha fatto qualcosa con VB.net mi desse qualche dritta ad esempio intanto su come creare passo passo "snap7.net.dll" che io chissà perchè non riesco a fare seguendo le spiegazioni di Dan.  E poi magari un esempio di applicazione che legga e scriva una variabile sul Logo. Come ha fatto EnryPLC

che ringrazio tantissimo.

Colgo l'occasione per ringraziare di esistere a Davide Nardella, che ci ha aperto questa breccia sul mondo un pò blindato della Siemens.

 

Link al commento
Condividi su altri siti

Sul sito (e quindi sul manuale) c'è un'intera pagina dedicata a .net

http://snap7.sourceforge.net/dotnet.html#key_concepts

Nell'ultima nuova versione (1.4.0), in \examples\dot.net\WinForm trovi esempi funzionanti in VB.NET e un progetto apposito (in Buildsnap7Assembly) per creare snap7.net.dll

Non ho proprio idea di cos'altro dirti.

Link al commento
Condividi su altri siti

  • 1 year later...

Ciao Dan,

sto cercando di capire se il logo 8 FS4 può fare al caso mio per automatizzare casa. Da questa versione vi è sia supporto modbus tcp che snap7.

L'app del logo è molto lacunosa e l'ambiente TDE non mi esalta, vorrei sopperire scrivendo qualcosa in ambiente .net.

Il mio target vorrebbe essere comandare per esempio degli interruttori da app.

E possibile avere delle indicazioni o ancor meglio un esempio su come fare per comandare degli ingressi tramite modbus tcp o snap7 su logo 8?

Grazie in anticipo

S

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...