Vai al contenuto
PLC Forum


Variant


uncas

Messaggi consigliati

Salve a tutti.

Sto cercando di "creare" un VARIANTin maniera dinamica.

Mi spiego meglio con il seguente esempio.

variant = P#DB10.DBX0.0 INT 10.

Dal momento che l'area a cui voglio puntare cambia continuamente, avrei bisogno di un VARIANT che la "segue" istante per istante.

Successivamente potrebbe valere:

variant = P#DB50.DBX10.0 INT 20.

Vorrei quindi poter modificare dinamicamente le vari componenti del VARIANT, ossia numero del DB, offset, lunghezza dell'area.

Qualcosa del genere per intenderci:

variant = P#(var a).(var b ) INT (var c).

Ho provato ad appoggiarmi al struttura dati "VREF" che stando alla documentazione "Consente di memorizzare il puntatore VARIANT".

VREF ha la seguente struttura:

RID: DWord --> ???

AREA: Byte --> ???

DB_NUMBER: Uint --> immagino sia il numero del DB a cui puntare.

OFFSET: UDint --> immagino sia l'offset (in byte?) all'interno del DB.

Purtroppo non trovo nessuna documentazione specifica su questa struttura VREF...

Qualcuno di voi ha qualche idea su come posso creare dinamicante un puntatore VARIANT (qualora fosse possibile col 1200).

Grazie

Modificato: da uncas
Link al commento
Condividi su altri siti

  • 4 years later...

Salve,

non è possibile costruire il puntatore VARIANT, è possibile soltanto utilizzarlo. Per utilizzarlo intendo che si può:

- Chiedergli se è un array (IS_Array)

- Chiedergli se è uguale al tipo di dato di una variabile nota (EQ_Type)

- Se è un array, chiedergli quanti elementi ha l'array (CountOfElements)

- Se è un array, chiedergli se il tipo di elementi è uguale a quello di una variabile nota (EQ_ElemType)

- Spostare tutto il variant su una variabile di tipo noto (Move_Blk_Variant)

- Se è un array, spostare solo qualche elemento del VARIANT in un altro array (Move_Blk_Variant)

 

Tutto questo chiaramente in simbolico e senza sapere nè dove è piazzato il dato nè qual'è la sua dimensione fisica. Se dovesse cambiare la posizone del dato o ingrandirsi/rimpicciolirsi, non deve essere toccato il codice PLC che lo elabora.

Come capisce, questo strumento è utilissimo per creare del codice standard che lavora su dati di volta in volta diversi di progetto in progetto (non durante il RUNTIME).

A questo link un manualetto rapido sull'indicizzazione e il puntamento indiretto dei dati che fa vedere qualche esempio applicativo.

https://support.industry.siemens.com/tf/it/en/posts/indirect-access-s7-1500-indicizzazione-dei-dati-su-s7-1500/200654/?page=0&pageSize=10

 

Questi dati che lei dice 'cambiano continuamente', cambiano continuamente durante il runtime oppure vengono decisi al momento della progettazione? Se cambiano in runtime, il modo migliore per sfruttare la programmazione simbolica del PLC S7-1500 è quello di far finire questi dati in array perchè questo è l'unico tipo di dato che può essere indicizzato sfruttando il numero che indica l'elemento da puntare. Se questo non è proprio possibile allora bisogna continuare a lavorare con una programmazione assoluta e con gli ANY come doveva obbligatoriamente fare con S7-300.

Link al commento
Condividi su altri siti

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