fruittis Inserito: 14 dicembre Segnala Share Inserito: 14 dicembre 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! Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 14 dicembre Segnala Share Inserita: 14 dicembre (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 da drn5 Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: 14 dicembre Segnala Share Inserita: 14 dicembre (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 da dina_supertramp Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: 14 dicembre Segnala Share Inserita: 14 dicembre 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... Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: 15 dicembre Autore Segnala Share Inserita: 15 dicembre 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. Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: 15 dicembre Autore Segnala Share Inserita: 15 dicembre 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?? Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre (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 da drn5 Link al commento Condividi su altri siti More sharing options...
max.riservo Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre 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 Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: 15 dicembre Autore Segnala Share Inserita: 15 dicembre 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! Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre 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. Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre 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. Link al commento Condividi su altri siti More sharing options...
max.riservo Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre 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). Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 15 dicembre Segnala Share Inserita: 15 dicembre 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; Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: domenica alle 21:29 Segnala Share Inserita: domenica alle 21:29 (modificato) Lo puoi replicare in SCL... [RT] è l'istruzione reset timer Modificato: domenica alle 21:32 da dina_supertramp Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: domenica alle 22:03 Segnala Share Inserita: domenica alle 22:03 (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: domenica alle 22:11 da dina_supertramp Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: lunedì alle 09:49 Autore Segnala Share Inserita: lunedì alle 09:49 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😂😂 Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: lunedì alle 15:00 Segnala Share Inserita: lunedì alle 15:00 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. Link al commento Condividi su altri siti More sharing options...
drn5 Inserita: lunedì alle 15:11 Segnala Share Inserita: lunedì alle 15:11 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 Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: lunedì alle 16:01 Autore Segnala Share Inserita: lunedì alle 16:01 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). Link al commento Condividi su altri siti More sharing options...
dina_supertramp Inserita: lunedì alle 16:27 Segnala Share Inserita: lunedì alle 16:27 (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: lunedì alle 16:39 da dina_supertramp Link al commento Condividi su altri siti More sharing options...
drugo66 Inserita: lunedì alle 16:32 Segnala Share Inserita: lunedì alle 16:32 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ì ... Link al commento Condividi su altri siti More sharing options...
acquaman Inserita: lunedì alle 16:42 Segnala Share Inserita: lunedì alle 16:42 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. Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: lunedì alle 20:08 Autore Segnala Share Inserita: lunedì alle 20:08 (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: lunedì alle 20:09 da fruittis Errore battitura Link al commento Condividi su altri siti More sharing options...
fruittis Inserita: lunedì alle 20:12 Autore Segnala Share Inserita: lunedì alle 20:12 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.... Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: martedì alle 06:32 Segnala Share Inserita: martedì alle 06:32 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. Link al commento Condividi su altri siti More sharing options...
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