Vai al contenuto
PLC Forum


andword, orword


Messaggi consigliati

Inserito:

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


Inserita: (modificato)

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

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