ANTONIO PLC Inserito: 6 novembre 2023 Segnala Inserito: 6 novembre 2023 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.
drn5 Inserita: 6 novembre 2023 Segnala Inserita: 6 novembre 2023 Senza offesa....Spaghetti code all'ennesima potenza! 🤨 mai sentito il salto indietro. Dove altro lo hai visto?
Livio Orsini Inserita: 6 novembre 2023 Segnala Inserita: 6 novembre 2023 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.
ANTONIO PLC Inserita: 6 novembre 2023 Autore Segnala Inserita: 6 novembre 2023 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.
Livio Orsini Inserita: 6 novembre 2023 Segnala Inserita: 6 novembre 2023 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.
zanellatofabio Inserita: 6 novembre 2023 Segnala Inserita: 6 novembre 2023 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....
drn5 Inserita: 6 novembre 2023 Segnala Inserita: 6 novembre 2023 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.
ANTONIO PLC Inserita: 6 novembre 2023 Autore Segnala Inserita: 6 novembre 2023 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 .
drn5 Inserita: 7 novembre 2023 Segnala Inserita: 7 novembre 2023 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...
Livio Orsini Inserita: 7 novembre 2023 Segnala Inserita: 7 novembre 2023 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.
ANTONIO PLC Inserita: 7 novembre 2023 Autore Segnala Inserita: 7 novembre 2023 Grazie dei suggerimenti nel pomeriggio inserisco i segmenti dove trovo difficoltà..
batta Inserita: 7 novembre 2023 Segnala Inserita: 7 novembre 2023 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ù.
ANTONIO PLC Inserita: 7 novembre 2023 Autore Segnala Inserita: 7 novembre 2023 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 .
ANTONIO PLC Inserita: 7 novembre 2023 Autore Segnala Inserita: 7 novembre 2023 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 .
ANTONIO PLC Inserita: 7 novembre 2023 Autore Segnala Inserita: 7 novembre 2023 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 .
Livio Orsini Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 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.
max.bocca Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 Una delle possibili soluzioni è di fare una funzione svolgi e salda, una volta la esegui con lunghezza x e la seconda con y.
ANTONIO PLC Inserita: 8 novembre 2023 Autore Segnala Inserita: 8 novembre 2023 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?
step-80 Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 (modificato) @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' 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: 8 novembre 2023 da step-80
Livio Orsini Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 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
step-80 Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 @Livio Orsini tentando di indovinare, credo che la causa dello stop sia proprio un salto incondizionato che fa superare il tempo di watchdog.
Livio Orsini Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 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.
batta Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 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.
step-80 Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 @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 😃
Livio Orsini Inserita: 8 novembre 2023 Segnala Inserita: 8 novembre 2023 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora