Vai al contenuto
PLC Forum


Consiglio Per Gestione Ricette-M258


Messaggi consigliati

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

Come sempre grazie anticipatamente del vostro prezioso aiuto

Matteo

Link al commento
Condividi su altri siti


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

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

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

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

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

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

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

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

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

post-21586-0-57565500-1396812263_thumb.p

post-21586-0-99784600-1396812363_thumb.p

post-21586-0-76512000-1396812565_thumb.p

Modificato: da valvolina
Link al commento
Condividi su altri siti

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

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

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

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 :blink:

Modificato: da bigalex
Link al commento
Condividi su altri siti

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

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 :blink:

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