Vai al contenuto
PLC Forum


Ciclo For SCL


luca_82

Messaggi consigliati

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.

Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

ifachsoftware

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.

 

 

Link al commento
Condividi su altri siti

 

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 

 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

 

 

Link al commento
Condividi su altri siti

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 

Link al commento
Condividi su altri siti

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

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