Vai al contenuto
PLC Forum


Spostare blocchi array con puntatori in AWL


del user 276738

Messaggi consigliati

del user 276738

Buonasera a tutti,

Ho spulciato da cima a fondo il forum, ho trovato alcune discussioni simili alle quali ho provato ad ispirarmi ma non sono riuscito a venire a capo del mio problema e sono alquanto disperato. Premetto di essermi appena approcciato all'AWL, ma mi è stato richiesto di creare del codice che svolgesse la seguente funzione, come da titolo:

Ho un array di doppi interi, definito nell'interfaccia del mio FB con nome tempo_misurato e definito Array [0..14 Of DInt]

Quello che il programma dovrebbe fare sarebbe, ad ogni fronte di salita di un certo input che chiameremo fronte_di_salita spostare l'elemento 13 dell'array (quindi il quattordicesimo) al posto dell'elemento 14 (quindicesimo, che così si perderà), spostare il 12 nel 13, l'11 nel 12 e così via fino all'elemento 0 messo al posto dell'elemento 1.

Il tutto dovrebbe essere fatto con l'ausilio dei puntatori, che ho provato a maneggiare ma con scarsi risultati.

Vi chiedo se possibile una soluzione che sfrutti un ciclo per effettuare gli spostamenti in modo ricorsivo (se possibile). Se poi riusciste a fornirmi sia la soluzione con ciclo che senza, dove vengono scritti di fatto tutti 14 gli spostamenti, ve ne sarei davvero super grato.

 

Vi ringrazio in anticipo e se servissero informazioni aggiuntive sono ovviamente a disposizione.

Link al commento
Condividi su altri siti


Ciao

 

ben venuto, per incominciare sposta una bozza di codice poi vediamo cosa manca.

 

Oggi mi sento buono e posso darti qusta soluzione

se fronte_di_salita allora
loop di 14 elementi => Mio_Array[n+1] = Mio_Array[n]
Mio_Array[1] = Tempo_misurato
fine

 

Saluti

Link al commento
Condividi su altri siti

E' iniziato l'autunno e ricominciano ad uscire gli esercizi di scuola, 

10 ore fa, Manfro95 scrisse:

Se poi riusciste a fornirmi sia la soluzione con ciclo che senza

Se invece cominci a postare quello che hai fatto (se hai provato a fare qualcosa) cosi ne discutiamo e vediamo cosa non va.

Link al commento
Condividi su altri siti

del user 276738
3 ore fa, TravelMen scrisse:

ben venuto, per incominciare sposta una bozza di codice poi vediamo cosa manca.

 

Oggi mi sento buono e posso darti qusta soluzione


se fronte_di_salita allora
loop di 14 elementi => Mio_Array[n+1] = Mio_Array[n]
Mio_Array[1] = Tempo_misurato
fine

Grazie TravelMen per l'dea.

2 ore fa, acquaman scrisse:

Se invece cominci a postare quello che hai fatto (se hai provato a fare qualcosa) cosi ne discutiamo e vediamo cosa non va.

Grazie acquaman.

 

Dunque in verità ho provato ma sono riuscito a fare ben poco, non riuscendo a capire i puntatori...

U	#att
FP    #fronte_salita
SPB   L001

L001: LAR1  P##tempo_misurato_0
      L     15

NEXT: T     #iter

att è un bool che uso per l'attivazione.
Ho iniziato così ma ora non so proprio come andare avanti, e non so comunque se sia la strada giusta.

Vi ringrazio per la disponibilità.
 

Modificato: da Manfro95
Link al commento
Condividi su altri siti

Ciao

 

be diciamo che quello che hai scritto non è awl per iniziare:


FUNCTION_BLOCK "test"
TITLE =
VERSION : 0.1


VAR_INPUT
  IN_Registra_dato : BOOL ;	
END_VAR
VAR
  FP_Registra : BOOL ;	
END_VAR
BEGIN
NETWORK
TITLE =


      U     #IN_Registra_dato; 
      FP    #FP_Registra; 
      SPBN  noDT; 


noDT: NOP   0; 

END_FUNCTION_BLOCK

Per tanto riordina le idee, e riprova, se vuoi scrivere una funzione in AWL la sintassi è molto importante.

 

Saluti

Link al commento
Condividi su altri siti

del user 276738
7 minuti fa, TravelMen scrisse:

be diciamo che quello che hai scritto non è awl per iniziare:

Capisco. È che sto usando SIMATIC Manager con S7-300. Il codice che ho scritto l'ho scritto in un segmento di un FB, le variabili le ho definite nell'interfaccia dell'FB. tempo_misurato e fronte_di_salita sono STAT, mentre att è IN. Per questo non ho scritto le restanti parti.

Link al commento
Condividi su altri siti

Ma è un esercizio scolastico o un lavoro vero?

Lo devi fare per forza in AWL o potresti farlo anche in SCL (testo strutturato)?

Per questa volta, ti voglio dare la soluzione, sperando che, soprattutto se si tratta di un esercizio, non ti limiterai a copiarlo pari pari, ma cercherai di capirne il funzionamento.

      U     #att
      FP    #xfp
      SPBN  L001

      LAR1  P##tempo_misurato           // Carico nel registro indirizzi l'indirizzo di inizio dell'array
      +AR1  P#52.0                      // Incremento il registro indirizzi di 13 DWord per puntare al penultimo elemento dell'array

      L     14                          // Carico il numero di cicli da effettuare (se l'array è di 15 elementi, gli spostamenti saranno 14)
NEXT: T     #i

      L     D [AR1,P#0.0]               // Leggo il valore della DWord puntata
      T     D [AR1,P#4.0]               // e lo scrivo nella DWord successiva

      L     L#-32
      +AR1                              // Decremento il registro indirizzi di una DWord (32 bit) per il prossimo ciclo

      L     #i                          // Carico indice ciclo
      LOOP  NEXT                        // e controllo se devo ripetere o se è finito

      L     #newVal                     // Alla fine del ciclo,
      T     #tempo_misurato[0]          // scrivo il nuovo valore nel primo elemento dell'array

L001: NOP   0

 

Pensa che in testo strutturato (SCL) il ciclo sarebbe stato così:

IF #fp_Execute THEN
    FOR #i := 13 TO 0 BY -1 DO
        #tempo_misurato[#i + 1] := #tempo_misurato[#i];
    END_FOR;
    #tempo_misurato[0] := #newVal;
END_IF;

Comunque, anche solo passando da S7-300 a S7-1500, pur volendo usare AWL, tutto sarebbe stato più semplice:

      U     #Execute
      FP    #xos
      SPBN  L000

      L     14
NEXT: T     #i
      +     -1
      T     #j

      L     #tempoMisurato[#j]
      T     #tempoMisurato[#i]

      L     #i
      LOOP  NEXT
      L     #newVal
      T     #tempoMisurato[0]
L000: NOP 0

 

Link al commento
Condividi su altri siti

del user 276738

batta io ti ringrazio davvero tantissimo. Grazie al codice più alla spiegazione ho capito meglio come si deve ragionare.

 

6 ore fa, batta scrisse:

L D [AR1,P#0.0] // Leggo il valore della DWord puntata T D [AR1,P#4.0]

Questa parte ero riuscito a scriverla, non riuscivo a capire come fare con il numero dei cicli ma sopratutto con la modifica degli indirizzi ad ogni ciclo. Quindi sostanzialmente non ero riuscito in nulla.

Si tratta di un progetto che sto facendo, ma non avendo MAI toccato AWL mi sono trovato assai in difficoltà, e la richiesta è proprio di farlo in AWL, altrimenti sì sarebbe molto più semplice.
I commenti accanto sono stati fondamentali, è nel mio interesse imparare non copiare, quindi doppiamente grazie.

Comunque il progetto non è finito, ora ho altre cose da aggiungere, tra le quali tempo_misurato in realtà diventerà una matrice di tempi, e per ogni riga dovrò fare questo procedimento. Il tutto però in un ciclo innestato sempre indicizzato. A seconda dell'input sposterò l'n-esima riga.

Nel caso avessi bisogno ancora mi farò vivo se sarete disponibili.

Grazie ancora a tutti!

Link al commento
Condividi su altri siti

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