step-80 Inserito: 4 aprile 2014 Segnala Share Inserito: 4 aprile 2014 Salve a tutti ragazzi,torno a stressarvi per un problema forse banale ,ma volevo comunque un vostro consiglio. Dunque da circa un mese la mia 'creatura' sta lavorando, devo dire con ottimi risultati. Per chi non lo sapesse,si tratta di una riempitrice/chiuditrice per blister da me costruita,che monta un controllore M258 e qualche brushless in CanOpen. Ora mi si prospetta la necessità di creare un database di ricette, che l'operatore deve avere la possibilità di richiamare ogni qualvolta si presenta la necessità di lavorare un dato formato. Supponiamo che ogni formato abbia bisogno di 40 variabili(è questo il numero più o meno) che possono essere di tipo TIME,REAL,DINT,ecc ecc e supponiamo che mi bastino una 50ina di ricette a disposizione. Avrei pensato di procedere in questo modo: -Creo una variabile di tipo byte che chiamerò 'INDICE' che sarà il mio indice di array -Creo un array di tipo STRING [1..50] che saranno i nomi delle mie ricette -Creo tutti i vari array,uno per ogni variabile che intendo memorizzare(Per esempio TEMPO_SALDATURA:array[1..50] of TIME; e cosi via) -Creo un programmino che mi permetta di incrementare/decrementare la variabile INDICE senza permettermi di sforare ovviamente, quindi da 1 a 50,cosicchè da permettermi di selezionare il numero dove voglio memorizzare/richiamare la ricetta -A questo punto creo due pulsanti:MEMORIZZA e RICHIAMA -Alla pressione di MEMORIZZA copio i valori contenuti nelle varie aree di memoria delle mie variabili di lavoro nelle variabili di array corrispondenti ad un indice ben preciso -Alla pressione di RICHIAMA eseguo il contrario di sopra. Questo ovviamente nei miei pensieri,volevo sentire i vostri preziosi pareri,se è la strada giusta o se mi sto complicando la vita... Come sempre grazie anticipatamente del vostro prezioso aiuto Matteo Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 5 aprile 2014 Segnala Share Inserita: 5 aprile 2014 ciao personalmente farei così : 1 - crei un dut (tipo di dati creato da te) che contiene tutti gli ingredienti della ricetta che ti servono esempio TYPE ricetta : STRUCT nome_ricetta : STRING(40); ingrediente_1 : REAL; ingrediente_2 : INT; ingrediente_3 : WORD; ingrediente_4 : BYTE; ingrediente_5 : BOOL; ingrediente_6 : DINT; ingrediente_7 : REAL; ingrediente_8 : REAL; ingrediente_9 : REAL; ingrediente_10 : REAL; END_STRUCT END_TYPE i dut li crei cliccando con il tasto destro su application (come per aggiungere un pou) ma scegli dut 2 - a questo punto nelle variabili globali o persistent (ad esempio) aggiungi un dato ricette che composto da un array fatto da 50 variabili del tuo tipo di dati ricetta aggiungi un dato ricetta in lavoro che è di tipo ricetta e un indice ricette : ARRAY[0..50] OF ricetta; ricetta_in_lavoro : ricetta; indice: INT; se vuoi caricare una ricetta in lavoro ti basta fare ricetta_in_lavoro := ricette[indice]; (dove indice è il numero xxx delle tue cinquanta ricette che vuoi caricare in lavoro) così invece per fare il contrario ricette[indice] := ricetta_in_lavoro; con questa operazione vengono copiati tutti gli ingrediente della ricetta con istruzione sola 3 - per estrarre gli ingredienti dalla ricetta o dargli un vaolore desiderato ti metto alcuni esempi: ricetta_in_lavoro.ingrediente_1 := 23; ricetta_in_lavoro.ingrediente_1 := ricette[indice].ingrediente_1; ricette[indice].ingrediente_6 := 98; ricette[indice].ingrediente_6 := ricetta_in_lavoro.ingrediente_5; ricetta_in_lavoro.nome_ricetta := 'ricetta trenta da lavorare'; ricetta_in_lavoro.nome_ricetta := ricette[indice].nome_ricetta; spero di essere stato di aiuto saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 5 aprile 2014 Autore Segnala Share Inserita: 5 aprile 2014 (modificato) Mi chiedi se sei stato d'aiuto? Credo che 56 mila centri assistenza, 12 corsi schneider e 6 master non sarebbero stati esaustivi come te... C è ancora qualcosa che mi sfugge, devo rileggere bene e mettermi li a provare cio che mi hai "svelato",ma sono sicuro che ci arriveró. Forse perchè parli di DUT e STRUCT che sono tipi di dato che non conoscevo( le mie conoscenze mi dicevano che lo struct è come l'array solo che è composto da tipi di dati anche diversi, non so se è esatto) In ogni caso grazie infinite dell'aiuto, ovviamente ogni altro tuo/vostro intervento sarà oro colato Matteo Modificato: 5 aprile 2014 da step-80 Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 5 aprile 2014 Segnala Share Inserita: 5 aprile 2014 ciao in realtà dut (immagino sia l'abbreviazione di dati utente) è il nome che trovi in Somachine (o codesys) per poter inserire nel progetto alcuni tipi di dati, come ad esempio : le strutture (struct) o gli enumeratori ecc.... la struttura come nell'esempio sopra può contenere diversi tipi di dati, mentre l'array è un insieme di dati ma tutti dell stesso tipo. nella struttura puoi anche inserire gli array. l'esempio in pratica progetta un tipo di dati(struct) composto secondo l'esigenza dell'applicazione (nel tuo caso le ricette). poi definisce e utilizza un array di struct (nel tuo caso le ricette). in pratica definendo un tuo tipo di dati ti consente poi di fare un array più complesso, composto anche da dati di tipo diverso. un array di ricette in cui ogni ricetta è composta da diversi ingredienti. saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Ciao Valvolina Nel primo post non capisco il significato del numero 40 fra parentesi, dopo la dichiarazione string. Per il resto credo che in 5-6 anni ci potrei arrivare Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 ciao vuol dire che il campo string cioè il tuo nome ricetta è composto da un massimo di 40 caratteri (o se vuoi byte) il campo string può essere composto al massimo da 256 caratteri (0---255) per il resto se vuoi lo facciamo passo per passo. dammi un appuntemento sul forum e io ci sarò, per spiegarti come fare e cosa significa un passo alla volta. penso che questo sia uno dei significati più importanti del fornum. ovviamente diamoci appuntamento con un minimo di anticipo. aspetto tue news saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Mi devi perdonare, ma non si è piu abituati a ricevere senza dover dare, e sulle prime ci sono rimasto un po cosi... Poi ho compreso ció che volevi dire, e ció che tu intendi per forum: io la penso esattamente come te, e tutte le volte che posso dare qualche consiglio lo do volentieri anche se non sono esperto come voi. Sono onorato di aver ricevuto non solo consigli ma addirittura un appuntamento: stai certo che non mi faró sfuggire l'occasione! Ho capito che vuoi fare tutto alla luce del forum cosi che sia d'aiuto anche ad altri e sono pienamente d'accordo con te... Forse faticavo a comprendere perchè nei primi post usavi(giustamente) nomi generici ed io che sono abituato ai miei non 'traducevo' a dovere. Ps: il discorso del dato 40 fra parentesi è valido solo per i dati string? Ppss: per la spiegazione passo passo ti ringrazio davvero, dovresti darmi un tuo target di orari per organizzarci! Grazie infinite Matteo Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 ciao prendo direttamente dal manuale di Somachine (o codesys): Una variabile del tipo di dati STRING può essere dotata di una stringa desiderata. L'indicazione di grandezza per riservare lo spazio nella memoria in fase di dichiarazione, si riferisce a caratteri e può avvenire tra parentesi tonde o quadrate. Laddove non vi siano indicazioni di dimensione, vengono accettati di default 80 caratteri. La lunghezza della stringa è inoltre illimitata, le funzioni String possono tuttavia elaborare solo lunghezze da 1 a 255! Se una variabile viene inizializzata con una stringa troppo lunga per il tipo di dati delle variabili, la stringa viene tagliata a partire in fondo. per correttezza il numero fra parentesi vale nel caso di tipo di dati string e vale da 1 a 255 (non 0 255 come ti avevo scritto) Se una variabile viene inizializzata con una stringa troppo lunga !!!!!!!!! ricetta_in_lavoro.nome_ricetta := 'ricetta trenta da lavorare abacabababababababababababababbababababababababbababababababababbabababababxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; l'inizzializzazione sono i caratteri scritti all'interno degli apici 'xxx' ad un certo punto passati i 255 caratteri massimi viene tagliata per quanto riguarda gli orari, direi la sera (dopo il lavoro) ad esempio dalle 18 in poi domani va benissimo se ci sei. saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 ciao inizia con il descrivermi i parametri (o ingredienti) che fanno parte della tua ricetta saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Domani dalle 18 sarebbe perfetto.. Grazie mille per la pazienza Matteo Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Scusami,ho visto ora la seconda parte del messaggio. Dunque le variabili sono queste:(oltre ovviamente all'indice e al nome ricetta) Tempo_di_saldatura:TIME; Tempo_tavola_rotante:TIME; Offset_cilindro_formatura:TIME; Anticipo_apertura_formatura:TIME; Ritardo_pinze:TIME; Temp_prerisc:REAL; Temp_risc:REAL; Temp_sbavatore:REAL; Dosata_principale:REAL; Velocita_mandata:REAL; Prodotto_risucchiato:REAL; Velocita_aspirazione:REAL; Velocita_risucchio:REAL; Acc_mandata:DINT; Dec_mandata:DINT; Acc_dec_risucchio:DINT; Acc_dec_aspirazione:DINT; Modalita_dosata:BOOL; Quota_di_fondo:REAL; Quota_di_risalita:REAL; Quota_di_fuor_lenta:REAL; Quota_intermedia:REAL; Vel_risalita_dur_riemp:REAL; Vel_uscita_lenta:REAL; Tempo_att_prima_dosata:TIME; Tempo_att_dopo_dosata:TIME; Spazio_pinze_prerisc:REAL; Spazio_pinze_risc:REAL; Offset_caricatore:DINT; Vel_inverter:REAL; Acc_inverter:DINT; Dec_inverter:DINT; Tempo_di_posa:TIME; Tempo_rit_asse_x:TIME; Ecco,i miei ingredienti sono questi. Calcola che un nome tipico di una mia ricetta potrebbe essere ' SIERO VISO 700 PZ ORA ' . Grazie ancora Matteo Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 (modificato) ciao bisogna cominciare a definire un tuo tipo di dati che chiameremo RICETTA_BASE quindi da Somachine inserisci un DUT (vedi immagine_1) come nome inserisci RICETTA_BASE come tipo di dati invece scegli struttura (vedi immagine_2) e clicca sul pulsante apri si aprirà una vista come da immagine_3 poi ho inserito i tuoi ingredienti copiati dal tuo messaggio, aggiungendo anche il nome ricetta TYPE RICETTA_BASE : STRUCT nome_ricetta :STRING(50); Tempo_di_saldatura :TIME; Tempo_tavola_rotante :TIME; Offset_cilindro_formatura :TIME; Anticipo_apertura_formatura :TIME; Ritardo_pinze :TIME; Temp_prerisc :REAL; Temp_risc :REAL; Temp_sbavatore :REAL; Dosata_principale :REAL; Velocita_mandata :REAL; Prodotto_risucchiato :REAL; Velocita_aspirazione :REAL; Velocita_risucchio :REAL; Acc_mandata :DINT; Dec_mandata :DINT; Acc_dec_risucchio :DINT; Acc_dec_aspirazione :DINT; Modalita_dosata :BOOL; Quota_di_fondo :REAL; Quota_di_risalita :REAL; Quota_di_fuor_lenta :REAL; Quota_intermedia :REAL; Vel_risalita_dur_riemp :REAL; Vel_uscita_lenta :REAL; Tempo_att_prima_dosata :TIME; Tempo_att_dopo_dosata :TIME; Spazio_pinze_prerisc :REAL; Spazio_pinze_risc :REAL; Offset_caricatore :DINT; Vel_inverter :REAL; Acc_inverter :DINT; Dec_inverter :DINT; Tempo_di_posa :TIME; Tempo_rit_asse_x :TIME; END_STRUCT END_TYPE Modificato: 6 aprile 2014 da valvolina Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 ciao di nuovo bisogna prima di andare avanti fare un piccolo ragionamento sui dati di tipo TIME. se questi dati li devi inserire da un pannello operatore (ad esempio Schneider), il tipo TIME non è gestito direttamente sul pannello. Per cui il mio consiglio è di trasformarli prima di scriverli nella ricetta. ad esempio prendiamo il Tempo_di_saldatura definisci una variabile Tempo_di_saldatura_da_pannello : dint; // che potrai scrivere da pannello operatore ad esempio in decimi di secondo (123 = 12,3 secondi) quello di cui devi tenere conto è che alla fine il tipo di dati TIME regola i temporizzatori in millesimi di secondi per cui per passarlo alla ricetta: Tempo_di_saldatura := dint_to_time(Tempo_di_saldatura_da_pannello * 100); // per 123*100 = 12300 = come risultato finale in tipo TIME 12,3 secondi devi decidere come fare, questo è solo un esempio. a domani sera saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Ciao utilizzo un pannello Schneider,ed il tipo di dato TIME me lo fa inserire tranquillamente ,in millesimi di secondo. Perchè dici che il tipo di dato TIME non è gestito dal pannello? Grazie Matteo Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 6 aprile 2014 Segnala Share Inserita: 6 aprile 2014 ciao OK ho provato e hai ragione tu il tipo time con protocollo Somachine è gestito. inoltre ho provato a fare una ricetta derivata dalla struttura creata, e viene gestita anche quella. una domanda : che tipo di pannello hai? saluti da Valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 6 aprile 2014 Autore Segnala Share Inserita: 6 aprile 2014 Il tipo di pannello dovrebbe essere il GTO da 5.7", ma te lo posso confermare domani... Link al commento Condividi su altri siti More sharing options...
bigalex Inserita: 7 aprile 2014 Segnala Share Inserita: 7 aprile 2014 (modificato) Concordo con l'esaustivo aiuto fornito da Valvolina. Onestamente però lavorerei in modo da utilizzare solo variabili di tipo INT in sostituzione di variabili di tipo DINT o REAL o TIME ove possibile in maniera da ridurre il consumo di memoria plc. Ad esempio : - per le accelerazioni/decelerazioni utilizzarei valori da 0 a 1000 ( ovvero 0.0 ---> 100.0) da adattare prima del trasferimento all'istruzione di posizionamento o movimento in velocità . - per i tempi puoi avere da 0 a 32767 che in funzione dell'utilizzo adatterai prima di trasferire il preset al TIMER . - per le posizioni stesso discorso . Attenzione però all'utilizzo per la memorizzazione delle ricette di variabili non allocate (cioè simboliche) specialmente quando poi hai che fare con variabili condivise (shared) con il pannello operatore e con il protocollo SoMachine. Ricordo di avere avuto problemi in passato soprattutto se durante lo sviluppo devi aggiungere variabili al progetto . Per le ricette è senz'altro meglio utilizzare il pannello operatore (che ha o dovrebbe avere una propria gestione ricette) sempre che possa fare al caso tuo. bigalex Modificato: 7 aprile 2014 da bigalex Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 7 aprile 2014 Autore Segnala Share Inserita: 7 aprile 2014 Grazie Bigalex per il tuo intervento Per quanto riguarda le posizioni Lexium 32 accetta solo variabili DINT,che io ho trasformato in Real per aver la possibilità di inserire cifre con la virgola dopo aver scalato adeguatamente i valori(per passare le posizioni direttamente in decimi/mm o centesimi/mm). Per le accelerazioni non mi sono posto li per li il problema ma onestamente ora mi sto chiedendo se il plc riesca a supportare un surplus di memoria del genere (per di più retain). Non ho nemmeno dato uno sguardo alla possibilità di gestire le ricette da HMI anche se ho visto che la cosa era fattibile... L' HMI è il modello HMIGTO2310 da 5.7" . Speriamo di non avere problemi,in teoria non dovrei più aggiungere variabili Grazie Matteo Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 7 aprile 2014 Segnala Share Inserita: 7 aprile 2014 ciao hai già inserito la struttura ? Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 7 aprile 2014 Autore Segnala Share Inserita: 7 aprile 2014 Ciao, purtroppo non ho avuto tempo di fare nulla...maledetto lavoro! Link al commento Condividi su altri siti More sharing options...
bigalex Inserita: 7 aprile 2014 Segnala Share Inserita: 7 aprile 2014 Ciao Step-80. Ti suggerisco di perseguire la strada delle ricette su pannello operatore. anche se la gestione ricette in Vijeo Designer non mi entusiasma. Tra l'altro utilizzando le ricette da pannello operatore hai anche la possibilità di farne il backup con una utility di Vijeo Designer . Utilizzando la memoria del plc (variabili retain) questo non ti è consentito. bigalex Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 7 aprile 2014 Segnala Share Inserita: 7 aprile 2014 facciamo adesso? Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 7 aprile 2014 Autore Segnala Share Inserita: 7 aprile 2014 Si dammi due minuti mi liberoEccomi presente! Ci sono valvolina Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 7 aprile 2014 Segnala Share Inserita: 7 aprile 2014 (modificato) inizia dichirando la struttura come dal mio esempio Modificato: 7 aprile 2014 da valvolina Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 7 aprile 2014 Autore Segnala Share Inserita: 7 aprile 2014 ok 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