Vai al contenuto
PLC Forum


Contatori E Indirizzi Di Memoria


erubini76

Messaggi consigliati

salve a tutti,

sto programmando da poco con plc CPU226, in pratica devo testare dei rele'

e ho bisogno di generare un clock per accenderli e spegnerli e tenere traccia

di eventuali anomalie (rele che saltano cicli di clock, quanti ne saltano, rottura

dei rele').

Dovendo ora pilotare fino a 6 rele' contemporaneamente ho deciso di fare dei sottoprogrammi

in modo da rendere scalabile la programmazione, ho pero' alcune difficolta'

con i contatori, e con le aree di memoria.

I contatori infatti arrivano solo poco sopra a 32000 e in una prova devo fare 100000 commutazioni,

oltretutto i contatori (C0 ecc) per contare hanno bisogno di una transizione da off a on il che mi

da non pochi grattacapi nel controllare il flusso (scusate sono neofita) ho pensato leggendo altri

post d'incrementare direttamente degli indirizzi di memoria.

Ora il problema si pone nei sottoprogrammi, se infatti uso variabili globali Vxx devo

scrivere sei sottoprogrammi, uno per relè, dovrei usare delle variabili locali ma nel

blocco dati (che se ho capito bene serve per inizializzare zone di memoria) mi accetta

solo vxx e non Mxx, Lxx o altro.

Quando poi uso funzioni tipo ADD_I mi accetta solo variabili del tipo MWx.

E' palese che non ho chiaro come funzionino, avete qualche suggerimento?

Enrico

Link al commento
Condividi su altri siti


Ti rispondo frettolosamente perchè non ho tempo:

Il blocco dati contiene solo V, altra cosa sono i M (Merker o relè interni), puoi impostarli come ritentivi nel blocco di sistema.

Quando poi uso funzioni tipo ADD_I mi accetta solo variabili del tipo MWx.

Per forza, ADD_I lavora con le word, accetta MWx o VWx o QWx o IWx

Se vuoi lavorare a 32 bit usa ADD_D, se lavori a 8 bit usa ADD_B

Le variabili locali sono interne alla SBR e perdono significato al termine della SBR stessa.

Però puoi creare una SBR standard con dei parametri d'ingresso e di uscita, sul blocco chiamante passerai tali parametri alla SBR.

Link al commento
Condividi su altri siti

Grazie,

sono riuscito a implementare i contatori, ho visto che comunque il comando ADD_BI non esiste quindi ho usato il comando ADD_I che lavora con word. :lol:

Ho ancora un problemino pero', il fatto è che giustamente ADD_I lavora con VWX e MWX, entrambi zone di memorie globali se non ho capito male, ora il comando si trova su una sottoprogramma che sarà richiamato piu' volte quindi rischio di sovraschivere la zona di memoria che funge da contatore perdendo informazioni.

Una possibile soluzione che mi viene in mente potrebbe essere quella di passare il dato del conteggio dal sottoprogramma al programma principale, in questa maniera comunque dovrei "mappare" a priori la memoria V per i contatori (circa 18 di tipo DW e W), sinceramente mi sembra una soluzione un po' macchinosa, non c'e' la possibilita' di implementare il programma in maniera piu' dinamica?

a presto,

Enrico

Link al commento
Condividi su altri siti

Scusa, ma i simboli non li usi?

Se la VD100 la usi p.es. per il contatore che conta le lenticchie di striscia la notizia :P , vai nella tabella simboli scrivi:

- Nome = ContatoreLenticchie

- Indirizzo = VD100

- Descrizione = Contatore lenticchie per Striscia la notizia.

Se in un'altro punto del programma usi la VD100 per fare qualcos'altro, te ne accorgi perchè compare il simbolo "ContatoreLenticchie"

Suggerimento: di tabelle simboli puoi crearne quante vuoi e dare loro il nome che vuoi (I/Q/M/V/DATI/CONTATORI/...)

Il fatto di passare parametri alle SBR rimane comunque valido, puoi fare una SBR unica e richiamarla 1000 volte per fare 1000 "Contalenticchie".

Ciao... ;)

Link al commento
Condividi su altri siti

Ciao,

forse mi son spiegato male :)

Se in un'altro punto del programma usi la VD100 per fare qualcos'altro, te ne accorgi perchè compare il simbolo "ContatoreLenticchie"

Si ho usato i simboli per facilitare la lettura del programma e per identificare i byte di memoria del blocco dati che ho utilizzato ma non è esattamente il mio problema.

Il fatto di passare parametri alle SBR rimane comunque valido, puoi fare una SBR unica e richiamarla 1000 volte per fare 1000 "Contalenticchie".

riprendo il tuo esempio, facciamo conto che vi siano 10 piatti di lenticchie da contare e che voglia implementare un unico sottoprogramma per contarli contemporaneamente tutti. All'interno di ogni sottoprogramma uso sempre l'area di memoria "Contalenticchie" (VD100) quello che succede è che ad ogni conteggio ogni sottoprogramma incrementa l'area di memoria VD100 con il risultato che VD100 non conterrà le lenticchie di un singolo piatto ma di tutti i piatti contemporaneamente.

Quello che devo fare invece è contare diverse quantita di lenticchie su piatti diversi contemporaneamente, ora la soluzione, a mio parere rudimentale, che ho trovato è stata quella di predisporre a priori le aree di memoria dei contatori da utilizzare e clonare il sottoprogramma da me utilizzato andando a cambiare per ogni sottoprogramma le etichette dei contatori (vd100 il primo piatto, vd200 il secondo piatto ecc.).

La mia domanda è se esiste un sistema dinamico per gestire queste memorie (forse utilizzando i puntatori? la butto li) per esempio utilizzando un simbolo comune a tutti i sottoprogrammi "Contalenticchie" che in maniera trasparente indirizza una memoria globale distinta per ogni sottoprogramma (SBR1: "Contalenticchie" VD100, SBR2: "Contalenticchie" VD200, ecc.).

Quest'ultimo esempio so gia che non si puo fare perche' avrei una sovrapposizione di simboli, volevo sapere se esiste un sistema simile per implementarlo in modo da non dover mettere sempre le mani dentro il sottoprogramma.

Spero di essere stato piu' chiaro :P

ciao e grazie,

Enrico

Link al commento
Condividi su altri siti

Una SBR fatta bene, se vuoi usarla dovunque e più volte nello stesso programma, non deve avere operazioni che si "appoggiano" o scrivono dati direttamente nelle aree globali (V/M/A/T/Z).

Non so se ti sto dicendo cose che sai già, ma se hai fatto caso, sopra il codice del blocco c'è una "tendina" che puoi abbassare, lì dentro puoi definire le variabili IN / IN-OUT / OUT / TEMP.

La tua SBR quindi accetta e restituisce delle variabili dall'esterno (dal blocco chiamante).

Per cui se il tuo SBR1 "Contalenticchie" lo munisci di un parametro IN-OUT che si chiama "wConteggio" lo potrai richiamare 10 volte con variabili diverse...... p.es. al primo richiamo dichiari wConteggio=VW100, al 2° dichiari wConteggio=VW102, al 3° dichiari wConteggio=VW104 eccetera.

Dentro la SBR ci saranno le operazioni che vanno a scrivere su #wConteggio, ma dove va a finire il valore lo decide di volta in volta il blocco richiamante.

Quindi, se vuoi creare SBR "portabili" (utilizzabili su vari programmi) , non devi MAI inserire istruzioni che scrivono bit/byte/word/dword globali ma sempre utilizzare i parametri IN / IN-OUT / OUT / TEMP, le variabili saranno definite altrove (nel blocco chiamante).

Ciao

Link al commento
Condividi su altri siti

Evidentemente non ho sfruttato al massimo le potenzialita date dai parametri IN-OUT del sottoprogramma, mi metto a lavorarci sopra intanto grazie moltissime per la pazienza :lol:

Enrico

Link al commento
Condividi su altri siti

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