Vai al contenuto
PLC Forum


NX1 Array


bele

Messaggi consigliati

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 al commento
Condividi su altri siti


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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

È 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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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

Modificato: da bele
Link al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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