Viene richiesto di creare una funzione (FC) che riceve in ingresso un blocco dati (costituito solamente da DWord) e restituisce in uscita il valore massimo (e anche l’indirizzo) dell’elemento più grande.
Semplicemente creo la seguente FB in STL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | FUNCTION "val_max_db" : Void { S7_Optimized_Access := 'FALSE' } VERSION : 0.1 VAR_INPUT db_in : Block_DB; END_VAR VAR_OUTPUT valore_max : DWord; indirizzo_max : DWord; END_VAR VAR_TEMP valore_max_tmp : DWord; indirizzo_max_tmp : DWord; num_loop : DWord; indirizzo_tmp : DWord; END_VAR BEGIN NETWORK TITLE = OPN #db_in; //apro il blocco dati L DBLG; //carico su ACCU1 la lunghezza del blocco dati (ossia il numero di byte di db_in) L 4; /I; //dividendo per 4 (un DWord è fatta da 4 Byte) ottengo il numero degli elementi del blocco dati L 1; -I; T #num_loop; // sottraggo 1 al valore precedentemente trovato e salvo il valore su num_loop che userò per il loop L P#0.0; T #indirizzo_tmp; //inizializzo indirizzo_tmp con P#0.0 T #indirizzo_max_tmp; //inizializzo indirizzo_max_tmp con P#0.0 L DBD[ #indirizzo_tmp]; T #valore_max_tmp; //inizializzo valore_max_tmp con il valore del primo elemento del DB L #num_loop; inizio_loop: T #num_loop; //inizio il loop L #indirizzo_tmp; L P#4.0; +D; T #indirizzo_tmp; //aggiorno indirizzo_tmp in modo che punti all'elemento successivo (ossia aggiungendo P#4.0 al valore precedente) L #valore_max_tmp; L DBD[ #indirizzo_tmp]; >D; // confronto il valore massimo trovato precedentemente con il valore dell'elemento attuale JC fine_loop; // se il valore massimo trovato prima è ancora maggiore dell'elemento attuale allora vai su fine_loop T #valore_max_tmp; //se il valore attuale è maggiore di valore_max_tmp allora valore_max_tmp=valore attuale L #indirizzo_tmp; T #indirizzo_max_tmp; fine_loop: L #num_loop; LOOP inizio_loop; //ripeti loop fino a quando num_loop>0 L #indirizzo_max_tmp; T #indirizzo_max; L #valore_max_tmp; T #valore_max; END_FUNCTION |