Vai al contenuto
PLC Forum


Generatore Di Impulsi


puntalino

Messaggi consigliati

ho il seguente problema se qualcuno può darmi una mano premetto per motivi di tempo non ho usato la funzione cerca e il manuali

il mio problema è di alzare una uscita almeno 30-40 volte al secondo la cpu è una 312c il tempo attuale di ciclo è < a 5 secondi

grazie a tutti

Link al commento
Condividi su altri siti


Programma un timer nell'OB35, per esempio da 25ms se ti servono 40 commutazioni, 33 ms se te ne servono 30. Ad ogni interruzione alzi l'uscita attraverso una PAW. Ovviamente l'uscita deve essere di tipo statico.

Attenzione che le uscite hanno comunque un ritardo Hw di qualche ms.

Link al commento
Condividi su altri siti

Normalmente, quando si scrive su un'uscita o si legge un ingresso, non si accede direttamente alla periferia ma alla sua tabella immagine; al termine di ogni ciclo la CPU aggiorna le uscite con il contenuto delle tabelle immagine di uscita e trasferisce lo stato degli ingressi nella realtiva tabella.

Se si vuole accedere direttamente alla periferia si usa l'istruzione PEW x.x per leggere e PAW x.x per scrivere.

Link al commento
Condividi su altri siti

l'istruzione PEW x.x per leggere e PAW x.x per scrivere.

non credo che si possa fare direttamente ( ma mi piacerebbe sapere come si fa' se possibile )

io lo ho fatto facendo l'uscita poi aggiornando il byte

faccio la q10.1 ( iimmagine )

poi

L qw10 ( immagine )

T pqw10 ( uscite fisiche )

Ciao

Luca

Link al commento
Condividi su altri siti

Sì, ma così ne assegni 16 oppure 8

e lui ne doveva usare solo 1.

Usando una maschera (And e/o Or) modifichi solo il bit che ti serve.

Link al commento
Condividi su altri siti

L 100

T PAW24

oppure

L mb200

T PAB32

in questo caso ti serve una maschera

L qw10 ( immagine )

T pqw10 ( uscite fisiche )

in questo caso non ti serve niente , poiche' le uscite che non ti interessano ma c'e' altro attaccato , vengono comunque impostate in base all'immagine delle uscite

quindi ti fai immediatamente l'immagine dell'uscita che ti serve , poi aggiorni tutto il byte

Luca

Link al commento
Condividi su altri siti

Leggere per leggere è più affidabile leggere lo stato fisico della word di uscita tramite PEW, fare OR con tutti zero tranne il bit interessato e scrivere il risultato tramite PAW (3 istruzioni) Idem per resettare il bit: AND con tutti 1 tranne il bit.

Link al commento
Condividi su altri siti

grazie a tutti oggi ho scritto 4 righe di programma e sembrava che funzionava tutto

invece stasera mi sono accorto che a volte al posto di avere un treno di impulsi mi rimangono tutte a 1 fisse ormai erano le 19 ho controllato il tutto ma mio parere grossi problemi non ci sono ma il bello doveva ancora arrivare ad un certo punto spengo il pc faccio gli ultimi due test a pc spento mi ritrovo al posto del treno di impulsi le uscite sempre alte o basse non so dove sto sbagliando vi allego le quattro righe di programma

UN "A 0.5"

SPB M2

L 0

T PAB 5

U "A 0.1"

UN T 9

L S5T#10MS //variando il timer vario la frequenza degli impulsi

SS T 9

U T 9

SPB M003

// UN "A 0.5"

// SPB M2

BEA

M003: L 500

T PAB 5

CLR

R T 9

L MW 14

L 1

+I

T MW 14 //conto gli impulsi inviati all'uscita

BEA

M2: L 0

T PAB 5

il tutto scritto in ob35 in configurazione hardware abilitato ogni 15 ms il tempo ciclo della cpu è inferiore a 5 ms

Link al commento
Condividi su altri siti

Gestire l'uscita in OB35 serve per ottenere un treno di impulsi regolare.

Se poi in OB35 utilizzi un timer, non ha più senso usare OB35.

Ci sono poi altre cose che proprio non capisco.

Per esempio:

L 500

T PAB5

Cosa vorresti ottenere con queste istruzioni?

Ed ancora:

CLR

R T9

Che senso ha mettere l'istruzione di Reset Timer dopo CLR?

Così il reset non verrà mai eseguito.

Prova, sempre in OB35, ad inserire le seguenti istruzioni:

      UN    A      5.0                  //Leggi stato attuale immagine
      =     A      5.0                  //uscita A5.0 ed inverti stato
      L     AB     5                    //Leggi immagine byte uscite AB5
      T     PAB    5                    //Aggiornamento immediato uscite

Ad ogni esecuzione di OB35 l'uscita A5.0 cambierà di stato.

Configurando esecuzione di OB35 ogni 15ms, ottieni un'onda quadra con frequenza 33,333Hz

Le altre uscite rimangono utilizzabili normalmente.

Unico "effetto indesiderato" è che tutte le uscite del byte verranno aggiornate immediatamente all'esecuzione di OB35, e non solo a fine scansione.

Link al commento
Condividi su altri siti

Unico "effetto indesiderato" è che tutte le uscite del byte verranno aggiornate immediatamente all'esecuzione di OB35, e non solo a fine scansione.

Si, ma a parte 5.0 non cambiano di stato

Link al commento
Condividi su altri siti

Si, ma a parte 5.0 non cambiano di stato

Se con questo intendi dire che non vado a modificare lo stato eventualmente assegnato da programma alle altre 7 uscite, sì.

Ed è proprio questo che mi permette di utilizzarle ancora

In OB35 modifico solo l'immagine dell'uscita A5.0, poi leggo l'immagine di tutte le 8 uscite, ed effettuo l'aggiornamento immediato dello stato fisico delle 8 uscite, copiando il valore dell'immagine sulla periferia.

Il sistema è semplice e collaudato.

Link al commento
Condividi su altri siti

GRAZIE A TUTTI

bata

il timer lo usato per poter regolare la quantità degli impulsi per non modificare sempre il richiamo di ob35 nella configurazione hardware

Ho scritto 500 perche dovevo abilitare diverse uscite contemporaneamente

Perché clr non resetta il timer devo mettere prima clr e poi il comando da resettare o mi sto perdendo

Se sbaglio mi puoi spiegare dove sbaglio

L’errore era

L0

T pab5

Comunque ho utilizzato il tuo esempio è molto piu snello

Link al commento
Condividi su altri siti

Livio Orsini
Se con questo intendi dire che non vado a modificare lo stato ..

Si è proprio quello che intendevo e che uso di norma. Ho citato l'istruzione PAW invece della PAB solo perchè è quella che mi viene in mente subito.

Link al commento
Condividi su altri siti

Se usi un timer per poter modificare la frequenza degli impulsi, allora non ha più alcu senso usare OB35.

La programmazione in OB35 serve se vuoi avere impulsi regolari, che non risentano della scansione del plc.

Se in OB35 condizioni poi delle operazioni allo stato di un timer, non solo perdi i vantaggi derivanti dall'utilizzo di un OB a tempo, ma addirittura peggiori la situazione.

Immagina di aver appena eseguito OB35, e al tuo timer mancava 1 solo millisecondo per arrivare a fine conteggio. In questo ciclo di OB35 non esegui le funzioni legate al timer, e dovrai aspettare la prossima esecuzione di OB35 per accorgerti che il tempo è scaduto.

Se non ti serve grande precisione e se la tua scansione è breve, allora usa pure il timer, ma non in OB35.

Perché clr non resetta il timer devo mettere prima clr e poi il comando da resettare o mi sto perdendo

Se sbaglio mi puoi spiegare dove sbaglio

L'istruzione CLR imposta l'RLC su FALSE.

Scrivere

CLR

R Txxx

equivale a scrivere: non resettare il timer

E' come se scrivessi:

U M0.0

R Txxx

quando M0.0 è OFF.

Se vuoi forzare il reset del timer devi scrivere:

SET

R Txxx

Oppure:

CLR

SE Txxx

Link al commento
Condividi su altri siti

Un altro sistema, sempre senza utilizzo di ob a tempo, potrebbe essere il seguente, che utilizza la variabile locale "#OB1_PREV_CYCLE"

      L     MW   100                    //Leggo valore attuale tempo trascorso
      L     #OB1_PREV_CYCLE             //leggo tempo ultima scansione
      +I    
      T     MW   100                    //Aggiorno tempo trascorso
      L     MW   102                    //Calcolo quanto tempo è trascorso dall'ultimo evento
      -I    
      L     15
      <I                                //Attendo che passino almeno 15 ms
      SPB   M000
      UN    A      5.0                  //Toggle uscita
      =     A      5.0

      L     MW   102                    //Incremento memoria per confronto di 15 millisecondi
      +     15
      T     MW   102
M000: NOP   0

Queste istruzioni devono tassativamente essere in OB1. Se le vuoi scrivere da qualche altra parte, in ob1 devi appoggiare la variabile locale OB1_PREV_CYCLE ad una variabile visibile da tutto il programma.

Questo sistema è più preciso di quello basato sul timer, ma per avere una buona regolarità degli impulsi il tempo di scansione deve essere abbondantemente più breve del semiperiodo (15ms nell'esempio) dell'onda quadra che vuoi ottenere.

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