qamrij Inserito: 23 aprile 2013 Segnala Inserito: 23 aprile 2013 Buongiorno a tutti Sono un ragazzo che lavora come manutentore presso un'azienda dove tutto è automatizzato ed ho avuto l'opportunità di frequentare un corso sulla programmazione di plc ( nel corso ci hanno dato le basi di come funziona il plc, azionamenti, pneumatica ecc.). Comunque adesso finito il corso e durante il corso mi dilettavo a ricreare i programmi che gestivano le macchine. Fino ad adesso ho fatto solo quelli sul s7-200 perche anche al corso diciamo ci hanno fatto fare pratica sul 200. La mia domanda è la seguente se io ho un programma all'interno della quale voglio che vengano eseguite due fasi contemporaneamente è possibile? oppure è sempre tutto sequenziale cioè il programma entra in una subroutine la esegue attiva le uscite o quello che deve fare poi esce da essa e mi entra nella seconda richiamata? il tutto è talmente veloce all'occhio umano sembra che ho due attive contemporaneamente? io associo le fasi alle subroutine, per ogni fase creo una subroutine. perdonatemi per eventuali errori e un grazie a BAtta che ha dato un'ottima spiegazione delle variabili IN OUT e IN/OUT nell'altro post ,
Livio Orsini Inserita: 23 aprile 2013 Segnala Inserita: 23 aprile 2013 (modificato) La contemporaneità, nel senso stretto del termine, non esiste a meno di ricorrere ad architetture multi CPU. Anche nei sistemi RTOS (Real Time Operating System) si lavora sempre in divisione di tempo, ovvero la risosrsa CPU viene assegnata ad intervalli di tempo ai vari tasks e jobs. Il tutto è funzione tra il tempo di risposta del processo controllato ed il periodo di tempo in cui si effettua il controllo. Cerco di chiarire con un esempio. Ammettiamo di dover effettuare determinate operazioni in funzione dello stato du due ingressi legati a due proximities. Ammettiamo che una variazione di stato di ciascun proximity, non possa essere più veloce di 100 ms. Se il ciclo di programma evolve in un tempo <=20 ms, in pratica le due funzioni, legate allo stato dei proximities, evolvono in contemporanea. Se invece il tempo di risposta del processo è simile al tempo di ciclo del PLC, per avere risposte in tempo reale e contemporaneità, è necessario ricorrere a funzioni particolari come, ad esempio, le interruzioni o interrupts. Con riferimento all'esempio precedente, se il tempo minimo di variazione dello stato dei proximities fosse dell'ordine di 1ms, si devrebbero usare degli ingressi con filtri Hw veloci, legati ad interrupts. In questo caso il programma evolve secondo il ciclo previsto. Al verificarsi della variazione di stato dell'ingresso si attiverebbe un'interruzione di programma ed il programma verrebbe forzato all'esecuzione dell'OB legato a quell'interruzione. Spero di averti chiarito un po' meglio il concetto di contemporaneità. Modificato: 23 aprile 2013 da Livio Orsini
qamrij Inserita: 23 aprile 2013 Autore Segnala Inserita: 23 aprile 2013 Assolutamente si ti ringrazio moltissimo per la tua risposta. Adesso posso continuare a sbizzarrirmi nella programmazione
qamrij Inserita: 23 aprile 2013 Autore Segnala Inserita: 23 aprile 2013 (modificato) Comunque ho notato che da microwin usato per il 200 a simatic manager cambia ompletamente il mondo dell'IDE di programmazione, ma anche i timers devono essere dichiarati all'interno dei DB? Modificato: 23 aprile 2013 da qamrij
Frank681 Inserita: 24 aprile 2013 Segnala Inserita: 24 aprile 2013 Ciao Diciamo che con "simatic manager" , veramente con cpu 300 e 400 , alcune funzionicambiano , i timer come i gli fb si appoggiano a dei db dove appoggiano i dati , a cui si puo accedere direttamente. Spero di esserti stato utile.
Livio Orsini Inserita: 24 aprile 2013 Segnala Inserita: 24 aprile 2013 ma anche i timers devono essere dichiarati all'interno dei DB? C'è una recentissima discussione sui DB di instanza in cui Batta spiega chiaramente l'uso dei DB
batta Inserita: 24 aprile 2013 Segnala Inserita: 24 aprile 2013 ma anche i timers devono essere dichiarati all'interno dei DB? Dipende. A quali timer ti riferisci? Se intendi le funzioni TON e TOF (rispettivamente SFB4 ed SFB5 se programmi con Step7), hanno bisogno di un DB di istanza o, in alternativa, di essere dichiarati all'interno di una FB come multiistanza (concetto un po' prematuro da trattare ora). Esistono però anche i timer SE, SA, SV, SI, SS, che non hanno bisogno di appoggio a DB.
qamrij Inserita: 24 aprile 2013 Autore Segnala Inserita: 24 aprile 2013 Allora sto usando simatic manager, v 5.5 e di fatti sinceramente non ho capito in modo chiarissimo e limpido le funzionalità dei db, ma diciamo che se non ho capito male nelle FC le variabili che genero quindi calcoli o altro nascono a muoiono la mentre nelle FB devo appoggiarmi ai DB per forza perchè tutto cio che avviene all'interno del FB viene salvato nei db assegnati ( ovviamente spiegazione molto molto semplificata). Ma se io creo un db all'interno dichiaro tutti i timer che voglio utilizzare? va bene lo stesso ? cioè un db globale con all'interno dichiarati timer e contatori? devo cercare la spiegazione di batta sui db mi sà.
batta Inserita: 24 aprile 2013 Segnala Inserita: 24 aprile 2013 Prima di tutto si deve distinguere tra DB globale e DB di istanza. I DB globali li crei come vuoi tu, dichiarando le variabili come vuoi tu. In un certo senso, è come se nel S7-200 tu avessi un unico DB globale, con variabili da VW0 a VWxxx. Poter creare i DB a piacere, anche se all'inizio può sembrare una inutile complicazione, in realtà permette una maggior flessibilità. I DB di istanza invece, sono associati ad una FB. C'è una discussione molto recente dove parlo dei DB di istanza, della differenza tra le variabili TEMP e STAT, ed altro: vedi link http://plc.plcforum....dpost__p__94722 Ma se io creo un db all'interno dichiaro tutti i timer che voglio utilizzare? va bene lo stesso ? cioè un db globale con all'interno dichiarati timer e contatori? Non hai risposto alla mia precedente domanda: stai parlando dei timer TON (SFB4) e TOF (SFB5)? Non mi pare si riesca a creare un DB globale con variabili dichiarate come TON o TOF. Puoi, eventualmente, creare una FB (da richiamare ciclicamente) con all'interno tutti i timer di tipo TON e TOF (dichiarati nelle variabili STAT).
qamrij Inserita: 24 aprile 2013 Autore Segnala Inserita: 24 aprile 2013 Si scusami e che avevo il secondo turno oggi quindi non ho potuto vedere le risposte. Si io mi riferivo a timer Ton e Toff. Nel 200 mi bastava inserirlo nel network e voilà. Nel simatic manager ogni volta che inserisco il temporizzatore mi chiede il DB e non capisco come devo dichiarare i timer nel DB globale o di istanza che sia. Ho preso il libro che parla di simatic manager e come usare le varie cose solo che non é ancora arrivato
batta Inserita: 25 aprile 2013 Segnala Inserita: 25 aprile 2013 Perché non usi i timer SE, SA, SV, SS, SI? Sono più limitati dei TON-TOF ma, nel 95% dei casi, vanno benissimo. Esiste poi la possibilità di crearsi una funzione "Timer" secondo le proprie esigenze. Io spesso uso una mia funzione "Timer" (timer con ritardo all'inserzione, tipo TON), che permette anche di congelare il tempo corrente. Alla funzione si deve passare in ingresso il tempo di preset in ms, e il tempo dell'ultima scansione, sempre in ms (lo leggi in OB1, nella variabile locale #OB1_PREV_CYCLE). La funzione ha bisogno di appoggiare il tempo corrente ad una doppia word, che può essere una MD, una variabile di un DB globale, una variabile interna di una FB (importante, ovviamente, che non sia una variabile TEMP). Per creare la funzione, nella cartella "Sorgenti" di Step7 crea una nuova sorgente, incolla il codice che segue, e compila. ATTENZIONE!!! Con la compilazione viene creata la FC134. Se nel tuo progetto esiste già una FC134, questa verrà irrimediabilmente sovrascritta. Per cambiare il numero della FC generata, ti basta modificare la prima riga del codice sorgente. FUNCTION FC 134 : VOID TITLE =Timer AUTHOR : batta VERSION : 0.1 VAR_INPUT Enable : BOOL ; //ON = timer abilitato; OFF = reset timer Run : BOOL ; //ON = timer attivo; OFF = timer congelato ScanTime : INT ; //Tempo ultima scansione PrstVal : TIME ; //Valore di preset del timer END_VAR VAR_OUTPUT Out : BOOL ; //Attiva con tempo terminato END_VAR VAR_IN_OUT ResVal : TIME ; //Valore residuo END_VAR BEGIN NETWORK TITLE =Reset timer U #Enable; SPB M000; L #PrstVal; T #ResVal; R #Out; BEA ; NETWORK TITLE =Aggiorna valore corrente e flag uscita M000: L #ResVal; UN #Run; SPB M002; L #ScanTime; ITD ; -D ; SPPZ M001; L L#0; M001: T #ResVal; M002: L L#0; <=D ; = #Out; END_FUNCTION
attiliovolpe Inserita: 25 aprile 2013 Segnala Inserita: 25 aprile 2013 Immancabilemte la "cosulenza" di Batta e Livio è sempre un grande aiuto! Saluti
qamrij Inserita: 26 aprile 2013 Autore Segnala Inserita: 26 aprile 2013 Si Batta diciamo che per il momento e il grado di conoscenza che ho mi vanno benissimo i timer SE, SA, SV, SS, SI. Piu avanti quando farò cose piu complicate sicuramente faro delle funzioni apposta. Per il momento sto cercando di fare il programma che gestisce un paletizzatore con magazzino palette e centratore, testa di presa e rilascio ( che è poi la stessa). Vediamo cosa viene fuori
batta Inserita: 26 aprile 2013 Segnala Inserita: 26 aprile 2013 Piu avanti quando farò cose piu complicate sicuramente faro delle funzioni apposta. Guarda che la funzione di cui ho postato il codice la puoi usare tranquillamente. L'ho messa lì apposta. È una funzione collaudata, comoda da usare e leggera. L'unica cosa che mi interessa, se la usi così com'è, è che non cambi il nome dell'autore. Oppure la puoi prendere come spunto per creare funzioni simili.
qamrij Inserita: 27 aprile 2013 Autore Segnala Inserita: 27 aprile 2013 Ti ringrazio moltissimo e stai tranquillo che non sono di quelli che cambiano il nome o prendono il merito per cose fatte dagli altri. mi é arrivato il libro oggi da domani si smanetta alla grande
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