conteggio ingressi chiusi (I soluzione)

Contare il numero degli ingressi chiusi del modulo al posto connettore 4.

Depositeremo in MB80 il numero degli ingressi chiusi ed utilizzeremo MD12 come puntatore all’ingresso correntemente in esame. La prima parte del programma consiste nell’inizializzazione a 0 di queste due variabili.

L’ istruzione successiva permette di caricare in RLC il complemento dell’ingresso puntato da MD12, con indirizzo di canale nei tre bit meno significativi e indirizzo di modulo nei bit da 3 a 18. Al primo passaggio, essendo MD12 a 0, verrà caricato il complemento dello stato di E0.0.

L’istruzione successiva è un salto condizionato: se RLC=1, cioè se il complemento di E0.0 è uguale ad 1, cioè se l’ingresso è aperto, l’elaborazione viene proseguita dall’etichetta INC. Se l’ingresso è chiuso, invece, il salto non viene effettuato e l’elaborazione continua con l’istruzione seguente.

In quest’ultimo caso, le tre istruzioni successive incrementano il valore di MB80, cioè del numero che rappresenta il conteggio di ingressi trovati chiusi, caricandone dapprima il valore in ACCU1, quindi incrementandolo di 1 e, infine, trasferendo il risultato di nuovo in MB80. Il compito complessivo di queste istruzioni e delle precedenti è quello di incrementare la variabile MB80 se l’ingresso è chiuso e di non incrementarla se l’ingresso è aperto.

In un caso o nell’altro l’elaborazione arriva al gruppo di istruzioni individuato dall’etichetta INC che provvede, come prima azione, ad incrementare MD12. Quindi, viene confrontato il valore appena ottenuto con il valore 15. Se minore o uguale, l’ingresso puntato esiste e dobbiamo valutarne il suo stato tornando all’etichetta TEST, come specificato dall’istruzione di salto condizionato. Altrimenti, nel caso il valore sia 16, il canale non esiste e dobbiamo uscire dal blocco, avendo esaminato tutti i sedici ingressi disponibili, da E0.0 a E1.7.

La parte di programma che va dall’etichetta TEST all’istruzione SPB =TEST viene quindi eseguita sedici volte, prima di ritornare al blocco chiamante OB1 per mezzo dell’ultima istruzione BE. Ogni volta MD12 conterrà un valore diverso, ed ogni volta il gruppo l’istruzione UN E[MD12] caricherà in RLC il complemento di un diverso ingresso del modulo, dal primo fino all’ultimo. In particolare, con MD12 pari a (0000_0007)16, viene puntato l’ultimo canale (111 ai tre bit meno significativi) del byte 0. Il successivo incremento, porta MD12 al valore (0000_0008)16 che punta il canale 0 (000 ai tre bit meno significativi) del modulo 1.

La parte di programma che va da L MB80 fino a T MB80 viene elaborata soltanto se l’ingresso testato correntemente è chiuso, col risultato di eseguire un incremento di MB80 soltanto in questa condizione e, siccome il valore iniziale di questo merker byte è pari a 0, alla fine dell’esecuzione del blocco, esso conterrà effettivamente il numero degli ingressi chiusi.

LADDER

 ladder22
 AWL
      L     L#0                           ‘impostazioni inizialiT     MB80

T     MD12

 

TEST: UN    E[MD12]              ‘indicizzazione ingresso

SPB   INC

L     MB80                              ‘l’ingresso è attivo:

INC   1                                  ‘incremento del merker byte

T     MB80                             ‘di conteggio

 

INC:  L     MD12                    ‘incremento indice per

INC   1                                 ‘esame ingresso successivo

T     MD12

L     15                                 ‘controllo se finito

<=I

SPB   TEST

 

BE

^