luca_82 Inserito: 30 maggio 2016 Segnala Inserito: 30 maggio 2016 Ciao a tutti, sto scrivendo un blocco in SCL, per la precisione usando un ciclo for, che come linguaggio di programmazione non è poi molto diverso da quello che scrivo nei linguaggi testuali di qualche robot... L'unico dubbio che ho è questo, nel momento in cui parte la scansione del ciclo FOR, la scansione del programma della Cpu rimane bloccata all'interno di questa funzione fino al termine o se ho delle if a seguire vengono lette a prescindere dal fatto che il ciclo For sia concluso o meno? Mi è venuto perchè nel ciclo For faccio dei calcoli usando una variabile che azzero poi in una IF scritta dopo il ciclo FOR, ma come risultato del calcolo mi ritrovo sempre 0 come se tale variabile fosse azzerata prima della fine del ciclo For...!! Ciao e grazie a tutti.
dott.cicala Inserita: 30 maggio 2016 Segnala Inserita: 30 maggio 2016 Come hai già visto, rimane nel for
luca_82 Inserita: 30 maggio 2016 Autore Segnala Inserita: 30 maggio 2016 Questo è il mio pezzo di programma: //Calcolo della media di tutti i cicli della pressa memorizzati IF "Blocco controllo efficienza macchina_DB"."Orario fine turno" THEN #"Somma parziale cicli" := "Blocco cicli in un turno".Ciclo[0] + "Blocco cicli in un turno".Ciclo[1]; //Ciclo for per fare la somma di tutti i cicli memorizzati FOR #indice_somma := 2 TO "Blocco dati con la pressa"."Cicli memorizzati per media" DO #"Somma parziale cicli" := #"Somma parziale cicli" + "Blocco cicli in un turno".Ciclo[#indice_somma]; END_FOR; //Calcolo della media del ciclo "Blocco dati con la pressa"."Tempo ciclo stampaggio per efficienza" := #"Somma parziale cicli" / "Blocco dati con la pressa"."Cicli memorizzati per media"; "Blocco dati con la pressa"."Cicli memorizzati per media" := 0; END_IF; Alla fine sulla voce "Tempo ciclo stampaggio per efficienza" dovrei trovarmi un valore mentre trovo sempre 0, iio credo sia perchè la vaiabile "Cicli memorizzati per media" si trovi a 0, anche se in realtà la azzero alla fine del ciclo For...probabilmente qualcos'altro mi sfugge...!! Grazie di nuovo.
ifachsoftware Inserita: 30 maggio 2016 Segnala Inserita: 30 maggio 2016 Le IF a seguire saranno eseguite una volta uscito dal ciclo FOR Se metti delle condizioni per uscire dal ciclo FOR che ti ci fanno impiegare troppo tempo ti farebbero scattare il watch dog. Nel caso di operazioni bloccanti , dovresti metterle in task separati.
dimo2474 Inserita: 30 maggio 2016 Segnala Inserita: 30 maggio 2016 La condizione If è sempre soddisfatta prova con M_cond_att_calcolo := Blocco controllo efficienza macchina_DB"."Orario fine turno" ; // creo impulso per attivazione eseguo calcolo M_eseguicalcolo := M_cond_att_calcolo and not M_cond_att_calcolo_CRC ; M_cond_att_calcolo_CRC := M_cond_att_calcolo; // A questo punto la tua If diventa IF M_eseguicalcolo then Un consiglio : Usi #"Somma parziale cicli prima del ciclo For la inizializzi e poi la usi all'interno del ciclo For separa le due cose alla fine del ciclo For prendi la seconda memoria per mettere il risultato
luca_82 Inserita: 30 maggio 2016 Autore Segnala Inserita: 30 maggio 2016 Scusami Dimo, probabilmente non ho afferrato quello che vuoi dire...che significa che la condizione IF è sempre soddisfatta, che il Plc scansiona quello che c'è al suo interno anche se la condizione della IF è False? probabilmente ho capito male, se così fosse non avrebbe senso mettere una IF.....
aude Inserita: 30 maggio 2016 Segnala Inserita: 30 maggio 2016 Ciao , non vedo dove inizializzi la variabile "Blocco dati con la pressa"."Cicli memorizzati per media" ; che invece poi metti a zero , quindi il suo valore è sempre a zero dopo aver eseguito almeno una volta il codice , quindi il calcolo della media è diviso per 0 !!! Anche il ciclo FOR non viene mai eseguito o viene eseguito una sola volta (non ricordo se il controllo della condizione di fine ciclo viene eseguito all'inizio o alla fine vedi il manuale). Devi inizializzare la variabile "Blocco dati con la pressa"."Cicli memorizzati per media" prima del ciclo FOR , oppure impostarla come valore costante e quindi eliminare l'azzeramento che non avrebbe più senso.
dimo2474 Inserita: 30 maggio 2016 Segnala Inserita: 30 maggio 2016 Ciao in pratica : IF "Blocco controllo efficienza macchina_DB"."Orario fine turno" THEN rimane attivo perché ti si è sviluppata la condizione del fine turno e quindi il PLC continua a ciclare tutto dopo la If e quindi esegue tutto , il fine turno ti sviluppa una sola volta ,come ti ho scritto creo l'esecuzione del calcolo una sola volta . ciao
luca_82 Inserita: 30 maggio 2016 Autore Segnala Inserita: 30 maggio 2016 Grazie a tutti,credo di aver risolto almeno la prima parte...la variabile "Cicli memorizzati per media " la scrivo in un altro blocco,in realtà non prendevo il calcolo sul fronte della condizione,quindi eseguiva il ciclo for anche con la variabile "Cicli memorizzati per media"a 0 ed il risultato era per forza 0!!!! Ora devo solo capire come lui legge il formato time in quanto i conti non mi tornano,ma credo sia solo per quello...Sommo diversi valori "Time" di un array e dividendo per il numero di variabili che avevo memorizzato ( che sarebbe la variabile "Cicli memorizzati per media) dovrei trovare la media in secondi....Farò qualche prova per trovare l'inghippo. Grazie a tutti di nuovo!!
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