Vai al contenuto
PLC Forum


Programma settimanale.


Futaba3

Messaggi consigliati

Salve chiedo una gentilezza dovrei eseguire un programma settimanale da lunedì alla domenica impostando degli orari dove mi dovrebbe avviare il programma realilizzato. cioè un controllo pid che ad esempio si dovrebbe accendere alle 7 della mattina e spegnere alle 18, girando in rete ho visto vari esempi ma non riesco a capire e una cosa nuova mai realizzato da me e sinceramente potrebbe essere banale ma non ho idea.

capisco il richiamo delle ore e minuti della CPU ma poi mi blocco. 

Gentilmente mi potete dare una mano grazie saluti.

Link al commento
Condividi su altri siti


  • Risposte 51
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Futaba3

    27

  • batta

    12

  • acquaman

    4

  • max.bocca

    4

Top Posters In This Topic

Posted Images

Simone.Salarsi

Prima cosa devi andare a leggere l'ora di sistema o l'ora locale con le istruzioni RD_SYS_T oppure RD_LOC_T ( a seconda che tu voglia leggere l'ora di sistema oppure quella locale che tiene conto del fuso orario e dell'ora legale/solare impostate nella configurazione del PLC)

 

Queste istruzioni ti restituiscono un dato DTL, che non è altro che un tipo di dati così composto :

image.thumb.png.6fd3b5b0f1b387998c4d957a2be5478c.png

 

 

Se tu appoggi questo dato su una DB, poi non ti resta altro che fare confronti  ( come se fossero valori qualsiasi) su ore e giorni per attivare o disattivare quello che ti serve.

 

image.png.a88bea3774144b0677ab871a30199ebf.png

Link al commento
Condividi su altri siti

Salve grazie per L'aiuto...mentre se dovrei schedulare solo alcuni giorni della settimana con orari diversi ?

non mi entra intesta sto Timer.. scusatemi grazie..

Link al commento
Condividi su altri siti

Nel DB hai anno, mese, giorno, giorno della settimana (i sette giorni), ore, minuti, secondi e nano secondi. 

Per esempio confronti giorno della settimana = mercoledì in serie alla condizione delle ore inizio e fine. 

Puoi farti anche una funzione con i 7 giorni, hh mm inizio hh mm fine come c è nel logo. 

Ci sono già fatte delle librerie con queste funzioni disponibile sul sito Siemens. 

Io preferisco farmele quando sono semplici. 

Link al commento
Condividi su altri siti

Salve Gentilmente e possibile avere una ricetta non ci sto con la testa questi giorni...e possibile avere una libreria Siemens grazie tanto del supporto...

Link al commento
Condividi su altri siti

8 minuti fa, Futaba3 ha scritto:

e possibile avere una libreria Siemens grazie tanto del supporto...

Non serve una libreria, con l'istruzione RD_LOC_T leggi la data e ora e con dei compare trovi le condizioni per abilitare la tua uscita, @Simone.Salarsiè stato chiarissimo.

Link al commento
Condividi su altri siti

Secondo me non funziona, o meglio funziona solo l'ultimo ramo.
Non puoi mettere una variabile più volte sulla una bobina, devi fare un parallelo.

cattura.jpg.260c447bd15d4e19235203e5bf4845d5.jpg

Link al commento
Condividi su altri siti

Ora mi sono bloccato in un altro punto. in questo #ON sarebbe che la CPU va In Run???????

Non credo.....

Ora dovrei incrociarlo con il Bit di avvio funzionamento....Giusto...

Grazie.

4 minuti fa, acquaman ha scritto:

Secondo me non funziona, o meglio funziona solo l'ultimo ramo.
Non puoi mettere una variabile più volte sulla una bobina, devi fare un parallelo.

cattura.jpg.260c447bd15d4e19235203e5bf4845d5.jpg

Si ho Capito questo era una prova che avevo eseguito Grazie sempre del vostro aiuto..

Link al commento
Condividi su altri siti

1 minuto fa, Futaba3 ha scritto:

Ora mi sono bloccato in un altro punto. in questo #ON sarebbe che la CPU va In Run???????

Non credo.....

Ora dovrei incrociarlo con il Bit di avvio funzionamento....Giusto...

Il bit di on lo utilizzerai per accendere quello di cui hai bisogno, ma per farlo funzionare devi mettere tutti i rami che hai fatto nell'esempio in parallelo ed utilizzare solo una volta la bobina che eccita il bit di on se no non funziona.

Link al commento
Condividi su altri siti

Ora che ricordo il programma che avevo eseguito e sempre acceso, mi ricordo anche di aver eseguito in modo che se andasse via l'alimentazione e poi ritornava si riavviava al suo funzionamento.......

Devo staccare un attimo il cervello mi stà andando in fumo..

Link al commento
Condividi su altri siti

Se gli orari sono uguali per tutti i giorni basta mettere nella prima colonna i 7gg che poi vanno in or con il confronto orario. 

Capisco che oggi le CPU hanno memoria a gogo e tempi di ciclo bsssussimo, ma la razionalizzazione è sempre gradita. 

Link al commento
Condividi su altri siti

 Salve Oggi la sfortuna mi perseguita.

Il Pid al ritorno della corrente non si attiva in automatico.

Giusto per l'argomento Schedulatore funziona correttamente.

Link al commento
Condividi su altri siti

Vedi se questo ti può essere utile come programmatore settimanale.
Se ti basta solo il comando On/Off, puoi eliminare dalla struttura tutte le altre variabili.

 

Link al commento
Condividi su altri siti

6 ore fa, Futaba3 ha scritto:

Il Pid al ritorno della corrente non si attiva in automatico.

Immagino tu stia usando la funzione "PID_Compact".

Controlla il valore della variabile STAT "RunModeByStartup" nel DB di istanza del PID.
Controlla il valore della variabiel In/Out "Mode" (per funzionamento automatico deve avere valore 3)
Dopo aver controllato che Mode abbia il valore corretto, comanda un cambio di stato da FALSE a TRUE della variabile di ingresso "ModeActivate".
Il PID commuta nella modalità indicata in "Mode" col fronte di salita di "ModeActivate".

Link al commento
Condividi su altri siti

Ciao grazie del Tuo Aiuto...era impostato male Mode.....

Gentilissimi TUTTI..Grazie Ancora Mille Non so come ringraziarvi......

 

2 ore fa, batta ha scritto:

Vedi se questo ti può essere utile come programmatore settimanale.
Se ti basta solo il comando On/Off, puoi eliminare dalla struttura tutte le altre variabili.

 

Scusami Batta Non riesco ad aprirlo....questo esempio.

Grazie..

Link al commento
Condividi su altri siti

Simone.Salarsi

si, sicuramente è quello il motivo. Se fosse il caso contrario potresti convertirlo alla nuova versione , ma in questo caso non puoi aprirlo con una versione precedente.

Link al commento
Condividi su altri siti

3 ore fa, Futaba3 ha scritto:

Buongiorno. Non riesco ad Aprire Il File perchè utilizzo ancora il Tia 15 forse vero?

Mandami in privato la tua mail. Dovrei avere una versione in TIA V14 (che poi converte automaticamente in V15).

 

Oppure, crea un file di testo con nome "CronoSett.scl" (il nome lo puoi cambiare, ma l'estensione deve essere .scl), copia nel file tutto il codice seguente. Poi, nel progetto TIA, da "Sorgenti esterne", clicca su "Aggiungi nuovo file esterno" e seleziona il file appena creato. Tasto destro del mouse sul file appena importato e scegli "Genera blocchi dalla sorgente".

In questo modo però non hai il progetto del pannello operatore per testare il funzionamento.

 

Sorgente:

FUNCTION_BLOCK "CronoSett"
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : batta
VERSION : 0.1
   VAR_INPUT 
      ActDateAndTime {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;
   END_VAR

   VAR_OUTPUT 
      OnOff : Bool;
      SetTemp : Real;
      SetUmid : Real;
      nrActTimeSlot : Int;
   END_VAR

   VAR 
      Set : Array[1..#NrMaxTimeSlot] of Struct
         Enable : Bool;
         DayOfWeek : Byte;
         TimeOfDay : Time_Of_Day;
         Temperature : Real;
         Umid : Real;
         OnOff : Bool;
      END_STRUCT;
   END_VAR

   VAR_TEMP 
      i : Int;
      ii : Int;
      ActDayOfWeek : Byte;
      ActTimeOfDay : Time_Of_Day;
      nrLastEnabledTimeSlot : Int;
      ActiveTimeSlot : Int;
      ActSecOfWeek : DInt;   // Secondi attuali da inizio settimana (dalle ore 00 di lunedì)
      SetSecOfWeek : DInt;   // Secondi impostati da inizio settimana (dalle ore 00 di lunedì)
      SecOfWeek_i : DInt;
      SecOfWeek_ii : DInt;
   END_VAR

   VAR CONSTANT 
      NrMaxTimeSlot : Int := 28;
   END_VAR


BEGIN
	// Cronotermostato settimanale
	// Autore: batta
	//
	
	// Controllo coerenza impostazione fasce orarie, ed eventualmente correggo impostazione
	FOR #i := 1 TO #NrMaxTimeSlot - 1 DO
	    #ii := #i + 1;
	    // Calcolo secondi da inizio settimana impostati in fascia attuale e successiva.
	    #SecOfWeek_i := (#Set[#i].DayOfWeek - 1) * DINT#86400 + TOD_TO_DINT(#Set[#i].TimeOfDay) / DINT#1000;
	    #SecOfWeek_ii := (#Set[#ii].DayOfWeek - 1) * DINT#86400 + TOD_TO_DINT(#Set[#ii].TimeOfDay) / DINT#1000;
	    IF #SecOfWeek_ii < #SecOfWeek_i THEN
	        #Set[#ii].DayOfWeek := #Set[#i].DayOfWeek;
	        #Set[#ii].TimeOfDay := #Set[#i].TimeOfDay;
	    END_IF;
	END_FOR;
	
	//Leggo Data Ora attuali e appoggio a variabili locali "giorno della settimana" e "ora del giorno"
	//Il giorno della settimana viene impostato partendo da lunedì (1=Lunedì ... 7=Domenica).
	//Il PLC invece interpreta il giorno della settimana partendo da domenica.
	//Correggo il giorno della settimana del PLC per renderlo compatibile con l'impostazione.
	#ActDayOfWeek := #ActDateAndTime.WEEKDAY - 1;
	IF #ActDayOfWeek < 1 THEN
	    #ActDayOfWeek := #ActDayOfWeek + 7;
	END_IF;
	#ActTimeOfDay := DTL_TO_TOD(IN := #ActDateAndTime);
	#ActSecOfWeek := TOD_TO_DINT(#ActTimeOfDay) / DINT#1000 + (#ActDayOfWeek - 1) * DINT#86400;
	
	// Cerco ultima fascia oraria abilitata
	#nrLastEnabledTimeSlot := 0;
	FOR #i := #NrMaxTimeSlot TO 1 BY -1 DO
	    IF #Set[#i].Enable THEN
	        #nrLastEnabledTimeSlot := #i;
	        EXIT;
	    END_IF;
	END_FOR;
	
	// Se non è stata trovata nessuna fascia oraria abilitata, saltare successivi controlli
	IF #nrLastEnabledTimeSlot > 0 THEN
	    // Inizializzo fascia oraria attiva con numero ultima fascia oraria abilitata.
	    // A cosa serve: successivamente verrà fatta una ricerca per assegnare i valori impostati
	    // per la fascia oraria corrente. Nel caso questa ricerca dovesse dare esito negativo,
	    // assumo come attiva l'ultima fascia oraria abilitata.
	    // Per esempio, di lunedì prima di raggiungere il primo orario impostato, si leggono
	    // i valori impostati nell'ultima fascia della domenica.
	    #ActiveTimeSlot := #nrLastEnabledTimeSlot;
	    
	    // Cerco la prima fascia attiva con tempo impostato <= tempo attuale
	    // (in secondi da inizio settimana)
	    FOR #i := #nrLastEnabledTimeSlot TO 1 BY -1 DO
	        IF #Set[#i].Enable THEN
	            #SetSecOfWeek := TOD_TO_DINT(#Set[#i].TimeOfDay) / DINT#1000 + (#Set[#i].DayOfWeek - 1) * DINT#86400;
	            IF #ActSecOfWeek >= #SetSecOfWeek THEN
	                #ActiveTimeSlot := #i;
	                EXIT;
	            END_IF;
	        END_IF;
	    END_FOR;
	    
	    #OnOff := #Set[#ActiveTimeSlot].OnOff;
	    #SetTemp := #Set[#ActiveTimeSlot].Temperature;
	    #SetUmid := #Set[#ActiveTimeSlot].Umid;
	ELSE
	    #OnOff := FALSE;
	    #SetTemp := 0.0;
	    #SetUmid := 0.0;
	END_IF;
	#nrActTimeSlot := #ActiveTimeSlot;
	
END_FUNCTION_BLOCK

 

 

Modificato: da batta
Link al commento
Condividi su altri siti

Come spiegato nell'archivio di PLC Forum dove ho caricato il file del progetto in versione TIA V16, questo progetto è nato parecchi anni fa, con l'unico scopo di prendere dimestichezza con l'SCL di S7-300. Da un po' di tempo ho notato che l'argomento "programmatore settimanale" viene trattato con una certa ricorrenza, ed ho quindi convertito il progetto in S7-1200/1500 (la sintassi SCL tra S7-300/400 e S7-1200/1500 è un po' diversa, ed ho cambiato panmnello operatore) e apportato qualche aggiustamento. Dovessi rifare tutto da zero, probabilmente ne uscirebbe qualcosa di leggermentre diverso ma, tutto sommato, non mi pare poi tanto male.

Modificato: da batta
Link al commento
Condividi su altri siti

Ciao Batta Grazie dell'email ma questo in scl non riesco a eseguirlo....Grazie ancora.

non so proprio dove parare.

anche su hmi non ho idea ...grazie vedo quello che stavo completando.

 

Link al commento
Condividi su altri siti

Nonso perchè ma su hmi weintek non riesco a vedere le word delle ore minuti e poi mi da mancanza di comunicazione solo quando apro la pagina della schedulazione , come se l'ora della Cpu e differente dall'hmi e cade la comunicazione.  strano.......in fatti l'allarme della mancata comunicazione va e viene al secondo....

 

Link al commento
Condividi su altri siti

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