chimera1803 Inserito: 9 febbraio 2023 Segnala Inserito: 9 febbraio 2023 Buongiorno a tutti. Mi sto occupando della programmazione di un sistema costituito da un manipolatore cartesiano a 6 assi così costituito: motori motori passo-passo con encoder, azionamenti della Lam Technologies pilotati in LAN Profinet, plc S7-1200 con scheda aggiuntiva SD e HMI della Flexem. Ho configurato sia gli azionamenti che il plc in Profinet con cui riesco senza problemi a movimentare gli assi sia in posizione e sia il velocità, leggere allarmi variare parametri di velocità, coppia, ricevere bit di stato ecc ecc. Fin qui tutto chiaro...ora però devo inserire una serie di coordinate che il cliente mi fornirà in un file in CSV per permettere al manipolatore di eseguire delle semplici movimentazioni in automatico che serviranno a testare un oggetto tramite sonda ultrasuoni (l'oggetto sarà immerso in acqua). Quello che vi chiedo è come inserire questo listato di coordinate nel PLC e come leggerlo in modo sequenziale. Avevo pensato di creare un blocco dati per ogni asse con una Array contenente le coordinate (collegate ad un file CSV salvato nella scheda SD del plc) ma il problema è che riesco a leggere una riga alla volta della Array ma a me serve leggerla in modo sequenziale cioè ogni volta che l'azionamento restituisce il bit alto di posizione raggiunta devo leggere la riga successiva e così via. Grazie mille a chi mi potrà aiutare! Buona giornata.
batta Inserita: 9 febbraio 2023 Segnala Inserita: 9 febbraio 2023 Non ho capito tanto bene. Riesci a leggere dal file tutti i dati e ad inserirli nell'array? Se hai tutti i dati nell'array, ti basta incrementare un idice per andare a leggere l'elemento successivo. Troppo semplice per essere questo il problema, quindi credo di non aver capito la domanda.
chimera1803 Inserita: 9 febbraio 2023 Autore Segnala Inserita: 9 febbraio 2023 Si esatto è quello che voglio fare! Incrementare l'indice di una posizione per poi leggere quello successivo che corrisponde alla nuova quota che l'asse deve effettuare. Ecco però non riesco a trovare il modo per farlo...
acquaman Inserita: 9 febbraio 2023 Segnala Inserita: 9 febbraio 2023 Ma vuoi leggere la riga successiva nel file csv o vuoi utilizzare l'elemento successivo dell'array?
chimera1803 Inserita: 9 febbraio 2023 Autore Segnala Inserita: 9 febbraio 2023 voglio leggere l'elemento successivo dell'array...
batta Inserita: 9 febbraio 2023 Segnala Inserita: 9 febbraio 2023 Esempio: target_x := myArray_x[i]; target_y := myArray_y[i]; target_z := myArray_z[i]; x, y e z possono essere tre variabili di una strttura che costituisce ogni singolo elemento dell'array. Puoi anche creare un "Tipo di dati" e dichiarare l'array come: myArray[0..31] of "MioTipoDiDati". Se anche la struttura di destinazione è uguale alla struttura degli elementi dell'array, in un colpo solo copi tutte le variabili: target := myArray[i]; Dove "i" è una variabile INT che inizializzi per puntare al primo elemento dell'array (o a quello che ti pare) ad inizio ciclo, e che incrementi di una unità sul fronte di salita di "posizione raggiunta". Si può fare anche in ladder.
chimera1803 Inserita: 9 febbraio 2023 Autore Segnala Inserita: 9 febbraio 2023 grazie batta, io purtroppo con Tia Portal non ho mai programmato in scl ma solamente in kop
batta Inserita: 9 febbraio 2023 Segnala Inserita: 9 febbraio 2023 24 minuti fa, chimera1803 ha scritto: io purtroppo con Tia Portal non ho mai programmato in scl ma solamente in kop Ma hai programmato in testo strutturato con altri PLC? Se sì, è praticamente uguale. Anzi, a mio avviso, l'editor del testo strutturato del TIA è il migliore che ho avuto occasione di provare. Se non hai mai usato il testo strutturato nemmeno con altri PLC, ti consiglio di metterci il naso, perché è molto versatile, e perché, prima o poi, lo dovrai imparare. In ogni caso, la stessa cosa che vedi nell'esempio la puoi fare anche in ladder con dei MOVE.
chimera1803 Inserita: 10 febbraio 2023 Autore Segnala Inserita: 10 febbraio 2023 14 ore fa, batta ha scritto: Ma hai programmato in testo strutturato con altri PLC? Se sì, è praticamente uguale. Anzi, a mio avviso, l'editor del testo strutturato del TIA è il migliore che ho avuto occasione di provare. Se non hai mai usato il testo strutturato nemmeno con altri PLC, ti consiglio di metterci il naso, perché è molto versatile, e perché, prima o poi, lo dovrai imparare. In ogni caso, la stessa cosa che vedi nell'esempio la puoi fare anche in ladder con dei MOVE. Si purtroppo non ho mai programmato in testo strutturato...dove lavoro non facciamo ultimamente molta automazione e comunque mi dedico anche ad altre attività che mi rubano tempo prezioso per imparare qualcosa in più dei Plc. Ok batta provo a programmare in ladder l'esempio che mi hai suggerito e vediamo se ne esco fuori. Grazie!!
chimera1803 Inserita: 15 febbraio 2023 Autore Segnala Inserita: 15 febbraio 2023 Salve, come suggerito da @battaho provato ad programmare in STL il codice per leggere la ricetta con le quote dell'asse (in passi che in un secondo momento trasformerò in millimetri): FOR "VARIABILE I" := 0 TO 38 DO IF "PULSANTE AVVIO CICLO POS. IN VASCA" THEN "Recipe_DB_Y_Attivo".Static_1["VARIABILE I"] := "Recipe_DB_Y_Attivo".Static_1["VARIABILE I"] + 1; END_IF; END_FOR; ma non funziona mi da errore sulla variabile "Static_1" che non viene letta come Array dal programma! Premetto che la ricetta in .CSV salvata nella scheda SD prima l'ho importata su una DB e poi successivamente con il blocco READ_DBL spostata dalla memoria di caricamento a quella di lavoro. Allego DB (della memoria di lavoro) con i dati della ricetta dove devo leggere le quote asse. grazie mille per l'aiuto!
batta Inserita: 15 febbraio 2023 Segnala Inserita: 15 febbraio 2023 Ma nel DB io non vedo nessun array. Vedo solo delle variabili chiamate "1", "2", "3"... Perché siano variabili di un array devi dichiararle come array. A sinistra metti il nome della variabile, mentre nella colonna "Tipo di dati" devi scrivere, per esempio: array[0..99] of real.
chimera1803 Inserita: 15 febbraio 2023 Autore Segnala Inserita: 15 febbraio 2023 2 ore fa, batta ha scritto: Perché siano variabili di un array devi dichiararle come array ho dichiarato i dati in array ma ora non mi traferisce più i dati ricetta dal file csv nella DB... C'è il modo di leggere le variabili anche se non sono in una array?
batta Inserita: 15 febbraio 2023 Segnala Inserita: 15 febbraio 2023 12 minuti fa, chimera1803 ha scritto: C'è il modo di leggere le variabili anche se non sono in una array? Non con un indice. O meglio, potresti dichiarare il DB "non ottimizzato" e lavorare con i puntatori, ma è molto più complicato. Soluzione assolutamente da non prendere nemmeno in considerazione. Per capire dove sbagli, bisognerebbe poter analizzare il programma.
chimera1803 Inserita: 15 febbraio 2023 Autore Segnala Inserita: 15 febbraio 2023 1 ora fa, batta ha scritto: Per capire dove sbagli, bisognerebbe poter analizzare il programma. @batta grazie per la pazienza. Ho momentaneamente abbandonato la ricetta (ma ci tornerò sopra, le ricette dovranno essere inserite dal cliente in web server è quindi fondamentali per il ciclo della macchina) e ho creato un nuova DB con dati dichiarati in Array e così non ho errori e funziona...o meglio funziona ma non come serve per il mio progetto! I valori di avvio che ho inserito nella DB vengono incrementati come valore nella colonna del valore di controllo mentre sulla "VARIABILE I" mi trovo il valore fisso di 59. Come già scritto devo leggere i valori di avvio così come inseriti compreso il segno in quanto sono dei posizionamenti di un asse e così devono rimanere. Sicuramente è sbagliato il codice che ho scritto in testo strutturato che allego di seguito: FOR "VARIABILE I" := 0 TO 38 DO IF "PULSANTE AVVIO CICLO" THEN "TARGET_Y".ASSE_Y["VARIABILE I"] := "TARGET_Y".ASSE_Y["VARIABILE I"] + 1; END_IF; END_FOR; Ciao
batta Inserita: 16 febbraio 2023 Segnala Inserita: 16 febbraio 2023 Per capire dove sbagli, si dovrebbe prima capire cosa vuoi fare. In questo caso, con la pressione del "PULSANTE AVVIO CICLO" non fai altro che incrementare di una unità il valore delle variabili con indice da 0 a 38. E questo continui a farlo fino a quando non viene rilasciato il pulsante. Con pulsante premuto, quindi, vedrai tutte le variabili incrementare il proprio valore. Se non ho capito male ciò che hai scritto all'inizio della discussione, tu vorresti prendere da questo array il primo valore da copiare come target per l'asse. Fatto il primo posizionamento, vorresti passare come target il secondo valore, e così via. Se è questo ciò che devi fare, sei completamente fuori strada. Se è questo ciò che intendi fare, devi impostare a zero il valore della variabile "i" ad inizio ciclo e, con il fronte di salita del posizionamento completato, incrementare di una unità il valore della variabile "i". Trasferisci sempre il valore della variabile puntatat dall'indice "i" nella variabile "target". In questo modo, ad avvio ciclo in "target" troverai il valore di variabile_i[0], dopo aver fatto il primo posizionamento il valore di variabile_i[1], e così via. Poi, non riguarda il problema in questione, ma solo qualche consiglio generale. - Evita i nomi delle variabili con spazi e punti - Non scrivere tutto in maiuscolo. È solo un fattore estetico, ma è veramente brutto da vedere. Per i nomi delle variabili, usa il minuscolo, e metti in maiuscolo solo la prima lettera di ogni parola come se fosse un separatore. Un esempio: "PULSANTE AVVIO CICLO" potrebbe diventare "pulsanteAvvioCiclo" o, se preferisci, "PulsanteAvvioCiclo" o, ancora, "pulsante_avvio_ciclo" Ti sembrerà poco, ma il codice guadagnerà molto in leggibilità.
chimera1803 Inserita: 16 febbraio 2023 Autore Segnala Inserita: 16 febbraio 2023 4 ore fa, batta ha scritto: Se non ho capito male ciò che hai scritto all'inizio della discussione, tu vorresti prendere da questo array il primo valore da copiare come target per l'asse. Fatto il primo posizionamento, vorresti passare come target il secondo valore, e così via. esatto @batta 4 ore fa, batta ha scritto: Se è questo ciò che devi fare, sei completamente fuori strada. Se è questo ciò che intendi fare, devi impostare a zero il valore della variabile "i" ad inizio ciclo e, con il fronte di salita del posizionamento completato, incrementare di una unità il valore della variabile "i". Trasferisci sempre il valore della variabile puntatat dall'indice "i" nella variabile "target". In questo modo, ad avvio ciclo in "target" troverai il valore di variabile_i[0], dopo aver fatto il primo posizionamento il valore di variabile_i[1], e così via. bene, ho azzerato il valore della variabile "i" e creato le variabili di trasferimento, ma non riesco a capire come fare a leggere il prima il valore [0] dell'Array e successivamente il valore [1] e così via... Ho capito che non devo sommare ma spostare l'indice al valore successivo, ok, ma sinceramente sono nel pallone! 4 ore fa, batta ha scritto: Poi, non riguarda il problema in questione, ma solo qualche consiglio generale. Grazie per i consigli, effettivamente è tutto più lineare
chimera1803 Inserita: 16 febbraio 2023 Autore Segnala Inserita: 16 febbraio 2023 @batta ho modificato il codice spostando l'incremento +1 all'interno della parentesi e così riesco a leggere i valori in sequenza: FOR "TargetAsseY" := 0 TO 37 DO IF "PulAvvioCicloInVasca" THEN "Target_Y".ASSE_Y["TargetAsseY"] := "Target_Y".ASSE_Y["TargetAsseY" + 1]; END_IF; END_FOR; il valore l'ho leggo direttamente sull'array [0], infatti se apro la DB con l'Array vedo i dati della colonna "valore di controllo" scorrere verso l'alto fino al completamento della lettura delle 38 righe. Al completamento della lettura delle 38 righe però mi va in allarme il PLC con l'errore: "Errore CPU temporaneo: Errore di lunghezza di campo in OB 133" dove il blocco OB 133 è quello del codice in STL. Cosa potrebbe causare l'errore? grazie
batta Inserita: 17 febbraio 2023 Segnala Inserita: 17 febbraio 2023 Ma fammi capire una cosa: quale variabile passi all'asse? Io ho sempre fatto l'esempio immaginando di passare all'asse la variabiel "target" esterna all'array. Ma non ho capito cosa passi tu all'asse. Ecco, partiamo da qui.
chimera1803 Inserita: 17 febbraio 2023 Autore Segnala Inserita: 17 febbraio 2023 1 ora fa, batta ha scritto: Ma fammi capire una cosa: quale variabile passi all'asse? vorrei leggere la prima variabile ASSE_Y[0] e dopo aver ricevuto dall'asse il bit di posizione raggiunta leggere la seconda e così via. Ora però oltre all'errore del PLC riesco solo a far scorrere in alto dati scritti della ricetta su la variabile [0], man mano che scorrono in alto quelli in basso vanno a zero. La variabile Target rimane ad un valore fisso pari a 38.
batta Inserita: 17 febbraio 2023 Segnala Inserita: 17 febbraio 2023 7 ore fa, chimera1803 ha scritto: vorrei leggere la prima variabile ASSE_Y[0] e dopo aver ricevuto dall'asse il bit di posizione raggiunta leggere la seconda e così via Nel codice che pubblichi io non ci vedo nulla di tutto questo. Io vedo solo che prendi la variabile "target_Y".asse_Y[0], la converti da REAL a DInt, e la scrivi "bufferPosY....". C'è sempre quel ciclo FOR legato alla pressione del pulsante, che non fa nemmeno lontanamente ciò che dici di voler fare. In quel codice c'è scritto che, se il pulsante è premuto, fai uno shift di tutte le variabili dell'array. Ma tu non devi andare a modificare le variabili dell'array. Quelle devono rimanere così come le leggi dal file csv, e nessuno le deve modificare. Tu devi solo gestire un indice (che andrai ad incrementare ad ogni passo) per andar a prendere dall'array la variabile che ti serve. L'indice lo devi usare dove fai la conversione da Real a DInt.
Simone.Salarsi Inserita: 18 febbraio 2023 Segnala Inserita: 18 febbraio 2023 Il 16/2/2023 alle 16:52 , chimera1803 ha scritto: @batta ho modificato il codice spostando l'incremento +1 all'interno della parentesi e così riesco a leggere i valori in sequenza: FOR "TargetAsseY" := 0 TO 37 DO IF "PulAvvioCicloInVasca" THEN "Target_Y".ASSE_Y["TargetAsseY"] := "Target_Y".ASSE_Y["TargetAsseY" + 1]; END_IF; END_FOR; il valore l'ho leggo direttamente sull'array [0], infatti se apro la DB con l'Array vedo i dati della colonna "valore di controllo" scorrere verso l'alto fino al completamento della lettura delle 38 righe. Al completamento della lettura delle 38 righe però mi va in allarme il PLC con l'errore: "Errore CPU temporaneo: Errore di lunghezza di campo in OB 133" dove il blocco OB 133 è quello del codice in STL. Cosa potrebbe causare l'errore? grazie quanto arrivi all'ultimo passo del ciclo FOR ti ritrovi nella seguente condizione : "Target_Y".ASSE_Y[37"] := "Target_Y".ASSE_Y[37 + 1]; "Target_Y".ASSE_Y[38] non esiste, perciò la cpu va in errore di lunghezza di campo.
batta Inserita: 19 febbraio 2023 Segnala Inserita: 19 febbraio 2023 22 ore fa, Simone.Salarsi ha scritto: "Target_Y".ASSE_Y[38] non esiste, perciò la cpu va in errore di lunghezza di campo. Nel primop esempio il ciclo FOR era da 0 a 38, e questo mi fa pensare che anche l'array sia da 0 a 38. Il problema è che il codice dell'esempio non si avvicina nemmeno lontanamente a quello che è nelle intenzioni.
Simone.Salarsi Inserita: 19 febbraio 2023 Segnala Inserita: 19 febbraio 2023 7 minuti fa, batta ha scritto: Nel primo esempio il ciclo FOR era da 0 a 38, e questo mi fa pensare che anche l'array sia da 0 a 38. Il problema è che il codice dell'esempio non si avvicina nemmeno lontanamente a quello che è nelle intenzioni. Nello screenshot del DB visualizzato nel messaggio a cui ho risposto è dichiarato ASSE_Y array[0..37] of Real A parte questo dettaglio che quasi sicuramente è la causa dell'errore di lunghezza di campo, concordo con te che il codice sia completamente da rivedere tanto per quanto riguarda la forma che per quanto riguarda il concetto. Trovo anche strani ed oltretutto errati i due rami che seguono. Strani perchè non comprendo l'utilizzo di uscite del PLC per fare operazioni del genere ( io sono solito associare un pulsante ad un ingresso o al limite ad un merker) ed errato perchè il merker del fronte dell'istruzione --(P)--- viene usato per abilitare il move del primo ramo e Q256.0 dovrebbe generare un fronte su se stesso Probabilmente l'intenzione era quella di sfruttare un fronte di salita sulla pressione del "pulsante avvio" per fare prima il move e poi il ciclo FOR una sola volta, ma con questo codice dubito che ciò avvenga. Consiglio sempre di consultare l'. in linea quando si hanno dubbi sul funzionamento delle istruzioni.
batta Inserita: 19 febbraio 2023 Segnala Inserita: 19 febbraio 2023 9 ore fa, Simone.Salarsi ha scritto: Nello screenshot del DB visualizzato nel messaggio a cui ho risposto è dichiarato ASSE_Y array[0..37] of Real Sì, vero. E concordo anche sul resto. È tutto un grande pasticcio. Forse @chimera1803, prima di gestire assi ed array, dovrebbe fare un passo indietro.
chimera1803 Inserita: 20 febbraio 2023 Autore Segnala Inserita: 20 febbraio 2023 12 ore fa, batta ha scritto: Forse @chimera1803, prima di gestire assi ed array, dovrebbe fare un passo indietro. certo ma di passi indietro non ne posso fare, devo chiudere il progetto prima possibile per non incorrere a penali. Vorrei solo chiarire che del Tia Portal sono un autodidatta. Le lacune sono tante e di questo ne sono consapevole, altrimenti non avrei chiesto a voi aiuto e consigli da questo Forum (nei precedenti messaggi avevo già scritto di non aver mai usato la programmazione in codice STL). Questo non per giustificarmi, non ne ho certamente bisogno; ognuno è a conoscenza della realtà aziendale in cui lavora, la scelta di programmare un macchinario, gestire assi, ricette ed Array non è di certo stata mia. Cercherò di trovare una soluzione. Grazie per il tempo che mi avete dedicato.
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