Vai al contenuto
PLC Forum


Sequenza con priorità


alexaccia

Messaggi consigliati

Buongiorno,

ho una serie di 16 serbatoi che devo riempire quando sono scarichi e per fare ciò, tutti e 16 attingono da un master con una pompa che spara il materiale un serbatoio per volta.

Il problema è che non ho una sequenza sempre lineare, ma devo seguire l'ordine di chiamata e non ho idea di come gestirlo.

Mi spiego meglio, può essere che serva del materiale all'utenza 8, finché sto pompando il materiale sul 8, serva sul 4 e poi sul 7 e così via...

Come faccio a ricordarmi qual è stata la sequenza di chiamata? 

Avete suggerimenti?

Pensavo di fare una specie di registro di scorrimento usando una word (16 bit) e ad ogni fronte di salita di una richiesta mi salvo il numero visualizzato via via su altre word e quando finisco il riempimento vado a vedere la word successiva per capire quale dei bit era alto nel momento successivo ma mi sembra macchinoso...

 

Accetto suggerimenti

Grazie

Link al commento
Condividi su altri siti


ciao, io farei corrispondere ad ogni serbatoio un suo identificatico univoco, che puo essere anche il numero staesso 1,2,3,4,5..... ogni qual volta che un serbatoio è vuoto avvia una richiesta di riempimento sul fronte di questa richiesta ti salvi in un array l'identificativo univoco di chi ha fatto al richiesta. i salvataggi li fai a scorrere verso giu nell array man mano che hai posizioni vuote. quando è il momento di riempire verifichi dall'alta dell'array la prima posizione, la riempi e poi shifti tutte le pos in su e riempi cosi riempi sempre la prima salvata.

Link al commento
Condividi su altri siti

Ciao.

io in questo caso faccio un contatore per ogni richiesta. Quando ho una richiesta ogni secondo aumento il contatore. Per cominciare guardo il contatore più alto e lo servo, poi azzero il contatore. Finito quello guardo di nuovo il contatore più alto. Se non ho la richiesta azzero il contatore.

Link al commento
Condividi su altri siti

4 ore fa, alessandropa ha scritto:

ciao, io farei corrispondere ad ogni serbatoio un suo identificatico univoco, che puo essere anche il numero staesso 1,2,3,4,5..... ogni qual volta che un serbatoio è vuoto avvia una richiesta di riempimento sul fronte di questa richiesta ti salvi in un array l'identificativo univoco di chi ha fatto al richiesta. i salvataggi li fai a scorrere verso giu nell array man mano che hai posizioni vuote. quando è il momento di riempire verifichi dall'alta dell'array la prima posizione, la riempi e poi shifti tutte le pos in su e riempi cosi riempi sempre la prima salvata.

 

Si dopo aver fatto la domanda ho cercato soluzioni in giro e l'array mi sembra la soluzione più appropriata ma non li so usare...

io dovrei inserire in alto nell'array il primo serbatoio che richiede il carico, se arriva una chiamata metterlo in coda, quando finisco il carico del primo dovrei traslare tutti i valori in su di 1...

Che blocco funzione devo usare?

Come faccio a fare shiftare verso l'alto?

Che blocco uso per leggere la prima riga dell'array?

 

Grazie

array.PNG

3 ore fa, 84paolo ha scritto:

Ciao.

io in questo caso faccio un contatore per ogni richiesta. Quando ho una richiesta ogni secondo aumento il contatore. Per cominciare guardo il contatore più alto e lo servo, poi azzero il contatore. Finito quello guardo di nuovo il contatore più alto. Se non ho la richiesta azzero il contatore.

 

avevo pensato anche a questo e anche con un TON... il temporizzatore che sta aspettando da più tempo viene servito ma ho paura che se salta l'alimentazione venga resettato... dovrei provare con un TONR... 

 

Grazie

Link al commento
Condividi su altri siti

22 minuti fa, alexaccia ha scritto:

quando finisco il carico del primo dovrei traslare tutti i valori in su di 1...

Che blocco funzione devo usare?

Se hai un minimo di pratica di linguaggio strutturato (SCL per Siemens), lo risolvi con un banale ciclo FOR-NEXT.

In caso contrario, diventa un po' più complicato.

 

22 minuti fa, alexaccia ha scritto:

ma ho paura che se salta l'alimentazione venga resettato... dovrei provare con un TONR... 

Perché tirare in ballo i timer? Se segui questa strada, fai come suggerito da "84Paolo": incrementi una variabile ad ogni secondo. Se la variabile è ritentiva, anche in caso di power off i valori rimangono.

Anche in questo caso però sarebbe utile masticare un po' di Testo Strutturato per trovare, ancora una volta con un ciclo FOR-NEXT, a chi corrisponde il valore più alto.
In caso contrario, risolvi con 15 comprarazioni. Metodo che definirei decisamente brutto.
 

Potresti anche fare un loop in ladder ma, a questo punto, è più facile imparare il testo strutturato. Cosa che, indipendentemente da questo specifico problema, ti consiglio vivamente.

 

Se devi fare tutto in ladder, potresti scaricarti dal sito Siemens la libreria "LGF_Library". È gratuita e, tra le molte funzioni, trovi anche la funzione FIFO, che fa al caso tuo. Nel download della libreria è compresa anche la documentazione.

Modificato: da batta
Link al commento
Condividi su altri siti

Io assegnerei ad ogni serbatoio un numero e poi mi farei un array di n elementi che nel tuo caso sarebbero 16 interi. 

Poi mi farei due puntatori alle celle dell'array: uno per l'ingresso 'PI" e uno per l'uscita "PO".

Metterei anche un bit per il comando di richiesta, un bit per comandare il carico e un bit per confermare l'avvenuto caricamento. 

 

Poi farei:

 

IF IN == TRUE THEN

A[PI] = NUMERO SERBATOIO

PI = PI + 1

IN = FALSE

END

 

 

IF (PI <> PO) AND NOT CARICO_IN_CORSO THEN

TINO DA CARICARE = A[PO] 

CARICO_IN_CORSO = TRUE

END

 

IF CARICO_TERMINATO AND CARICO_IN_CORSO THEN

CARICO_IN_CORSO = FALSE

PO = PO + 1

END

 

IF PI >16 THEN

PI = 1

END

 

IF PO > 16 THEN

PO = 1

END

 

Ho scritto dal cellulare e spero si capisca. 

Comuque piuttosto che fare degli shift, preferisco spostare i puntatori e farli scorrere. 

Una volta in fondo ricomincio da capo. 

 

Così se i tini da 16 diventano 25 cambio due righe di codice e ricarico. 

 

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