Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Primo Approccio Step 7 - Utilizzo della stessa uscita?


Messaggi consigliati

Inserito:

Salve a tutti, da qualche giorno seguo questo forum e ho iniziato anche a dare un occhiata allo Step7.

Sto cercando di realizzare la prima applicazione, con molte difficoltà non avendo nozioni per questo tipo di programmazione, ma pian pino sto risolvendo i vari problemi che riscontro.

Vengo all’inghippo, sto cercando di realizzare lo schema del semaforo, di seguito il progetto prefissato:

Accensione impianto (RUN)---> Nessun Azione

RUN su E0.0 ---> Tutte le lanterne gialle lampeggiano con intermittenza di un secondo.

RUN su E0.1 ---> Reset di E0.0 e delle funzioni annesse + Avvio Automatismo

1 Passo ---> Tutte le lanterne rosse si accendono per x tempo

2 Passo ---> In una direzione si accendono le lanterne verdi l’altra rimane il rosso.

3 Passo ---> Accensione giallo su verde dopo x tempo dall’accensione del verde.

4 Passo ---> MI SONO INCEPPATO.

Nel 4° passo dovrei accendere il Rosso sul Giallo/Verde che spengo e far partire il Verde nell’altra direzione.

SEGMENTO 8:

      U     T      3
      L     S5T#5S
      SE    T      4
      NOP   0
      NOP   0
      NOP   0
      U     T      4
      R     A      0.1
      R     A      0.2
      R     A      0.6
      R     A      1.1
      R     A      1.2
      R     A      1.6
      =     A      0.3 ???????????????? Lanterna Rossa 1 da accendere.
      =     A      0.4
      =     A      1.3 ???????????????? Lanterna Rossa 2 da accendere.
      =     A      1.4
Quando inserisco l’accensione delle lanterne nel segmento 8 mi va in tilt il 1° Passo, cioè all’avvio le lanterne A0.3 e A1.3 non si accendono più per il tempo x. Premetto le due A0.3 e A1.3 vengono resettate nel SEGMENTO 6:
      U     E      0.1
      L     S5T#5S
      SE    T      2
      NOP   0
      NOP   0
      NOP   0
      U     T      2
      R     A      0.3
      R     A      1.3
      =     A      0.1
      =     A      1.1

Essendo ai primissimi passi, l’unica spiegazione che riesco a darmi è che non è possibile usare due uscite da due punti diversi del programma?

Dove sbaglio?

Ringrazio anticipatamente per l’aiuto.

P.S. ripeto è il primo approccio, non sono neanche riuscito ad utilizzare il merker di clock per il lampeggiamento :wallbash: , però sono riuscito ad impostarne il valore :D .


Inserita:
l’unica spiegazione che riesco a darmi è che non è possibile usare due uscite da due punti diversi del programma?

Infatti, non va bene.

Senza entrare nello specifico del codice da te implementato, se vorresti comandare la stessa uscita da diversi segmenti o punti del programma , appoggiati piuttosto su delle merker e poi efettua una assegnazione logica sulla uscita.

Esempio :

U E 2.0
= M 0.0

U E 1.0
= M 0.1

O M 0.0
O M 0.1
= A 0.0

Inserita:

Grazie della tempestiva risposta Savino.

Proverò a risolvere diversamente, usando altre uscite, poichè ritengo sia più semplice (per me), per il momento voglio solo iniziare a comprendere il funzionamento, senza addentrarmi troppo in tutte le potenzialità di questo linguaggio, questo per non scoraggiarmi prima di aver iniziato.

Inserita:
Proverò a risolvere diversamente, usando altre uscite

Non devi usare altre uscite (e poi che faresti, le cableresti in parallelo?).

Segui il consiglio di Savino.

Non si tratta di fare cose complicate ma, anzi, di semplificarle.

L'utilizzo di merker di appoggio è essenziale, è alla base della programmazione di un plc. Di qualsiasi plc.

Inserita:

Grazie batta della risposta.

Ho seguito il vostro consiglio, ho cercato di utilizzare i merker ma continua a non funzionare, ecco riassumendo cosa ho fatto:

Segmento 1:
---> E1.0 ON, E0.2 OFF
U     E      1.0      // Valore 0000_0001
=     M      5.1      // Valore 0000_0010

U     M      5.1      // Valore 0000_0010
=     A      0.3      // Valore 0000_0000 --->???
=     A      0.6      // Valore 0000_0000 --->???
Segmento 2:
---> E1.0 OFF, E0.2 ON
U     E      2.0      // Valore 0000_0001
=     M      5.2      // Valore 0000_0100


U     M      5.2      // Valore 0000_0100
=     A      0.3      // Valore 0100_1000
=     A      0.6      // Valore 0100_1000

Il problema persiste quando inserisco A0.3 e A0.6 nel E0.2 ON il primo non funziona più.

A0.3 e A0.6 sono le lampade gialle, nei segmenti della E0.1, con due timer si accendono e si spengono ad intervalli regolari, nei segmenti della E0.2 che riguarda l’automatismo si accendono una volta A0.3 sul verde e l’altra è spenta e viceversa.

I merker sono diversi su due diverse uscite.

Dove sbaglio?

L’esempio proposto da Savino funziona alla perfezione.

Inserita:

è sempre un'uscita doppia a0.3 e a0.6 sono nei due segmenti

Inserita:

Ciao ken, grazie dell’intervento, segmenti sono più di due, in diversi punti richiamo A0.3 e A0.6 usando i merker, ma funziona solo all’ultimo richiamo, i precedenti vengono annullati dall’ultimo anche se si trova in OFF.

Inserita: (modificato)

I merker di appoggio ti servono proprio per evitare di richiamare più volte la stessa uscita.

Se tu ad una uscita dici dieci volte di accendersi, e poi, come ultimo comando, le dici di spegnersi, tu la vedrai sempre spenta.

O meglio, se interroghi l'immagine delle uscite nel programma, la vedi accesa.

Ma l'aggiornamento fisico dello stato dell'uscita viene fatto una sola volta a fine elaborazione programma.

Quindi, l'uscita sarà sempre spenta.

E questo non vale solo per Siemens, ma per tutti i plc.

Del resto, prova a chiederti: come farebbe il plc a sapere quale istruzione tu vorresti eseguire e quale invece vorresti ignorare?

Il plc (se non si effettuano salti) esegue tutte le istruzioni che tu scrivi e, se nell'ultimo segmento hai detto alle uscite che devono spegnersi, si spegneranno, indipendentemente da quante volte tu, prima abbia comandato l'accensione.

Tieni presente che il fatto che nell'ultimo segmento lo stato dell'ingresso sia OFF, non significa che le istruzioni in esso contenute debbano essere ignorate, ma significa che stai comandando lo spegnimento delle uscite.

Se così non fosse, come faresti a spegnerle?

Il tuo codice dovrebbe diventare come segue:

Segmento 1:
---> E1.0 ON, E0.2 OFF
U E 1.0 
= M 5.1

Segmento 2:
---> E1.0 OFF, E0.2 ON
U E 2.0 
= M 5.2

Segmento 3:
O M 5.1
O M 5.2
= A 0.3
= A 0.6
Anzi, nel caso specifico di questo esempio, sarebbe sufficiente:
Segmento 1:
O E 1.0
O E 2.0
= A 0.3
= A 0.6

Chiaro, ora?

Modificato: da batta
Inserita:

Ne deve passare acqua sotto i ponti ( = codice per le mie mani).

Era proprio questo che mi portava in errore.

|

| E0.0

| ---| |----------------------( )

|

|---

|

|---

| E0.1

|---| / |----------------------( )

|

|

Credevo proprio che il programma partisse dal primo ON che riceveva, escludendo il codice non "Alimentato", non tenendo conto delle uscite che incontrava nei segmenti di E0.0.

Grazie batta, tutto chiaro e applicando il tuo esempio funziona correttamente.

Inserita:

Finalmente ho terminato questo piccolo progetto, tutto sembra funzionare alla perfezione, le lanterne rispettano i tempi.

L’ultimo problema che risulta è la creazione del ciclo continuo.

L’automazione avviene abilitando la E0.1 e si svolge dal Segmento 4 al 10.

Giustamente all’ultimo segmento il programma termina, è possibile creare un ciclo dal segmento 4 al segmento 10 che si ripeta fin quando la E0.1 resta abilitata?

Inserita:

E' sufficiente un salto condizionato all'etichetta in segmento 4, se l'RLC di E0.1 è 1.

Inserita:

Grazie busanela, dopo un paio d’ore di manuale sono giunto alla seguente conclusione

U M 1.1

SPB PNO1

Ora tutto funziona, anche il ciclo e perfetto.

Noto solo un piccolo particolare, i merker che ho usato, durante il ciclo del programma di tanto in tanto vengono attivati per un istante e poi si disattivano, non provocando nessun azione sulle uscite.

Praticamente i merker che comandano le uscite in quel momento restano fissi mentre qualche altro che non è utilizzato in quel momento è come se ricevesse un impulso per un tempo brevissimo.

È una cosa normale?

Sul manuale ho letto (ma non ancora approfondito l’argomento) che i bit di merker da MB0 a MB16 sono detti ritentivi per alcune CPU, potrebbe essere questo il problema?

Inserita:
Sul manuale ho letto (ma non ancora approfondito l’argomento) che i bit di merker da MB0 a MB16 sono detti ritentivi per alcune CPU, potrebbe essere questo il problema?

Ho cambiato il valore dei merker utilizzando un numero superiore al 16, il problema non si presenta più.

Ringrazio tutti per i preziosi consigli.

Inserita:

Sul manuale ho letto (ma non ancora approfondito l’argomento) che i bit di merker da MB0 a MB16 sono detti ritentivi per alcune CPU, potrebbe essere questo il problema?

Ho cambiato il valore dei merker utilizzando un numero superiore al 16, il problema non si presenta più.

il MB0 se non lo ai modificato nella config hw e quello dedicato ai clock

basta non usarlo come merker nel sw

Inserita:

Volendo creare una sorta di pannello operatore per il programma del PLC (simulato senza PLC),ho creato una maschera in visual basic e collegata al simulatore, se interessa, al seguente link vi è un video dimostrativo:

niente di speciale, un incrocio con semafori.

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