Ghisla Inserito: 20 febbraio 2020 Segnala Share Inserito: 20 febbraio 2020 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 More sharing options...
Marco Mondin Inserita: 20 febbraio 2020 Segnala Share Inserita: 20 febbraio 2020 (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: 20 febbraio 2020 da Marco Mondin Link al commento Condividi su altri siti More sharing options...
Marco Mondin Inserita: 20 febbraio 2020 Segnala Share Inserita: 20 febbraio 2020 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora