Jump to content
PLC Forum


NX1 Array


Recommended Posts

Posted

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


Posted

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

 

Posted

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.

Posted
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!

Posted

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

Posted
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

Posted

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

Posted
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)

Posted

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

Posted (edited)
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
Posted
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.

Posted
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 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...