Antonio80 Inserito: 6 gennaio 2013 Segnala Inserito: 6 gennaio 2013 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: 6 gennaio 2013 Segnala Inserita: 6 gennaio 2013 (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: 6 gennaio 2013 da Giuseppe Signorella
JumpMan Inserita: 6 gennaio 2013 Segnala Inserita: 6 gennaio 2013 (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: 6 gennaio 2013 da JumpMan
Antonio80 Inserita: 6 gennaio 2013 Autore Segnala Inserita: 6 gennaio 2013 Ok grazie, ho capito e mi sa che è meglio se creo delle DB allora.
batta Inserita: 6 gennaio 2013 Segnala Inserita: 6 gennaio 2013 Ok grazie, ho capito e mi sa che è meglio se creo delle DB allora. Certo. Sono fatti apposta...
Antonio80 Inserita: 6 gennaio 2013 Autore Segnala Inserita: 6 gennaio 2013 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?
ken Inserita: 6 gennaio 2013 Segnala Inserita: 6 gennaio 2013 (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: 6 gennaio 2013 da ken
batta Inserita: 6 gennaio 2013 Segnala Inserita: 6 gennaio 2013 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.
JumpMan Inserita: 7 gennaio 2013 Segnala Inserita: 7 gennaio 2013 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).
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