Vai al contenuto
PLC Forum


GET da S7-1500 con indirizzamento variabile


SanGer

Messaggi consigliati

Ciao a tutti e grazie in anticipo.

Ho un S7-1500 che comunica con un S7-300 con una serie di PUT e GET gestiti dall'S7-1500.

Nell'S7-300 c'è una DB contenente 96 stringhe da 50 byte l'una, scritte da un pc.

 

A me servirebbe leggere una di quelle stringhe, ma non sempre la stessa: a volte devo leggere la prima, altre la numero 40, altre l'ultima.

Posso scrivere su un intero il numeor di stringa che devo andare a leggere, quindi moltiplicando l'intero per 50 posso ottenere il byte da utilizzare per il GET.

Ma come faccio poi ad utilizzare questa informazione per il GET?

Il tipo di dati che servono al GET è un remote, e io l'ho sempre usato assegnando ad esempio P#DB1.DBX0.0 CHAR 150 all'ADDR_1.

È possibile utilizzare invece un indirizzamento dinamico?

 

Altrimenti credo che dovrei rassegnarmi e fare una svalangata di GET per importarmi tutta la DB e poi operare su quella, ma mi chiedevo se ci fosse una soluzione più semplice.

 

Grazie in anticipo e buona giornata

 

Link al commento
Condividi su altri siti


Mattia Spoldi

non credo che si possa fare così alla svelta, prova a ragionarla al contrario, leggi costantemente le 96 stringhe, le appoggi in una db dove avrai dichiarato un'array di 96 stringhe da 50 caratteri l'una, quando devi accedere ad una delle stringhe, invece di accedere a quelle remote, le leggi dal tuo array con la sintassi db_stringhe.stringa[indice_stringa] e dovresti essere a cavallo.

 

Link al commento
Condividi su altri siti

Al blocco GET passi un puntatore ANY, guarda l'istruzione Variant_TO_ANY se fa al caso tuo oppure lo puoi compilare e rendere dinamico, lo avevo fatto sul 300.

Link al commento
Condividi su altri siti

3 ore fa, Mattia Spoldi ha scritto:

non credo che si possa fare così alla svelta, prova a ragionarla al contrario, leggi costantemente le 96 stringhe, le appoggi in una db dove avrai dichiarato un'array di 96 stringhe da 50 caratteri l'una, quando devi accedere ad una delle stringhe, invece di accedere a quelle remote, le leggi dal tuo array con la sintassi db_stringhe.stringa[indice_stringa] e dovresti essere a cavallo.

 

Eh quella sarebbe la soluzione lunga ma semplice. Volevo sapere, per conoscenza mia e poterlo fare anche in futuro, se c'era un metodo più veloce e più "da programmatore".

Link al commento
Condividi su altri siti

3 ore fa, 84paolo ha scritto:

Altrimenti esistono i "magici" puntatori any. Un po' difficili da usare ma funzionano

Ho provato a guardare un po' di cose ma sarò io che non ci arrivo e i puntatori li ho usati solo in C, ma non ho trovato molte risorse.

Oltre al fatto che il tipo di dati Any, Remote o Puntatore me li fa mettere solo come Input e non li posso dichiarare in una DB.

Non è che sai se ci sono risorse che posso guardare?

Link al commento
Condividi su altri siti

2 ore fa, acquaman ha scritto:

Al blocco GET passi un puntatore ANY, guarda l'istruzione Variant_TO_ANY se fa al caso tuo oppure lo puoi compilare e rendere dinamico, lo avevo fatto sul 300.

 

Grazie, sembrerebbe quello che fa al caso mio, ma da Tia Portal (ho la V16) mi fa solo selezionare l'istruzione VARIANT_TO_DB_ANY che però si usa per ricavare il numero di una DB, quindi non sembra quello che mi serve per indicizzare il puntatore.

Link al commento
Condividi su altri siti

Devi dichiarare una variabile #Temp nell'FC di tipo ANY. Per farlo dall'fc dove lo inserisci selezioni proprietà e disabiliti accesso ottimizzato.

 

image.png.9c21becad9e0ee670d8361b25b1d8438.png

 

Di seguito un esempio da me usato in TIA.

 

il puntatore è dichiarato come prima variabile temp e quindi la LW0

 

Nella prima word metti 1002 che significa 10 (codice puntatore) e 02 (quantità in byte

LW2 (numero di byte)

LW4 (numero DB)

LB6 (Codice per area DBX)

Il resto devi mettere l'offset calcolato.

 

Poi usi il puntatore al posto di dove metti l'indirizzo

Modificato: da 84paolo
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...