Vai al contenuto
PLC Forum


ciclo for in programmazione strutturata


Messaggi consigliati

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

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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.

 

 

 

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

  • 11 months later...

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

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...