Vai al contenuto
PLC Forum


Monitorare i passaggi di stato 0/1 di un Merker


CarlettoR

Messaggi consigliati

Buon giorno.

Con S7 300 vorrei registrare i passaggi di stato da 0 a 1 di un Merker, memorizzando data e ora. 

Come potrei incolonnare l’informazione in una DB?

 

Es: M44.4 = 1 scrivo in DB44.DBD0  “28/03/17 13:45”

      M44.4 = 1 scrivo in DB44.DBD4  “28/03/17 17:11”

Grazie.

Link al commento
Condividi su altri siti


lupusimprobus

AWL

Ad ogni fronte di salita del merker richiami l'FC9999

Dando in ingresso la data e l'ora attuali

      A     M     44.4
      FP    M     44.5
      JNB   _001
      CALL  FC  9999
       data:=#act_DateTime		// DATE_AND_TIME
       dati:=#Tabella			// Array[1..10] of DATE_AND_TIME
_001: NOP   0

DB50 - Archivio

La tabella registra gli ultimi 10 cambi di stato da false a true

DATA_BLOCK DB 9999
TITLE =
VERSION : 0.1
  STRUCT 	
   dati : ARRAY  [1 .. 10 ] OF DATE_AND_TIME ;	
  END_STRUCT ;	
BEGIN
   dati[1] := DT#90-1-1-0:0:0.000; 
   dati[2] := DT#90-1-1-0:0:0.000; 
   dati[3] := DT#90-1-1-0:0:0.000; 
   dati[4] := DT#90-1-1-0:0:0.000; 
   dati[5] := DT#90-1-1-0:0:0.000; 
   dati[6] := DT#90-1-1-0:0:0.000; 
   dati[7] := DT#90-1-1-0:0:0.000; 
   dati[8] := DT#90-1-1-0:0:0.000; 
   dati[9] := DT#90-1-1-0:0:0.000; 
   dati[10] := DT#90-1-1-0:0:0.000; 
END_DATA_BLOCK

 

FC50 - SCL

Sposta i dati una riga verso il basso ed aggiunge alla prima riga la nuova data/ora

In pratica un LIFO personalizzato, in questo modo puoi modificarlo per archiviare tutto ciò che ti occorre

FUNCTION FC50 : VOID
TITLE = ''
AUTHOR : CMP_VG
VERSION : '0.1'
VAR_INPUT
    data : DATE_AND_TIME;   // Data e ora attuale
END_VAR

VAR_IN_OUT
    dati : ARRAY[1..10] OF DATE_AND_TIME;   // Tabella archivio
END_VAR

VAR_TEMP
    i : INT;                // Contatore iterazioni
END_VAR

    // Sposto tutti i dati una riga verso il basso
    // l'ultimo dato in fondo alla tabella andrà perso
    FOR i:=10-1 TO 1 BY -1 DO
        dati[i+1] := dati[i];
    END_FOR;
    // Ora posso inserire il nuovo dato nella prima riga
    dati[1] := data;
END_FUNCTION

Spero d'esseri stato utile.
Buona giornata

Link al commento
Condividi su altri siti

Ti ringrazio, davvero tanto.

Un'altra richiesta se puoi: non conosco il linguaggio SCL, potresti convertire in AWL?

 

Buona giornata.

Link al commento
Condividi su altri siti

Non è certo il massimo, ma funziona.

Ho fatto così:

  • da OB1 leggo Data e Ora.
  • FC7 esegue le funzioni.
  • FC70 richiamo FC7 assegno parametri.
  • Archivio in DB7

PS: è possibile eliminare o nascondere le ultime due cifre dalle variabili Data e Ora?

es:

DW#16#170329

DW#16#211916

 

Grazie.

 

OB1.JPG

FC70.JPG

FC7.JPG

DB7.JPG

Link al commento
Condividi su altri siti

lupusimprobus

Non so se per una cosa del genere vale la pena complicarsi la vita utilizzanto formati come DATE_AND_TIME e similari.
Magari ti basterebbe salvare la data e ora attuali in una STRUCT di BYTE in tipo

Data -> STRUCT

    DAY -> BYTE

    MONTH -> BYTE

    YEAR -> BYTE

    HOUR -> BYTE

    MINUTE -> BYTE

    SECOND -> BYTE
E gestire tutto come un array di byte e con molto più semplici

L DBxxx.DBB0

T DByyy.DBB10

 

Per leggere l'ora del PLC puoi vedere l'esempio al seguente link:

https://support.industry.siemens.com/cs/document/21222026/how-can-you-read-out-the-date-and-time-with-sfc1-(read_clk)-and-set-them-with-sfc0-(set_clk)-?dti=0&lc=en-WW

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