Vai al contenuto
PLC Forum


Generatore Di Impulsi


Messaggi consigliati

Inserito:

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


Inserita:

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.

Inserita:

grazie livio

cosa intendi alzi l'uscita attraverso una PAW

Inserita:

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.

Inserita:

grazie livio molto gentile domani provo

Inserita:
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

Inserita:

Si può fare anche l'assegnamento diretto:

L 100

T PAW24

oppure

L mb200

T PAB32

CIAo

Beppe

Inserita: (modificato)

Sì, ma così ne assegni

16

oppure

8

e lui ne doveva usare solo 1.

Ciao :)

Modificato: da JumpMan
Inserita:
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.

Inserita:
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

Inserita:

Avete ragione, mi era sfuggito che Puntalino voleva alzare una sola uscita.

CIAo

Beppe

Inserita:

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.

Inserita:

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

Inserita:

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.

Inserita:
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

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

Inserita:
Il sistema è semplice e collaudato.

Quoto e confermo per esperienza personale

Luca

Inserita:

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

Livio Orsini
Inserita:
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.

Inserita:

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

Inserita:

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.

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