Vai al contenuto
PLC Forum


Aree Di Memoria?


Messaggi consigliati

Inserito:

Mi sembra di capire che se voglio usare i bit allora uso i merker, ossia M0.0 per SpiaVerde, M0.1 per PulsanteStart......

Ma se voglio memorizzare un numero? Ad esempio NumeroAllarmiAttivi in una word che faccio? Dichiaro MW100?

Non capisco, se uso M0.0, M0.1, ..., M1.7 e poi uso MW0 faccio riferimento agli stessi dati o sono aree distinte?


Giuseppe Signorella
Inserita: (modificato)

Se tu dichiari una variabile word e la chiami MW10, e successivamente dichiari 8 variabili a bit e le chiami M10.0, m10.1 .........m10.7 vai a scrivere la medesima area di memoria, con la differenza che in MW10 scrivi 16 bit (2byte) in contemporanea della memoria merker 10 ed M11 ( 8 bit per la M10 ed 8 per la M11) nell'altro modo scrivi un singolo bit alla volta dell' area di memoria solo M10.

In pratica ha un conflitto nelle occupazioni delle aree di memoria.

Modificato: da Giuseppe Signorella
Inserita: (modificato)

Come ha detto Giuseppe fa riferimento agli stessi dati! ( p.es. potresti comporre una word bit per bit e poi interrogarla come word...)

Tutte le aree (E/A/M/DB) possono essere interrogate come bit, byte, word, doppia-word (M, MB, MW, MD),

Normalmente i dati è meglio metterli nelle DB e la logica booleana nell'area M, ma nulla vieta di mettere tutto nelle DB.

Ultimamente ho sviluppato dei programmi dove un unico PLC con 6 programmi che giravano all'interno controllava altrettante macchine diverse, il cliente però aveva l'esigenza di poter vendere anche le macchine singolarmente ognuna con il suo plc, se avessi usato i M avrei avuto grosse difficoltà a realizzare 6 programmi diversi senza sovrapposizioni per cui ho fatto tutto tramite DB (anche la logica booleana) assegnando ad ogni macchina una decina di DB.

Modificato: da JumpMan
Inserita:

Ok grazie, ho capito e mi sa che è meglio se creo delle DB allora.

Inserita:
Ok grazie, ho capito e mi sa che è meglio se creo delle DB allora.

Certo.

Sono fatti apposta...

Inserita:

Sto cercando di utilizzare i DB, ne ho creato uno ossia DB1, con due bit tanto per fare una prova (bitA e bitB).

Ho messo due contatti nell'OB1 e li ho associati a bitA e bitB e noto che il loro indirizzo è DB1.DBX0.0 e DB1.DBX0.1.

Ora se volessi prendere la parola come faccio? Ho scritto DB1.DBX0 come parametro della FC99 credendo che lo prendesse ma niente.

Come si fa?

Inserita: (modificato)

Ti basterebbe premere F1 sulla tastiera per visualizzare l'.

Comunque:

Word oppure Interi (int) DBx.DBWx

Byte BDx.DBBx

Doppia word (DWORD) oppure Doppio Intero Dint oppure Virgola mobile DBx.DBDx

Punti il cursore su FC99 premi F1 e vedi che tipo di variabili sono richieste.

Modificato: da ken
Inserita:

Se ti fermi col cursore del mouse sull'ingresso IN della FC99-BITSUM, viene visualizzato il formato della variabile richiesta.

In questo caso, ti appare DWORD.

Con questa funzione quindi puoi contare quanti bit alti ci sono in una DWORD.

Nel tuo caso, sarebbero i bit che vanno da DB1.DBX0.0 a DB1.DBX3.7.

La sintassi da usare per collegare questa DWORD all'ingresso IN di BITSUM è: DB1.DBD0

Per non avere errori una volta caricato il programma nella CPU (o nel simulatore), l'area indicata deve esistere.

Nel tuo DB quindi dovrai dichiarare altre variabili, oltre a DB1.DBX0.0 e DB1.DBX0.1, fino ad arrivare almeno fino a DB1.DBX3.7.

Non è necessario che siano variabili booleane.

Il sistema più comodo, soprattutto per delle prove, è creare un array di 32 variabili BOOL.

In generale, la sintassi da usare è la seguente:

Bit: DBn.DBXa.b

Byte: DBn.DBBa

INT o WORD: DBn.DBWa

DINT, DWORD, REAL: DBn.DBDa

La funzione FC99 BITSUM è piuttosto limitata, perché permette di contare i bit alti solo di una DWORD.

Se devi controllare lo stato di meno di 32 bit, devi filtrare quelli che non ti interessano.

Se, invece, devi controllare più di 32 bit, devi richiamare più volte la funzione e poi sommare i risultati.

Io ho creato una funzione (BitCnt) che ti permette di indicare la lunghezza (in byte) dell'area di memoria da controllare.

Se mi mandi, in privato, tua mail, ti posso inviare una piccola libreria che contiene anche la funzione BitCnt.

Inserita:

Una cosa mi sono dimenticato di dire, anche se è abbastanza ovvia: se usi i Merker puoi configurarli facilmente come ritenitivi o non ritenitivi (nelle impostazioni hardware), mentre se usi le DB anche per la logica booleana i bit sono per forza ritenitivi (se i vuoi azzerare devi aggiungere del codice in OB100).

Altre cose importanti:

1. Prestare molta attenzione nell'uso di DB per la logica booleana, soprattutto in fase di collaudo!

2. Se devi aggiungere un BOOL in una DB che è usata nella logica del programma devi poi stare attento a non trasferirla nel PLC con la macchina in moto !!! (Se la DB è tutta a 0 la macchina si ferma)

3. Non copiare mai una DB con variabili BOOL usate nella logica dal PLC al PC mentre la macchina è in funzione, altrimenti quando farai il trasferimento inverso la macchina partirà da sola !!!!!!!!!!!!

Per questi motivi, se non si ha molta pratica, è preferibile usare i M per la logica (puoi aggiungere un M nella tabella simboli senza mai trasferire niente, puoi decidere di resettare gli M quando spegni il PLC).

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