Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Istruzione Lar1 - Come inserire un off-set?


Messaggi consigliati

Inserito:

Salve a tutti,

devo controllare una serie di byte e verificare se il valore dei singoli bit sono a 0 o a 1;piu' precisamente ho bisogno di verificare se almeno un bit di X byte ha un valore diverso rispetto tutti gli altri.

Ho scritto queste poche righe di programma in un FB, ho appoggiato alcuni dati all'area interfaccia per

poter richiamare il blocco piu' volte abbinato a diverse DB e il tutto funziona:

// incremento per creare indice puntatore

U #Bit_MANU_forced // BOOL AREA TEMP

SPB M203

L #APP_scansione_MANU // INT AREA TEMP appoggio scansione

+ 1

T #APP_scansione_MANU

L #Max_bit // INT AREA IN interfaccia "numero di bit da controllare"

<I

SPB M203

L 0

T #APP_scansione_MANU

M203: NOP 0

L #APP_scansione_MANU

LAR1

AUF #DB_number // AREA IN BLOCK_DB interfaccia "DB da controllare"

U DBX [AR1,P#100.0] // Offset inizio il controllo dal byte 100 bit 0

= #Bit_MANU_forced // AREA OUT interfaccia "almeno un bit con valore 1"

// Vista del blocco richiamato in un FC

CALL "Compare dbx-AUTO_MANU" , DB115

DB_number :=DB11

Max_bit :=64

Bit_MANU_forced:=FORCED_MANU

Ora volevo appoggiare il dato Offset ad una variabile per poter

modificare all'occorrenza l'area da controllare e ho modificato il blocco in questo modo:

// incremento per creare indice puntatore

U #Bit_MANU_forced // BOOL AREA TEMP

SPB M203

L #APP_scansione_MANU // INT AREA TEMP appoggio scansione

+ 1

T #APP_scansione_MANU

L #Max_bit // INT AREA IN interfaccia "numero di bit da controllare"

<I

SPB M203

L 0

T #APP_scansione_MANU

M203: NOP 0

L #APP_scansione_MANU

LAR1

L P##Primo_Byte_MANU // AREA IN POINTER interfaccia "primo byte/bit da controllare"

+AR1 // Offset inizio il controllo dal byte xxx bit x

AUF #DB_number // AREA IN BLOCK_DB interfaccia "DB da controllare"

U DBX [AR1,P#0.0]

= #Bit_MANU_forced // AREA OUT interfaccia "almeno un bit con valore 1"

// Vista del blocco richiamato in un FC

CALL "Compare dbx-AUTO_MANU" , DB115

DB_number :=DB11

Max_bit :=64

Primo_Byte_MANU:=P#76.0 // Inizio controllo dal byte 76

Bit_MANU_forced:=FORCED_MANU

CALL "Compare dbx-AUTO_MANU" , DB116

DB_number :=DB12

Max_bit :=64

Primo_Byte_MANU:=P#100.0 // Inizio controllo dal byte 100

Bit_MANU_forced:=FORCED_MANU

La sintassi sembra corretta, non ho errori e il blocco viene compilato correttamente; pero' in questo modo non funziona. Se qualcuno riesce a darmi una mano...

Grazie e ciao

Bruno


Inserita:

Non ho capito bene come lo hai realizzato .........

ma ho fatto una cosa simile ( a mio parere piu' semplice )

mi faccio una DB dove vado a scrivere per ogni DBW l'indirizzo dei bit da testare ( M40.5 = 40x8+5 )

con un semplice puntatore vado a testare ( io l'ho fatto a ogni scansione ) la M con l'indirizzo contenuto nella DBW

non so' se ti sono stato di aiuto

Ciao

Luca

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