Jump to content
PLC Forum

bele

NX1 Array

Recommended Posts

bele

Ciao a tutti, è possibile sapere  quando i bit di un array di  bool  sono tutti a zero ? ho provato a dare un occhio alle istruzioni AryCMP xxx  ma non sono riuscito a capire se una di queste fa a caso mio

Link to post
Share on other sites

valvolina

ciao

ciao questo è un piccolo esempio con un ciclo For

 

- Dichiarazione delle variabili

Id                              : INT;
Bool_Array               : ARRAY[0..10] OF BOOL;
ContaBool                : INT;
AlmenoUnBool_On   : BOOL;
TuttoAzero                : BOOL;

=================================================

codice

(* azzeramento contatore *)
ContaBool := 0;
(* ciclo for per contare quanti bool sono a true *)
FOR Id := 0 TO 10 DO
    IF Bool_Array[Id] THEN
        ContaBool := ContaBool +1;
    END_IF
END_FOR
(* verifica finale *)
AlmenoUnBool_On := (ContaBool > 0);
TuttoAzero      := (ContaBool = 0);

 

un saluto

Valvolina

 

Link to post
Share on other sites
Ctec

Un altro sistema è usare le Union (grande strumento...), in modo da definire una variabile accessibile come array di bit o word (o altro).

In tal modo si risparmia tempo e programma.

Link to post
Share on other sites
bele
Il 15/7/2020 alle 10:28 , valvolina ha scritto:

ciao

ciao questo è un piccolo esempio con un ciclo For

 

- Dichiarazione delle variabili

Id                              : INT;
Bool_Array               : ARRAY[0..10] OF BOOL;
ContaBool                : INT;
AlmenoUnBool_On   : BOOL;
TuttoAzero                : BOOL;

=================================================

codice

(* azzeramento contatore *)
ContaBool := 0;
(* ciclo for per contare quanti bool sono a true *)
FOR Id := 0 TO 10 DO
    IF Bool_Array[Id] THEN
        ContaBool := ContaBool +1;
    END_IF
END_FOR
(* verifica finale *)
AlmenoUnBool_On := (ContaBool > 0);
TuttoAzero      := (ContaBool = 0);

 

un saluto

Valvolina

 

 

Grazie, per il codice! grazie a tutti per le risposte!

Link to post
Share on other sites
Ctec

Questo è un esempio di uso delle Union.

Qui si definiscono i tipi di dati Union:

image.png.9ea9686ff7ff81167278b8f79fa4b09c.png

 

e qui due variabili definite come sopra

image.png.a1b6991b5a65a41821a78b86f4ca6362.png

 

A questo punto possiamo usare i bit singoli delle variabili come segue

Dosa.O[2] := 1;       // Attivo il terzo bit di Dosa (per esempio associato a una uscita)

Pos.b[7] := 1;        // Attivo l'ottavo bit di Pos (per esempio associato a una posizione di una tavola rotante)

 

 

E qui posso controllare in un solo "colpo" se ci sono bit non a zero nel Byte o nella Word

if Dosa.B == 0 then   // Condizione vera se tutti i bit sono a 0

  fai_qualcosa;       // fai qualcosa se sono tutti a 0

end_if

 

if Pos.W then         // Condizione vera se almeno un bit a 1

  fai_qualcosaltro;

end_if

 

Come si vede, è più compatto e soprattutto più veloce (nonché più elegante) rispetto al For-Next (immagina di doverne analizzare parecchi in tutto il programma).

Link to post
Share on other sites
bele
7 ore fa, Ctec ha scritto:

Questo è un esempio di uso delle Union.

Qui si definiscono i tipi di dati Union:

image.png.9ea9686ff7ff81167278b8f79fa4b09c.png

 

e qui due variabili definite come sopra

image.png.a1b6991b5a65a41821a78b86f4ca6362.png

 

A questo punto possiamo usare i bit singoli delle variabili come segue

Dosa.O[2] := 1;       // Attivo il terzo bit di Dosa (per esempio associato a una uscita)

Pos.b[7] := 1;        // Attivo l'ottavo bit di Pos (per esempio associato a una posizione di una tavola rotante)

 

 

E qui posso controllare in un solo "colpo" se ci sono bit non a zero nel Byte o nella Word

if Dosa.B == 0 then   // Condizione vera se tutti i bit sono a 0

  fai_qualcosa;       // fai qualcosa se sono tutti a 0

end_if

 

if Pos.W then         // Condizione vera se almeno un bit a 1

  fai_qualcosaltro;

end_if

 

Come si vede, è più compatto e soprattutto più veloce (nonché più elegante) rispetto al For-Next (immagina di doverne analizzare parecchi in tutto il programma).

Non sono sicuro di avere capito bene, ma nel tuo modo utilizzi byte o word e poi li compari per vedere se sono a zero, quindi se io ho un array di 8 16 o 32 bool ok uso una byte word o DWord  ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next

Link to post
Share on other sites
batta

È quello che in Siemens viene chiamato "sovrapposizione con AT".

Le variabili sono sovrapposte, occupano la stessa area di memoria.
Quindi, puoi accedere al singolo bit dell'array di 8 bool, oppure al byte.
Lo stesso vale per l'esempio con array di 16 bool e la relativa word.

Link to post
Share on other sites
Ctec
3 minuti fa, batta ha scritto:

È quello che in Siemens viene chiamato "sovrapposizione con AT".

Esatto, quello è l'altro trucco (che uso per esempio con Mitsubishi che non ha le Union).

Essendo che programmo anche in C, per me è piuttosto normale usare le union pe accedere a dati in modo diverso a seconda dei casi.

 

14 minuti fa, bele ha scritto:

ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next

Beh, non mi pare mi sia mai capitato qualcosa del genere. In tal caso temo che la scansione mediante for-next (o meglio ancora un while, almeno si interrompe prima)

Link to post
Share on other sites
pcontini

C'è l'istruzione ArySearch che ti dice in quanti elementi di un array hai il valore che cerchi tu.

Metti come chiave di ricerca "True" e nell'uscita "Num" dell'istruzione controlli che il risultato sia a 0

 

Ciao

Link to post
Share on other sites
bele
1 ora fa, pcontini ha scritto:

C'è l'istruzione ArySearch che ti dice in quanti elementi di un array hai il valore che cerchi tu.

Metti come chiave di ricerca "True" e nell'uscita "Num" dell'istruzione controlli che il risultato sia a 0

 

Ciao

Grazie!   funziona perfettamente

Edited by bele
Link to post
Share on other sites
batta
1 ora fa, bele ha scritto:

ma se ho un array di 500 bool e voglio verificare se sono tutti a zero? credo si debba utilizzare il ciclo For-next

Si, va bene utilizzare il ciclo FOR o, meglio, come suggerito da Ctec, un WHILE, ma lo potresti sempre fare su 16 DWord, o 32 Word, piuttosto che su 512 bool.

Link to post
Share on other sites
bele
Il 18/7/2020 alle 19:46 , batta ha scritto:

Si, va bene utilizzare il ciclo FOR o, meglio, come suggerito da Ctec, un WHILE, ma lo potresti sempre fare su 16 DWord, o 32 Word, piuttosto che su 512 bool.

 

Si Certo!    ma con la funzione  ArySearch suggerita da  pcontini  si fa in un attimo e non devi scomodare le union, e comunque volendo utilizzare le union  come suggerisci tu anzichè utilizzare un array di bool   e meglio utilizzare un array di 8 LWORD 

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