Sifeld Inserito: 11 febbraio 2010 Segnala Inserito: 11 febbraio 2010 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 oreUtenza 2 - 15 oreUtenza 3 - 7 oreUtenza 4 - 35 oreUtenza 5 - 24 oreUtenza 6 - 2 orea questo punto devo creare qualcosa che mi restituisca:Utenza 6Utenza 3Utenza 1Utenza 2Utenza 5Utenza 4Questo 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.
Livio Orsini Inserita: 11 febbraio 2010 Segnala Inserita: 11 febbraio 2010 Dovresti esplicitare meglio qual'è la tua difficoltà; come costruire l'algoritmo? quale istruzioni usare? altro?
Sifeld Inserita: 11 febbraio 2010 Autore Segnala Inserita: 11 febbraio 2010 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.
Livio Orsini Inserita: 11 febbraio 2010 Segnala Inserita: 11 febbraio 2010 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.
batta Inserita: 11 febbraio 2010 Segnala Inserita: 11 febbraio 2010 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 nullaContinui 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.
Sifeld Inserita: 12 febbraio 2010 Autore Segnala Inserita: 12 febbraio 2010 [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
Livio Orsini Inserita: 12 febbraio 2010 Segnala Inserita: 12 febbraio 2010 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.
Sifeld Inserita: 12 febbraio 2010 Autore Segnala Inserita: 12 febbraio 2010 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 passatain 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?
batta Inserita: 12 febbraio 2010 Segnala Inserita: 12 febbraio 2010 [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.
Sifeld Inserita: 18 febbraio 2010 Autore Segnala Inserita: 18 febbraio 2010 Grazie mille a tutti, alla fine ho optato per crearmi un blocco parametrizzato per ogni caso. Ciao e alla prossimo domanda.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora