(FC in STL) Valore Maggiore in un Blocco Dati

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

You may also like...


Warning: count(): Parameter must be an array or an object that implements Countable in /membri/fabioplc/wp-includes/class-wp-comment-query.php on line 399
Menu Title