Vai al contenuto
PLC Forum


Monitorare i passaggi di stato 0/1 di un Merker


Messaggi consigliati

Inserito:

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.


lupusimprobus
Inserita:

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

Inserita:

Ti ringrazio, davvero tanto.

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

 

Buona giornata.

Inserita:

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

lupusimprobus
Inserita:

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

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