Vai al contenuto
PLC Forum


Fc 7 Dt_day - dissociare il giorno della settimana dal formato DATE_AND_TIME


Messaggi consigliati

Inserito:

Un saluto a tutti :)

Sono alle prese con una cpu 314 e la necessità di comparare il giorno della settimana per alternare il funzionamento di 2 motori.

Nella biblioteca del Simatic ho visto che con la funzione FC 7 è possibile dissociare il giorno della settimana dal formato DATE_AND_TIME, quindi:

Lo richiamo in OB1, al parametro IN assegno la variabile temporanea dichiarata #giorno di tipo DATE_AND_TIME (lunghezza: 8 byte), e al parametro RET_VAL assegno la variabile DB100.DBW10 a 16 bit.

esempio:

CALL "DT_DAY"

IN0 :=#giorno

RET_VAL:=DB100.DBW10

A questo punto sembrerebbe tutto molto semplice, perchè dovrei visualizzare nella DW10 in formato decimale:

1
. se Domenica

2
. se Lunedì

3
. se Martedì

4
. se Mercoledì

5
. se Giovedì

6
. se Venerdì

7
. se Sabato

Di fatto però non riesco a capire perchè continua a restituire lo stesso numero (3). Qualcuno di voi l'ha già utilizzata la funzione FC 7 con successo?

Sono convinta che mi sfugge qualcosa e da sola non riesco a capire :(

Mi potete aiutare? Grazie1000 :)


Inserita:

Il parametro RET_VAL si riferisce all'informazione in uscita dal blocco sullo stato dell'esecuzione del blocco stesso.

il valore vero lo trovi all'interno della variabile temporanea #giorno che tu hai mappato. casomai appoggiala a delle merker word così trovi il valore agevolmente.

pigroplc

Inserita: (modificato)

Grazie ragazzi, siete veramente gentili :)

In ogni caso non riesco, per via dei miei limiti :(

pigroplc: ho provato con l'operazione di caricamento ad appoggire la variabile ad una Word, non lo accetta :(

CALL "DT_DAY"

IN0 :=#giorno

RET_VAL:=DB100.DBW10

L #giorno
<---------------
mi segnala errore

T MW 100

anche in questo caso dov'è che sbaglio?

ken: avevo trovato, con la funzione cerca, quella discussione.

Ma nelle informazioni restituite dalla variabile non vedo il numero corrispondente al giorno della settimana, per questa ragione ho pensato che con la funzione FC 7, nel parametro RET_VAL, si potesse leggere.

Ma anche qui immagino che sia io a sbagliare :( ma dove?

Modificato: da monica_124
Inserita:

Forse con un'immagine risulta più chiaro: nuovaimmagines.png

Inserita:

suppongo che tu stia usando una FC per il lancio della FC7, se tu fai

L LW2

T MW100

L LW4

T MW102

ecc ti trovi i valori che interessano a te.

pigroplc

Inserita:

se invece hai utilizzato una FB e quindi hai richiamato il blocco con una DB di istanza interroghi direttamente le DW della DB oppure sostituisci l'istruzione

L LW2

con l'istruzione L DIW2

pigroplc

Inserita:

pigroplc, io ti sono grata per lo sforzo che stai facendo ma devo ammettere che i mie limiti sono notevoli.

Ho provato le istruzioni che mi hai suggerito ma dalla tabella delle variabili non riesco a interpretarne il significato :(

Ritorno all'FC 7: non dovrebbe avere proprio la funzione di dissociare il giorno della settimana dal formato DATE_AND_TIME e quindi restituirmi il numero decimale corrispondente il giorno?

Se oggi è Sabato dove o come leggo il numero 7 :unsure:

oops mi vergogno ragazzi, abbiate pazienza :)

Inserita:

Ciao Monica,

Se oggi è Sabato dove o come leggo il numero 7

Se richiami da OB1, la TEMP9 contiene la DATE_AND_TIME del sistema.

Sbagli nel richiamo.

     CALL  "DT_DAY"
       IN     :=#TEMP9
       RET_VAL:=MW150

Se monitori la MW150, ricavi il giorno della settimana corrente.

Inserita:

savino, grazie anche a te per la disponibilità e pazienza :)

Ma come vedi dalla foto non c'è verso di riuscire, dall'OB1 richiamo l'FC 7 e la Word 188 mi visualizza 0

nuovaimmagine1v.png

Non ci stò più con la testa :(

Inserita:

Il paramero IN0 è del tipo date_and_time, questo formato usa ben 8 byte codificati in BCD!

0. Anno

1. Mese

2. Giorno

3. Ora

4. Minuti

5. Secondi

6. Due cifre più significative di MSEC

7. (4MSB) Cifre meno significative di MSEC

7. (4LSB) Giorno settimanale:

I 4 bit bassi del 7° byte contengono il giorno della settimana:

1 = Domenica

2 = Lunedì

...

7 = Sabato

Non ho mai usato FC7 ma credo si limiti a estrarre il giorno della settimana dal parametro IN0 (cosa fattibile anche con un paio di istruzioni).

Prima però devi usare SFC1 (READ_CLK) per leggere l'orario del sistema !

iTemp1    INT        int temporaneo    
DataOra    DATE_AND_TIME        Data / ora    
GDS    INT        Giorno della settimana    

      CALL  "READ_CLK"
       RET_VAL:=#iTemp1
       CDT    :=#DataOra
            
            
      CALL  "DT_DAY"
       IN     :=#DataOra
       RET_VAL:=#GDS

Inserita:

JumpMan: adesso funziona ;) Visualizzo correttamente il numero 7 corrispondente a Sabato.

Ho provato a forzare la data della CPU al 21/06/2009 ed effettivamente la Word 188 visualizza 1, cioè Domenica.

nuovaimmagine2.png

Dunque era necessario richiamare l'SFC1!

L'avessero specificato nella guida del Simatic :( , o anche in questo caso mi è sfuggito qualcosa?

Per fortuna ci siete voi, un grazie di cuore a tutti per la disponibilità e la pazienza.

GRAZIE 1000 :)

Inserita: (modificato)

Ciao Monica,

post-27384-0-85362400-1399912682_thumb.j

Se tu guardi il mio attachment, vedi che la TEMP9 ( data type DATE_AND_TIME ) che sarebbe l'offset del orologio parte dall'indirizzo 12.0

Infatti se tu vorresti caricare i dati dell'orologgio in OB1, indirizzi a partire del offset byte 12:

L LB 12

T MB 244 // anno

L LB 13

T MB 245 // mese

...

..

Io vedo sul tuo attachment che l'offset della TEMP9 ha lo indirizzo 0.0 <_<

Vedi, se la TEMP9 non e' all'offset 12.0, allora non funzionera'.

A me sembra strano perche nello OB1 per default, la TEMP9 e' all'offset 12.0

Prima però devi usare SFC1 (READ_CLK) per leggere l'orario del sistema !

Questo va bene se non carichi la TEMP9 nell'OB1.

Modificato: da Savino
Inserita:

Savino: hai ragione, scusami se al tuo suggerimento di prima non ho considerato il richiamo nell'OB1.

Richiamavo l'FC 7 da un'altro FC, mappavo la temporanea #TEMP9 convinta che avrebbe funzionato, invece ecco allora la ragione del richiamo di SFC1 se richiamo L'FC 7 da un'altro FC.

Ora ho provato a richiamare l'FC 7 dall'OB1, effettivamente funziona ;) Grazie di cuore anche a te.

Ragazzi, vi sono estremamente riconoscente :) ciao, monica.

Inserita:

L'importante è anche capire le cose, non soltanto farle funzionare...

Savino, è strano il tuo OB1, per quello non mi capivo, nel mio ci sono i nomi delle variabili e non TEMP....

OB1_EV_CLASS BYTE Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)

OB1_SCAN_1 BYTE 1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)

OB1_PRIORITY BYTE 1 (Priority of 1 is lowest)

OB1_OB_NUMBR BYTE 1 (Organization block 1, OB1)

OB1_RESERVED_1 BYTE Reserved for system

OB1_RESERVED_2 BYTE Reserved for system

OB1_PREV_CYCLE INT Cycle time of previous OB1 scan (milliseconds)

OB1_MIN_CYCLE INT Minimum cycle time of OB1 (milliseconds)

OB1_MAX_CYCLE INT Maximum cycle time of OB1 (milliseconds)

OB1_DATE_TIME DATE_AND_TIME Date and time OB1 started

OB1_DATE_TIME che sarebbe la tua TEMP9 è proprio all'indirizzo locale 12.0, ma non mi convince del tutto...

Date and time OB1 started cioè data/ora di avvio dell'OB1 e non data/ora dell'orologio...

Inserita:

Se vi può interessare, quando da un progetto S7 apro l'OB1 le variabili temp. appaiono mappate così:

nuovaimmagine1f.png

Inserita: (modificato)
OB1_DATE_TIME che sarebbe la tua TEMP9 è proprio all'indirizzo locale 12.0, ma non mi convince del tutto...

Date and time OB1 started cioè data/ora di avvio dell'OB1 e non data/ora dell'orologio...

Mi auto-correggo, aveva ragione Savino, le variabili "Date and time OB1 started" si aggiornano ad ogni scansione di OB1, quindi se le operazioni di controllo dell'orologio vengono eseguite in OB1 non serve nemmeno usare SFC1, ma a questo punto non serve neanche usare FC7.

Esempio:

L LB 12 //Anno

BTI

T "Anno"

L LB 13 // Mese

BTI

T "Mese"

L LB 14 // giorno

BTI

T "Giorno"

L LB 15 // Ore

BTI

T "Ore"

L LB 16 // Minuti

BTI

T "Minuti"

L LB 17 // Secondi

BTI

T "Secondi"

L LB 19

L 2#1111

UW

T "GDS"

Queste ultime 4 istruzioni dovrebbero essere sufficienti a Monica per determinare il giorno della settimana in OB1

Per quanto riguarda i simboli delle variabili locali di OB1 non mi spiego come mai sono l'unico ad averli...

Modificato: da JumpMan
Inserita: (modificato)
Ora ho provato a richiamare l'FC 7 dall'OB1, effettivamente funziona

Brava Monica, well done! :)

Per quanto riguarda i simboli delle variabili locali di OB1 non mi spiego come mai sono l'unico ad averli

No JumpMan, non sei l'unico ad averle.

Nel esempio allegato sopra avevo aperto un'OB1 in un progetto gia' esistente, e le variabili TEMP mi le sono trovate cosi descritte, e se mi chiedi perche, adesso non mi lo ricordo :rolleyes:

Comunque, nello esempio sotto, ho creato una nuova CPU, e OB1 e allora mi ha dato per default le discrizioni dopotutto piu' corrette.

post-164172-0-21433900-1399925257_thumb.

Comunque, la descrizione della TEMP dall'offset 12.0 potrebbe essere cambiata, e se vogliamo ricavare gli 8 byte di data dal orologgio di sistema, la data type deve essere del tipo DATE_AND_TIME.

Modificato: da Savino

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