Jump to content
PLC Forum


alessandropa

settare singolo bit in varialbile out locale

Recommended Posts

alessandropa

Buonasera,

Spiego brevemente il mio problema.

Devo visualizzare su di un hmi 25 rettangoli i quali possono assumere 3 colorazioni, grigio, verde, rosso.

Il grigio è il colore base mentre il il verde è dato da una variabile che si incrementa percui ho semplicemente messo nella dinamica dell oggetto se 0 colore grigio poi da 1-25 verde per il primo, da 2-25 per il secondo e via dicendo fino a 25-25 per l'ultimo. Cosi all incrementare della variabile mi si accendono in sequenza i rettangoli e a 0 si spengono tutti.

Bene questo funziona.

Ora per i rossi io non devo accenderli in sequenza ma bensi ad un evento ossia il rettangolo che diventa verde se premo un tasto diventa rosso, quindi posso avere 3 verdi poi un rosso o 1 verde poi 2 rossi a caso quindi.

All inizio avevo creato uno variabile int per ogni rettangolo e le facevo assumere 3 valori di cui il terzo con il tasto.

Il sistema andava ma 25 variabili mi sembrano tante per accendere 25 rettangolini,poi se devo riprodurre me ne vanno altre 25 e cosi via....

Ora sono ad un altra soluzione ossia con una variabile gestisco i grigi e verdi e con 25 bit sovrappongo un rettangolo rosso visibile solo se ho premuto il tasto.

Per non passare 25 bit singoli all hmi ho voluto creare nel mio FB 25 condiziono che mi settano 25 bit, ho creato la variabile OUT "bit_rossi DINT" con indirizzo L8 e vado a settare L8.0, L8.1 L8.2 e cosi via.

Ma non mi si settano i bit nella variabile che poi associo all'out.

Come mai?

Scusate la lunghezza del post ma ho voluto spoegarvi tutto il problema cosi magari voi avete una soluzione piu immediata rispetto a quelle pensate da me. Grazie

Share this post


Link to post
Share on other sites

SHKODRAN

Buongiorno.

Essendo un fb multiuso, spero abbia provveduto salvare i due registri AR1, AR2 prima dell'uso e ripristinare dopo l'uso...

Vengono usati come appoggio per il puntamento, se non vengono salvati, tutte le memorie locali hanno un valore non attendibile.

 

Ciao.

Share this post


Link to post
Share on other sites
alessandropa

Buongiorno, come faccio a lavorare su questo registri?

Io sto scrivendo in ladder.

L'FB ogni volta che lo richiamo ha un suo DB di istanza quindi credevo fossero li salvati i suoi dati e non scritti a ogni volta come in un FC.

Share this post


Link to post
Share on other sites
SHKODRAN
6 minuti fa, alessandropa ha scritto:

Buongiorno, come faccio a lavorare su questo registri?

Io sto scrivendo in ladder.

L'FB ogni volta che lo richiamo ha un suo DB di istanza quindi credevo fossero li salvati i suoi dati e non scritti a ogni volta come in un FC.

Salve, 

non sapendo cosa sta sviluppando, sotto un comune esempio di salvataggio registro:

FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1

VAR_INPUT
  //variabile d'ingresso
END_VAR
VAR_OUTPUT
  //variabile d'uscita  
END_VAR
VAR_TEMP
  AR2_DW : DWORD ;  //Salvataggio valori registro AR2     
END_VAR

Begin
 TAR2  #AR2_DW

// Codice che si vuole utilizzare

 LAR2  #AR2_DW 
      SAVE   
      BE    
END_FUNCTION_BLOCK

 

Share this post


Link to post
Share on other sites
alessandropa

Ma la variabile nella quale io voglio settare i bit è dichiarata come out non come temp

Share this post


Link to post
Share on other sites
SHKODRAN
2 minuti fa, alessandropa ha scritto:

Ma la variabile nella quale io voglio settare i bit è dichiarata come out non come temp

Anche se dichiarata come variabile del tipo out, è sempre una variabile locale, di conseguenza, non ha un valore attendibile ad ogni entrata di scansione.

Share this post


Link to post
Share on other sites
batta
12 ore fa, alessandropa ha scritto:

Ma non mi si settano i bit nella variabile che poi associo all'out.

Senza vedere il codice, difficile capire dov'è l'errore.

Share this post


Link to post
Share on other sites
batta
31 minuti fa, SHKODRAN ha scritto:

non sapendo cosa sta sviluppando, sotto un comune esempio di salvataggio registro:

Non vedo l'utilità di salvare i registri AR1 e AR2.

 

18 minuti fa, SHKODRAN ha scritto:

Anche se dichiarata come variabile del tipo out, è sempre una variabile locale, di conseguenza, non ha un valore attendibile ad ogni entrata di scansione.

Non è una variabile locale, ma è una variabile che viene appoggiata nel DB di istanza.

Bisogna capire cosa va a scrivere in questa variabile, o se la usa erroneamente come se fosse una IN/OUT.
Ma, fino a quando non potremo mettere gli occhi sul programma, si potranno fare solo supposizioni.

Share this post


Link to post
Share on other sites
alessandropa

Pomeriggio appena possibile vi mando uno screen del codice.

In pratica io dichiaro nelle variabili out una dint chiamiamola prova e vedo che mi viene assegnato l indirizzo 8.0.

Mi aspetto cha da 8.0 a 11.7 siano i miei bit della variabile prova.

Nell FB ora vado a settare uno ad uno i bit.

Ora richiamo l FB con la sua istanza in un mio FC  e all uscita prova gli assegno la variabile DB1.DBD1

Mi aspetto che in DBD1 i bit si settino come in prova all interno dell FB.

Share this post


Link to post
Share on other sites
batta
1 ora fa, alessandropa ha scritto:

Mi aspetto cha da 8.0 a 11.7 siano i miei bit della variabile prova.

 

14 ore fa, alessandropa ha scritto:

con indirizzo L8 e vado a settare L8.0, L8.1 L8.2 e cosi via.

 

"L" sta per Locale. Tu stai impostando i bit nell'area delle variabili "temp".
Per accedere ai dati delle variabili Input, Output e Stat, l'area è "DI".
Per il bit 8.0, devi scrivere DIX 8.0

 

Ricordati poi di come sono ordinati i byte in Siemens. Se la tua variabile DInt inizia dal byte 8, il bit più a destra sarà DIX 11.0, e quello più a sinistra DIX 8.7.

 

Molto brutto però impostare direttamente i bit in questo modo.

Fai una variabile locale di tipo DInt, imposta i bit della variabile locale (assicurandoti di azzerare eventuali bit non usati), e poi copia la variabile locale nell'uscita.

Esempio:

L 0
T tmpVar

U ....
= L0.0
U ....
= L0.1
...
U ...
= L3.7
...
...
L tmpVar
T outVar

 

Lavorando in AWL potresti anche usare i puntatori, e slegare il codice dagli indirizzi assoluti delle variabili che, in caso di modifica all'interfaccia delle variabili, potrebbero cambiare.

 

Sicuro poi di avere bisogno di una FB, e che non ti basti una FC?
 

Share this post


Link to post
Share on other sites
alessandropa

Nella prima foto vedete l FB aperto dove ho dichiarato la variabile e come vado a settare i bit.

Nelle seconda foto vedete l FB richiamato ma la merker word che associo rimane a 0. Anche se un bit è settato come in terza foto.

 

Sto lavorando a word per provare ma penso che word int o dint non cambi.

IMG_20200408_133255.jpg

IMG_20200408_133203.jpg

IMG_20200408_133223.jpg

Share this post


Link to post
Share on other sites
alessandropa

Grazie batta appena posso faccio delle prove.

L FB non fa solo questo ma molto altro per questo è FB e non FC

Share this post


Link to post
Share on other sites
SHKODRAN
53 minuti fa, alessandropa ha scritto:

Grazie batta appena posso faccio delle prove.

L FB non fa solo questo ma molto altro per questo è FB e non FC

Ovviamente può fare tutto, ma NON se usato in modo improprio...

Prova aggiungere queste due semplice righe e te ne accorgi da solo lo sbaglio che fai...

L LW 8
T #Passo_Piatt_Errore

Ciao.

Share this post


Link to post
Share on other sites
batta
32 minuti fa, SHKODRAN ha scritto:

Prova aggiungere queste due semplice righe e te ne accorgi da solo lo sbaglio che fai...

Sì, con quelle due righe qualcosa inizierebbe a funzionare, ma ancora in modo sbagliato, perché è sbagliato settare dei bit nell'area delle variabili locali.
 

Se la necessità è quella di settare i bit di quella word poi collegata in uscita alla funzione (probabilmente resettati da qualche altra parte del programma), la variabile #Passo_Piatt_Errore dovrà essere dichiarata come INOUT e, per accedere direttamente ai singoli bit di questa variabile, al posto di "L" si deve usare "DIX".

 

Poi, come già detto prima, accedendo direttamente all'indirizzo della variabile, se l'indirizzo di questa variabile dovesse cambiare per modifiche all'interfaccia della funzione, si dovrebbe risistemare il programma manualmente.
Meglio sarebbe ricorrere ai puntatori, ma si può fare solo in AWL.

Share this post


Link to post
Share on other sites
alessandropa

Tutto chiaro, ma come mai IN/OUT se la gestisco internamente e solo setto e resetto non basterebbe OUT?

Share this post


Link to post
Share on other sites
batta
35 minuti fa, alessandropa ha scritto:

ma come mai IN/OUT se la gestisco internamente e solo setto e resetto non basterebbe OUT?

Non so se i bit li resetti all'interno della funzione. Non avendo visto i comandi di reset, ed essendo segnali di errore, ho supposto, forse erroneamente, che il reset avvenga all'esterno della funzione, sulla variabile collegata alla funzione (MW304, nell'esempio). Se è così, devi anche leggere il valore attuale quando entri nella funzione, quindi il parametro dovrà essere INOUT.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...