del user 276738 Inserito: 8 ottobre 2019 Segnala Share Inserito: 8 ottobre 2019 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 More sharing options...
TravelMen Inserita: 9 ottobre 2019 Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
acquaman Inserita: 9 ottobre 2019 Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
del user 276738 Inserita: 9 ottobre 2019 Autore Segnala Share Inserita: 9 ottobre 2019 (modificato) 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: 9 ottobre 2019 da Manfro95 Link al commento Condividi su altri siti More sharing options...
TravelMen Inserita: 9 ottobre 2019 Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
del user 276738 Inserita: 9 ottobre 2019 Autore Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
batta Inserita: 9 ottobre 2019 Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
del user 276738 Inserita: 9 ottobre 2019 Autore Segnala Share Inserita: 9 ottobre 2019 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 More sharing options...
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