Vai al contenuto
PLC Forum


Snap7 Primo Avvio


Messaggi consigliati

cristian.magrini

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


cristian.magrini

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

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

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

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

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

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

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" :smile:

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

cristian.magrini

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

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

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: da walterword
Link al commento
Condividi su altri siti

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: da walterword
Link al commento
Condividi su altri siti

cristian.magrini

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

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: da walterword
Link al commento
Condividi su altri siti

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

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

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 :lol: 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 :D

Poi magari una lettura alla documentazione non ti farebbe male ;)

Ciao

Davide

Link al commento
Condividi su altri siti

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

cristian.magrini

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

cristian.magrini

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

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