Vai al contenuto
PLC Forum


Puntatori E S7-300


Jonnywolf

Messaggi consigliati

Scusatemi, ma nelle discussioni che già affrontano questo tema non sono riuscito ha fare molta chiarezza su questo argomento, sarà perchè di AWL non ci capisco molto ed ho sempre programmato il ladder. Comunque il mio problema è: devo archiviare ogni 10sec un byte in un DB già progettato di dimensioni 400 byte, quindi puntare ogni 10sec al byte successivo del DB.

Grazie anticipatamente.

Ciao

Link al commento
Condividi su altri siti


devo archiviare ogni 10sec un byte in un DB già progettato di dimensioni 400 byte, quindi puntare ogni 10sec al byte successivo del DB.

- Potresti implementare un contatore che, ogni dieci secondi, aumenta di una unità una variabile......

- Potresti implementare una semplice operazione matematica del tipo A:=A+1 (ogni 10 sec).....

Buon lavoro

Link al commento
Condividi su altri siti

Molto brevemente poiche' si sono gia' spesi fiumi di messaggi sui puntatori

timer da 10 secondi

fronte di salita del timer incremento una MD

apro la DB che mi interessa

carico il byte che mi interessa

trasferisco in DBB[MDsopra]

non scordare di fare il confronto con MDsopra quando passa il campo dei byte della Db per rimetterla a zero

attenzione , se usi byte nella db puoi incrementare di 1 la MD

se usi word ovviamente moltiplichi per 2 ( o incrementi 2 )

ciao

Luca

Link al commento
Condividi su altri siti

Luca, hai trascurato una cosa fondamentale: in Step7 si punta al bit. Per puntare al byte successivo si deve incrementare di 8.

Nella cartella "Sorgenti"del tuo progetto inserisci una nuova "Sorgente AWL". Apri il nuovo file sorgente e incollagli dentro il codice che segue. Compila.

FUNCTION "Esempio" : VOID
TITLE =Esempio
//A questa FC devi passare i seguenti parametri:
//- AdrPrimoByte: devi passare l'indirizzo del byte del DB dal quale desideri 
//iniziare l'archiviazione dei tuoi dati.
//Esempio: se vuoi inziare ad archiviare i dati da DB20.DBB50 dovrai scrivere:
//P#DB20.DBX50.0
//- ID: numero del byte da scrivere, allineato a zero
//- Dato: valore da scrivere in formato byte
AUTHOR : batta
VERSION : 0.1


VAR_INPUT
  AdrPrimoByte : POINTER;    //Indirizzo primo byte
  ID : INT;    
  Dato : BYTE;    
END_VAR
VAR_TEMP
  N_DB : INT;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##AdrPrimoByte; //Carica indirizzo puntatore
      LAR1 ; //in registro indirizzi AR1
      L     W [AR1,P#0.0]; //Estrai numero DB da indirizzo
      T     #N_DB; 
      AUF   DB [#N_DB]; //apri DB
      L     D [AR1,P#2.0]; //Estrai indirizzo primo byte
      LAR1 ; //e caricalo in registro indirizzi AR1

//Caica indice puntatore
//N.B.: in questo esempio l'indice è allineato a zero.
//Per scrivere nel primo byte del DB si deve quindi
//impostare ID = 0
      L     #ID; //Carica indice
      ITD  ; //trasforma in DINT
      SLD   3; //Shift a sx di 3 bit per puntamento a byte
      +AR1 ; //Incrementa registro indirizzi AR1

      L     #Dato; //Carica valore
      T     B [AR1,P#0.0]; //e scrivilo nel byte puntato

END_FUNCTION

Questo è solo uno dei tanti modi. Sono poche istruzioni buttate giù di corsa senza essere testate, ma vedrai che funziona.

A te l'onere di gestire incremento e limiti dell'indice da passare alla FC.

Link al commento
Condividi su altri siti

Luca, hai trascurato una cosa fondamentale: in Step7 si punta al bit.

verissimo

Per puntare al byte successivo si deve incrementare di 8.

verissimo , ma scomodo

da quello che dicevo prima , la MD del puntatore ti basta moltiplicarla per 8 o shiftarla a sinistra di 3

prima di interrogare la DBB

ciao

Luca

Link al commento
Condividi su altri siti

Vorrei aggiungere una piccola postilla alle perfetta spiegazione di batta,

ricordare sempre :

Quando si usa il registro AR1 per l'indirizzamento indiretto, si deve sempre caricare in AR1 l'indirizzo corretto.
tratto dal . in linea di step7, ovvero quando si carica un offset tipo

L P#1.5

L AR1

SET

= A[AR1,P#0.0]

scrivo a uno l'uscita A1.5, sino a qui niente di strano, ma se volessi puntare al byte 1 bit 5 della MW0 della

DB20 devo scrivere

L 20

T N_DB

AUF DB [#N_DB]

L P#DBX0.0 //CARICO IL PUNTATORE AL PRIMO DATO DELLA DB

LAR1 // ADESSO SONO SICURO CHE IL PUNTATORE PUNTA ALLA PRIMA LOCAZIONE DELLA DB

L P#1.5 // CARICO L'OFFSET

+D // SOMMO L'OFFSET AL MIO PUNTATORE

LAR1 // ADESSO IL PUNTATORE PUNTA ESATTAMENTE A DB20.DBX1.5 DI DB20.DBW0

Aggiungo, per finire, che all'interno della mia FC / FB dove faccio uso di AR1 e/o AR2 di aggiungere all'inizio della FC/FB quanto segue

TAR1 #STar1 // Dove STar1 e STar2 sono due variabili locali in formato DBWord

TAR1 #STar2

ed alla fine della FC / FB

LAR1 #STar1

LAR1 #STar2

Il commento a quanto scritto qui sopra lo trovate sul . in line del Step7

Link al commento
Condividi su altri siti

  • 1 year later...

Dovendo collegare un'elettrovalvola con contatto ausiliario di cui non sono in possesso dello schema di collegamento,ho proceduto nel seguente modo:

Con il tester impostato sugli ohm ho rilevato un valore tot su due (blu e marrone) dei 4 fili provenienti dall'elettrovalvola, determinado che questi sono i due fili per l'eccitazione della bobina, sugli altri due fili (grigio e nero) ho rilevato un valore di zero ohm determinando che questi sono i due fili del contato ausiliario. Per ulteriore conferma ho azionato manualmente l'elettrovalvola rilevando un valore di fondoscala tra il filo grigio e nero confermando in tal modo che questi sono il contatto ausiliario,ed ho sempre rilevato un valore tot per quelli della bobina di eccitazione dell'elettrovalvola.

Quindi vi chiedo cortesemente di confermarmi se quanto da me effettuato e' corretto.

Vi ringrazio per la vostra disponibilita'.

Se la sezione dove ho posto questa domanda dovesse essere sbagliata,me ne scuso.

Link al commento
Condividi su altri siti

Quindi vi chiedo cortesemente di confermarmi se quanto da me effettuato e' corretto.
Confermo che hai individuato correttamente i fili che alimentano la bobina e quelli del micro, le prove che hai fatto sono corrette.
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...