Vai al contenuto
PLC Forum


Microwin - impostare bit in una DoubleWord


Messaggi consigliati

Inserito:

Salve,

prima di tutto, Buon anno a tutti.

Non riesco a capire come fare a impostare un bit in una variabile, mi spigo meglio:

S7-200 e Microwin 4.0 programmazione KOP.

Ho una variabile VD1 ( Double Word ) la quale, se non sbaglio, in binario contiene 32 bit.

Dovrei interfacciare gli 8 ingressi della mia CPU 221 sui primi 8 bit di questa variabile.

Ingressi da Q0.0 a Q0.7

Non riesco a capire quale e' la funzione da utilizzare.

Grazie mille a tutti.


Inserita:

C'una via un poco contorta. Acquisisci gli stati I0.0 - I0.7 (credo che Q0.0 - Q0.0 sia un refuso) in una variabile Byte, poi converti il Byte in intero, con l'apposita istruzione e riconverti, sempre tramite l'istruzione apposita, l'intero in doppio intero. A questo punto fai or dell due variabili previo azzeramento dei primi 8 bit della variabile di partenza.

L'altra via, più semplice, è quella di assegnare una variabile byte al medesimo indirizzo del byte basso della variabile Doppio Intero. Però devi fare molta attenzione agli indirizzi

Inserita:

In effetti ho fatto un po' di confusione gli ingressi sono I, per fortuna e' stata solo una svista.

Credo di aver risolto in parte.

Ipotiziamo di creare una VD0 formato binario, quest'ultima occupa 4 byte, che posso ritrovare utilizzando da V0.0 a V3.7.

In questo modo posso settare a piacimento il singolo bit e vederli anche tramite la VD0.

Tutto questo mi serve per realizzare un sistema personale di domotica, utilizzando un sistema di supervisione il quale limita, nella versione base ( non posso spendere 1000 euro per la supervisione del mio impianto di domotica ) a poche decine di variabili.

In questa maniera con ogni Doubleword posso supervisionare fino a 32 I/O.

Gia' che ci siamo, si puo' fare qualcosa anche con i valori analogici?

Devo monitorare alcune sonde PT100 e la risoluzione potrebbe essere tranquillamente in gradi senza decimali.

Ciao e grazie

Inserita: (modificato)

La via più semplice è quella di utilizzare l'istruzione MOV_B con ingresso IB0 e uscita VB0.

Non ho capito bene se Livio con questa frase

L'altra via, più semplice, è quella di assegnare una variabile byte al medesimo indirizzo del byte basso della variabile Doppio Intero. Però devi fare molta attenzione agli indirizzi
intendeva la stessa cosa...

Comunque per risparmiare potresti fare a meno del programma di supervisione usando la modalità freeport, solo che io non l'ho mai provata e non ti posso dare molti consigli in merito.

Modificato: da JumpMan
Inserita:
Gia' che ci siamo, si puo' fare qualcosa anche con i valori analogici?

Si' , considerando solo che il valore analogico in ingresso puo' essere interrogato solo come parola, cioe' word.

Esempio:

LD SM0.0

MOVW AIW10, MW10 //trasferisce valore analogico in una merker word

Oppure:

LD SM0.0

MOVW AIW10, VW10 //trasferisce il valore analogico in una V word

e la risoluzione potrebbe essere tranquillamente in gradi senza decimali.

Diciamo che il modulo analogico fornisce un valore compreso tra +0 e +32000 , nella AIW che corrisponde al minimo ed al massimo valore misurato sul canale analogico, non fornisce un dato di temperatura diretto , devi tu tramite una linearizzazione convertirlo secondo le tue esigenze.

Esistono vari modi, tramite la funzione SCALE : S_ITR (Scale Integer to Real) , include elaborazione in annotazione REAL

Esempio , supponiamo che nel modulo EM231 (che tra l'altro non ho mai usato), il valore di 0.0 gradi corrisponda a 0 e 100.0 gradi corrisponda a 20000.

Scrivi:

LD SM0.0

CALL S_ITR, AIW10, 20000, 0, 100.0, 0.0, VD100

Dove leggi il valore analogico in AIW10, fissi i valori di ingresso massimo 20000 e minimo 0 , ed i valori di uscita 100.0 e 0.0 , e la destinazione VD100 (dopia paroloa prche' in annotazione reale).

Se invece restiamo nel campo del fai da te' , una semplice linearizzazione potrebbe essere, supponendo che all'ingresso analogico la il valore zero della word corrisponda a zero gradi ed il valore massimo 32000 corrisponda a 150 gradi:

Scirvi:

LD M0.0 //Always ON

ITD AIW10, VD100 //Converti valore intero della AIW in doppio intero destinazione VD100

DTR VD100,DV100 //Converti valore INT in REAL

/R 32000.0, VD100 //Dividi il contenuto di VD100 per 32000 e ritrasferisci in VD100

*R 150.0, VD100 // Moltiplica il contenuto di DV100 per 150 (fondoscala) e ritrasferisci in VD100.

Il risultato del calcolo si trovera' in VD100 a partire da VW100, sempre in formato REAL.

Ciao

Ivan

Inserita:
Non ho capito bene se Livio con questa frase..

Si è la medesima cosa; l'indirizzo di VB è il medesimo dell'indirizzo del byte basso di VD, questa tecnica è conosciuta come "overlapping". Bisogna solo stare molto attenti nell'assegnazione delle memorie per evitare confusioni

Inserita:

E' vero, che stupido, con soli 4 comandi posso avere il controllo di 16 DI e 16 DO in una sola Doubleword.

MOV_B da IB0 a VB0

MOV_B da IB1 a VB1

MOV_B da VB2 a QB0

MOV_B da VB3 a QB1

Il tutto supervisionabile da VD0 ripsettivamente Ingressi da V0.0 a V1.7, Uscite da V2.0 a V3.7

E' corretto o sto' facendo nuovamente confusione?

Inserita:

No e' giusto, puoi anche ridurre il tutto a 2 comandi cioe':

MOV_W IW0 , VW0 // muove il contenuto della word ingressi 0 + 1 nella V Word 0+1

MOV_W VW2 , QW0 // muove il contenuto della V word 2+3 nella word di uscita 0+1

Ma se proprio ti servono i byte per motivi che non ho inteso , lascia come hai fatto tu.

Ciao

Ivan

Inserita:

Hai ragiona ancora tu...

.... non c'e necessita' di utilizzare i Byte, posso spostare l'intera word e risparmio due comandi.

Sono all'inizio e vedo ancora il PLC all'esterno, non sono ancora completamente dentro con la mente.

Hai presente MATRIX? Prima o poi vedro' soltanto 101100001111111110110....

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