Vai al contenuto
PLC Forum


Fb Per Gestione Utenze - Rotazione utenze in base alle ore lavoro


Messaggi consigliati

Inserito:

Salve a tutti.

Ho la necessità di creare un FB parametrizzabile per la gestione dello start da un minimo di 2 ad un max di 6 utenze in sequenza, seguendo l'ordine di avviamento in base all'utenza con il minor numero di ore lavoro.

Avevo pensato a creare un blocco con dei comparatori ma mi diventa molto macchinoso e quindi stò cercando di cambiare metodo. Ho quindi pensato all'utilizzo di un'array dove al suo interno mi venga scritta la sequenza di start delle utenze. Praticamente dopo i calcoli che effettuo tra le varie comparazioni delle ore mi viene scritto nell'array la sequenza di start.

Qui però sorge il mio problema. Come posso fare a gestire il blocco che mi regola la sequenza di avviamento?

Riporto un esempio pratico per capire meglio cosa devo fare:

Utenza 1 - 10 ore

Utenza 2 - 15 ore

Utenza 3 - 7 ore

Utenza 4 - 35 ore

Utenza 5 - 24 ore

Utenza 6 - 2 ore

a questo punto devo creare qualcosa che mi restituisca:

Utenza 6

Utenza 3

Utenza 1

Utenza 2

Utenza 5

Utenza 4

Questo nel caso io abbia 6 utenze da gestire. Nel caso ne abbia solamente due nell'array ci dovrà essere scritta la sequeza di solamente 2 utenze. e così via...

Non ho la più pallida idea su come partire. Chiedo quindi aiuto a voi.


Inserita:

Dovresti esplicitare meglio qual'è la tua difficoltà; come costruire l'algoritmo? quale istruzioni usare? altro?

Inserita:

Non so che tipo di algoritmo usare...cercando in rete ho trovato qualcosa come l'agoritmo Bubble Sort. ma non è che ci abbia capito più di tanto.

Inserita:

Gli algoritmi di sort o di ordinamento sono sempre macchinosi perchè devono essere effettuati per comparazioni successive. Miracoli non ne esistono.

Se, come nel tuo caso, devi ordinare gli elementi di un vettore in ordine di valore crescente dovrai comparare tutti gli elementi tra loro, non c'è scampo.

In genere si crea un loop che si ripete si a che tutti gli elementi sono stati confrontati e ordinati.

A questo punto è obbligatorio porti due domande: qual'è il numero massimo di utenze previste, in che modo conteggi le ore di funzionamento. In base a questi dati si pèuiò ottimizzare l'algoritmo.

Stando alle mie esperienze l'ordinamento conviene farlo immediatamente al conteggio del tempo di funzionamento.

Inserita:

Se devi solo decidere chi far partire ogni volta che ti arriva un ordine di avvio, non c'è bisogno di riordinare tutte le utenze.

Potresti procedere come segue:

- predisponi la partenza di Utenza_1 e scrivi le ore di funzionamento di Utenza_1 in una variabile di appoggio AuxOre

- confronti AuxOre con le ore di funzionamento di Utenza_2

- se Utenza_2 < AuxOre, allora resetti le precedenti predisposizioni alla partenza, predisponi per la partenza Utenza_2 e scrivi in AuxOre le ore di funzionamento di Utenza_2

- altrimenti, se Utenza_2 >= AuxOre, non fai nulla

- confronti AuxOre con le ore di funzionamento di Utenza_3

- se Utenza_3 < AuxOre, allora resetti le precedenti predisposizioni alla partenza, predisponi per la partenza Utenza_3 e scrivi in AuxOre le ore di funzionamento di Utenza_3

- altrimenti, se Utenza_3 >= AuxOre, non fai nulla

Continui così fino all'esaurimento dei controlli.

Ovviamente si devono saltare le utenze già in marcia o non abilitate alla marcia.

Questo metodo, come già detto, non riordina tutte le utenze ma permette, con poche istruzioni, di scegliere l'utenza da avviare.

Inserita:

[at] Livio Orsini: Il numero massimo di utenze da controllare è 6 e le ore mi vengono calcolate sulla base di un segnale di ON che mi aggiunge un numero di tipo intero ad una variabile DINT.

il Problema è che io devo gestirmi più azionamenti tramite queste utenze, per fare un'esempio pratico, ho una vasca contenente del liquido ed a seconda di quanta acqua ho in questa vasca (in base a dei livelli quindi) devo far partire un numero da 1 a 6 pompe, tramite l'odrine di partenza che ho detto prima, ovvero, per prima parte la pompa con le ore lavoro più basse, la seconda sarà la seconda pompa con le ora più basse, ecc. ecc... questo fino a svuotamento della vasca. Se durante lo svuotamento una pompa supera le ore di lavoro dell'altra non deve accadere niente, ma semplicemente quella pompa al prossimo avviamento non si avvirà (sempre che le sue ore di lavoro non siano inferiori).

[at]batta: io avevo fatto come mi ha suggerito tu, solo che mi vengono fuori 6 comparazione per ogniuna delle 6 utenze e volevo ottimizzare al massimo il controllo. Anche perchè non è detto che io debba sempre gestire 6 utenze....in molti casi ne gestisco 3 altre volte ne gestisco 2 e quindi volevo utilizzare un blocchetto standard in modo da non doverci mai più ragionare sopra :)

Inserita:

Se fai un algoritmo di sort dovrai fare sempre tutte le comparazioni, come ti ho scritto prima tecnica e magia non vanno d'accordo.

Conviene fare la funzione ottimizzata per l'applicazione di volta in volta.

Io la scelta la fareri al momento della richiesta di avvio, più o meno come suggerisce Batta.

Inserita:

il problema è che mi è stato imposto di creare un blocco che valga per qualsiasi applicazione con un massimo di 6 pompe...praticamente questo blocco che creerò diventerà uno standard per l'azienda...quindi preferisco spendere più tempo qui per farlo e farlo bene che fare una cosa che funzioni bene, ma magari difficile da interpretare. qui sul forum ho trovato un esempio di Bubble Sort con codice in AWL:

 AUF   DB    19                    // DB
     L     100                         // 100 word in db 19 dalla DBW0 alla DBW198
jum1: T     #cont_1                     // contatore esterno
     LAR1  P#DBX 0.0
     L     99                          // le 99 word sotto
jum2: T     #cont_2                     // contatore interno
     L     DBW [AR1,P#0.0]             // word sopra
     L     DBW [AR1,P#2.0]             // word sotto
     <=I                               // sopra <= sotto  ?
     SPB   jum3
     T     #mem                        // scambia, word sotto in mem
     L     DBW [AR1,P#0.0]             // word sopra...
     T     DBW [AR1,P#2.0]             //...sotto
     L     #mem
     T     DBW [AR1,P#0.0]             // ..e viceversa
jum3: L     P#2.0
     +AR1                              // incrementa di una word
     L     #cont_2
     LOOP  jum2                        // se non e' finita una passata..
     L     #cont_1
     LOOP  jum1                        // finita una passata

in questo modo tutta la fase dei controlli viene ridotta a queste poche righe di istruzione. volendola riadattare al mio caso mi basta cambiare i puntatori e il controllo portarlo da word a doppia word giusto? avrei pensato di creare una seconda DB dove ci sono i bit delle utenze e quando scambio i posti delle ore vado a scambiare i bit per la partenza delle utenze. Può essere una soluzione? è fattibile secondo voi?

Inserita:
[at]batta: io avevo fatto come mi ha suggerito tu, solo che mi vengono fuori 6 comparazione per ogniuna delle 6 utenze e volevo ottimizzare al massimo il controllo.

Se segui il mio procedimento, bastano sei comparazioni in tutto, e non sei per ogni utenza.

Inserita:

Grazie mille a tutti, alla fine ho optato per crearmi un blocco parametrizzato per ogni caso. Ciao e alla prossimo domanda.

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