fruittis Inserito: 14 dicembre 2024 Segnala Inserito: 14 dicembre 2024 Ciao a tutti avrei questa domanda da porvi! Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto! In breve accendere una luce dopo l'altra ogni 2 secondi. Per questo volevo utilizzare il ciclo for,in scl della siemens. Provato in tutti i modi,e beh,non riesco e non capisco il perche! In arduino anche se non è uguale lo so,mettendo all'interno del ciclo for un delay,e assegnando all'indice del ciclo for una uscita lii va e rispetta il mio tempo,e mi incrementa ogni volta come giusto che sia! Invece il ciclo for in tia portal no,non mi fa fare questa cosa,il risultato che ottengo e quello che lui aspetta i 2 secondi e poi i bit si alzano tutti insieme,perhe fa cosi?? Avete consigli? Ps: secondo me non si puo fare con il ciclo for della siemens!
drn5 Inserita: 14 dicembre 2024 Segnala Inserita: 14 dicembre 2024 (modificato) scrivi qui quello che hai scritto in scl che vediamo dove hai sbagliato. il delay dentro il ciclo for non ci può stare sennò il tempo ciclo va alle stelle ! invece del ciclo for usa un sistema tipo macchina a stati, con il ritardo asincrono rispetto a quello. Modificato: 14 dicembre 2024 da drn5
dina_supertramp Inserita: 14 dicembre 2024 Segnala Inserita: 14 dicembre 2024 (modificato) 51 minuti fa, fruittis ha scritto: Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto! In breve accendere una luce dopo l'altra ogni 2 secondi. Per questo volevo utilizzare il ciclo for,in scl della siemens. Un for per accendere delle lampadine in sequenza...ma no dai... Ad ogni linguaggio il suo... Ricordati che stai programmando un PLC... |START|---|TON_1|---|TON_2|---|TON_3|---|TON_4| |START|---|TON_1.Q|---(Q0.0) |START|---|TON_1.Q|---|TON_2.Q|---(Q0.1) e cosi via.... 51 minuti fa, fruittis ha scritto: Invece il ciclo for in tia portal no,non mi fa fare questa cosa,il risultato che ottengo e quello che lui aspetta i 2 secondi e poi i bit si alzano tutti insieme,perhe fa cosi?? Stai ritardando la partenza della prima iterazione e basta, vedi tutte le uscite accendersi insieme perché vengono eseguite tutte senza ritardi tra una e l'altra, come è giusto che sia. Non puoi ritardare tra un'iterazione e l'altra, sennò il ciclo di scansione rimane nel for e sfora il tempo di controllo... Modificato: 14 dicembre 2024 da dina_supertramp
dina_supertramp Inserita: 14 dicembre 2024 Segnala Inserita: 14 dicembre 2024 17 minuti fa, drn5 ha scritto: il delay dentro il ciclo for non ci può stare sennò il tempo ciclo va alle stelle ! ...La cosa più importante l'ha detta @drn5...
fruittis Inserita: 15 dicembre 2024 Autore Segnala Inserita: 15 dicembre 2024 Dina_supertramp Capisco perfettamente che mi consigli di usare dei semplici ton,in cascata. Bene. Ma se ho 80 bit da mettere in coda,ci metto una vita a programmare il tutto,nel.mentre con il ciclo for ci metterei un secondo! Grazie.
fruittis Inserita: 15 dicembre 2024 Autore Segnala Inserita: 15 dicembre 2024 Drn5 Se mi dici che non funziona in primis,cosa che credo anche io non lo scrivo per nulla il codice. Per il discorso macchina a stati ti direi di no dato che ho gia fatto tutto il programma in scl😂! La cosa che non capisco è la seguente: se io immetto il temporizzatore all'interno del mio ciclo for,ciò mi determina già che il mio programma entra nel ciclo for e scansiona,per contare i famosi due secondi,allora dico io qui: perche se entra nella mia funzione non mi funziona??
drn5 Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 (modificato) Stato 0 : bit 0 Stato 1 : start pausa Stato 2 : fine pausa? Stato 3 : azzerare tutti i bit Stato 4 : ultimo bit? vai a passo 0! Stato 4 : prossimo bit Stato 5 : vai al passo 1 Che ne pensi? Puoi usare scl o quello che vuoi. In un FC o FB richiamato ciclicamente dal main. Modificato: 15 dicembre 2024 da drn5
max.riservo Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 12 ore fa, fruittis ha scritto: Allora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto! In breve accendere una luce dopo l'altra ogni 2 secondi. Per questo volevo utilizzare il ciclo for,in scl della siemens. Può darsi che quello che vuoi fare non si possa fare con un ciclo, non uso Siemens quindi non mi esprimo. Soluzione concettuale alternativa : - Utilizzi un timer e ogni 2 secondi sposti un bit di un array di bit verso sinistra (cerca l'equivalente Siemens dello Shift Left dei bit). Potresti farlo anche moltiplicando per 2 una variabile ma 2^80 supera sicuramente anche la capacità dei LongLong Integer (64 bit) - Trovi il modo Siemens di mappare questo array di bit alle uscite digitali (con altri PLC : Q0:80 := B0:80 con Siemens non so), ovviamente a patto che le uscite digitali siano consecutive (probabilmente 80 uscite consecutive non ci sono quindi dovrai spezzare lo spostamento rispettando l'indirizzamento fisico delle uscite i.e. Q0.0:63 := B0.63, Q1.0:16 := B64:16) - Quando nell'array di bit viene settato l'80° bit riparti dal primo
fruittis Inserita: 15 dicembre 2024 Autore Segnala Inserita: 15 dicembre 2024 Max.riservo Lo SRL (shift register left) della siemens,sposta i bit da destra verso sinistra all'interno di una variabile,in modo tale da modificarne il valore finale. Se mi creo un array di bit sto creando un bit singolo per volta e ciò mi determina già che non modifico nulla dato che 80 bit hanno lo stesso valore ovvero o 0 o 1. Se non ricordo male dovrebbe funzionare cosi SRL,guardo ancora in settimana e poi ti do conferma. Grazie mille per la risposta. Quasi quasi metto un contatore up e voilà,me ne lavo le mani!
dina_supertramp Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 11 ore fa, fruittis ha scritto: Ma se ho 80 bit da mettere in coda,ci metto una vita a programmare il tutto,nel.mentre con il ciclo for ci metterei un secondo Effettivamente 😅 …sorry pensavo fosse una cosa didattica da 3-4 uscite… Invece di un ciclo for potresti pensare a usare dei salti e accedere in modo indicizzato all’array di lampadine array[x] dove x è un intero che viene incrementato +1 dopo ogni ritardo eseguito.
Ctec Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 Usa uno shift su un registro immagine delle uscite, oppure lo copy nelle uscite dopo. A ogni fine del tempo impostato, shifti i bit di un posto a sinistra o destra. L'unico problema da considerare è la folle disposizione dei bit nelle word/doppie word di siemens. Per esempio, se shifti a sinistra il settimo bit di un byte, col cavolo che lo ritrovi nel bit 0 del byte successivo, ma in quello precedente. Non è una disposizione lineare.
max.riservo Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 18 minuti fa, Ctec ha scritto: ...Usa uno shift su un registro immagine delle uscite, oppure lo copy nelle uscite dopo... Mi sembra molto simile a quanto proposto da me ... almeno a livello concettuale, poi non usando Siemens sicuramente il tuo suggerimento è più centrato. 80 bit lo vedo difficile che si possano gestire utilizzando word/doppie word io utilizzerei un'array di bit (Siemens permettendo).
Livio Orsini Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 18 ore fa, fruittis ha scritto: llora,vorrei alzare delle uscite del mio plc,in modo sequenziale per tot.tempo che io gli imposto! In breve accendere una luce dopo l'altra ogni 2 secondi. Per questo volevo utilizzare il ciclo for,in scl della siemens. Si fa un vettore, o array che dir si volgia, in cui c'è lo stato delle uscite, Anzi in pratica son tutti zero. Si usa un byte o un intero come contatore che funge da indice del vettore. Poi si fa un timer ciclico di 2 secondi, alla scadenza del timer si pone a zero il bit puntato dal contatore, si pone ad "1" il bit seguente e si incrementa di 1 il contatore. é più lungo da spiegare che da fare. Il tempo di esecuzione sarà quello delle 3 istruzioni necessarie. Scritto inpseudo "C" sarebbe: bool bout[80]; //vettore delle uscite int icnt = 0; //indice del vettore if (timer == 0) { bout[icnt] = 0; bout[icnt+1] = 1; icnt++; } if (icnt > 79) icnt = 0;
dina_supertramp Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 (modificato) Lo puoi replicare in SCL... [RT] è l'istruzione reset timer Modificato: 15 dicembre 2024 da dina_supertramp
dina_supertramp Inserita: 15 dicembre 2024 Segnala Inserita: 15 dicembre 2024 (modificato) Cosi è affinato...puoi resettare a sequenza finita, e il limite alto dell'array è definito da una costante (potresti anche usare un input in modo da modificare tutto dall'esterno senza accedere all'FB in caso di modifica delle dimensioni...ma interbloccala con la condizione che non ci siano operazioni in corso sull'array). Il reset di "Done" è fatto nel segmento 4 che non si vede... Modificato: 15 dicembre 2024 da dina_supertramp
fruittis Inserita: 16 dicembre 2024 Autore Segnala Inserita: 16 dicembre 2024 Dina_supertramp Livio_orsini Grazie per l'impegno e tempo a me dedicato. Ma il mio problema non è farlo funzionare in altri modi,ce ne sono un bel pò di modi da applicare,il mio problema è capire perche se uso un ciclo for non va,nonostamte io resetti il timer ad ogni implemento di conteggio dell'indice,bah! Rimarrà un misterooo😂😂
Livio Orsini Inserita: 16 dicembre 2024 Segnala Inserita: 16 dicembre 2024 5 ore fa, fruittis ha scritto: non va,nonostamte io resetti il timer ad ogni implemento di conteggio dell'indice,bah! Io non capisco perchè non debba funzionare. L'unico inconveniente è che se non forzi l'uscita dal ciclo il watch dog del PLC va in allarme perchè 2" con PLC fermo sull'istruzione è assurdo. Io non conosco il linguaggio SCL, però se tu pubblichi quello che hai scritto ci sarà senz'altro qualcuno che ti trova l'inghippo. Se avessi scritto qualche cosa di simile in "C", avrei mezzo un'istruzione di exti subito dopo il test del timer, ovvero se il timer è scaduto fa qualle che deve fare, altrimenti esce dal ciclo; ci rientrerà quando il PLC avrà terminato il programma e rièrende di nuovo dall'inizio.
drn5 Inserita: 16 dicembre 2024 Segnala Inserita: 16 dicembre 2024 Il 15/12/2024 alle 01:53 , fruittis ha scritto: Se mi dici che non funziona in primis,cosa che credo anche io non lo scrivo per nulla il codice. Inutile insistere
fruittis Inserita: 16 dicembre 2024 Autore Segnala Inserita: 16 dicembre 2024 17 ore fa, dina_supertramp ha scritto: Cosi è affinato...puoi resettare a sequenza finita, e il limite alto dell'array è definito da una costante (potresti anche usare un input in modo da modificare tutto dall'esterno senza accedere all'FB in caso di modifica delle dimensioni...ma interbloccala con la condizione che non ci siano operazioni in corso sull'array). Il reset di "Done" è fatto nel segmento 4 che non si vede... 59 minuti fa, Livio Orsini ha scritto: Io non capisco perchè non debba funzionare. L'unico inconveniente è che se non forzi l'uscita dal ciclo il watch dog del PLC va in allarme perchè 2" con PLC fermo sull'istruzione è assurdo. Io non conosco il linguaggio SCL, però se tu pubblichi quello che hai scritto ci sarà senz'altro qualcuno che ti trova l'inghippo. Se avessi scritto qualche cosa di simile in "C", avrei mezzo un'istruzione di exti subito dopo il test del timer, ovvero se il timer è scaduto fa qualle che deve fare, altrimenti esce dal ciclo; ci rientrerà quando il PLC avrà terminato il programma e rièrende di nuovo dall'inizio. Vi allego a tutti il ciclo che ho scritto almeno potete vedere. Tralasciate il fatto che ho usato un altro indice in più,era solo per prova (indice 2),intanto anche usando indice del for non funziona lo stesso,la variabile appo è solo per farmi partire il timer. E bene no non funziona nemmeno se inserisco un rt(reset timer). Nemmeno se inserisco un exit,(motivo per cui ho fatto indice 2).
dina_supertramp Inserita: 16 dicembre 2024 Segnala Inserita: 16 dicembre 2024 (modificato) Dove incrementi l'indice, scrivi: #"indice 2" := (#"indice 2" + 1); E comunque l'approccio è errato, non stiamo facendo i professori, ma non puoi inserire dei timer dentro delle iterazioni sennò ammazzi il PLC 🤣. Come non devi fare fare mai dei salti indietro, solo in avanti, altrimenti anche li ammazzi il ciclo di scansione. Modificato: 16 dicembre 2024 da dina_supertramp
drugo66 Inserita: 16 dicembre 2024 Segnala Inserita: 16 dicembre 2024 Ciao, secondo me l'errore sta nel non aver compreso bene il funzionamento di un PLC; a grandi linee e semplificando parecchio: - Lettura degli ingressi; - Elaborazione dei blocchi di programma; - Scrittura delle uscite. A meno di non utilizzare istruzioni particolari, il PLC deve terminare l'elaborazione del programma per scrivere le uscite, quindi il pilotaggio di uscite in un ciclo for non ha molto senso. Inoltre, giustamente come ti hanno fatto notare, esiste anche il Watch Dog. Almeno, io la so così ...
acquaman Inserita: 16 dicembre 2024 Segnala Inserita: 16 dicembre 2024 Il ciclo FOR NEXT nei plc non può essere fermato, e il ton e il wait sono 2 funzioni differenti. Il ciclo for viene eseguito tutto in una unica scansione plc, se lo dovessi fermare 2 secondi per 54 cicli ti troveresti un tempo scansione enorme ed il plc in stop. La strada giusta è quella di creare un array e un indice che incrementi ogni 2 secondi, ogni volta che incrementi l'indice setti il bit dell'array riferito all'indice, come suggerito da anche da Livio.
fruittis Inserita: 16 dicembre 2024 Autore Segnala Inserita: 16 dicembre 2024 (modificato) PERFETTO. Volevo togliermi il dente e ci siete riusciti: Quindi affermo a me stesso che non si può mettere un timer all'interno del ciclo for,perfetto grazie mille a tutti! Ma mi rimarrà il dubbio perche sù arduino funziona anche essendo hn CICLO FOR!! Modificato: 16 dicembre 2024 da fruittis Errore battitura
fruittis Inserita: 16 dicembre 2024 Autore Segnala Inserita: 16 dicembre 2024 Drugo66 Diciamo che di senso ne ha,pilotare dei bit in un ciclo for. Ti faccio un semplice esempio,ipotizziamo che dobbiamo resettare delle uscite di una periferica che contiene 100 uscite. Ti metteresti veramente li a scrivere la condizione 100 volte? Assolutamente no,si indicizza il tutto e in 2 secondi sei al top! Ps: alla tua prima affermazione non ti rispondo nemmeno....
Livio Orsini Inserita: 17 dicembre 2024 Segnala Inserita: 17 dicembre 2024 10 ore fa, fruittis ha scritto: Ti faccio un semplice esempio,ipotizziamo che dobbiamo resettare delle uscite di una periferica che contiene 100 uscite. Però se non fai una scrittura diretta alla periferia le uscite vengono azzetate tutte assieme alla fine del programma, quando il PLC copierà il registo immagine nelle uscite. 10 ore fa, fruittis ha scritto: ,si indicizza il tutto e in 2 secondi sei al top! Se usassi un PLC che impiega 2" per fare 100 iterazioni in un ciclo for.....meglio puttartlo via. Dovrebbe impiegare un tempo almeno mille volte inferiore.
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