Jump to content
PLC Forum


taymyr

Come puntare un singolo bit di una word dichiarata come IN o TEMP

Recommended Posts

taymyr

Ciao a tutti,

su Step 7 - In un FC è possibile interrogare lo stato di un singolo bit di una word dichiarata come IN o TEMP?

Cioè:

Interfaccia  Nome  Tipo

IN               Prova   INT

oppure

TEMP        Prova1  INT

 

nel segmento

U M0.0

U #Prova."un bit qualsiasi della word"

= M 2.0

 

In pratica, c'è il modo per interrogare "un bit qualsiasi della word" dichiarata su IN o TEMP?

 

Spero di essere stato chiaro ...

Grazie in anticipo

Stefano

 

Share this post


Link to post
Share on other sites

ken

visto che scrivi nella sezione 300 tutte le variabili hanno un indirizzo fisico.

le variabili Temp possono essere chiamate con suffisso L

di fianco alla variabile trovi l'indirizzo (quello che in tia si chiama offset).

U L0.0 è il bit 0 della tua variabile Prova1

per gli ingressi non conosco la sintassi corretta

Share this post


Link to post
Share on other sites
taymyr

Grazie Ken

si lo so che le variabili TEMP sono definite come L

con le TEMP e solo per rendere più "interpretabile" il programma. Era "simpatico", infatti, continuare ad usare la dichiarazione tipo:

#Prova1.un bit qualsiasi della word"

 

Se invece dichiari una word come IN / OUT /InOut non so come fare … eventualmente ci fosse un modo

 

Ciao

Share this post


Link to post
Share on other sites
pigroplc

esiste anche su step7 se non erro la funzione di overlay: "AT" 

un simpatico esempio che ho inserito tempo addietro: cerca "Specchairebit" 

cambierà qualcosa se lo esegui sullo step 7 classico piuttosto che sul TIA.... 

Share this post


Link to post
Share on other sites
batta

Oppure (solo in awl), con i puntatori.

Esempio:

      L     P##inputVar          // Carica l'indirizzo della variabile "inputVar"
      LAR1                       // nel registro indirizzi 1
      A [ AR1 , P#0.3 ]          // Interroga lo stato del bit nr.3 della variabile puntata dal registro indirizzi

Assieme alla sovrapposizione con AT, usare i puntatori offre il vantaggio di non dover modificare il codice (per risistemare gli indirizzi) nel caso di inserimento o eliminazione di variabili.

Share this post


Link to post
Share on other sites
taymyr

<batta>

Hai ragione "batta" … non ci avevo pensato proprio … ma come ti vengono queste idee … 

Già provato e funziona alla grande … funziona con Word/Dword … con Merker/Input/Output/DBX, praticamente con tutto

Grazie mille

 

<pigroplc>

onestamente non ho mai sentito parlare di questa funzione "AT" … 

Cerco di capire di cosa si tratta

Grazie mille

 

Ciao

Share this post


Link to post
Share on other sites
batta
33 minuti fa, taymyr ha scritto:

ma come ti vengono queste idee

Non è una mia idea, ma semplicemente uno dei modi di utilizzare i puntatori. Più o meno, la scoperta dell'acqua calda ;-)

Con le CPU 1200/1500 si possono adottare altre strategie, senza ricorrere ai puntatori.

Share this post


Link to post
Share on other sites
taymyr

Non sarà una tua idea … ma le sai tutte!!!

Share this post


Link to post
Share on other sites
Yiogo

cioè stai dicendo che su questi plc non vedi direttamente il booleiano MY_word.bit

dove MY_word è la word e bit è il bit nella word (nel caso di 16 bit da 0 a 15)

su altri lo puoi usare perfino nel ladder, sia come condizione di input che come condizione calcolata

Share this post


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

cioè stai dicendo che su questi plc non vedi direttamente il booleiano MY_word.bit

Nel 300, dove le variabili hanno tutte un indirizzo noto, era poco importante. Nei 1200/1500, che lavorano solo con il simbolico (salvo diversa impostazione), puoi accedere a bit, byte o word con quella sintassi.

Pensa che ho scoperto da poco, con una certa meraviglia, che myWord.bit non si può usare in Codesy. 

Share this post


Link to post
Share on other sites
Yiogo

come hai immaginato io mi riferivo sopratutto ad Emerson (GE) che uso tanto ma ero perplesso da quello che hai detto per cui ho voluto verificarlo ulteriormente prima di risponderti anche se mi ricordavo di averlo usato anche su CodeSys

l'ho  fatto  ora su CodeSys Version 2.3.9.59 che ho su questo computer

funziona benissimo sia in ST che in LD

 

 

Edited by Yiogo

Share this post


Link to post
Share on other sites
cdc
16 ore fa, batta ha scritto:

Oppure (solo in awl), con i puntatori.

Esempio:


      L     P##inputVar          // Carica l'indirizzo della variabile "inputVar"
      LAR1                       // nel registro indirizzi 1
      A [ AR1 , P#0.3 ]          // Interroga lo stato del bit nr.3 della variabile puntata dal registro indirizzi

Assieme alla sovrapposizione con AT, usare i puntatori offre il vantaggio di non dover modificare il codice (per risistemare gli indirizzi) nel caso di inserimento o eliminazione di variabili.

 

Ciao,

ma se devo rendere parametrizzabile anche il bit (nel tuo esempio il 3), come posso fare usando i puntatori in S7-300?

 

Share this post


Link to post
Share on other sites
batta
9 ore fa, cdc ha scritto:

ma se devo rendere parametrizzabile anche il bit (nel tuo esempio il 3), come posso fare usando i puntatori in S7-300?

Per rendere parametrizzabile il numero del bit, puoi incrementare il contenuto del registri indirizzi, e poi leggere lo stato del bit puntato dal registro indirizzi.
Esempio:

immagine.png.b2f0628046fe4ea4286c37b80ec8e539.png

 

Fai sempre attenzione all'ordinamento dei byte.
Nell'esempio, il contenuto della variabile inputVarInt è: 2#0000_0000_0000_0100.
Il bit alto è il bit numero 2 della variabile ma, dato l'ordinamento dei byte secondo lo standard Motorola (big endian), devi interrogare lo stato del bit 10.
Potresti risolvere facendo lo swap dei byte ed appoggiando il risultato ad una variabile locale.

Esempio:

immagine.png.2644f08ba1a14f00f97a7031559176ca.png

 

Poi, ci sono anche altri metodi per ottenere lo stesso risultato.
Esempio:

      L     P##localVarInt              // Carica indirizzo della variabile 
      L     #bitNr                      // Carica numero del bit della variabile 
      ITD                               // Trasforma in DINT
      +D                                // Somma all'indirizzo della variabile il numero del bit da puntare
      T     #adr                        // Scrivi risultato in "adr" (variabile di tipo DINT)
      U     L [#adr]                    // Interroga lo stato del bit puntato nell'area delle variabili locali
      =     #bitStatus                  // Scrivi stato del bit

 

 

Ora, con le cpu 1200/1500 e TIA Portal, che mette a disposizione anche un editor di testo strutturato che non ha paragoni con quello del SimaticManager,
cerco sempre soluzioni che non comportino l'uso dei puntatori.
Devo dire che mi sono divertito, dopo tanto tempo, a tornare a fare qualche piccolo esercizio con i puntatori.
E, aggiungo, nei casi (per quanto rari) si dovesse ricorrere all'uso di puntatori, la gestione dei puntatori in AWL è più flessibile (e non è più complicata) dell'uso di PEEK e POKE in strutturato.

  

 

Edited by batta

Share this post


Link to post
Share on other sites
Operational Amplifier

Complimenti Batta... 🧙‍♂️

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