Vai al contenuto
PLC Forum


Dimostrazione Snap7


walterword

Messaggi consigliati

Sto facendo dei test per un impianto , tramite un simulatore che sto scrivendo in c# .

La libreria Snap7 è proprio una figata .

In questo video spiego qualche cosa , se vi interessa ....

 

Link al commento
Condividi su altri siti


Operational Amplifier

Grande Walter  :clap:,
Io sono alle prime armi con C#, ho visto che leggi e scrivi dinamicamente le variabili tramite timer, quindi se ho capito bene quando viene caricata la Form il tuo programma continua a leggere/scrivere le variabili da te specificate (DB RX e DB TX), non è che che mi dai una dritta....:worthy: .

Nel S71500 le DB non devono essere ottimizzate vero?

Link al commento
Condividi su altri siti

No .

Ci sono due eventi da pulsante , uno legge e l'altro scrive 

Un altro evento è dovuto al timer che ogni 500ms legge .Poi ho inserito un'altra funzionalità che legge subito dopo aver scritto .

Ho anche inserito la serializzazione e deserializzazione per salvare i dati su file xml e ricaricarli .

Essendo un simulatore di impianto mi serve per testare le logiche e garantire la comunicazione .Ho progettato il protocollo con relativa documentazione, e quando sarà il momento l'ing informatico che dovrà fornire l'applicazione non avrà scampo almeno per quanto riguarda scrivere e leggere.

Per un applicazione seria ed industriale si devono implementare altri oggetti ed altre tecniche , come il multi threading, i design pattern e molte altre cose.

Non va bene usare il timer delle form per una cosa stabile.

L'applicazione finale deve gestire una logica molto complessa, database con query complicate , visitare grafi e fare scelte.La parte di scrittura sarà eseguita su eventi one-shoot mentre la lettura su thread separato , diciamo ogni tot tempo legge tutto o comunque legge quello che serve per decidere se leggere altre cose o no.

Attualmente a me va bene cosi , piu che sufficiente per quello che devo verificare , ma sto gia progettando una base per sviluppi futuri .

Si tratta di creare e gestire moduli o meglio oggetti che possono essere utilzzati in base alle esigenze di progetto nel caso di magazzini automatici robotizzati e computerizzati .

comunque inizia a giocarci sopra e vedrai che funziona molto bene ed è molto veloce ;)

Se scarichi il materiale dal sito ufficiale di Snap7 troverai diversi esempi , anche in c#

Inizia ad aprirli e a studiarli e poi componi i tuoi DB per scrivere e/o leggere tramite le funzioni del wrapper snap7 .

Ai dati che scrivi fai seguire per ultimo un booleano che determina la ricezione in modo tale che se hai quel booleano vuol dire che hai gia ricevuto i dati e che sono validi e coerenti .

Se sei in una rete industriale con 40 inverter, azionamenti , barcode , hmi , plc's non puoi scrivere e leggere continuamente altrimenti vai a saturare la rete stessa creando traffico inutile, se poi hai i safeties ancor peggio. Devi stabilire le tempistiche in base alle esigenze e alle ottimizzazioni del'impianto .Ne troppo veloce e nemmeno troppo lento .Ti consiglio di iniziare a smanettare e poi inizi a specializzarti , le cose da fare e da sapere sono molte e notevoli per una app stabile .Ci sono poi i controlli da inserire per capire se la connessione è viva o no , i timestamp etc.

Io sto gia pensando ad n re-vamping di applicazioni che avevo scritto per opc server e fare il porting per snap7 , quindi wrapper, facade, proxy, adapter etc in quanto molte cose non le posso rifare da capo perchè già funzionanti e manutenute in un certo modo  

Link al commento
Condividi su altri siti

Operational Amplifier

Attualmente sono ancora in fase di studio con C# (libro acquistato), la libreria l'avevo già scaricata, controllerò all'interno del file zippato per gli esempi.

Scusa Walter non ho capito se nel S71500 devo utilizzare le DB non ottimizzate (mi sembra che snap7 punti in assoluto). 

Link al commento
Condividi su altri siti

Quote

Se sei in una rete industriale con 40 inverter, azionamenti , barcode , hmi , plc's non puoi scrivere e leggere continuamente altrimenti vai a saturare la rete stessa creando traffico inutile

Walter, 

questo problema lo abbiamo affrontato.

 

Attualmente tutti gli switch (anche quelli più economici, gli hub non esistono più) creano dinamicamente le tabelle associate agli IP connessi alle singole porte. Questo fa si che i pacchetti TCP vengano instradati solo verso le porte fisiche che hanno nella lista il TCP destinazione ignorando le altre.

Per cui in un'architettura a più moduli (quelle che facciamo noi) abbiamo uno switch di server che collega tutti i moduli ed all'interno di ogni modulo uno switch locale (scalance non gestito) che collega tutte le periferiche ethernet.

Il traffico è praticamente zero verso i non destinatari, testato con wireshark.

 

Se hai tutto in profinet il problema cambia : è bene non mischiare le reti ed inoltre gli indirizzi disponibili diventano insufficienti per la sottorete.

In questo caso separiamo la rete ethernet dati da quella ethernet campo, così ogni PLC può avere la stessa classe di indirizzi delle sue periferiche e installiamo un processore aggiuntivo (CP343-1) che gestisce server,HMI e altra robaccia asincrona. Per cui localmente abbiamo uno switch profinet ed uno ethernet-dati connesso a quello del server.

Costicchia qualcosa in più ma alla fine l'architettura è senz'altro migliore.

 

p.s.

Bello il video ;):thumb_yello:

 

Link al commento
Condividi su altri siti

Grazie ;)

Negli ultimi impianti usiamo spesso gli scalance con topologia .

In altri impianti che stiamo re-vampando anche per l'inserimento di safeties (barriere, cancelli etc) sto proponendo il disaccoppiamento della rete impianto da quella della azienda tramite router e rete 172.31......  In impianti vecchi ci sono gli IP 192.168 ormai pieni e condivisi tra uffici , macchine , etc , daltronde è roba vecchia ....

Quello di mettere una scheda CP343-1 per gestire la "robaccia" lo propongo sempre e talvolta riesco ad averlo .

Ultimamente ordinano le IM-F con 3 porte , in altri casi le 317 in altri le 315 , in altri  5 o 6xIM-F ....le 400 le stiamo togliendo per via che non supportano i safeties 

In pratica c'e' ancora un po di disordine ma il target sarebbe quello , come dici tu .

Gli switch scalance con topologia li suo anche perchè alcuni moduli non sono disposti di memory card e perderebbero l'indirizzo (costano troppo le memory , poi magari le mettono da 8 mega dove non serve) .... 

Link al commento
Condividi su altri siti

Operational Amplifier

Ho notato che alcuni utilizzano il  "SIMATIC NET SOFTNET" come software per la gestione della comunicazione (ethernet) e poi sviluppano la grafica in C#, a parte il costo della licenza, quali sono le differenze tra snap7 ed il Softnet...?

Link al commento
Condividi su altri siti

quello che dici tu è l'opc server simatic. Ce ne sono di meglio come Keepware e poi Matricon .

L'architettura è diversa per il programmatore .Quello che fai tu con Snap7 lo fa l'opc server in modo trasparente , piu o meno .

Per cui lascia perdere e usa Snap7 , gli opc's li ho già provati tutti da anni .

Link al commento
Condividi su altri siti

Sto mettendo giù una comunicazione continua con Thread separato , delegate ed evento ....

 private void cb_readwritethread_CheckedChanged(object sender, EventArgs e)
        {
            if(cb_readwritethread.Checked==true)
            {
                readwriteThread = new Thread(ReadWriteThread);
                readwriteThread.Start();
            }
            else
            {
                if(readwriteThread!=null)
                {
                    readwriteThread = null;
                }
            }
        }


 private void ReadWriteThread()
        {
            while(true)
            {
                PlcDBRead();
               // UpdateRXViews();
                if(on_updateRXviewEvent!=null)
                {
                   this.BeginInvoke(on_updateRXviewEvent);
                }
                Thread.Sleep(300);
                FillDBWrite();
                WriteDB();
                Thread.Sleep(300);
            }
           
        }

  void UpdateRXFromEvent()
        {
            UpdateRXDatas();
            UpdateRXViews();
        }

Sembrerebbe reggere ....mancano un po accortezze sul delegato ma stai in piedi per ora.

In questo modo flaggo una checkbox e fa tutto lui ....

Il delegato serve altrimenti quando faccio l'aggiornamento dei controlli come texbox , pulsanti etc che fanno parte del thread principale mi da errore.in questo modo posso condividere le risorse , un altro modo è quello di prevedere un delegato con parametri .

Un delegato si puo' definire in qualche modo come un puntatore a funzioni del C

Link al commento
Condividi su altri siti

ho fatto qualche accorgimento ......

 private void cb_readwritethread_CheckedChanged(object sender, EventArgs e)
        {
            if(cb_readwritethread.Checked==true)
            {
                
                readwriteThread = new Thread(ReadWriteThread);
                readwriteThread.Start();
                on_updateRXviewEvent += new UpdateRXViewDelegate(UpdateRXFromEvent);
            }
            else
            {
                if(readwriteThread!=null)
                {
                    on_updateRXviewEvent -= new UpdateRXViewDelegate(UpdateRXFromEvent);
                    readwriteThread.Abort();// = null;
                }
            }
        }

        private void ReadWriteThread()
        {
            while(readwriteThread.IsAlive)
            {
                PlcDBRead();
                
                if(on_updateRXviewEvent!=null)
                {
                    Invoke(on_updateRXviewEvent);
                }
             //   Thread.Sleep(100);
                FillDBWrite();
                WriteDB();
             //   Thread.Sleep(100);
            }
           
        }

        void UpdateRXFromEvent()
        {
            if(readwriteThread!=null)
            {
                UpdateRXDatas();
                UpdateRXViews();
            }
          
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (readwriteThread != null)
            {
                on_updateRXviewEvent -= new UpdateRXViewDelegate(UpdateRXFromEvent);
                readwriteThread.Abort();
                readwriteThread = null;
            }
        }

 

Devo ancora piazzare qualche blocco try-catch e i finally ....comunque cosi gira bene 

Link al commento
Condividi su altri siti

  • 2 weeks later...
Operational Amplifier

Ho effettuato delle prove con il "clientdemo.exe" con un plc s7300, ho letto e scritto alcune variabili attraverso il pulsante read/write, poi ho letto la parte della documentazione che riguarda la comunicazione con il client snap7 e plc s71200/s71500, ho notato che nella configurazione hardware bisogna effettuare tre passaggi :

1 - I DB non devono essere ottimizzati.

2 - Sotto la voce protezione deve esserci l'accesso completo.

3 - Infine il flag su "Autorizzazione Comunicazione tramite funzioni Get e Put".

 

Per il punto uno e tre nessun problema ma per il punto due significa avere il software accessibile da chiunque, secondo voi come è possibile proteggere il software?

Link al commento
Condividi su altri siti

io questo tipo di applicazioni le imposto nel seguente modo:

1) Il plc è sempre il server 

2) l'applicazione pc, su windows o linux o altro , è sempre client.

L'accesso completo credo si riferisca ai DB non agli FC o FB ... o no?

Link al commento
Condividi su altri siti

Operational Amplifier

Nel manuale Snap7 c'è scritto che nella configurazione hardware sotto la voce protezione deve essere spuntato accesso completo "senza password", pag35/289.

Con S7300 e password di Livello 3 sono riuscito ad effettuare l'accesso con il "clientdemo.exe".

Effettuerò delle prove con un S71500

 

 

Link al commento
Condividi su altri siti

se vuoi accedere dall'esterno a un db bisogna che questo sia libero da vincoli .Per cui O mandi la password , cosa che in snap7 non puoi fare, oppure lasci il blocco senza password. i blocchi safety che hanno password non sono accessibili 

Link al commento
Condividi su altri siti

Operational Amplifier

Walter mi stai parlando dei DB del programma da quello che ho capito con protezione know how, quello mi può stare bene (lasciarli accessibili) ma solitamente io immetto una password in lettura e scrittura da accesso esterno al Plc, che sarebbe la solita password livello 3 nell' hardware S7300.

Quando ho effettuato le prove con S7300 la password di livello 3 l'avevo impostata e riuscivo a leggere e scrivere con il client, dovrebbe essere così anche l'S71500 solo che nel manuale di snap7 è specificato di lasciare l'accesso completo nella configurazione hardware guarda a pagina 35 del manuale, ti risulta?

Link al commento
Condividi su altri siti

proprio adesso ho inserito la password read/write nel HW del plc .

Con snap7 riesco a leggere e a scrivere senza problemi.

Potrebbe darsi che qualche funzione avanzata di Snap7 sia bloccata ma quelle di scrittura e lettura DB stanno funzionando

Con Snap7 , volendo, si può creare una sorta di Simatic Manager ;) 

Link al commento
Condividi su altri siti

Operational Amplifier

Walter sono riuscito ad accedere anche con la password di lettura/scrittura sulla CPU S71500 benissimo come con S7300, adesso effettuo un po di prove con C#....:thumb_yello:

 

Link al commento
Condividi su altri siti

Operational Amplifier

A livello di codice C# non ho modificato nulla (del demo) era come dicevi te uguale all' S7300 solamente che bisogna spuntare in più "consenti accesso tramite comunicazione PUT/GET dal partner remoto".....:thumb_yello:.

Adesso sto cercando di capire il demo a livello di codice C#, sono alle prime armi....;)

Link al commento
Condividi su altri siti

Quote

Nel manuale Snap7 c'è scritto che nella configurazione hardware sotto la voce protezione deve essere spuntato accesso completo "senza password", pag35/289.

Con S7300 e password di Livello 3 sono riuscito ad effettuare l'accesso con il "clientdemo.exe".

Effettuerò delle prove con un S71500

 

Quote

Walter sono riuscito ad accedere anche con la password di lettura/scrittura sulla CPU S71500 benissimo come con S7300, adesso effettuo un po di prove con C#....:thumb_yello:

 

Per curiosità che versione di Firmware hai ?

Quando feci le prime prove avevo delle CPU S71200/1500 praticamente con il primo firmware.

 

Buono a sapersi :thumb_yello:

 

Per le altre due voci:

- L'autorizzazione al GET/PUT serve ad abilitare "S7Protokol".

- Le DB ottimizzate potrebbero avere la disposizione dei campi interni diversa da quella progettata, quindi gli offset non sarebbero più validi.

 

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