gargio Inserito: 22 dicembre 2016 Segnala Share Inserito: 22 dicembre 2016 Buongiorno, è presente una funzione in Snap7 in grado di connettere più plc simultaneamente e decidere poi quale delle connessioni stabilite attivare? In alternativa mi è venuta l'idea di creare un array di Client, ma spero ci sia una funzione già implementata più semplice. (I plc saranno del tipo S7 1200/1500) Grazie mille. Link al commento Condividi su altri siti More sharing options...
gargio Inserita: 22 dicembre 2016 Autore Segnala Share Inserita: 22 dicembre 2016 P.S. Tra l'altro pur avendo impostato al singolo plc: Client.SetConnectionType(Snap7.S7Client.CONNTYPE_BASIC) mi da TCP : Connection refused Link al commento Condividi su altri siti More sharing options...
gargio Inserita: 22 dicembre 2016 Autore Segnala Share Inserita: 22 dicembre 2016 Post Scriptum risolto: stupido conflitto di ip in rete Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 23 dicembre 2016 Segnala Share Inserita: 23 dicembre 2016 L'idea di un array (o una lista) di Client è la soluzione migliore. La comunicazione, a basso livello, è di tipo TCP/IP : ogni client ha un socket connesso al PLC. Un socket, e di conseguenza un client, non può essere connesso a più PLC contemporaneamente. Una simile architettura è possibile solo in presenza di scambio dati connectionless, tipo UDP per capirci, dove mandi un pacchetto e questo viene ricevuto solo dal device che riconosce l'indirizzo di destinazione. Ti sconsiglio caldamente di pensare ad una classe che si connette, scambia dati e si disconnette. La connessione S7 introduce un overhead notevole in quanto è a tre livelli : connessione TCP/IP, connessione ISO, Setup S7 (negoziazione PDU). Inoltre le CPU non amano molto questo "accendi e spegni". Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 23 dicembre 2016 Segnala Share Inserita: 23 dicembre 2016 si ma anche una coda di eventi perchè se ad ogni client corrisponde un socket , ad ogni client corrispondono anche diverse operazioni da fare e da sincronizzare Per cui threads separati , mutex , semafori etc ..... Non è un'applicazione proprio semplice Link al commento Condividi su altri siti More sharing options...
gargio Inserita: 25 dicembre 2016 Autore Segnala Share Inserita: 25 dicembre 2016 Già in effetti sto riscontrando qualche difficoltà visto che non mi sembra ci sia una funzione che restituisca l'indirizzo IP del plc connesso, in modo da distinguerli chiaramente e sicuramente univocamente all'interno della lista. Penso poi che sia una cosa abbastanza comune il fatto di dover gestire più di un plc; quindi qualcuno ha un esempio di codice o altro di come si possa implementare? (Io userò vb.net con dei 1200/1500, qualsiasi esempio però in qualunque linguaggio e per qualunque dispositivo è ben accetto) Grazie mille. Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 25 dicembre 2016 Segnala Share Inserita: 25 dicembre 2016 SI ma in applicazioni di questo tipo ci sono anche altri accorgimenti lato plc's Si usa un plc,per esempio, come concentratore di informazioni e ci si connette a questo col pc . Se consideri che in un impiantomodesto ci sono profinet , safeties, pannelli , HMI , SCADA etc non puoi pensare di strutturare la cosa comunicando con 200 plc ed altresi 200 client . L'architettura che ti ho appena spiegato è largamente usata e permette di fare molte cose e molto meglio Link al commento Condividi su altri siti More sharing options...
dan64100 Inserita: 26 dicembre 2016 Segnala Share Inserita: 26 dicembre 2016 Quote Si usa un plc,per esempio, come concentratore di informazioni e ci si connette a questo col pc . Se consideri che in un impiantomodesto ci sono profinet , safeties, pannelli , HMI , SCADA etc non puoi pensare di strutturare la cosa comunicando con 200 plc ed altresi 200 client Su questo non sono completamente d'accordo, ti dico le considerazioni che abbiamo fatto noi a riguardo. Efficienza: Supponi di avere un impianto in cui ogni PLC gestisce un modulo il quale, per lavorare ha necessità di avere le informazioni dal server, e che alla fine deve registrare i dati . In questo caso il PLC concentratore è un grosso collo di bottiglia : hai una comunicazione three-tier PLC<->PLC<->SERVER che per grossi impianti può portarti anche a 600/700 ms solo per la comunicazione di campo che peggiora all'aumentare dei PLC, poi devi metterci la parte server. Risorse: I PLC Siemens hanno risorse di comunicazione limitate, se hai 200 PLC non puoi pensare di connetterli tutti ad un unico concentratore a meno di non mettere nel rack una batteria di CP ($$$) oppure devi creare più livelli Ore uomo / Programmazione: Devi implementare software lato PLC che comunica con il concentratore e (forse) viceversa, devi implementare lato PC software che serializza/deserializza le informazioni a livello logico (il canale è lo stesso ma i PLC sono tanti). Ti sei giocato la possibilità di usare un approccio object oriented : hai un unica classe che deve gestire (almeno come front-end) tutto. Se non sei stato molto bravo nel progetto dell'architettura, ad ogni modifica hardware seguiranno modifiche software a cascata. Snap7 è stato progettato apposta per la comunicazione in parallelo, più PLC ci sono più è vantaggioso secondo un principio molto semplice: All'aumentare dei PLC aumenta in modo importante il valore dell'impianto ma la complessità, usando un approccio object oriented, non cresce in proporzione, per cui l'utile di commessa è maggiore. Gargio Devi usare un approccio object oriented altrimenti non ne esci vivo, a prescindere che tu usi Snap7 o un OPC server o altro. S7Client è una classe che ti gestisce solo il canale di comunicazione. Devi creare una classe, ad esempio PLC, che contenga al suo interno: - Tutte le informazioni (indirizzo, info ecc..) relative al PLC. - Un thread che ti gestisce la comunicazione in modo indipendente da tutto il resto del programma e che gestisca gli errori (qualcosa trovi quì ) - Un S7Client che comunica con la CPU. - Il codice necessario alla configurazione : caricare da un DB, un file o quant'altro le informazioni relative al tuo PLC. La lista deve contenere queste classi non direttamente il client. Alla fine hai bisogno di una classe manager, di interfaccia con il tuo programma, che contiene la lista e si occupa dello start/stop dell'impianto. Lavora sull'architettura a livello di progetto (se vuoi scrivere software industriale ) Link al commento Condividi su altri siti More sharing options...
walterword Inserita: 26 dicembre 2016 Segnala Share Inserita: 26 dicembre 2016 Giusto . Bisogna lavorare con oggetti , ereditarietà , polimorfismo etc ...magari creare classi che ereditano da una classse specializzata che deriva da S7Client di Snap 7 . Bisogna progettare bene ciao Link al commento Condividi su altri siti More sharing options...
gargio Inserita: 3 gennaio 2017 Autore Segnala Share Inserita: 3 gennaio 2017 Ok, grazie mille per le delucidazioni, proverò a riprendere in mano il progetto e verificare queste caratteristiche. Essendo praticamente ai primi passi probabilmente chiederò ancora a voi esperti per altri sicuri intoppi Grazie ancora intanto 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