Vai al contenuto
PLC Forum


CODIFICA DAI DIAGRAMMI A BLOCCHI AL LINGUAGGIO DI PROGRAMMAZIONE KOP


pablopalma

Messaggi consigliati

Ciao a tutti, sto imparando step 7, in particolar modo, in questo momento sto affrontando la programmazione strutturata. Sono fermo però alla creazione ( per software complessi ), dei diagramma a blocchi per le varie cicliche del programma, mi piacerebbe imparare come trascrivere il diagramma a blocchi o flowchart, in linguaggio di programmazione kop, in particolar modo, le transizioni da uno stato ad un altro come le codifico in kop?, assegnando dei marker? , qualcuno può farmi un esempio chiarificatore?, grazie a chi vorrà aiutarmi.

Link al commento
Condividi su altri siti


usa un contatore, ad ogni valore del contatore corrisponde una fase. Alla fine della fase imposti il contatore per iniziare la fase successiva.

 

 

Link al commento
Condividi su altri siti

Ciao, grazie per l'idea, potrebbe essere una soluzione, in pratica correggimi se sbaglio, è la stessa cosa che si fa con il set reset dei marker, settato ad uno nella fase attiva , resettato a zero, nel ciclo successivo.Questo però è un metodo da " smanettoni", secondo chi programma da anni, l'autore del corso base che ho comprato, egli sostiene che per una programmazione strutturata per cicliche complesse, non deve essere questo il modo, perchè adatto a programmi semplici e non strutturati, ma quale sarebbe sto benedetto modo professionale di scrivere le transizioni da una fase all'altra?

Link al commento
Condividi su altri siti

Quote

mi piacerebbe imparare come trascrivere il diagramma a blocchi o flowchart, in linguaggio di programmazione kop

Più che come "trascrivere in KOP", la questione dovrebbe essere come "trascrivere in un qualsiasi linguaggio per PLC".
Che quello che si è scritto in un diagramma di flusso si sviluppi in schema a contatti, in lista istruzioni o in testo strutturato (solo per citare i linguaggi più utilizzati nei PLC), poco cambia. Casomai, si deve definire il metodo.

Per eseguire una sequenza, direi che i metodi più utilizzati sono i seguenti:

1) Quello descritto da "mrsunday", dove viene utilizzata una variabile, e ad ogni valore corrisponde un passo della sequenza.

Questo metodo ha il grande vantaggio di poter gestire un numero elevatissimo di passi, ma ha lo svantaggio di non poter gestire "rami in parallelo". Eventuali rami da eseguire in parallelo dovranno essere spezzati in "sottosequenze". Questo metodo quindi io lo consiglio per la gestione di sequenze senza ramificazioni.
Un altro svantaggio di questo metodo, è che si deve sempre avere a portata di mano una tabella con i valori che corrispondono ad ogni singolo passo.

2) C'è poi un altro metodo (che ha un nome preciso che ora non mi viene in mente) che utilizza sempre una variabile per definire il passo attivo, dove però il passaggio allo step successivo non viene gestito con un MOVE (permettendo quindi salti liberi al passo desiderato), ma con un incremento (programmato una sola volta) che viene effettuato solo se non ci sono interblocchi. Quindi, quando sono in un passo, attivo l'interblocco fino a quando non ci sono tutte le condizioni per passare allo step successivo.

Come il metodo precedente, ha il vantaggio di poter gestire con una sola variabile un elevato numero di passi, presenta sempre lo svantaggio di non poter gestire "ramificazioni", ed anche quello di creare non poche difficoltà nel caso diventi necessario inserire un nuovo passo dove non sono stati preventivamente lasciati passi di riserva.
Da quanto mi risulta, in passato alcune aziende pretendevano che si utilizzasse questo metodo, come fosse il migliore in assoluto. Personalmente ritengo che, rispetto ad altri metodi, siano più i contro dei pro. Io l'ho utilizzato quando mi è stato imposto, mai come scelta personale.

3) Il set/reset dei bit che costituiscono i passi della sequenza. Sinceramente vorrei sapere chi è che definisce questo un "metodo da smanettoni". A mio avviso, non è forse il più elegante ma è sicuramente il più flessibile. Ti permette di utilizzare un bit per ogni step (col vantaggio quindi di assegnare un nome chiaro allo step), di gestire ramificazioni, di fare salti a piacere da un passo ad un altro. In pratica ti permette di fare tutto quello che faresti in Grafcet, in modo ancora più flessibile. Manca, ovviamente, la praticità della rappresentazione grafica del Grafcet. Svantaggi? A mio avviso, l'unico svantaggio è che devi organizzare con un certo ordine i bit della sequenza. Se lo si fa, basta leggere i nomi dei bit per avere già un'idea piuttosto precisa di come si svolge tutto il ciclo. È già quasi come avere sott'occhio il diagramma di flusso.
Questo è il metodo che io preferisco per le sequenze complesse. Ma chissà... Forse sono solo uno smanettone.

4) Il set del bit del passo successivo, senza resettare il bit del passo precedente. I comandi in uscita, anziché essere legati ad un passo, vengono attivati quando il passo in corso è ON e il passo successivo è ancora OFF. Non lo amo in modo particolare, ma è molto pratico per sequenze semplici e lineari.

5) C'è poi il Grafcet, che però non è supportato da tutti i PLC. Con poco sforzo permette di gestire cicli complessi. La rappresentazione grafica poi è praticamente il diagramma di flusso e, in online, permette di tenere sotto controllo, quasi sempre in una sola schermata. tutta la sequenza, mostrando le tappe attive.
Non ho mai capito perché poi rovinino tutto rendendo complicate funzioni come il reset completo o il congelamento della sequenza, operazioni da fare con funzioni dedicate che però devono sempre essere eseguite rispettando un ordine ben preciso (questo, almeno, nei PLC che mi è capitato di programmare in Grafcet).

 

Una volta definito il metodo che si intende utilizzare, che il set/reset di un bit, piuttosto che il caricamento di un valore in una variabile, vengano fatti in ladder, in lista istruzioni o in qualsiasi altro linguaggio, non fa differenza.

 

Link al commento
Condividi su altri siti

Ciao Batta, grazie dei preziosi consigli, in effetti, non riuscivo a trovare altre soluzioni, l'unica che mi veniva in mente era il set reset, anche perchè lo avevo visto in degli esempi dell'autore, io però sono un principiante, quindi tendo a prendere per buono quello che mi si dice. Lui lo definisce metodo poco ortodosso da "smanettoni", quello che lui definisce da professionisti non saprei, bisogna comprare il corso successivo.Ho sbagliato dicendo codificare da diagrammi a kop, solo perchè è quello che uso io, intendevo come tu dici codifica in generale, kop awl, ecc.Grazie ancora, ora che mi hai chiarito le idee, posso ritenermi soddisfatto, stava diventando un ossessione trovare sto benedetto metodo....., ti ho inviato la mail per le librerie, grazie.

Link al commento
Condividi su altri siti

Ciao Batta, grazie per i chiarimenti, ma mettendo in pratica i vari metodi, non ho ancora le idee chiare, in particolar modo, la differenza tra il metodo 3 e 4 che tu hai elencato sopra, cioè tra il set-reset dei bit che costituiscono i passi  della sequenza,( cioè assegnare dei marker ad ogni passo), giusto?,ed il set del bit del passo successivo, grazie.

Link al commento
Condividi su altri siti

Con il "metodo 4", i bit delle fasi, anziché indicare "Fase in corso", indicano "Fase Eseguita".

Molto banalmente, partendo da un esempio classico:

ciclo di foratura con le seguenti fasi:

- avviamento rotazione mandrino

- discesa mandrino (foratura)

- salita mandrino

- arresto rotazione mandrino

 

Con il sistema "set/reset", i bit delle fasi potrebbero essere:

- Ciclo_ON (rimane sempre attivo, fino a completamento ciclo)

- StartMandrino

- Discesa

- Salita

- StopMandrino

 

A parte il bit "Ciclo_ON", che rimane sempre attivo per tutto il ciclo, gli altri bit sarebbero ON uno alla volta.

La rotazione mandrino deve essere tenuta attiva nella fasi "StartMandrino", "Discesa", "Salita".

L'elettrovalvola per la discesa rimane attiva solo nella fase "Discesa".

L'elettrovalvola per la salita rimane attiva solo nella fase "Salita".

 

Se, invece, usiamo l'altro sistema, i bit potrebbero essere:

- Ciclo_ON

- StartMandrinoOk

- DiscesaOk

- SalitaOk

- StopMandrinoOk

 

Ad ogni passo, si attiva il bit successivo senza resettare il bit precedente.

La rotazione mandrino è attiva se "Ciclo_ON" = TRUE e "StopMandrinoOk" = FALSE.

La EV discesa si attiva con "StartMandrinoOk" = TRUE e "DiscesaOk" = FALSE.

La EV salita si attiva con "DiscesaOk" = TRUE e "SalitaOk" = FALSE.

 

Questo, ovviamente, è solo un banale esempio, che serve solo per chiarire il concetto.

 

Link al commento
Condividi su altri siti

Quote

quello che lui definisce da professionisti non saprei

Sarà l'SFC (Grafcet) che se non sbaglio Siemens fa pagare mentre è di serie in plc di basso livello come lo Zelio.

Quote

Non ho mai capito perché poi rovinino tutto rendendo complicate funzioni come il reset completo o il congelamento della sequenza

Ho avuto parecchi problemi anch'io con SFC in un ambiente simile al codesys, per il reset totale ho dovuto inserire un bit di abort in ogni passo in modo da scorrere il diagramma fino alla fine !!!

 

 

 

Link al commento
Condividi su altri siti

Quote

Sarà l'SFC (Grafcet) che se non sbaglio Siemens fa pagare mentre è di serie in plc di basso livello come lo Zelio.

Sì, confermo. In un PM che mi ha inviato "pablopalma", dove citava alcune righe del libro, l'autore si riferisce proprio a SFC.

In pratica, da quanto si legge, sembra che i bravi programmatori utilizzino SFC (o Grafcet), mentre gli "smanettoni" usino la barbara tecnica del set/reset.

Inoltre, l'autore considera la tecnica del set/reset adatta solo a piccoli e semplici programmi.

Io ritengo, al contrario, che con set/reset sei libero di fare tutto quello che vuoi e, se strutturi bene bit utilizzati e codice programma, condito con una buona dose di commenti (che, ricordiamolo, non devono MAI mancare), il tutto risulta facile da comprendere, facile da debuggare, facile da modificare.

Per spezzare una lancia a favore del Grafcet, c'è da dire che risulta molto semplice seguire le fasi (transizioni) del ciclo in esecuzione, online.
Quando programmo cicli con set/reset, io ho sempre in mente (anche se non sempre lo disegno fisicamente) il diagramma di flusso.
I bit delle sequenze in pratica simulano le transizioni del grafcet. Alla fine, il risultato è praticamente identico. È come programmare in Grafcet, con la differenza che il passaggio da una transizione alla successiva viene gestito con set/reset.

A favore del Grafcet rimane la rappresentazione grafica, a favore del set/reset c'è la flessibilità.

 

Link al commento
Condividi su altri siti

A quanto pare l'autore ha inventato un modo unico di programmare, a noi comuni mortali, per conoscerlo bisogna comprare i suoi scritti, altrimenti accontentarsi del set-reset.

Link al commento
Condividi su altri siti

Quote

A quanto pare l'autore ha inventato un modo unico di programmare, a noi comuni mortali, per conoscerlo bisogna comprare i suoi scritti, altrimenti accontentarsi del set-reset.

Non ho nessuna intenzione di denigrare l'autore. Non lo conosco, ed essere in disaccordo sul set/reset non significa che il suo libro non sia valido.
Troverai sicuramente altri programmatori ai quali non piace il set/reset.

Però... Un po' l'impressione che voglia presentare il suo libro come la "Bibbia della Programmazione", c'è.

Da non dimenticare poi, che non si può generalizzare. Non c'è un modo giusto che vada bene per tutte le cose. Per ogni compito si devono valutare il linguaggio di programmazione ed il metodo che meglio si prestano.

Link al commento
Condividi su altri siti

Quote

Ad ogni passo, si attiva il bit successivo senza resettare il bit precedente.

Sul metodo che prevede l'attivazione dei bit dei passi successivi senza disattivare i bit dei passi precedenti, mi sono dimenticato di dire una cosa: spesso risulta più comodo, al posto del SET, mantenere alti i bit dei passi eseguiti con un'autoritenuta, vincolata allo stato del bit del passo precedente.

Basta azzerare il primo bit della sequenza, e gli altri, di conseguenza, cadono tutti. 

Link al commento
Condividi su altri siti

Quote

autoritenuta

Che barbarie :lol:

Scherzo!!! 

La parola autoritenita è ritenuta preistorica da molti programmatoroni, e invece come dici tu è molto utile perchè permette di definire nello stesso segmento il e in maniera molto chiara momento di attivazione e quello di disattivazione, il periodo di validità, semplicemente mettendoci in serie un bit, che come dici tu può essere il passo precedente, o l'automatico, o il fine ciclo(negato), a seconda del comportamento che si vuole ottenere.

Ogni funzione ha i suoi pro e i suoi contro, i set reset sono molto facili da utilizzare ma hanno il contro che un errore di programmazione a volte è difficile da trovare quando lo stesso bit è settato e resettato in molti punti, se lo trovi basso quando dovrebbe essere alto a volte fai fatica ad individuare il punto che ha causato il reset. Per questo io non ne abuso e molte volte preferisco usare l'autoritenuta :thumb_yello:.

 

 

Link al commento
Condividi su altri siti

Salve ragazzi, grazie per i numerosi interventi, su una questione per me cruciale.Se qualcuno a voglia può scrivere, possibilmente in kop, l'esempio del trapano sopra riportato da Batta?, magari con entrambi i metodi, al punto 3 e 4, mi farebbe un piacere enorme, grande forum, a presto.

Link al commento
Condividi su altri siti

Ciao Ifachsoftware, grazie per l'aiuto, ma non trovo il programma al link che hai messo, puoi rimandarlo?, grazie, mi interessa. 

Link al commento
Condividi su altri siti

Riguardo al metodo 1 (che mi ricorda il funzionamento del programmatore a cammes della lavatrice):

Quote

Questo metodo quindi io lo consiglio per la gestione di sequenze senza ramificazioni.
Un altro svantaggio di questo metodo, è che si deve sempre avere a portata di mano una tabella con i valori che corrispondono ad ogni singolo passo.

Per questi 2 motivi e perchè non mi piacciono i programmi con segmenti strapieni di anonimi confronti per attivare un movimento non ho mai usato il metodo 1 ma sempre il barbaro metodo 3.

Su insistenza di un amico che mi dice che si trova molto bene con il metodo 1 lo sto recentemente provando (sono ancora in fase iniziale) su una macchina che ha un ciclo senza tante varianti, lo faccio però con una modifica per renderlo più chiaro: nel blocco di gestione dei passi inizio ogni segmento con un confronto tra l'indice di passo e una costante, l'uscita del confronto attiverà un flag (commentato!) del passo attivo, sempre nello stesso segmento l'uscita del confronto con in serie le condizioni necessarie attiverà lo step successivo tramite un move. La struttura risultante è molto simile ad un Case del Basic, e la ritengo simile anche a un diagramma di flusso.

Negli altri blocchi che gestiscono la logica di attivazione dei movimenti userò il flag che avrà un nome simbolico anzichè un confronto, rendendo così superflua la tabella per ricordare a cosa corrisponde ogni passo.

In questo modo potrò anche successivamente modificare i numeri dell'indice o la sequenza di esecuzione senza tanti problemi perchè i movimenti rimarranno legati ai flags e non ai confronti.

Poi ho una fissa mia, di solito non faccio un passo per ogni cambio di stato di ogni singolo bit come fanno molti, i miei passi hanno nomi simili a: Accensione_motori, Prelievo _Pezzo, Carico_pezzo, Bloccaggio_pezzo, Foratura, Ritorno_mandrino, Sblocco_pezzo e così via, proprio come si scriverebbe in un diagramma di flusso. Nei PB di movimento basterà usare i flag di passo per attivare uno o più movimenti con le necessarie condizioni in serie (molto spesso le stesse condizioni vanno bene anche per i comandi manuali).

Ne risulta un programma secondo me molto snello.

Link al commento
Condividi su altri siti

Ciao Jumpman, cosa intendi con flag di passo?, perchè non scrivi proprio il programma del trapano con il tuo metodo?, nel tuo discorso fatico a starti dietro, non sono esperto, mi piacerebbe capire, grazie. 

Link al commento
Condividi su altri siti

Quote

 lo faccio però con una modifica per renderlo più chiaro: nel blocco di gestione dei passi inizio ogni segmento con un confronto tra l'indice di passo e una costante, l'uscita del confronto attiverà un flag (commentato!) del passo attivo, sempre nello stesso segmento l'uscita del confronto con in serie le condizioni necessarie attiverà lo step successivo tramite un move. La struttura risultante è molto simile ad un Case del Basic, e la ritengo simile anche a un diagramma di flusso.

Negli altri blocchi che gestiscono la logica di attivazione dei movimenti userò il flag che avrà un nome simbolico anzichè un confronto, rendendo così superflua la tabella per ricordare a cosa corrisponde ogni passo.

In questo modo potrò anche successivamente modificare i numeri dell'indice o la sequenza di esecuzione senza tanti problemi perchè i movimenti rimarranno legati ai flags e non ai confronti.

In particolare quanto scritto quà

Link al commento
Condividi su altri siti

Visto che fuori pioveva ho scritto un esempio, non escludo che ci possano essere errori e mancano sicuramente alcune cose tipo le temporizzazioni per l'avvio/arresto motore, l'azzeramento delle fasi ciclo (p.es. uscendo dall'automatico), ecc. ecc.

 

Tieni presente che questo è un mio metodo personale che sto sperimentando in questi giorni e non è il metodo standard (1)  descritto da batta e solitamente preferisco anch'io usare il metodo (3) sempre in riferimento al post di batta.

ciao.

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