Antonio80 Inserito: 10 marzo 2011 Segnala Share Inserito: 10 marzo 2011 (modificato) Salve,ho una CPU CP1H, problema:Ho dichiarato un array di 10 elementi "pippo" di tipo UINT. Poi ho dichiarato "i" di tipo DINT (che è l'indice che userò per muovermi all'interno dell'array).Con l'istruzione MOV speravo di accedervi, ossiaMOVpippoD300e mi da errore!Solo se uso la costante:MOVpippo[3]D300funziona!Ho provato e riprovato modificanco i tipi di dati, ma niente, il simbolico sembra non gli piaccia!!Nell'. ho visto che si può fare, ma non è che si possa solo con CPU CJ2? Modificato: 10 marzo 2011 da Antonio80 Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 13 marzo 2011 Segnala Share Inserita: 13 marzo 2011 Il puntare a un elemento di una matrice mediante il simbolico [var] funziona solo dentro una FB. Ho provato e funziona (in simulatore) anche con il CJ1H.Se la stessa cosa la vuoi fare in ladder fuori dalla FB, allora devi usare i registri indice, oppure l'indirizzamento indiretto ([at]), a partire dal primo elemento della matrice, cioè pippo[0].Praticamente, in ladder, viene calcolato l'indirizzo fisico dell'elemento della matrice, per cui non puoi usare una variabile. Se per esempio definisci una matrice pippo[10] (dieci elementi), a partire da D100, nella tabella dei simboli, quando metti in una istruzione, per esempio, pippo[3], automaticamente il Cx Programmer ti indicherà D103, cioè l'elemento 3 della matrice pippo.Invece, nelle FB, essendo sostanzialmente tutto simbolico (gli indirizzi fisici li assegna il compilatore), questo funziona.Spero di essere stato chiaro... Link al commento Condividi su altri siti More sharing options...
Antonio80 Inserita: 15 marzo 2011 Autore Segnala Share Inserita: 15 marzo 2011 Grazie, fin troppo chiaro!! Link al commento Condividi su altri siti More sharing options...
claudio Inserita: 13 luglio 2011 Segnala Share Inserita: 13 luglio 2011 Gentilissimi partecipanti al forumBuonaseraPer questioni didattiche (sono un docente che approfitta del periodo estivo per cercare di colmare lacune e di preparare qualche lezione innovativa per il prossimo anno) sarebbe mia intenzione convertire un programma scritto per un Siemens 300 verso un OMRON CJ1m.Nel software originale si faceva molto utilizzo di array e di indicizzazioni.Senza saperlo, mi sono trovato nella stessa situazione descritta da Antonio80 (l'unica differenza è che i miei array contengono valori booleani)Facendo un po' di ricerce mi sono imbattuto in questa discussione, dove mi sembra di capire che ci sia la possibilità di indicizzare in ladder anche fuori dalle FB, proprio come desidererei di fare.Purtroppo, a causa della mia scarsa conoscenza del CJ1, non mi è chiaro cosa si intende quando si dice:"Se la stessa cosa la vuoi fare in ladder fuori dalla FB, allora devi usare i registri indice, oppure l'indirizzamento indiretto ([at]), a partire dal primo elemento della matrice, cioè pippo[0]" o meglio, non mi è chiaro in che modo quanto detto possa essere tradotto in istruzioni scrivibili nel cx-programmer.Pertanto chiederei se qualcuno, se e quando avrà tempo, potesse darmi qualche ulteriore ragguaglio.Ringrazio anticipatamente fin d'ora quanti potranno dedicare un po' del loro tempo per questa richiestaCordiali salutiClaudio Link al commento Condividi su altri siti More sharing options...
Antonio80 Inserita: 22 luglio 2011 Autore Segnala Share Inserita: 22 luglio 2011 1 - Dichiara <i> di tipo DINT, sarà l'offset da sommare all'indice di registro per muoverti all'interno della tabella1 - Usa l'istruzione DIM per dichiarare una tabella ex DIM [0;&2;&10;D100] (Crea la tabella 0 di 10 record di dimensione 2 word a partire dall'indirizzo D100) N.B La esegui una sola volta (P_First_Cycle)2 - Usa l'istruzione SETR per memorizzare l'indirizzo del primo record della tabella ex SETR[0;&0;IR0] (IR0 è il registro indice che conterrà, nel nostro caso, l'indirizzo D100) N.B. Io lo eseguo sempre (P_On)3 - Per leggere il contenuto del ex 2° record usa: MOVL [&2;i] +L [iR0;i;IR1] (Io non sovrascrivo mai il registro indice del primo record, uso un altro registro per esprapolare i dati in questo caso IR1) MOVL [,IR1;D300] (La virgola non è un errore!, stai prelevando il contenuto di IR1 e lo metti in D300) (D300 conterrà il valore del 2° record) Link al commento Condividi su altri siti More sharing options...
Antonio80 Inserita: 22 luglio 2011 Autore Segnala Share Inserita: 22 luglio 2011 Da sapere che non puoi fare le stesse cose su tutte le CPU.Le CPU CP1... non accettano l'utilizzo degli arrai attraverso un indice (cosa che trovo abbastanza "rognosa") simbolico (i nel nostro caso)Solo se utilizzi l'array all'interno di una FB lo puoi fare.Questo è stato l'oggetto della discussione che hai trovato.Era sottinteso che si utilizzava il ladder.Per utilizzare array con indice simbolico fuori dalla FB e quindi in una qualsiasi sezione del programma devi utilizzare i registri indice (IR0..IR9)N.B. Io utilizzavo una CP1H Link al commento Condividi su altri siti More sharing options...
claudio Inserita: 28 luglio 2011 Segnala Share Inserita: 28 luglio 2011 Antonio80Ti chiedo scusa per aver risposto solamente ora al tuo post, ma sono appena rientrato (stanotte) da una settimana di ferie.Ti ringrazio moltissimo per le tue precise risposte: appena mi sarò un po' sistemato, le leggerò con attenzione e metterò sicuramente in pratica quanto suggerisci.Colgo anche l'occasione per augurare a tutti i partecipanti al forum, e a te in particolare, delle splendide vacanza, qualora fossero ancora da fare.CiaoClaudio 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