Vai al contenuto
PLC Forum


Vidjeodesigner: Modalità Ingresso Con Array


Cronos.

Messaggi consigliati

Mi domandavo se qualcuno avesse trovato una soluzione umana a questo problema:

Poniamo di avere un array di strutture ( ma il problema lo si ha anche con un array normale così a memoria ) e di voler mostrare questi valori in una schermata, scorrendo con un tasto l'indice si visualizzano i vari dati e l'utente deve poterli modificare

Poniamo che il dato che si tenti di visualizzare abbia questo nome : PLC_PLC.Brush[Temp.Brushl].ABS_Vel

Dove,

PLC_PLC è ovviamente una cartella

Brush è il nome dell'array

Temp.Brushl è una variabile temporanea che fa da indice

ABS_Vel è il nome del dato che si tenta di modificare / displayare

In caso si tenti di displayarlo, la cosa funziona correttamente

il problema è che non è possibile attivare la modalità ingresso per questo dato

Utilizzando i pulsanti è possibile fare operazioni con "on temporaneo" scrittura di valori e quant'altro, la limitazione è per l'appunto sulla modifica dei dati con un visualizzatore numerico

L'idea che mi era venuta per risolvere il problema è quella di utilizzare una variabile di appoggio che viene aggiornata / aggiorna il dato tramite uno script, ma la questione è un filo più complicata di quello che sembra

Intanto se ho 50 dati in questa pagina devo crearmi 50 variabili e scrivermi il codice che le aggiorna

In secondo luogo nella pagina deve girare uno script perpetuo che cicla ogni tot millisecondi, ma anche a mezzo secondo va più che bene per le mie esigenze

questi due però sono finti problemi, gli script gestiscono correttamente tutti e 2 i casi,

lo script quindi deve divenire qualcosa del tipo ( faccio un esempio con una sola variabile ovviamente )

Temp.ABS_Vel := PLC_PLC.Brush[Temp.Brushl].ABS_Vel.getIntValue();
questo codice deve ciclare in uno script ogni 0.5sec Il visualizzatore numerico visualizzerà Temp.ABS_Vel, non essendo questa una variabile "particolare" può essere quindi abilitata tranquillamente anche la modifica del dato ora, il problema è che non esiste un evento che dica "ho premuto l'ok per modificare il dato", ed è difficile diagnosticare quando c'è stata 1 modifica una possibile soluzione è quella di fare un codice di questo tipo ( ometto i getIntValue() e i write() altrimenti il codice è illeggibile )
if (Temp.ABS_Vel != Temp.OLD_Abs_Vel)
{
   // Ho aggiorna il valore, quindi ho premuto un tasto
   PLC_PLC.Brush[Temp.Brushl].ABS_Vel = Temp.ABS_Vel;
   Temp.OLD_Abs_Vel = Temp.ABS_Vel;
}
else
{
  // Non ho aggiornato il valore, aggiorno il valore da plc
  Temp.ABS_Vel = PLC_PLC.Brush[Temp.Brushl].ABS_Vel.getIntValue();
  Temp.OLD_Abs_Vel = PLC_PLC.Brush[Temp.Brushl].ABS_Vel.getIntValue();
}

ma è una soluzione parecchio dispendiosa quando si hanno più di 50 variabili in una sola pagina

qualcuno ha trovato quacosa di meglio?

Link al commento
Condividi su altri siti


ciao

PLC_PLC è ovviamente una cartella

Brush è il nome dell'array

Temp.Brushl è una variabile temporanea che fa da indice

ABS_Vel è il nome del dato che si tenta di modificare / displayare

sto andando a memoria ( non ho il sw sotto per essere esatto ) comunque quello che vuoi fare ( se non ho capito male ) e' fattibile mettendo , nella proprieta della variabile , nel campo indice la variabile interna "Brushl"

cosi in base al valore di "Brushl" la tua variabile "ABS_Vel" assumera valori in base all'array.

In questo modo pero potrai visualizzare/modificare un valore alla volta.

e' questo quello che volevi ???

spero di si

bye

Link al commento
Condividi su altri siti

dichiari una VAR00 con indice INDEX che legge word 100

dichiari una VAR01 con indice INDEX che legge word 101

dichiari una VAR02 con indice INDEX che legge word 102

dichiari una VAR03 con indice INDEX che legge word 103

dichiari una VAR04 con indice INDEX che legge word 104

....

modificando INDEX ottieni la tua tabella (creata da VAR00 - 0n ) indicizzata

bye

Link al commento
Condividi su altri siti

E' certamente una buona idea e risolve il problema che ho esposto in caso la disposizione della memoria sia, diciamo,"semplice"

ovvero contigua o in ogni caso venga disposta ogni "tot" word

Nel mio caso, ho indicizzato una struttura che contiene vari tipi di dati ( bool, word, doppie word.. ) e non so nemmeno ogni "quanto" la struttura si ripete e in ogni caso questo "ogni quanto" è passabile di modifiche perchè aggiungo un bool o similare

Per rendere più chiaro l'esempio io sto cercando di modificare una struttura presa da unity che è un array di strutture, in altre parole si presenta più o meno come segue

Brush[0]
  ABS_Vel ( word )
  ABS_Pos ( dword )
  ABS_Start ( bool )
  Home_Pos
  Home_Start
  Home_Type
  ..
  ..
Brush[1]
  ABS_Vel ( word )
  ABS_Pos ( dword )
  ABS_Start ( bool )
  Home_Pos
  Home_Start
  Home_Type
  ..
  ..
Brush[2]
  ABS_Vel ( word )
  ABS_Pos ( dword )
  ABS_Start ( bool )
  Home_Pos
  Home_Start
  Home_Type
  ..
  ..
..
..

le posizioni delle variabili vengono decise da unity in modo da rendere il tutto contiguo, se io un giorno mi accorgo che mi serve "Home_HomingVel" per esempio, lo devo aggiungere.. e questo mi manderebbe a quel paese tutti i dati che vengono dopo "Home_HomingVel" e probabilmente anche "ogni quanto" la struttura si ripete, rendendo il tutto veramente poco gestibile e a rischio di gravi danni nel caso io mi scordi di aver fatto una modifica e non la riporti sul pannellino, in quel caso si scriverebbe su word sbagliate con le note conseguenze..

senza considerare che calcolarne gli offset può divenire un impresa epica

Link al commento
Condividi su altri siti

visto come e' strutturato piu che "array" mi sembrerebbero "ricette" o sbaglio ?

in base all'indice di ricetta -->

(Brush[n])

carichi la ricetta composta da piu ingredienti -->

ABS_Vel ( word )

ABS_Pos ( dword )

ABS_Start ( bool )

Home_Pos

Home_Start

Home_Type

..

..

io userei la funzione ricette ... l'indice puo arrivare a 255

bye

Link al commento
Condividi su altri siti

No, non sono ricette, sono semplicemente i parametri degli azionamenti brushless, inverter, e altre cose, che sono fisse

è il numero di brushless/inverter che è alto ( circa una 10ina di inverter e un paio di brushless, ma conoscendo il cliente il numero può variare e non intendo rifare il programma ogni volta )

sostanzialmente sono parametri che non vengono mai cambiati, salvo in casi molto particolari

"prova a far andare quel nastro più veloce"

"l'altro un po più lento"

quindi devono essere velocemente accessibili e devono riuscire a farlo anche loro se io sono altrove

strutturandoli in questo modo fare il check degli allarmi è banale, ed altri vantaggi ancora che non sto ad illustrare visto che non è questo lo scopo del thread ( ma se vi interessano non ci sono problemi ovviamente )

ho provato a chiedere anche a pronto contatto, mi hanno risposto che è una cosa poco utilizzata e che sarà sviluppata in futuro, ovviamente nessuna data stabilita

Link al commento
Condividi su altri siti

  • 4 months later...

Se non sbaglio VijeoDesigner non contempla l'utilizzo nè di array multidimensionali nè di array di strutture nè di strutture di dati (user data type).

Credo che sia possibile solo l'utilizzo di array monodimensionali di dati non strutturati.

Comunque dall'. in linea dovrebbe essere possibile trovare la risposta.

Ciao

bigalex :blink:

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