Vai al contenuto
PLC Forum


andword, orword


Ghisla

Messaggi consigliati

Ciao ragazzi,

Potreste spiegarmi come utilizzare le operazioni a parole??

Ho capito la loro funzione ma non capisco dove si potrebbero utilizzare.

Potreste farmi degli esempi pratici?

Grazie

Link al commento
Condividi su altri siti


Se intendi AW ed OW (And su word ed Or su word) hanno parecchi utilizzi.

Di solito in informatica sono utili per settare o resettare e leggere lo stato di un bit in un dato.
Sia D il tuo dato, K una word a cui setti solo il bit che vuoi verificare a cui diamo il nome di maschera, se fai un D AND K (il tuo dato sulla maschera), il risultato sarà uguale a 0 se e solo se il bit settato in K non è settato anche in D!
Questo ti permette di capire se il bit deciso in K è o meno attivo in D.

Usando la maschera in OR, il risultato è D con attivato il bit di K e ti permette di attivare un bit.
Usando la maschera in AND con il complementare di D (D negato con i bits 0 a 1 ed i bits 1 a 0), il risultato è D con il bit di K disattivo.

Su un singolo bit di una word sui PLC ha poco senso in quanto ci si può accedere direttamente, e lo fa già il runtime intrinsecamente, tuttavia può capitare di voler attivare, disattivare o confrontare gruppi di bits, in questo caso è comoda, in quanto K funziona benissimo con più di un bit attivo, dipendentemente dal suo utilizzo attivi, disattivi o confronti se più bit sono attivi simultaneamente.

Per la verifica delle attivazioni simultanee non si confronta più con 0 ma con la maschera stessa se il risultato è uguale alla maschera sono tutti attivi.

Può anche essere comoda sui singoli bit quando devi iterare un processo. Per esempio impacchettare o spacchettare dei bit.

Per farti un esempio questo pezzo di codice in ST impacchetta dei BOOL in una seria di bit su un array di LWORDS:
 

maskOn := ULINT#16#1;
maskOff := ULINT#16#FFFFFFFFFFFFFFFE;

FOR col := 0 TO 63 DO
    FOR row := 0 TO 7 DO
        IF m_bitsPLC[col + (row * 64)] THEN
            processHMI.mainArea().plcBits.lwords[row] := processHMI.mainArea().plcBits.lwords[row] OR maskOn;
        ELSE
            processHMI.mainArea().plcBits.lwords[row] := processHMI.mainArea().plcBits.lwords[row] AND maskOff;            
        END_IF
    END_FOR
    maskOn := SHL(maskOn, 1);
    maskOff := SHL(maskOff, 1) OR ULINT#16#1;
END_FOR

 

In questo caso si usa anche un'altro operatore molto comodo in questi casi, si tratta dello spostamento a sinistra.

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

2 ore fa, Marco Mondin ha scritto:

Usando la maschera in AND con il complementare di D (D negato con i bits 0 a 1 ed i bits 1 a 0), il risultato è D con il bit di K disattivo.

Non posso più modificare scusate il secondo messaggio.

Errata corrige:
Usando la maschera in AND con il complementare di K (K negato con i bits 0 a 1 ed i bits 1 a 0), il risultato è D con il bit di K disattivo.

Ho scritto senza rileggere!

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