Vai al contenuto
PLC Forum


Memorizzazione Dati In Db - Come memorizzare valori in una DB


Messaggi consigliati

Inserito: (modificato)

Ciao a tutti! Sono alle prese con il seguente problema: sto lavorando con un plc S7-300 e devo memorizzare all'interno di una DB i valori provenienti da una sonda NTC opportunamente scalati. La memorizzazione avviene in un array di 100 elementi prelevando un dato ogni 10 sec.

La domanda che vi pongo è la seguente: che procedura devo seguire per effettuare la memorizzazione ad intervalli prefissati di tempo della variabile acquisita?

Grazie!

Modificato: da ccarafa

Inserita:

Dovresti creare un puntatore, puntare una dbw scrivere il valore e incrementare il puntatore ogni 10s.

C'è una discussione con qualcosa di simile:

Puntare Una Db

Ciao

Inserita:

Ciao Ricky, dai un ;) a questo file sorgente!!!!!!!!!!!!!!

Puoi usarlo per "n" schedulazioni!!!!!

Mi sembra quello che cerchi :D !!!!!

DATA_BLOCK "Data base"
TITLE =
AUTHOR : Eddy
VERSION : 0.1


  STRUCT  
   Dati : ARRAY  [0 .. 9 ] OF WORD;    
  END_STRUCT;    
BEGIN
   Dati[0] := W#16#0; 
   Dati[1] := W#16#0; 
   Dati[2] := W#16#0; 
   Dati[3] := W#16#0; 
   Dati[4] := W#16#0; 
   Dati[5] := W#16#0; 
   Dati[6] := W#16#0; 
   Dati[7] := W#16#0; 
   Dati[8] := W#16#0; 
   Dati[9] := W#16#0; 
END_DATA_BLOCK

FUNCTION_BLOCK "Prg"
TITLE =
AUTHOR : Eddy
VERSION : 0.1


VAR_INPUT
  NumeroDB : INT;    //Numero DB dove voglio salvare i dati
  NumeroSchedulazioni : INT;    //Numero schedulazioni da eseguire
  InizioArray : INT;    //W inizio Array
  VariabileDaSalvare : WORD;    //Indirizzo variabile da schedulare
  TempoSchedulazione : S5TIME;    //Tempo di schedulazione
  TimerPerSchedulazione : TIMER;    //Timer usato per schedulazione
  StartSchedulazione : BOOL;    //Bit abilita schedulazione
END_VAR
VAR_IN_OUT
  FineSchedulazione : BOOL;    //Schedulazione terminata
END_VAR
VAR
  DatoAttuale : DWORD;    
  AntiRepeat : BOOL;    
END_VAR
VAR_TEMP
  PuntatoreDB : INT;    
  PuntatoreW : DWORD;    
END_VAR
BEGIN
NETWORK
TITLE =

      UN    #StartSchedulazione; 
      SPBN  END; 
      L     0; 
      T     #DatoAttuale; 
END:  NOP   0; 

      U     #StartSchedulazione; 
      SPBN  end2; 

//apertura DB dove eseguire schedulazione

      L     #NumeroDB; 
      T     #PuntatoreDB; 

      AUF   DB [#PuntatoreDB]; 

//--------------------------------------


//clok di schedulazione

      UN    #AntiRepeat; 
      L     #TempoSchedulazione; 
      SE    #TimerPerSchedulazione; 

      U     #AntiRepeat; 
      R     #AntiRepeat; 

//---------------------


//copia dato su Array

      U     #TimerPerSchedulazione; 
      SPBN  end2; 
      S     #AntiRepeat; 

      L     #InizioArray; 
      ITD  ; 
      L     #DatoAttuale; 
      +D   ; 
      L     2; 
      *D   ; 
      SLD   3; 
      T     #PuntatoreW; 

      L     #VariabileDaSalvare; 
      T     DBW [#PuntatoreW]; 

      L     #NumeroSchedulazioni; 
      L     1; 
      -I   ; 
      L     #DatoAttuale; 
      >I   ; 
      SPBN  end1; 
      L     #DatoAttuale; 
      L     1; 
      +I   ; 
      T     #DatoAttuale; 
      SPA   end2; 

end1: L     0; 
      T     #DatoAttuale; 
      S     #FineSchedulazione; 

end2: NOP   0; 
//-------------------
END_FUNCTION_BLOCK

DATA_BLOCK "DBistanzaFB1"
TITLE =
AUTHOR : Eddy
VERSION : 0.1

"Prg"
BEGIN
   NumeroDB := 0; 
   NumeroSchedulazioni := 0; 
   InizioArray := 0; 
   VariabileDaSalvare := W#16#0; 
   TempoSchedulazione := S5T#0MS; 
   TimerPerSchedulazione := T 0; 
   StartSchedulazione := FALSE; 
   FineSchedulazione := FALSE; 
   DatoAttuale := DW#16#0; 
   AntiRepeat := FALSE; 
END_DATA_BLOCK

ORGANIZATION_BLOCK "Cycle Execution"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_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;    //Priority of OB Execution
  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
END_VAR
BEGIN
NETWORK
TITLE =

      CALL "Prg" , "DBistanzaFB1" (
           NumeroDB                 := 1,//numero DB dove salvare i dati
           NumeroSchedulazioni      := 10,//numero schedulazioni da fare
           InizioArray              := 0,//indirizzo inizio Array
           VariabileDaSalvare       := MW    10,//variabile da schedulare
           TempoSchedulazione       := S5T#10S,//tempo di schedulazione
           TimerPerSchedulazione    := T      0,//timer usato
           StartSchedulazione       := M      0.0,//bit abilitazione schedulazione
           FineSchedulazione        := M      0.1);//bit scedulazione avvenuta

END_ORGANIZATION_BLOCK

Buon lavoro!

Ciao.

:clap:

Inserita:

Grazie per le soluzioni proposte, ho risolto il problema con una struttura simile a quella che mi hai proposto!

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