Vai al contenuto
PLC Forum


Array Con Indice Simbolico Su Cp1h


Antonio80

Messaggi consigliati

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, ossia

MOV

pippo

D300

e mi da errore!

Solo se uso la costante:

MOV

pippo[3]

D300

funziona!

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: da Antonio80
Link al commento
Condividi su altri siti


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

  • 3 months later...

Gentilissimi partecipanti al forum

Buonasera

Per 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 richiesta

Cordiali saluti

Claudio

Link al commento
Condividi su altri siti

  • 2 weeks later...

1 - Dichiara <i> di tipo DINT, sarà l'offset da sommare all'indice di registro per muoverti all'interno della tabella

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

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

Antonio80

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

Ciao

Claudio

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