ramjet Inserito: 16 febbraio 2018 Segnala Share Inserito: 16 febbraio 2018 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 More sharing options...
Water Inserita: 16 febbraio 2018 Segnala Share Inserita: 16 febbraio 2018 vado a naso senza entrare nel merito del programma, non si incrementa perchè ...non lo incrementi! a fine del ciclo devi mettere i +1 Link al commento Condividi su altri siti More sharing options...
ramjet Inserita: 17 febbraio 2018 Autore Segnala Share Inserita: 17 febbraio 2018 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 More sharing options...
zanellatofabio Inserita: 17 febbraio 2018 Segnala Share Inserita: 17 febbraio 2018 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 More sharing options...
ramjet Inserita: 17 febbraio 2018 Autore Segnala Share Inserita: 17 febbraio 2018 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 More sharing options...
step-80 Inserita: 20 febbraio 2018 Segnala Share Inserita: 20 febbraio 2018 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 More sharing options...
pigroplc Inserita: 21 febbraio 2018 Segnala Share Inserita: 21 febbraio 2018 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 More sharing options...
step-80 Inserita: 23 febbraio 2018 Segnala Share Inserita: 23 febbraio 2018 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'è.. 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 More sharing options...
Sklerato Inserita: 20 febbraio 2019 Segnala Share Inserita: 20 febbraio 2019 Macchine a stati, non cicli bloccanti!! Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 20 febbraio 2019 Segnala Share Inserita: 20 febbraio 2019 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 More sharing options...
Messaggi consigliati