Vai al contenuto
PLC Forum


Creare Storico (di Un Grandezza Fisica) In Un Blocco Dati In Funzione - Monitoraggio di una grandezza fisica in funzione del tempo


giacomo_76

Messaggi consigliati

Nell'impianto dove lavoro ho la necessità di controllare frequentemente la temperatura...dopo un corso base di PLC mi ritrovo a fare i conti con la normale inesperienza del provetto programmatore nonostante ci stia mettendo tutta la buona volontà.

Mi domandavo se posse possibile con un pulsante/interruttore avviare la registrazione di un parametro fisico(tipo la temperatura) in un blocco dati. All'indirizzo dbxx.dbd0 volevo indirizzare la temperatura istantanea del sistema da monitorare, mentre nei successivi indirizzi vedi dbxx.dbd4, dbxx.dbd12, ecc. registrare la temperatura con una cadenza di 2-3-4 o più minuti questo lo decido io al bisogno. Spero di essere stato sufficentemente chiaro e riporto in codice quanto sono riuscito a produrre ahimè senza i risultati voluti.. ovvero riesco a ottenere solo misurazioni istantanee e non ritardate como pensavo.

Un grazie a chi mi potrà gentilmente aiutare nei miei intenti almeno per sapere se è concettualmente possibile con il seguente programma o praticamente fattibile con un altro sistema. Giacomo

AUF #Database //apri DB 100

L P#0.0 //carica in formato puntatore l'indirizzo 0.0

L #Campo_Inizio //carica l'indirizzo del primo valore utile per la creazione del Database

SLD 3

+D

T #Puntatore //setta il Puntatore nel DB100 all'indirizzo 0.0

//*******************************

L #Temperatura //carica temperatura

T DBD [#Puntatore] //trasferiscila DB100 all'indirizzo 0.0

//*******************************

L #Campo_lunghezza //Valore che indica l'estensione delle misurazioni da effettuare

jack: T #NumeroDati //trasferisci il prec.valore in locale che memorizza le misurazioni già compiute

//*******************************

L #Puntatore //carica il puntatore settato nel DB100 all'indirizzo 0.0

L P#4.0 //carica in formato puntatore l'indirizzo 4.0

+D //somma gli indirizzi

T #Puntatore //setta il puntatore all'indirizzo 4.

L P#16.0 //carica indirizzo della merker di SET del pulsante di avvio registrazione dati

LAR1 //su LAR1

U M [AR1,P#0.0] //se la Merker 16 ha il bit 0 a 1

SPBN nop //vai a nop

CALL "Generatore di clock" //generatore di clock con ritardo all'attivazione di 10s.

L P#30.1

LAR1

U M [AR1,P#0.0]

CALL "Generatore di clock" //generatore di clock con ritardo all'attivazione di 10s.

L #Temperatura

T DBD [#Puntatore] //trasferiscila DB100 all'indirizzo 4.0

L #NumeroDati

LOOP jack

//*******************************

nop: L #Temperatura

T DBD 0

//--------FINE------//

//****SPIEGAZIONE di CALL "Generatore di clock" ****

Generatore di Clock

U(

U M 16.0

L S5T#10S

SE T 4

NOP 0

NOP 0

NOP 0

U T 4

)

UN T 5

L S5T#20S

SV T 5

= M 24.0

Di seguito riporto un contatore che conta semplicemente gli impulsi di M24.0 (l'ho messo in un 2° segmento della Fc solo x verificare il funzionamento del !°segmento)

U M 24.0

ZV Z 1

BLD 101

NOP 0

NOP 0

U M 15.2

R Z 1

L Z 1

T MW 25

NOP 0

Link al commento
Condividi su altri siti


Ciao Giacomo,

quel che chiedi è spesso cosa di routine, ci mancherebbe altro che non si potesse.

Se posso darti un cosiglio, cerca di pensare in modo generico. Il codice mi sembra un po' troppo appesantito.

Se fossi in te mi creerei una FC o una FB che poi standardizerei in grado di gestire un buffer circolare. In questo modo pui salvare le tue granzezza secondo i tuoi canoni e/o tempi.

Un buffer cicolare lo si gestisce normamente con due puntatori, uno di scrittura e uno di lettura. Poi vi dovrebbe essere un comando di push (inserisci dato) ed uno di pop (estrai dato). Volendo si potrebbe pensare ad un terzo puntatore che può scorrere nella finestra del puntatore di scrittura e di lettura per definire delle letture "random".

ciao

Link al commento
Condividi su altri siti

Ciao Federico

Per prima cosa ti ringrazio per la disponibilità nel rispondermi. Ho delle domande riguardo alla tua proposta e/o soluzione.

1-Per buffer di tipo circolare intendi un blocco dati che ha la funzione di ospitare i valori che devo monitorare?

2-Per comando di push (inserisci dato) ed uno di pop (estrai dato) ti riferisci ai consueti comandi L e T o sono degli altri comandi?

Il terzo puntatore per definire delle letture "random" per il momento non lo prendo in considerazione..vorrei risolvere prima la gestione del database/buffer

3-Dove posso trovare della documentazione riguardante la creazione di buffer circolari, sulla gestione dati sui monitoraggi ed esempi a riguardo?

Link al commento
Condividi su altri siti

Ciao,

onestamente documentazione specifica per lo Step7 non saprei, ma il buffer circolare è una tecnica comunissima, quindi penso un buon libro di algoritmi e strutture dati.

Venendo alle tue domande:

1. Il buffer circolare potrebbe essere una DB che contiene una serie di locazioni grandi quanto la dimensione dei dati, quindi sì hai capito a perfezione.

2. le funzioni di pop e push dovranno essere implementate da una FC o FB che gestisce la tua DB di buffer circolare.

di regola, il buffer circolare viene realizzato facilmente con una struttura di tipo array. Focalizzando l'attenzione sulle funzioni push e pop:

(ti scrivo del pseudo codice per evitare prolissità, alla fine è come realizzare una FC o un comando di una FC generica)

push(dato): l'istruzione scrive il valore "dato" sulla locazione puntata dal puntatore di scrittura, quindi incrementa il valore del puntatore di scrittura, se l'incremento supera la dimensione del buffer aggiorna il valore del puntatore di scrittura al valore zero - è un buffer circolare proprio per questo -.

pop() -> dato: l'istruzione recupera il dato puntato dal puntatore di lettura, quindi incrementa il valore del puntatore di lettura, se l'incremento supera la dimensione del buffer aggiorna il valore del puntatore di lettura al valore zero - come per il push, il pop è la punzione duale -.

Credo che già così puoi implementare qualcosa di semplice ma funzionante. Nota che se i puntatori di lettura e scrittura coincidono o il buffer è vuoto o c'è un overwrite. In questo caso si incrementa il puntatore d lettura perdendo il primo dato.

tieni presente che un buffer circolare è di regola un buffer FIFO.

ciao

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