Jump to content
PLC Forum


Sign in to follow this  
ramjet

ciclo for in programmazione strutturata

Recommended Posts

ramjet

Buongiorno

sto cercando di imparare a usare la programmazione strutturata su PLC Schneider.

Ho fatto un programma che apre due cilindri pneumatici secondo la sequenza A+ B+ B- A-.

Il programma ha funzionato; quando ho introdotto un ciclo for per ripetere la sequenza per un certo numero di volte (ad esempio 3) il programma funziona senza fermarsi mai, come se il contatore non venisse aggiornato.

 

Allego di seguito il listato in cui: 

a0, a1,  b0,  e b1 sono i finecorsa dei cilindri A e B;

Ap e  Am comandano apertura e chiusura del cilindro A;

Bp e Bm comandano apertura e chiusura del cilindro B;

L'intero i è stato dichiarato nella tabella delle variabili come int.

 


FOR i:=0  TO 3 BY 1 DO

x:=(pm and a0 or x) and not(b1); 

    if x and a1 then 
    Reset( Bm);
    Set (Bp);
    end_if;


if  x  then
    Reset( Am);
    Set (Ap);
    end_if;


    if  not( x) and b0 then 
    Reset( Ap);
    Set (Am);
    end_if;

        if not(x) then 
    Reset( Bp);
    Set (Bm);
    end_if;

    
END_FOR;

 

Grazie

Share this post


Link to post
Share on other sites

Water

vado a naso senza entrare nel merito del programma,

non si incrementa perchè ...non lo incrementi!

a fine del ciclo devi mettere i +1

Share this post


Link to post
Share on other sites
ramjet

ma la i viene incrementata automaticamente dall'istruzione for;

comunque ho provato a fare la stessa cosa usando un ciclo while (e incrementando la i);  il ciclo va in loop e non riesco a uscire.

E' possibile che la i vada dichiarata all'interno del programma anzichè nella tabella?

dovrei  inserire, insomma un'istruzione del tipo

 

var

i: int;

end_var;

 

Inoltre: va bene dichiarare la i come intero? oppure dovrei dichiararla come dint o uint?

grazie

Share this post


Link to post
Share on other sites
zanellatofabio

La i va dichiarata come variabile nel blocco, non di tipo globale.

esempio :

 

PROGRAM TEST
VAR
    i:INT;
END_VAR


i:=0;

FOR i:=1 TO 20 DO

fai qualcosa
END_IF

END_FOR

 

fai qualcosa è il codice che viene ripetuto per 20 volte.

i:=0; all'inizio lo metto io solo per estetica, ma credo funzioni anche senza, ovvero alla fine dopo il ciclo FOR dovrebbe rimettere i a zero da solo.

 

Detto ciò, non capisco cosa serve fare una logica di comando di 2 cilindri con un ciclo FOR.

Lascia che il programma giri liberamente e ad ogni ciclo di scansione esegua la tua logica, poi saranno i set reset ad aiutarti a far compiere la giusta sequenza.

 

Io scrivo in ST le funzioni complesse che poi devono essere ripetute, invece i semplici movimenti li scrivo in ladder.

 

 

 

Share this post


Link to post
Share on other sites
ramjet

ti ringrazio.

Provo e ti faccio sapere.

Il listato l'ho scritto per motivi di studio: sto imparando ST e ho iniziato da un caso semplice che so che funziona (già scritto in ladder e in sfc)..

In realtà mi pare di aver già dichiarato (nei precedenti tentativi) la i mediante l'uso di VAR.

Vi farò sapere.

Share this post


Link to post
Share on other sites
step-80

Capisco che l'esempio è didattico, ma secondo me ti stai cacciando in un bel grattacapo. I cicli come For , While..Do e Repeat..Until io li lascerei per manipolare dati. 

Quando non ho voglia di usare il ladder e devo fare cicli simili il CASE credo sia la soluzione migliore. Confesso che non ho letto molto attentamente il listato ma buttato giu cosi credo sia molto poco leggibile , oltre a non capire la "x" a cosa serva. Ma questo è sicuramente un mio limite dato il mio background molto poco informatico..

Share this post


Link to post
Share on other sites
pigroplc

Il ciclo FOR e simili effettuano una ricorsione al loro interno fino al termine del limite previsto. Il fatto di scrivere in linguaggio strutturato NON ti esime dal commentare il significato di ciascuna riga, così come NON ti esime dallo scrivere una sequenza di operazioni logica. 

Io non conosco il PLC in questione ma programmo abitualmente in questo linguaggio e ti consiglio di utilizzare una catena sequenziale col CASE, così come suggerito da step-80.

ESEMPIO:
quando d'è il pulsante di start e il puntatore = 0 e il contatore < 3 il puntatore diventa 10

10: abilita la valvola pippo e vai al passo 20

20: aspetta il sensore di pippo e quando arriva vai al passo 30

30: abilita la valvola pluto e vai al passo 40

40: ecc ecc 

xxx: incrementa il contatore:= contatore+ 1; azzera il puntatore

 

Share this post


Link to post
Share on other sites
step-80

Concordo con Pigroplc , anch'io uso i CASE in questo modo da qualche anno e rendono i cicli molto semplici e leggibili. poi ogni tanto mi stanco e li faccio in ladder...ma al posto di una variabile uso set/reset di bit(solitamente mi servo di una word della quale uso l'indirizzamento a bit,per la comodità di poter azzerare tutti i bit con un semplice Move 0 sulla word)altrimenti che gusto c'è..:P

 

Con entrambi i metodi ripetere una sequenza per n volte è questione di un minuto, senza incasinarsi con istruzioni che loopano su se stesse col rischio di mandare in errore la cpu per watchdog...

Share this post


Link to post
Share on other sites
Livio Orsini

occhio alle date! la discussione è ferma da un anno!

 

Su questo forum non si acquistano meriti, medaglie e/o gradi in base alnumero di messaggi.;)

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

×
×
  • Create New...