Vai al contenuto
PLC Forum


NX1 Array


Messaggi consigliati

Inserito:

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


Inserita:

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

 

Inserita:

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.

Inserita:
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!

Inserita:

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

Inserita:
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

Inserita:

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

Inserita:
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)

Inserita:

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

Inserita: (modificato)
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
Inserita:
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.

Inserita:
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 

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