biondo Inserito: 29 febbraio 2016 Segnala Share Inserito: 29 febbraio 2016 Ciao a tutti, sto creandomi un FB in linguaggio ST per poter gestire le ricette delle mie macchine. Ho creato un Array di word di 100 posizioni (DM0-DM99) Ary_a sono i parametri (le variabili) per ciscuna ricetta. Poi ho l'area delle ricette Ary_b , altro array di 100 posizioni (per esempio D10000-D10099) Infine ho un Array di 100 posizioni Ary_c di tipo Ary_b .(D10000-D19999) Cosi' facendo a seconda dell'indice della ricetta da salvare con un ciclo FOR dovrei copiare Ary_a su Ary_b + indice offset. Il problema ora è come diachiarere in ST una variabile matrice di matrice ovvero un array di 100 elementi Ary_C di tipo Ary_b in modo da evere un primo indice che mi va da 0-99 per copiare i 100 parametri , un secondo indice da 0-99 per selezionare l'area di partenza per la copia. Qualcuno sa come creare o bypassare il problema in ST ? Grazie per qualsiasi suggerimento e/o risposta. Buona serata. Link al commento Condividi su altri siti More sharing options...
_kevin Inserita: 1 marzo 2016 Segnala Share Inserita: 1 marzo 2016 Ary_c := Ary_a[Ary_b]; O qualcosa di simile?! Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 1 marzo 2016 Segnala Share Inserita: 1 marzo 2016 Credo che tu stia usando un CJ e non un NJ. Le cose non sono identiche. In CJ (CX programmer) non è possibile creare direttamente array multidimensionali, o array di array. Puoi farlo creando in Tipi di Dati una Struct contenente i dati della tua ricetta, nel tuo caso ha come elemento una matrice di 100 elementi [0..99]. Poi definisci un simbolo che è un array di struct, cui poi potrai puntare con gli indici (praticamente ricetta.elemento[j]). Tra l'altro, questo sistema consente di usare come elementi della ricetta dei dati eterogenei (le strutture contengono dati che non sono necessariamente dello stesso tipo). Molto comodo nelle ricette. Ma la cosa più comoda per copiare aree è usare la XFER magari usando un puntatore al primo elemento e spostando cento elementi tutti in una volta, senza FOR. Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 1 marzo 2016 Autore Segnala Share Inserita: 1 marzo 2016 Ciao Ctec, hai ragione sto usando un CJ1M..... fammi capire meglio definisco una variabile di tipo array [100] elementi e poi non ho capito l'ulteriore simbolo che devo creare come variabile.... Puoi spiegarti meglio.... Grazie Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 1 marzo 2016 Autore Segnala Share Inserita: 1 marzo 2016 Ciao Ctec, finalmente ho capito........ sono andato in tipo di dati e ho creato la mia struttura (vedi allegato1)... poi ho creato una variabile interna Recipe di tipo della mia struttura (Ric) che è un array a 100 posizioni con AT DM0 (allegato 2). Ora stavo testando semplicemente con un indice k per vedere se funziona.....ma riscontro un errore strano....INDICE DI MATRICE NON VALIDO (vedi errore allegato 2)... mi sfugge qualcosa ? Se al posto del mio indice k metto un valore numerico la compilazione non da errore...... Qualche idea ? Grazie . Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 2 marzo 2016 Segnala Share Inserita: 2 marzo 2016 Nel CJ (CP e CS) non è possibile indicare un indice variabile in una matrice. Era quello che volevo dire nel mio primo post. Per fare quello che vuoi te, tanto usi aree fisse del CJ, meglio usare una XFER con un puntatore. Appena ho due minuti ti mando un esempio Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 2 marzo 2016 Autore Segnala Share Inserita: 2 marzo 2016 Grazie Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 2 marzo 2016 Segnala Share Inserita: 2 marzo 2016 Dunque. Premesso che (purtroppo) nel CX-programmer non si può indicizzare una matrice, si ricorre a un sistema diverso. Suppongo che tu abbia definito la tua ricetta (in uso) come hai detto come un array Ary_a che inizia da D0, ed è lungo 100word. Tale lunghezza la definiamo nella tabella dei simboli con una costante WordRicetta pari a &100. Nel momento che vorrai salvare la tua ricetta in uso nel tuo archivio, te hai indicato che il tuo archivio comincia a D10000, e quindi definiamo un'altra costante come &10000 e la chiamiamo StartRicette. Ora ci definiamo una temporanera doppia UDINT , e la chiamiamo DTemp. Poi una UINT chiamata NewRic che conterrà il numero della ricetta su cui scrivere o da cui leggere. Il suo contenuto sarà da 0 al numero massimo di ricette che vogliamo. E infine una UINT chiamata Pointer che ci servirà da puntatore Abbiamo tutto pronto per trasferire i dati da e per l'archivio. Per scrivere faremo così (ladder): * NewRic WordRicetta DTemp (preparo a puntare alla ricetta giusta in archivio) + DTemp StartRicette Pointer (aggiungo l'offset di inizio archivio) XFER WordRicetta Ary_a[0] @Pointer (trasferisco 100 word dalla mia ricetta attuale all'archivio puntato). Similmente per leggere faremo così (ladder): * NewRic WordRicetta DTemp (preparo a puntare alla ricetta giusta in archivio) + DTemp StartRicette Pointer (aggiungo l'offset di inizio archivio) XFER WordRicetta @PointercAry_a[0] (trasferisco 100 word dall'archivio puntato alla mia ricetta attuale ). Spero sia chiaro Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 2 marzo 2016 Autore Segnala Share Inserita: 2 marzo 2016 Ciao, intanto grazie per la pazienza e i suggerimenti, ho dato un occhio al tuo codice, la domanda è funziona anche in ST o devo per forza farlo in LADDER ? Grazie Link al commento Condividi su altri siti More sharing options...
0.0 Inserita: 2 marzo 2016 Segnala Share Inserita: 2 marzo 2016 Lavorando con il CJ2 ed CX-Programmer è possibile indicizzare in modo dinamico gli array sia in ladder che in ST (task o blocco funzione che sia). Se non ricordo male era possibile farlo anche con il CJ1 ma solo dentro gli FB. Nel blocco funzione riportato sopra non viene dichiarata la variabile K. Quindi il compilatore si lamenta. Ciao. Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 2 marzo 2016 Segnala Share Inserita: 2 marzo 2016 Col CJ1 in ladder è impossibile indicizzare gli array. Si possono indicizzare nelle FB, ma non si possono fare array di array, nè array multidimensionali. Col CJ2 ha ragione 0.0, si può fare. Ma non array di array. In ST col CJ1 non si può (a mia conoscenza) usare l'indirezione, o indirizzamento indiretto (possibile col CJ2), né è possibile usare in una FB ladder i puntatori @ o * (indirizzamento indiretto). Attualmente è un po' un controsenso usare il CJ1, meglio il CJ2 su tutti i fronti. Ti ho messo un esempio con la XFER in ladder, perché funziona sicuramente con i CJ1 e CP1. Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 2 marzo 2016 Autore Segnala Share Inserita: 2 marzo 2016 Grazie ... preciso che utilizzo CJ2M Cpu 12 e per mio sfizio volevo fare tutta la gestione del FB in linguaggio ST.......... Ctec 0.0 pensate si possa fare ? Grazie Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 3 marzo 2016 Autore Segnala Share Inserita: 3 marzo 2016 Ciao ragazzi, sto provando ad usare XFER con indirizzamento indiretto (@D200) e funziona regolarmente se la metto nella sezione 1....o comunque sotto Nuovo Programma SE invece la creo con "GENERAZIONE BLOCCO FUNZIONE LADDER" mi importa tutto quanto ma la XFER non va ..... Non c'è proprio modo di scrivere (XFER &10 @D200 D0) all'interno del FB in Ladder...... ci DEVE essere una soluzione..... Link al commento Condividi su altri siti More sharing options...
0.0 Inserita: 3 marzo 2016 Segnala Share Inserita: 3 marzo 2016 L'unico tipo di puntatori supporti all'interno dei blocchi funzione sono gli index register. Link al commento Condividi su altri siti More sharing options...
0.0 Inserita: 3 marzo 2016 Segnala Share Inserita: 3 marzo 2016 In allegato trovi un esempio dell'uso degli index register nel blocchi funzione. FB_IR.zip Link al commento Condividi su altri siti More sharing options...
biondo Inserita: 3 marzo 2016 Autore Segnala Share Inserita: 3 marzo 2016 Grazie molto utile... 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