Vai al contenuto
PLC Forum


Fasi Del Programma


Messaggi consigliati

Inserito:

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 :D,


Inserita: (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: da Livio Orsini
Inserita:

Assolutamente si ti ringrazio moltissimo per la tua risposta. Adesso posso continuare a sbizzarrirmi nella programmazione

Inserita: (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: da qamrij
Inserita:

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.

Inserita:
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

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

Inserita:

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à. :D

Inserita:

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

Inserita:

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 :(

Inserita:

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

Inserita:

Immancabilemte la "cosulenza" di Batta e Livio è sempre un grande aiuto!

Saluti

Inserita:

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 :D

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

Inserita:

Ti ringrazio moltissimo e stai tranquillo che non sono di quelli che cambiano il nome o prendono il merito per cose fatte dagli altri.:rolleyes: mi é arrivato il libro oggi da domani si smanetta alla grande :lol:

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...