Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Array E Indice


Messaggi consigliati

Inserito:

Ciao a tutti, domanda:

è possibile accedere ad un elemento di un array tramite un volore contenuto in un merker (indice)?

es. MioBlocco.MioArray[MB60] ? o qualcosa di simile.

mi serve accedere ad un elemento dell'array in base ad un valore che leggo da un input

dimenticavo: programmando in KOP

grazie


Inserita:

se fosse una cosa cosi sarebbe perfetto pero io non lho trovato sul ..

e io use indirect addressing per questo. cioe per esempio hai un array = array[0..9] di byte adesso

array[0] = 0 (bit di comcincio)

array[1] = 9 (bit di comincio)

.

.

.

tu puoi fare per esempio

L L#0

t ld0

opn db10

l dbb[ld 0]

adesso tuo indice e ld0 pero non e come visual basic.. tutto bit based devi aggiungere 8 per avere prossimo valore..

Inserita:

grazie per la risposta

Sul manuale come ci sono i soliti esempi stupidi...

la cosa è un po' + complicata di come l'ho spiegata, in realtà mi serve un array di strutture (a meno di divididere la struttura in n array) e ho già notato che appena cambio un tipo di dato nella struttura mi si incasina tutto...

Con alley bradley la stessa cosa è semplicissima (ergo è perfetto :) ), come lo rimpiango...

Inserita:

hanno creato set di istruzioni nuove in siemens? :blink:

per puntare ad una variabile indicizzata in awl , anche perche in kop e fup non si puo ,

bisogna creare un array o array di struttura/e e poi ottenere il formato puntatore , esempio

mio_array :array[1..100] of int ;

mio_indice:int;

mio_indice=3;

l mio_indice

slw 3

lar1

l dbw[ar1,p#0.0]

t mw10

Inserita:

ricordati che un array di strutture altro non e' che una tabella

quindi ogni volta che vuoi spostarti alla riga successiva dovrai sommare un offset

in bytes che sara il numero di bytes di una riga

Questo si usa quando vuoi fare un loop while -do o for next in awl

ed iterare tra tutte le righe

I singoli elementi di una riga , cioe della tua struttura li punti con l'offset

del puntatore

mia_tab:array[1..100] of struct

dato1:int;

dato2:real;

dato3;byte;

end_struct

index:int;

L 1

t index

u(

L index

L 700

<I

)

spbn salt

L index

slw 3

lar1

L dbw[AR1,p#0.0] //qui carichi la var mia_tab[1].dato1

T MW20

L dbw[AR1,p#2.0] //qui carichi la var mia_tab[1].dato2

T MD22

L dbw[AR1,p#6.0] //qui carichi la var mia_tab[1].dato3

T MB27

//incremento l'offset per saltare alla riga successiva

//incremento l'indice del loop

// ect ect ect

salt:nop 0

l index

l 100

<i

Inserita: (modificato)

FUNCTION FC 100 : VOID

TITLE =Leggi dato da DB con puntatore

AUTHOR : batta

VERSION : 0.1

VAR_INPUT

N_DB : BLOCK_DB ;

StrByte : INT ;

ID : INT ;

END_VAR

VAR_OUTPUT

Value : INT ;

END_VAR

VAR_TEMP

Addr : DINT ;

END_VAR

BEGIN

NETWORK

TITLE =Calcola puntatore e leggi dato

AUF #N_DB; //Apri DB

L P#DBX 0.0; //Inizializza puntatore

L #StrByte; //Leggi indirizzo inizio array,

ITD ; //trasforma in DINT

SLD 3; //conversione indirizzo da byte a bit

+D ; //indirizzo inizio array in formato puntatore

L #ID; //Carica numero variabile da puntare (allineata a ZERO)

ITD ; //Trasforma in DINT

SLD 4; //conversione indirizzo da word a bit

+D ;

T #Addr; //Indirizzo in formato puntatore della variabile nel DB

L DBW [#Addr]; //Leggi valore variabile puntata

T #Value; //Trasferisci in uscita

END_FUNCTION

Puoi compilare questa FC (crea nuovo sorgente ed inserisci con copia/incolla) e richiamarla in programma kop.

"N_DB" = DB che contiene il tuo array

"StrByte" [iNT] = indirizzo (byte) inizio array (non è detto che il tuo array parta da inizio DB)

"ID" [iNT] = indice variabile dell'array (in INT, allineata a ZERO)

"Value" [iNT] = valore letto

ATTENZIONE: non viene eseguito nessun controllo ne' sull'esistenza del DB ne' sulla validità dell'indirizzo calcolato

Se questa funzione non fa al caso tuo, specifica meglio quello di cui hai bisogno e vedremo cosa si può fare.

Modificato: da batta
Inserita:

Grazie per le info, io non so quasi niente in awl comunque imparo presto (se trovassi il tempo per documentarmi...), per adesso sto cercando di capire se quello che ho fatto con Allen Bradley è fattibile anche con step 7 (senza impiccarmi)

se dovessi gestire un array di struct? (è solo ipotesi, sono disposto a dividere la struct in n array di INT)

mi serve anche la funzione per scrivere nell'array, ma credo che sia sufficiente modificare la parte finale della funzione.

Inserita:

Bene, crea una struttura composta da n array di int. Poi devi sempre fare riferimento agli indirizzi.

Credo sia superfluo dirlo, ma nel DB non devi apportare modifiche (aggiunta o cancellazione di variabili prima della struttura) che vadano a modificare gli indirizzi delle variabili della tua struttura.

In Allen Bradley (logix5000?) se non mi sbaglio gli indirizzi non esistono, mentre in S7 è sempre e solo l'indirizzo che conta.

Per scrivere devi solo dichiarare la variabile "Value" come variabile in ingresso anzichè in uscita, e modificare le ultime due righe della mia funzione come segue:

L #Value

T DBW [#Addr]

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