Vai al contenuto
PLC Forum


Puntatore - come viene usato


compag

Messaggi consigliati

Salve a tutti, ho un po' di esperienza con programmazione Siemens ma sono nuovo di PL7.

Ho trovato su un programma di una macchina la seguente scrittura:

%MW360[%MW360]=%MW298

Come va interpretata?

E' giusto dire che la MW360=MW298, ma non capisco il significato dentro la parentesi quadra.

Se qualcuno fosse gentile da farmi un esempio.

Grazie

Link al commento
Condividi su altri siti


il valore dentro la parentesi quadra significa che e' l'indice dell'array

Se consideri l'area merker word in pl7 come un 'area contigua di word dorvebbe essere cosi .

Se %mw360 =100

vuol dire che stai puntanto a %mw460 e quindi %MW460:=%MW298

Cioe ' partendo dalle cose facile mi viene di fare questo ragionamento semplice

A cosa possa servire non lo so , bisognerebbe vedere un po tutto il codice , ma potrebbe anche essere

l'offset espresso in numero di word che c'e' tra una colonna e le altre di una tabella .

<_<

Vedi ri salire con i riferimenti incrociati a dove viene scritta %MW360 e a cosa .

Fammi sapere perche sono curioso

ciao

walter

Link al commento
Condividi su altri siti

Claudio Monti

%MW360[%MW360]=%MW298

In effetti e' un po' strano...

Come ti ha spiegato Walter il contenuto all'interno delle [n] e' l'indice di puntamento.

Se tu hai una tabella di word che partono dalla %MW360, tu vai a scrivere nella %MW360+n.

Link al commento
Condividi su altri siti

vi riporto per esteso:

FOR %MW360:=1 TO 24 DO

IF %MW360[%MW360]=%MW298 THEN

EXIT;

END_IF;

END_FOR;

Oppure 'espressione:

%MW401:=%MW411[%MW297];

Grazie per una risposta

Link al commento
Condividi su altri siti

%MW401:=%MW411[%MW297];

questa espressione e' normale e presenti in tutti i programmi ed in tutti i linguaggi

In sostanza vai a pescare l'elemento dell'array con indice %MW297

sarebbe come dire

int[100] buffer;

int indice;

int mia_var;

mia_var=buffer[indice]

ne piu ne meno !!!!!!!!!!

L'esempio di ieri riproposto oggi altro non e' che un iterazione all'interno di un array .

Ma ricordati che anche una riga o un insieme di righe , ossia una tabella , altro non e' che

un array organizzato in modo tale da renderti l'occhio come se fosse una tabella

COn step7 posso creare e dichiarare strutture ed array di strutture (tabelle ) come in C o altri linguaggi evoluti , e puntarci o oraganizzarmi come tale ,ma se nel db guardi il valore assoluto vedrai che

altro non e' che un'area di memoria contigua che parte da DBX0.0 fino alla fine della tabella

Non a caso se inserisci una variabile all'interno della struttura dell'array vedrai shiftare tutte variabili assolute .

Nel tuo caso premium , l'area di memoria e' sempre uguale ma organizzata in maniera diversa ,e se vuoi

creare tabelle devi creare prima le colonne prevedendo una lunghezza tale che non si accavalli

alle altre colonne della tabella .

Ricordati che anche un file che puo "vedere" con gli occhi in maniera gerarchicamente organizzata altro non e' che un array di byte

Metteti in testa questo ed hai capito tutto

nel tuo caso puo essere che con un ciclo for venga fatto un controllo a tutti i primi elementi

di ogni colonna della tabella , potrebbe essere

ciao

walter

Link al commento
Condividi su altri siti

hai il codice che it dice che la variabile di controllo del loop parte da 1 fino a a 24

prendi un file di excel ed esegui la funzione assegnando i valori da 1 a 24 e li

sostituisci alla variabile associata e vedi cosa viene fuori , piu facile di cosi '

Io sono appena rientrato dal lavoro e sono a pezzi , piu tardi te lo faccio io il conticino

;)

ciao

walter

p.s. magari cerca di capire anche quanto valgono e come vengono assegnate le variabile

comprese all'interno del loop

Link al commento
Condividi su altri siti

FOR %MW360:=1 TO 24 DO

IF %MW360[%MW360]=%MW298 THEN

EXIT;

END_IF;

END_FOR;

quando %MW360=1

IF %MW361 =% MW298 THEN

EXIT;

quando %MW360=2

IF %MW362 =% MW298 THEN

EXIT;

quando %MW360=3

IF %MW363 =% MW298 THEN

EXIT;

e cosi via , allora e' tutto chiaro si tratta di una ricerca .

Appena viene trovata una %MW , all'interno dell'intervallo %MW361 - %MW384

che vale uguale alla word % MW298 allora si esce dal loop soddisfatti (exit)

E' una ricerca all'interno di un array per cercare un valore ed uscire soddisfatti , interrompendo il loop

e quindi risparmiando tempo di ciclo .

Il fatto che venga usata %MW360 due volte puo essere di comodo oppure puo essere di proposito

stato scelto come indice (numero intero ) la prima word dell'array , oppure per risparmiare

una word utilizzandola come varibile locale anche se non lo e' e anche se il premium ha

un sacco di memorie da utilizzare .

altre spiegazioni non ce ne sono , non perderti la testa .

A meno che non trovi qualcosa di strano in giro per il codice , ma se %MW360 e' utilizzata solo qua

allora non c'e' niente da dire se non quello che ti ho detto sopra .

Tante volte capita che si ritengano sempre gli altri programmatori piu bravi di se, soprattuto

quando il sw l'hanno fatto loro .

Ma poi si scopre che son solo cagate e seghe mentali di qualche programmatore che non aveva niente

altro da fere che farsi le seghe al cervello

Lascia perdere , e' come ti ho detto io

ciao

walter

Modificato: da walterword
Link al commento
Condividi su altri siti

Grazie mille Walter, sei stato molto gentile e disponibile.

Hai per favore piccoli esempi o progetti per imparare un po' PL7 x versioni 4?

Grazie ancora

Compag

Link al commento
Condividi su altri siti

Sto facendo solo reti di S7-400 da quasi 2 anni

e qualche 300.

Premium l'ho usato pochissimo 3-4 anni fa e non saprei dove cercare .

Comunque ricordati che piu o meno la musica e' quella .

Cambiano le interpretazioni grafiche o le sintassi strutturali ma la sostanza e' quella

Inizia a farti un po esercizi , magri poniti un target , un virtual progetto e inizia a vedere cosa succede .

Con premium e pl7 hai a disposizione un sistema veramente elastico e molto friendly .

Leggiti qualche bel manuale e vedrai che nonsara' difficile.

L'unica cosa che non ho mai approfondito con pl7 e' la creazione di strutture e array di strutture viste

come in step7 .sicuro che si puo fare anche qua un discorso del genere credo con i dfb o qualcosa del genere.

Se lavori con %MW affiancati sempre da un file di excel dove tieni tutto sott'occhio , con i simboli ect .

La parte piu importante nello sviluppo sw per plc, secondo me , e' capire bene la logica da scrivere , ma

prima fare una bella e giusta stesura delle aree di memoria

Poi se lavori con i simbolici , o anche assoluti , basta fare un bel copia ed incolla e find & replace

Per esempio quando hai 20 motori da gestire in egual maniera , fai la logica di uno e poi fai come sopra .

E' diverso dal fare una funzione richiamabile 19 volte , con minor spreco di memoria programma utente,ma hai la possibilita' di debuggare meglio e customizzare ogni singolo motore .

poi insomma ognuno ha le sue tecniche e considerazioni , devi fare un po di pratica , applicarti e piangere un po poi tutto viene di istinto .

Insomma se ti piace non lo troverai pesante o particolarmente difficile .

Poi con pl7 puoi anche creare degli scada con tool hmi incorporato ed avere tutti i linguaggi di programmazione , grafset , il , st , ladder ect .

ciao

walter

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