Vai al contenuto
PLC Forum


Puntatori Cx Programmer


enomis81

Messaggi consigliati

Buonasera, ammetto che sono un principiante in fatto di programmazione, fino ad ora ho lavorato principalmente con programmi Siemens. Proprio oggi ho voluto provare il puntamento indiretto con il cx-programmer e devo dire che ho alcune difficoltà a capire quali sono le tipologie di puntamento che utilizzano questi modelli di plc. Qualcuno riesce ad aiutarmi???

Link al commento
Condividi su altri siti


Forse sono stato un po troppo generico, le mie difficoltà riguardano l'utilizzo dei registri IR, ho provato con a scrivere qualche esempio riportato sul manuale ma con il simulatore del programma non riesco a farli funzionare. Avete qualche consiglio??

Link al commento
Condividi su altri siti

ciao

spiegare i puntatori nel forum (secondo me ) non è facile(principalmente perché ci sarebbe molto da scrivere).

io uso principalmente il puntamento diretto perché gestisce gli offset al puntatore.

scrivimi una riga di codice di puntamento indiretto e dimmi dov'è il problema.

usali con cautela e controllo perché se sfori le aree di memoria fai casini.


ciao

quanta esperienza hai nella programmazione dei plc omron?

Link al commento
Condividi su altri siti

Non ho molta esperienza a dire il vero, diciamo che l'esempio molto semplice che ho provato è il seguente:

LD 2960.00

MOVR D0 - IR0

LD 2960.01

MOV D100 - ,IR0

Con questa semplice sequenza mi aspetto che il valore contenuto in D100 venga trasferito dentro l'indirizzo contenuto in IR0, giusto??

L'ho provato con il simulatore e non ho ottenuto riscontro, non funziona.

Link al commento
Condividi su altri siti

Siccome ho visto che l'argomento degli indirizzamenti indiretti (tramite puntatori o registri indice) è più volte richiesto, provo a illustrarlo.

Mi raccomando ai neofiti: fate una ricerca nel sito per vedere se gli argomenti sono già stati trattati, evitando di aprire argomenti già trattati...

Per semplicità, si fa riferimento ai PLC serie CS/CJ e CP, che hanno un ottimo set di istruzioni. Gli altri sono o stanno andando fuori produzione.

Cominciamo con il primo caso, cioè INDIRIZZAMENTO INDIRETTO (sarebbe il cosiddetto Puntatore di altri linguaggi).

In pratica, non si definisce l'indirizzo della variabile di partenza e/o destinazione, ma una variabile contenente l'indirizzo di partenza e/o destinazione.

In Omron, un indirizzo puntato lo si definisce mediante un carattere prima del nome della variabile contenente il puntatore (indirizzo vero).

Se la variabile contenente il puntatore è espresso in BCD (ormai abbandonato) tale carattere è un *, altrimenti (binario) è un @.

Quindi, l'istruzione MOV D100 @D200 sposterà il contenuto di D100 (per esempio +123) nella variabile puntata da D200. Se quest'ultima contiene per esempio +567 (decimale), il risultato dell'istruzione sarà di avere +123 (contenuto di D100) nella variabile D567 (puntata da D200).

Come si vede, il valore della variabile puntatore è il valore nell'area D o E della variabile puntata.

La limitazione di questo indirizzamento è che è valido solo per le aree D ed E, che però possono essere mescolate. Inoltre, non hanno limite di puntatori (gli IR sono "solo" 16), ne possono essere usati quanti se ne vuole, e le operazioni sul puntatore sono libere (moltiplicazioni, somme, ecc). Bisogna stare però attenti a non dar di fuori, altrimenti si avrà un errore di Illegal Area Access.

Link al commento
Condividi su altri siti

Poi ci sono i registri Indice, mediante i quali si ottiene un altro tipo di indirizzamento indiretto.

Ce ne sono 16 disponibili, da IR0 a IR15. Questi sono dei registri (a 32 bit) che contengono effettivamente l'indirizzo interno della variabile puntata.

Per "convertire" una variabile nel suo indirizzo si usa la MOVR (MOVRW per il valore attuale di contatori e timer).

L'istruzione MOVR D0 IR0 mette in IR0 l'indirizzo interno della D0. Nei manuali trovate una tabella che riporta gli indirizzi interni delle varie aree.

Se si vuole manipolare il contenuto del registro indice, non tutte le istruzioni sono utilizzabili, ma solo quelle riportate in apposita tabella.

Una volta impostato il registro indice, è possibile utilizzarlo come segue (si fa l'esempio di IR0, ma vale per qualsiasi altro):

Siano MOVR D50 IR0 (quindi IR0 contiene l'indirizzo di D50), D100 contiene +123, c=5, n=1, DR1 = +10

MOV D100 ,IR0 sposta il contenuto di D100 in D50, D50 puntato da IR0. Pertanto D50 = +123

MOV D100 c,IR0 sposta il contenuto di D100 in (D50+c), D50 puntato da IR0, con c costante algebrica tra -2048 e +2047. Pertanto D(50+5)=>D55 = +123

MOV D100 DRn,IR0 sposta il contenuto di D100 in (D50+DRn), D50 puntato da IR0, DRn è un registro Dati (da DR0 a DR15) contenente il valore da sommare algebricamente. Pertanto D(DR1+50)=>D(10+50)=>D60 = +123

MOV D100 ,IR0+ sposta il contenuto di D100 in D50, puntato da IR0 e poi incrementa di 1 il registro indice. Pertanto D50 = +123 e poi IR0 punta a D1.

MOV D100 ,IR0++ sposta il contenuto di D100 in D50, puntato da IR0 e poi incrementa di 2 il registro indice. Pertanto D50 = +123 e poi IR0 punta a D2.

MOV D100 ,-IR0 decrementa di 1 il registro indice e poi sposta il contenuto di D100 nel registro puntato da IR0. Pertanto IR0 punta a D49 e poi D49 = +123.

MOV D100 ,--IR0 decrementa di 2 il registro indice e poi sposta il contenuto di D100 nel registro puntato da IR0. Pertanto IR0 punta a D48 e poi D48 = +123.

La differenza sostanziale è che IRn può puntare a qualsiasi variabile, purchè di pari formato. Pertanto è possibile puntare alle aree CIO, W e H non raggiungibili dai puntatori di cui prima.
Inoltre, è possibile indirizzare i bit, per cui se si fa una MOVR 34.5 IR0, il registro indice punterà al bit 5 della CIO 34. Ciò può essere utile per spostare o manipolare bit con i puntatori.
Link al commento
Condividi su altri siti

Ricapitolando un poco.

Qualsiasi variabile D o E può essere usata come puntatore nella propria area, se usato con * o @. Tutte le normali istruzioni operano sul contenuto del puntatore.

Mediante i registri indice IR è possibile puntare qualsiasi area, sia a bit che a word (o dual word), permettendo di operare in modo anche parecchio complesso sulle variabili.

I registri dati DR sono dei registri offset che possono essere sommati algebricamente al registro indice per ottenere ulteriore flessibilità nel puntamento.

I puntatori possono essere usati sia per la sorgente che per la destinazione o entrambi, per manipolazioni dati complesse.

Cosa da tener presente è che non seguono l'aritmetica dei puntatori (come il C per esempio), pertanto in caso di variabili doppia o quadrupla word (per esempio i valori floating point in singola o doppia precisione), bisogna stare attenti agli incrementi e decrementi, cosa automatica in altri linguaggi di alto livello.

Spero di aver fugato un po' di dubbi.

Nel caso, sono a disposizione

Link al commento
Condividi su altri siti

Spiegazione perfetta!!! ma soprattutto molto chiara. Il dubbio che mi rimane, riguarda l'impiego con il simulatore. Nonostante abbia effettuato diversi esempi sulla base delle sue indicazioni, non riesco a puntare nessun valore. Potrebbe essere colpa del simulatore?? Dovrei provare con un plc vero??

Link al commento
Condividi su altri siti

Veramente a me funziona perfettamente su simulatore (e ci mancherebbe altro...). Anche le tue righe all'inizio le ho testate e vanno.

Io uso l'ultima versione dei software Omron, per cui CxProgrammer 9.5 e relativo simulatore (mi pare 1.9.94)

E ovviamente li uso in continuazione nei programmi...

Link al commento
Condividi su altri siti

Io attualmente sto utilizzando la versione 9.31 e relativo simulatore, sicuramente e decisamente più vecchia della tua. Non riesco ne a puntare correttamente, ma sopprattutto quando apro la finestra di controllo non mi permette d'inserire i registri IR come denominazione. Potrebbe essere un problema legato alla versione del software?? Io volendo ho la possibilità nei prossimi giorni di provarlo con una cpu reale, credi possa essere una prova attenibile??

Grazie

Link al commento
Condividi su altri siti

I registri IR e DR non sono inseribili nella finestra di controllo. L'unico modo di poter vederne il contenuto (e manipolarlo, se necessario) è di usare Memoria nell'albero del progetto. Funziona anche nel simulatore.

L'unica cosa che mi può venire in mente nel simulatore è che non sia in esecuzione (nelle vecchie versioni, caricavi il programma ma non andava in RUN automatico, ora si.


I registri IR e DR non sono inseribili nella finestra di controllo. L'unico modo di poter vederne il contenuto (e manipolarlo, se necessario) è di usare Memoria nell'albero del progetto. Funziona anche nel simulatore.

L'unica cosa che mi può venire in mente nel simulatore è che non sia in esecuzione (nelle vecchie versioni, caricavi il programma ma non andava in RUN automatico, ora si.

Link al commento
Condividi su altri siti

  • 2 years later...

Salve a tutti,

ho utilizzato spesso i puntatori all'interno dei miei programmi mediante un carattere prima del nome della variabile (BCD *, altrimenti in binario un @), ma ora voglio utilizzare un puntatore dentro un blocco funzione e provando ad inserire i caratteri * o @ prima del indirizzo si verifica un errore durante la compilazione.

Mi sfugge qualcosa... è possibile utilizzare un puntatore dentro un blocco funzione creato in ladder?

Allego uno ScreenShot della compilazione

Grazie

2016-05-03_110436.jpg

Link al commento
Condividi su altri siti

  • 2 years later...
  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...