Vai al contenuto
PLC Forum


Esempio Pratico Comunicazione Tra S7-1200 E Programma Vb


rocco250

Messaggi consigliati

Sò che questo argomento è stato trattato in varie parti di questo forum e in molti altri forum della rete, ma effettivamente almeno per me che sò programmare dal s7-1200 e tutti i prevedenti e so programmare in visual basic, ancora non ho ben chiaro il funzionamento di queste benedetti librerie libnodave, Qui vorrei cercare di riunire chiaramente tutta la conoscenza a riguardo con possibilmente esempi pratici da cui prendere spunto e fare le prime prove. Poi piano piano una volta messi in sella si pedala da soli. Chiedo a riguardo l'aiuto degli utenti il quale ho visto su qualche altro post avevano messo degli esempi non più caricati nel forum. Chiunque ne sappia qualcosa o abbia aiuti utili e concreti, farebbe molto contento me, e tutti gli altri utenti, visto che ormai il suo utilizzo è sempre piu frequente.

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti


Si già visto provato e spulciato, ma con il 1200 così comè non funziona, per capirci qualcosa bisogna almeno partire da qualcosa che almeno già funzioni per poi riadattarlo :-p

Link al commento
Condividi su altri siti

Giuseppe Signorella

L'esempio a cui fai riferimento è un mio progetto che in questo momento non trovo i sorgenti.

Funzionava mediante l'invio di dati in Ethernet, ma non utilizzava il protocollo profilnet.

Ti consiglio invece di dare un'occhiata invece a questa discussione, che c'è un esempio in visual basic 6 che utilizza la libreria Snap7

Buon proseguimento.

Link al commento
Condividi su altri siti

Ho provato a fare qualche prova ma oltre a dare connessione ok non riesco a fare molto altro... :-(

Giuseppe se tu riuscissi a ritrovare quelle soregenti o almeno il file del progetto dove stanno qualche esempio di codice forse arriverei ad una soluzione ;-(

Link al commento
Condividi su altri siti

Io non chiedo molto, devo solo connettere e disconnettere il plc, impostare run e stop, scrivere e leggere db marker ed ingressi e uscite. tutto qui... niente di troppo scentifico rispetto a tutto quello che permette di fare il 1200

Link al commento
Condividi su altri siti

Rocco,

non mi è chiaro con quale versione di Visual Basic programmi, VB6 o VB.NET ?

Il demo che hai provato è quello del link di Giuseppe ? se si, che problemi hai avuto ?

C'è un pulsante per leggere dalla DB1, non leggi nulla ?

In ogni caso per la connessione e lettura/scrittura di DB/Mk/I/O non c'è problema, devi solo capire perché non funziona a te (magari ci dai qualche altra informazione).

Per il run/stop non c'è soluzione per la famiglia 1200/1500, qualunque libreria tu utilizzi (Snap7, Prodave, Libnodave, OPC) non funziona. Le funzioni amministrative di controllo per questi PLC seguono il nuovo protocollo esteso che ancora non è implementato da nessuno.

Per curiosità personale, perché hai necessità di mandare in RUN/STOP la CPU da un'applicativo esterno ?

Link al commento
Condividi su altri siti

Giuseppe Signorella

Come ti ho già detto nel precedente post, non riesco più a trovare l'esempio demo che avevo realizzato. In ogni caso sempre per come specificato nel precedente post, il programma che avevo realizzato non faceva altro che "interpretare" una serie di stringhe inviate mediante Ethernet.

Quindi non era in grado di leggere da un DB o una variabile.

Per fare ciò che chiedi l'unica strada (quella secondo me più percorribile) a costo zero, è l'uso delle librerie SNAP7.

L'esempio pubblicato nel post che ti ho linkato, è per VB6, mentre nei file zippati hai anche un esempio per VB,net.

C'è tutto quello che ti occorre per poter procedere con tuo progetto.

-Libreria Free

-Esempi.

-Un forum su cui chiedere aiuto

-La disponibilità dell'autore delle librerie.

A te non resta che metterci la buona volontà . ;)

Link al commento
Condividi su altri siti

Premetto, utilizzo VB6, Almeno oggi ho scoperto che run e stop che utilizzavo per provare se funzionasse, effettivamente non funziona, bene, vedremo un pò che combino... vi terrò aggiornati

Link al commento
Condividi su altri siti

Sono stato a fare prove oggi pomeriggio ma non mi riesce proprio.

Potete scrivermi per favore 4 righe di esempio per scrivere un dato in una DB? Grazie

Link al commento
Condividi su altri siti

Se vuoi una mano cerca di essere più dettagliato.

Cosa intendi per "non mi riesce" ?

Hai di ritorno un codice di errore ?

Non hai codice di errore ma nella DB non trovi i dati che ti aspettavi ?

Hai letto queste note a proposito dell'accesso alle DB del 1200/1500 ?

http://snap7.sourceforge.net/snap7_client.html#target_compatibility

Poi:

- Stiamo sempre facendo riferimento allo stesso programma, quello che ti ha indicato Giuseppe, o ne hai creato un'altro da zero ?

- Riesci a connetterti ?

- Riesci a leggere i 16 byte da DB 1 ?

Per motivi di sicurezza raramente inserisco nei demo codice per scrivere nella memoria, per evitare che qualcuno, distrattamente, vada a sovrascrivere dati importanti.

In ogni caso le funzioni di lettura/scrittura sono "simmetriche" e hanno gli stessi parametri.

Per cui, se per leggere da DB 1 16 bytes a partire da 0 in un Buffer usi

Cli_DBRead(Client, 1, 0, 16, VarPtr(Buffer(0)))

per scrivere devi usare

Cli_DBWrite(Client, 1, 0, 16, VarPtr(Buffer(0)))

Ovviamente prima inserisci i tuoi dati nel buffer e poi chiami la funzione.

Per scrivere nella DB, tu che codice hai usato ? posta le righe magari.

Modificato: da dan64100
Link al commento
Condividi su altri siti

ho provato ad effettuare dei test.

carico dei valori di esempio nel buffer in questo caso il valore progressivo di "i"

Private Sub Command7_Click()
Dim i As Integer
For i = 0 To 15
Buffer(i) = i
Next
Result = Cli_DBWrite(Client, 1, 0, 16, VarPtr(Buffer(0)))
ShowResult (Result)
End Sub
poi per esempio chiudo il programma, lo riavvio e quando provo a rileggere la stessa db con:
Private Sub Command4_Click()
Dim i As Integer
' Legge 16 bytes da DB1 a partire da offset 0 e li mette nel buffer
' La scrittura non l'ho implementata per motivi di sicurezza, magari premete il
' pulsante e siete collegati ad un PLC di produzione.
' I parametri della scrittura sono esattamente gli stessi
Result = Cli_DBRead(Client, 1, 0, 16, VarPtr(Buffer(0)))
ShowResult (Result)
Text1.Text = ""
For i = 0 To 15
Text1.Text = Text1.Text + Hex$(Buffer(i)) + " "
Next
End Sub
e mi restituisce 16 numeri "0" quando il risultato dovrebbe essere 0 1 2 3 4 5 6 7 8 9 A B C D E F
i parametri di connessione ho messo:
Private Sub Command1_Click()
' Questa funzione permette di connettersi usando Rack e Slot
' Viene usata per tutti i sistemi S7300/400/1200/1500/WinAC, Drive SINAMICS ecc..
Dim Result As Long
Result = Cli_ConnectTo(Client, "192.168.1.115" + Chr$(0), 0, 1)
ShowResult (Result)
' Disabilitiamo i pulsanti di connessione e abilitiamo quello di disconnessione
If Result = 0 Then
Command1.Enabled = False
Command2.Enabled = False
Command3.Enabled = True
End If
End Sub
e mi da connessione OK pero no notato che quando provo a leggere o scrivere DB result mi da:
"CPU: Item not available"
è normale ciò?
Link al commento
Condividi su altri siti

Fermi tutto, funziona! il problema era che non avevo creato e settato correttamente la db1 ne plc. Allora anche se molti lo sapranno ma io l'ho dovuto sperimentare perche non era scritto espressamente da nessuna parte, innanzitutto bisogna creare e settare la DB1 esattamente come indicato nel link sopra, http://snap7.sourceforge.net/snap7_client.html#target_compatibility , secondo nel plc, vanno create tutte e 16 le voci nella db, quindi 16 byte completi perche se ne metti anche solo 15 e ne leggi 16 non funziona ammeno che non ne imposti di leggere 15:

Result = Cli_DBRead(Client, 1, 0, 15, VarPtr(Buffer(0)))

altrimenti seeeeee, non funziona...

Comunqnue Giuseppe e Dan64100 hanno una cena pagata (solo pizza :-P) quando si troveranno in provincia di Frosinone ahahhaha, (è sottointeso che gli disturberò ancora in caso di bisogno)

Modificato: da rocco250
Link al commento
Condividi su altri siti

altrimenti seeeeee, non funziona...

E' normale che non funziona :smile:

E' il PLC stesso a non accettare il comando se richiedi più bytes di quanti ce ne siano nella DB.

Buon divertimento ;)

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...