Vai al contenuto
PLC Forum


Funzione 1200 salta indietro


ANTONIO PLC

Messaggi consigliati

Buongiorno mi ritrovo a scrivere dei segmenti con tia portal  per una cpu s7 1200, avrei necessità di saltare indietro  con il numero   di segmenti  , cioè il contrario della funzione jmp (salta in avanti ) vi è questa possibilità , o una funzione che mi è sfuggita di vedere ?

Un anticipato grazie a chi mi offre una delucidazione in merito.

Link al commento
Condividi su altri siti


  • Risposte 53
  • Created
  • Ultima risposta

Top Posters In This Topic

  • ANTONIO PLC

    17

  • Livio Orsini

    14

  • step-80

    9

  • batta

    5

Top Posters In This Topic

Posted Images

1 ora fa, ANTONIO PLC ha scritto:

avrei necessità di saltare indietro  con il numero   di segmenti  , cioè il contrario della funzione jmp (salta in avanti )

 

A parte ogni considerazione sulla raffinatezza della soluzione, l'istruzione di salto ha come destinazione una locazione memoria. Può essere una locazione fisica assoluta o una locazione simbolica, ovvero un'etichetta (label). Al compilatore non importa se l'indirizzo attuale del program counter si minore, quindi salto in avanti, o maggiore, quindi salto all'indietro.

Un'isrtruzione "jump" esegue sempre un salto incondizionato all'indirizzo di memoria specificato.

Link al commento
Condividi su altri siti

Grazie sig.Livio "salto indietro "   l'ho chiamato per essere molto concreto nello spiegarmi.In poche parole ad un certo punto mi servirebbe una funzione che ritorni indietro con  i segmenti . Ho provato con la funzione jump ma quando inserisco l'etichetta(label) prima della funzione (jmp) la CPU va in stop.

Link al commento
Condividi su altri siti

3 minuti fa, ANTONIO PLC ha scritto:

Ho provato con la funzione jump ma quando inserisco l'etichetta(label) prima della funzione (jmp) la CPU va in stop.

 

Non conosco la sintassi del del compilatore del 1200, però solitamente la label va dopo l'istruzione jump. Esempio " jump   L0010", poi in testa alla riga dove vuoi che salti sim mette "L0010:   "

 

Però sono anni che non si usa più una simile architettura di programma. Dall'avvento dei linguaggi strutturati i salti non sono praticamente più usati.

Link al commento
Condividi su altri siti

zanellatofabio
7 minuti fa, ANTONIO PLC ha scritto:

prima della funzione (jmp) la CPU va in stop

E non ti sei chiesto perchè va in stop?

Prova a pensare cosa fa l'esecuzione del programma....

Link al commento
Condividi su altri siti

46 minuti fa, ANTONIO PLC ha scritto:

quando inserisco l'etichetta(label) prima della funzione (jmp) la CPU va in stop.

è probabile che non ci sia una uscita dal "loop" tra etichetta e jump, oppure questo "loop" porta la cpu a superare il tempo ciclo massimo impostato. 

Situazione che dovresti comunque vedere nella cronologia  degli errori della cpu.

Link al commento
Condividi su altri siti

Grazie drn5 ,si ho provato ad aumentare il tempo del ciclo  ma non accade nulla .Premetto che sono un autodidatta,,cerco di spulciare dappertutto pero' alcune volte dovo chiedere" l'aiuto da casa".😀

Ritornando al programma che sto scrivendo , sto utilizzando il metodo classico del merker di passo  credevo che non essendoci una continuita` nel segmento la funzione (jamp )non veniva eseguita .

Ti spiego cosa dovrei fare : Si tratta di una confezionatrice verticale che imbusta taralli ,o altro .Avviando la  confezionatrice  il film  (materiale polipropilene) viene trainato da n.2 cinghioli la misura del film viene letta da un encoder ,al raggiungimento della misura impostata  parte la barra saldante verticale  ecc.  Il problema nasce (per me)  quando dovrei far ripartire il motore che trina il film e ripetere la lettura dell'encoder e risaldare con la barra verticale. Questa funzione di doppio traino serve quando vado ad aumentare la grammatura del prodotto nella confezione  ad esempio se passo da gr 200 a gr 500.Spero di esseremi spiegato bene . 

Link al commento
Condividi su altri siti

Il tempo non toccarlo, va bene quello di default. credo 150msec, ma anche meno.

 

Mi sembra di capire che stai lavorando a "stati".

Allo stato 1 fai una cosa, al 2 un'altra e così via....magari per 100 o 200 stati... quello che serve...

Lavori in Ladder (immagino) o in SCL?

In qualunque caso il jump dimenticalo proprio, fatti dei blocchi che eseguono operazioni semplici e in base allo stato entraci ed escici continuamente fino a quando non si è realizzato il risultato dell'operazione che ti aspetti per quello stato. Solo a questo punto incrementi lo stato e passi al successivo.

Per esempio se stai aspettando una certa lettura dall'encoder non devi rimanere in quel FC/FB fino a quando hai letto il valore che ti interessa. Ci entri , leggi e se non hai raggiunto il valore corretto esci senza modificare lo stato, sennò incrementi lo stato ed esci...

 

E' più difficile spiegarlo che farlo.

In un progetto come quello che descrivi il tempo ciclo del tuo programma potrebbe essere di tranquillamente di 30/40 mSec. Giusto per dare un numero...

 

 

 

Link al commento
Condividi su altri siti

6 ore fa, drn5 ha scritto:

In qualunque caso il jump dimenticalo proprio,

 

Al di la dello stile di programmazione un'istruzione di salto incondizionato deve comunque funzionare senza problemi. Se la CPU si blocca deve essereci una ragione e questa ragiione deve essere capita. Poi si potrà anche usare uno stile di programmazione più funzionale ede legante.

 

10 ore fa, ANTONIO PLC ha scritto:

si ho provato ad aumentare il tempo del ciclo  ma non accade nulla

 

Lascia stare il tempo di ciclo che non c'entra nulla a meno di enttare inun loop perverso, ma in questo caso non lo risolvi aumentando il tepo di ciclo.

Pubblica uno screen shot del pezzo di programma dove hai l'ìistruzione di salto, così si può capire dove c'è l'inhippo.

Link al commento
Condividi su altri siti

Il 6/11/2023 alle 15:25 , drn5 ha scritto:

Senza offesa....Spaghetti code all'ennesima potenza!

Non è del tutto vero. In AWL, quando si esegue un loop, si fa un salto indietro. Ma anche in strutturato un ciclo For-Next non è altro che un salto indietro, così come anche Until e While.
L'unica differenza è che con queste istruzioni è più difficile combinare pasticci con un salto all'indietro all'infinito, che non può che avere come conseguanza lo stop della CPU.

 

21 ore fa, ANTONIO PLC ha scritto:

Il problema nasce (per me)  quando dovrei far ripartire il motore che trina il film e ripetere la lettura dell'encoder e risaldare con la barra verticale.

Ma perché devi fare un salto all'indietro? Il programma di un PLC deve sempre girare, non lo puoi bloccare in una routine. Pensa alle conseguenze: finché tu stai ciclando nelle istruzioni all'inerno del salto all'indietro, chi controlla tutto il resto della macchina? Sarebbe una situazione estremamente pericolosa, per questo in tutti i PLC esiste il watch dog che manda in stop la CPU se si supera il tempo di ciclo impostato.
Non ho idea di come tu abbia svluppato il software ma, quel salto all'indietro, scordatelo, non farlo mai più.

Link al commento
Condividi su altri siti

Grazie drn5 ,si ho provato ad aumentare il tempo del ciclo  ma non accade nulla .Premetto che sono un autodidatta,,cerco di spulciare dappertutto pero' alcune volte dovo chiedere" l'aiuto da casa".😀

Ritornando al programma che sto scrivendo , sto utilizzando il metodo classico del merker di passo  credevo che non essendoci una continuita` nel segmento la funzione (jamp )non veniva eseguita .

Ti spiego cosa dovrei fare : Si tratta di una confezionatrice verticale che imbusta taralli ,o altro .Avviando la  confezionatrice  il film  (materiale polipropilene) viene trainato da n.2 cinghioli la misura del film viene letta da un encoder ,al raggiungimento della misura impostata  parte la barra saldante verticale  ecc.  Il problema nasce (per me)  quando dovrei far ripartire il motore che trina il film e ripetere la lettura dell'encoder e risaldare con la barra verticale. Questa funzione di doppio traino serve quando vado ad aumentare la grammatura del prodotto nella confezione  ad esempio se passo da gr 200 a gr 500.Spero di esseremi spiegato bene . 

confezionatrice 123_page-0002.jpg

confezionatrice 123_page-0003.jpg

confezionatrice 123_page-0001.jpg

Link al commento
Condividi su altri siti

Grazie drn5 ,si ho provato ad aumentare il tempo del ciclo  ma non accade nulla .Premetto che sono un autodidatta,,cerco di spulciare dappertutto pero' alcune volte dovo chiedere" l'aiuto da casa".😀

Ritornando al programma che sto scrivendo , sto utilizzando il metodo classico del merker di passo  credevo che non essendoci una continuita` nel segmento la funzione (jamp )non veniva eseguita .

Ti spiego cosa dovrei fare : Si tratta di una confezionatrice verticale che imbusta taralli ,o altro .Avviando la  confezionatrice  il film  (materiale polipropilene) viene trainato da n.2 cinghioli la misura del film viene letta da un encoder ,al raggiungimento della misura impostata  parte la barra saldante verticale  ecc.  Il problema nasce (per me)  quando dovrei far ripartire il motore che trina il film e ripetere la lettura dell'encoder e risaldare con la barra verticale. Questa funzione di doppio traino serve quando vado ad aumentare la grammatura del prodotto nella confezione  ad esempio se passo da gr 200 a gr 500.Spero di esseremi spiegato bene . 

Link al commento
Condividi su altri siti

Il problema lo trovo al segmento n.5 dove dovrei ritornare a far ripartire l'encoder  tramite l'uscito q0.0  ripetere il conteggio del contatore, azzerarlo , e ripartire dal segmento 5 dove avviene  nuovamente la saldatura verticale ed il proseguo del programma .

Link al commento
Condividi su altri siti

Scusa ma io non vedo l'istruzione jump nelle righe che hai pubblicato.

Comunque da quello che hai spiegato se metti un jump incondizionato non sci più, e la cpu continuerà a girare all'interno di quell'anelllo chee crei.

Il jump lo devi condizionare; ad esempio devi mettere la condizione di un merker: se il merker è alto salti altrimenti no.

Link al commento
Condividi su altri siti

Grazie  delle risposte , per il Sig. Livio la funzione jmp non mi dava lo svolgimento del salto e come già menzionato sopra ,mi bloccava la Cpu.Per questo ho  chiesto al forum se la funzione poteva essere una soluzione.

Per max Bocca , dovrei utilizzare delle nuove variabili ? Come  potrei  azzerare il contatore per la seconda volta se ID1000 del contatore  è univoco ? Ma funzione svolgi e salda come viene chiamata esattamente?

 

Link al commento
Condividi su altri siti

@ANTONIO PLC

 

credo tu abbia confuso il 'salto indietro' con il semplice fatto di reiterare una azione sino al raggiungimento di una determinata condizione (ovvero una sequenza). 

 

Aprendo gli screenshot, senza entrare nel merito della programmazione, la prima cosa che mi salta agli occhi è l'uso della bobina 'Q0.0' 

image.thumb.jpeg.e598c2947177cab0a0b83907e665a062.jpeg

 

usata anche in ingresso(?) al blocco CTRL_HSC. Vedendo solo queste 2 righe, non mi stupisce tanto che la cpu vada in Stop, ma che la stessa si metta in Run 😆.

Scherzi a parte, se descrivi per bene le fasi della tua applicazione, magari riusciamo ad aiutarti a fare un po' di chiarezza. 

 

Dimmi se ho capito bene: la barra saldante verticale ha una lunghezza ridotta e, per riuscire a formare sacchetti più lunghi, esegui il traino 2 volte prima di saldare orizzontalmente e dosare il prodotto. Giusto? 

Se è cosi devi ragionare per fasi: Qual'è la fase che si ripete? Secondo me il motore di traino, la lettura encoder con relativo stop motore e la saldatura verticale. 

Se la devi eseguire 2 volte, basta che al termine incrementi un contatore che all'inizio avevi azzerato. Se contatore == 2, azzeri , dosi i taralli e saldi orizzontalmente.

Modificato: da step-80
Link al commento
Condividi su altri siti

36 minuti fa, ANTONIO PLC ha scritto:

funzione jmp non mi dava lo svolgimento del salto e come già menzionato sopra ,mi bloccava la Cpu.Per questo ho  chiesto al forum se la funzione poteva essere una soluzione.

 

Si, ma se non mostri come e dove l'hai scritta non si può capire perchè ti blocca!

 

Ripeto al di la delle varie soluzioni possibili l'istruzione jump deve funzionare!

Poi, ripeto da quello che hai descritto, questa istruzione non può essere incondizionata, ma deve essere esguita se, e solo se, esistono le condizioni, in modo da poter uscire dal loop.

Qui trovi un esempio di uso dell'istruzione JUMP con TIA PORTAL

 

 

 

 

 

 

Link al commento
Condividi su altri siti

22 minuti fa, step-80 ha scritto:

credo che la causa dello stop sia proprio un salto incondizionato che fa superare il tempo di watchdog.

 

Se accade questo è perchè il programma entra in loop.

Prorpio per questo motivo ho chiesto che pubblicasse il codice.

Link al commento
Condividi su altri siti

Se mi posso permettere, io vedo solo un grande pasticcio.
Prima cosa: anche se funziona lo stesso, usare le uscite come passi del ciclo è da evitare.
Per i passi del ciclo usa memorie interne (merker, variabili di un DB, oppure variabili STAT di una FB) e solo alla fine, a seconda del passo attivo, comandi le uscite.
Poi c'è una gestione incomprensibile del blocco CTRL_HSC e dell'uscita Motore_Traino.
Nel segmento 1 comandi "MOTORE_TRAINO" con ritardo da F1_START_ENCODER".
Ma nel segmento 2 comandi MOTORE_TRAINO in modo incondizionato e, se non ci sono errori nell'esecuzione di CTRL_HSC, alla fine del segmento 2 MOTORE_TRAINO sarà sempre alta.
Nel segmento 4 MOTORE_TRAINO si resetta se è alta CTRL_HSC_1_DB.CV.
Poi si trova un altro SET di MOTORE_TRAINO nel segmento 10.
Insomma, più pasticcio di così, non si può.

 

Poi c'è CTRL_HSC_1_DB.CV che non si capisce cosa vorresti farle fare.

Nel seg.10 c'è un impulso di SET, nel seg. 2 è collegata come ingresso a sé stessa, nel seg.3 c'è un ulteriore set se è in range.

 

Poi, mi sono perso.

Link al commento
Condividi su altri siti

@batta somiglia al primo programma che ho scritto 😂.

 

Ma devo ammettere che no, non era a questi livelli di casinismo..qui sembra che sia esploso un foglio con dei contatti a caso e che si siano attaccati qui e la nei segmenti. 

 

Una cosa è chiara: questo 'motore traino' deve essere senz'altro importante, visto che viene richiamato in ogni segmento 😃

Link al commento
Condividi su altri siti

Io ritengo che se si vuole aiutare un principiante ad imparare è inutile discettare di linguaggi e strategie.

La cosa migliore da fare è che lui spieghi chiaramente cosa vuole realizzare e che mostri come ha fatto, poi si parte dal suo elaborato cercando i punti critici e cercando di insegnare sia come risolvere gli errori sia come va approcciato il problema.

però bisogna che anche chi ha posto il problema collabori stando sul pezzo e rispondendo alle domande, non iniziando a divagare o tentare nuove strade.

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