Vai al contenuto
PLC Forum


'relais' Passo Passo


daddy.lee

Messaggi consigliati

Salve a tutti. Ho fatto un po di ricerca guasti su plc s5 circa 15 anni fa e poi, ho lasciato quel lavoro per fare qualcosa di completamente diverso.

A distanza di anni, ho acquistato un plc (cpu100) con tanto di cavo di programmazione e mi rendo conto che 15 anni sono davvero tanti.

Stavo cercando un sistema per attivare/disattivare un'uscita con un impulso su un solo ingresso (cio che di solito fa un relais passo/passo) e anche provando i suggerimenti trovati in un post di qualche anno fa, non riesco a farlo funzionare.

Il codice che ho inserito è il seguente

E0.0: PULSANTE

A1.0: LUCE

M0.0: APPOGGIO

U E 0.0

UN M 0.0

S A 1.0

U E 0.0

U M 0.0

R A1.0

***

UN E 0.0

U A 0.0

S M 1.0

UN E 0.0

UN A 0.0

R M 0.0

***

dove sbaglio??

Link al commento
Condividi su altri siti


dove sbaglio??

Dalle basi, purtroppo, amico mio.

A parte che nel secondo segmento hai settato M1.0 invece di M0.0, un sistema a processore logico esegue le istruzioni in maniera sequenziale ma ciclica, il che vuol dire che, governato dal tempo di ciclo della cpu, esegue l'interrogazione dell'immagine di processo degli ingressi, elaborazione del programma di governo, trasferimento dei dati dell'immagine di processo d'uscita alle uscite, ricominciando nuovamente.

A causa di questo, semplificando il discorso, il primo ciclo attiva l'uscita in base alle condizioni poste, il secondo la disattiva, il terzo la spegne, etc. facendo "sfarfallare" l'uscita, nel migliore delle ipotesi.

Dovresti utilizzare il controllo del fronte, che in Step5 non esiste come istruzione diretta ma con una sequenza d'istruzioni:

U E0.0

UN M1.0

= M0.0

------

U0.0

=M1.0

------

UM0.0

=A0.0

Cercando "toggle" forse troverai altre discussioni a riguardo.

Modificato: da busanela
Link al commento
Condividi su altri siti

Ho letto adesso la tua risposta e credo di aver capito cosa intendi. Il codice che hai postato, però, non mi è per niente chiaro.

per quanto riguarda il toggle invece, sul forum non ho trovato nessun post.

ma torniamo a noi. Premetto che a costo di sembrare rompi[at][at], preferisco capire la soluzione da intraprendere piuttosto che avere la 'pappa pronta'.

in che modo risolvo il mio quesito riconoscendo il fronte dell'impulso?

nel frattempo cerco di ritrovare qualcosa a riguardo: credo di averlo letto proprio pochi giorni fa.

grazie per la pazienza!

Link al commento
Condividi su altri siti

in che modo risolvo il mio quesito riconoscendo il fronte dell'impulso?

I primi 2 "segmenti"del codice che ti ho scritto sono la maniera canonica per la rilevazione del fronte con Step5; il terzo l'ho aggiunto per completare il tuo esempio. Mi sono accorto solo ora di aver saltato un operando, quindi il secondo segmento è:

U E 0.0

= M 1.0

La spiegazione è più o meno la seguente: ad ogni variazione da 0 a 1 del segnale d'ingresso 0.0 (fronte di salita) la combinazione AND è soddisfatta e I merker M 1.0 e M 0.0 vengono impostati. Nel successivo ciclo di elaborazione della cpu, il merker M 1.0 è impostato, quindi l'AND U E 0.0 con UN M 1.0 non è soddisfatto: M 0.0 presenta quindi lo stato 1 solamente durante un unico ciclo di elaborazione.

Link al commento
Condividi su altri siti

rieccomi. Ho capito il tuo codice e l'ho inserito nel mio ob1 (che è tra l'altro l'unico blocco esistente).

Premendo il pulsante (e0.0) l'uscita (a1.0) si accende e si rispegne anche se il pulsante rimane premuto...francamente non capisco perchè.

ho quindi provato a modificare il segmento 3 come segue:

u m 0.0 Fronte di salita

un a 1.0

s a 1.0

u m 0.0

u m 0.0

r a 1.0

L'uscita viene attivata al primo fronte di salita e poi...nulla più.

cercando in rete, ho letto di un codice scritto da più persone e che non funzionava su una singola macchina. purtroppo quando il problema è stato risolto, l'utente non ha spiegato come mai. potrebbe esserci un problema legato all'installazione del software?

Link al commento
Condividi su altri siti

u m 0.0 Fronte di salita

un a 1.0

s a 1.0

u m 0.0

u m 0.0

r a 1.0

Forse hai sbagliato a trascrivere quello che volevi dire: c'è una ripetizione senza senso di U M 0.0.

Comunque prova così il segmento 3:

U M 0.0

UN A 1.0

S A 1.0

--------

U M 0.0

U A 1.0

R A 1.0

Link al commento
Condividi su altri siti

//Generazione fronte di salita (che io sono abituato a fare in maniera leggermente diversa da quella canonica)

U E0.0

U M0.0

= M0.1

UN E0.0

= M0.0

//Toggle uscita

UN A0.0

U M0.1

O

U A0.0

UN M0.1

= A0.0

Link al commento
Condividi su altri siti

Scartabellando tra le vecchie carte dei programmi S5 ho trovato questo FB che mi ero fatto moolto ma moolto tempo fa per poter utilizzare più di un toggle all'interno di un programma:

FB 187

segmento 1

Nome :TOGGLE

sigla :INGR E/A/D/B/T/Z: E BI/BY/W/D: BI

sigla :FRON E/A/D/B/T/Z: E BI/BY/W/D: BI

sigla :IMPL E/A/D/B/T/Z: A BI/BY/W/D: BI

sigla :TOGL E/A/D/B/T/Z: A BI/BY/W/D: BI

:U =INGR

:UN =FRON

:= =IMPL

:S =FRON

:UN =INGR

:RB =FRON

:

:U =IMPL

:UN =TOGL

:S =TOGL

:RB =IMPL

:

:U =IMPL

:U =TOGL

:RB =TOGL

:BE

Quando lo vai a richiamare, imposta l'ingresso , le memorie di appoggio e l'uscita che preferisci.

Link al commento
Condividi su altri siti

rieccomi. in quest giorni ho avuto un po da fare e non ho potuto provare la soluzione che mi proponevi. ovviamente, c'è qualcosa che non mi torna. le funzioni non sono mai state il mio forte e se a questo si aggiungono 15 anni di astinenza, il risultato è intuibile!

ho ricopiato la fb che mi hai suggerito e l'ho richiamata da ob1 nel seguente modo:

spa fb1

nome: toggle

ingr e0.0

fron m0.0

impl m1.0

togl a1.0

ma il plc va in blocco.

Dico forse una castroneria: nel fb fron e impl sono dichiarati rispettivamente come ingresso e uscita. dove sbaglio stavolta?

davvero grazie per la pazienza

Link al commento
Condividi su altri siti

Le dichiarazioni degli operandi formali sono corrette così. Non so perchè la tua cpu "vada in blocco" (suppongo tu intenda in stop), bisognerebbe dare uno sguardo al registro delle interruzioni per risponderti, dato che non conosco esattamente la configurazione del tuo sistema o cosa hai caricato in esso: solo con OB1 ed un FB non dovrebbe. Prova comunque a dare un valore diverso all'FB1, magari FB100, e vedi come si comporta. Al limite posta il REG.IN.

Link al commento
Condividi su altri siti

Se devi fare un certo numero di "toggle", allora la soluzione di "busanela" con la FB dedicata è la migliore.

Continua su quella strada anche se vuoi semplicemente fare esercizio.

Se, invece, il tuo unico scopo è far funzionare un numero limitato di "toggle", ti conviene scrivere direttamente le poche righe di codice necessarie.

Link al commento
Condividi su altri siti

diciamo che vorrei creare un piccolo (oltre che inutile) impianto di domotica. il vero scopo e rimettere mano sui plc che non uso ormai da 15 anni circa...ma senza uno scopo preciso: semplice divertimento.

in ogni caso, i pulsanti che utilizzerò saranno una decina circa e la soluzione che preferirei adottare è quella della fb. non so se sei daccordo dato il numero di pulsanti, ma tornando a cio che ho detto prima, mi permettere di 'fare esercizio'.

tornando al problema invece, le poche (e peraltro semplici) righe di codice che busanella mi ha suggerito, non funzionano e non capisco il motivo. adesso sto provando con l'fb e ho lo stesso problema. quindi vorrei porre nuovamente una domanda: è possibile che ci sia un problema non nel codice (che ho ricopiato pari pari) ma nell'hw e/o nel software? eventualmente, come posso fare per scoprirlo?

Link al commento
Condividi su altri siti

le poche (e peraltro semplici) righe di codice che busanella mi ha suggerito, non funzionano e non capisco il motivo.

Cosa vuol dire non funzionano? La cpu va ancora in "blocco" (stop) o all'ingresso che attivi non corrisponde l'attivazione dell'uscita?

è possibile che ci sia un problema non nel codice (che ho ricopiato pari pari) ma nell'hw e/o nel software?

Dipende dal tipo di comportamento del malfunzionamento: se indirizzi ad un'ingresso od a una uscita che non esiste (ricorda che i moduli in S5 si numerano da 0 e si incrementano, non ricominciano dal byte 0 se cambi tipo di modulo come in S7), semplicemente non attivi l'ingresso/l'uscita corretta, ma non si pone in stop.

Solo il REG.IN., come ti ho detto, ti può aiutare se non puoi dare informazioni più precise.

Link al commento
Condividi su altri siti

non credo ci sia un errore di indirizzamenti. il plc è composto unicamente da cpu, scheda 8 input (e0.0 -->e0.7) e scheda 8 output (a1.0 --> a1.7).

il primo codice che mi hai proposto mi attiva l'uscita a1.0 quando premo il pulsante collegato in e0.0 ma non la disattiva alla seconda pressione dello stesso pulsante. per quanto riguarda il blocco fb (che mi manda in stop la cpu), cercherò nel pomeriggio di postare il reg.int.

a proposito: c'è un modo per copiarlo su file?

Link al commento
Condividi su altri siti

il primo codice che mi hai proposto mi attiva l'uscita a1.0 quando premo il pulsante collegato in e0.0 ma non la disattiva alla seconda pressione dello stesso pulsante. per quanto riguarda il blocco fb (che mi manda in stop la cpu)

Che cpu 100 stai utilizzando? Non sarà mica una 102? <_<

Link al commento
Condividi su altri siti

tornando al problema invece, le poche (e peraltro semplici) righe di codice che busanella mi ha suggerito, non funzionano e non capisco il motivo.

Ma hai provato anche il mio codice???

In quello di Busanela (non parlo della FB che non ho controllato) c'è un errore:

U M 0.0

UN A 1.0

S A 1.0

--------

U M 0.0

U A 1.0

R A 1.0

Nelle prime tre righe infatti, se l'uscita è OFF viene impostata ON con il fronte di salita (M0.0).

Ma le tre righe successive, sempre con lo stesso fronte di salita ora che l'uscita è ON, la resettano subito.

Il codice potrebbe essere modificato come segue:

U M 0.0

UN A 1.0

S A 1.0

R M 0.0

--------

U M 0.0

U A 1.0

R A 1.0

Oppure puoi provare con l'esempio che ho postato io (che sembra tu abbia completamente ignorato), che riporto nuovamente:

UN A0.0

U M0.0

O

U A0.0

UN M0.0

= A0.0

N.B.: in tutti gli esempi M0.0 è il fronte di salita.

Link al commento
Condividi su altri siti

In quello di Busanela (non parlo della FB che non ho controllato) c'è un errore

Hai ragione, m'era sfuggito!

L'FB invece ho fatto copia-incolla quindi è senz'altro corretto!

Ma hai provato anche il mio codice???
puoi provare con l'esempio che ho postato io (che sembra tu abbia completamente ignorato)

Dai Flavio, non te la prendere!! :D:P

Modificato: da busanela
Link al commento
Condividi su altri siti

batta, perdonami ma credo che il tuo post non lo avevo letto...tra le altre cose, funziona!!!

intanto grazie mille e ovviamente grazie anche a busanella per la pazienza.

questo week-end avrò un po da fare e non credo avrò tempo da dedicare a niente. il prossimo passo sarà duplicare la funzione per un secondo ingresso e una seconda uscita e utilizzare uno dei due pulsanti per spegnere entrambe le luci se premuto più di 2 secondi.

una sola domanda: se volessi salvare lo stato delle uscite, devo usare le db, giusto?

Link al commento
Condividi su altri siti

batta, perdonami ma credo che il tuo post non lo avevo letto...tra le altre cose, funziona!!!

... Hai visto Flavio? :lol:

il prossimo passo sarà duplicare la funzione per un secondo ingresso e una seconda uscita

Ma allora adesso funziona? Non manda più in stop la cpu? Se è così, cosa sbagliavi, allora?

Non so cosa intendi con "duplicare la funzione": l'FB che ti ho postato si utilizza tutte le volte che vuoi semplicemente richiamandolo con SPA o SPB da OB,PB,FB, inserendo gli operandi attuali, richiesti dal richiamo,che vuoi utilizzare in quel momento per quel dato pulsante/uscita.

una sola domanda: se volessi salvare lo stato delle uscite, devo usare le db, giusto?

Nei blocchi dati si salvano i dati, appunto, sotto forma di parole per un numero massimo di 256 ( da DW0 a DW255), quindi per salvare lo stato di un bit d'uscita, lo devi trasformare in stringa di bit della parola dello stato delle uscite e solo poi traferirlo nel DB.

Link al commento
Condividi su altri siti

si, mi sono espresso malissimo

la tua fb, mi manda il plc in stop. leggendo il post di batta, ho provato il suo codice e funziona! quindi penso che utilizzerò questo (anche se prima o poi, cercherò di capire il problema della fb)

quando ho detto che avrei duplicato la funzione quindi mi riferivo a quella di batta anche se mi rendo conto che la tua soluzione sarebbe più elegante e più pratica.

per il momento è tutto! vi auguro un felice week-end!

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