Vai al contenuto
PLC Forum


Traduzione In Ladder Di Un Sfc


mehehe

Messaggi consigliati

Buonasera, mi sono da poco iscritto al forum perchè ho scoperto il mondo dei plc e volevo studiare un po la materia in quanto affascinante quindi mi scuso in anticipo se dirò eresie ^_^

Volevo imparare a tradurre in ladder un sfc e mi sono letto un po di teoria qui e li però non ho capito una situazione

Posso chiedere a voi che siete più esperti di me?è la sezione giusta questa?

Link al commento
Condividi su altri siti


Inserita: (modificato)

Ok Ti ringrazio per l'aiuto :smile:

d98077d85c318b5db9d10b3c71d280cd.png

Io avevo pensato di tradurla così (però parlo solo della sezione di valutazione delle transizioni)

   1     5.X         Tr1
|---||--|/|----------()---|
    1      4.X        Tr2
|---||--|/|----------()---|
    2    a         Tr3
|---||--||----------()---|
    3    a         Tr4
|---||--||----------()---|
    4    d         Tr5
|---||--||----------()---|
    5    c         Tr6
|---||--||----------()---|
Modificato: da mehehe
Link al commento
Condividi su altri siti

Uanema! Scusa il ritardo ma ieri sera sono crollato... Ma voi studentessi moderni non studiate più di giorno?
Non ho idea di cosa siano i contatti NC 4.X e 5.X che hai usato, spiegamelo appena puoi (non ho una conoscenza accademica dell'argomento).
Ad ogni modo, per la sola valutazione delle transizioni, io farei semplicemente così (più tardi posto la mia spiegazione).
Per semplicità ho chiamato TRa la transizione associata alla condizione 'a', e analogamente TRb, TRc, TRd.

    1     2     a          TRa
+--| |---| |---| |---------( )--+

    1     3     b          TRb
+--| |---| |---| |---------( )--+

    5     c                TRc
+--| |---| |---------------( )--+

    4     d                TRd
+--| |---| |---------------( )--+
Link al commento
Condividi su altri siti

Roberto Gioachin

Ciao mehehe,

La rappresentazione grafica che hai postato non è conforme allo standard SFC, e a dire il vero ci assomiglia anche poco.

Probabilmente per farlo hai usato uno di quei software free che vengono usati per creare delle flow chart.

Sopratutto il blocco in mezzo (step 1) diventa impossibile connetterlo logicamente con gli altri, guardando questa rappresentazione.

Visto invece dal lato teorico, il problema può essere risolto in diversi modi.

Chiariamo inanzitutto che questo linguaggio (o metodo) utilizza "Passi" (o step) per identificare la parte che esegue le azioni (i rettangoli nel grafico) e le transizioni per identificare il passaggio da un passo al sucessivo (tratti orizzontali).

Uno dei modi più semplici per ricreare in Ladder questo linguaggio è quello di assegnare un bit (variabile BOOL) ad ogni Passo e condizionare le azioni a questi Bit.

Le azioni non devono necessariamente essere inserite nella stessa parte di programma, ma scritte in altri blocchi di programma, a patto che le variabili utilizzate per rappresentare i passi siano di tipo Globale (pubbliche).

Quando il bit del passo 2 è impostato su True (set) il passo esegue le sue azioni, quando è impostato su False (reset) non fa nulla.

La transizione "a" che sta sotto al passo 2 avrà il compito di Resettare il bit del passo 2 e settare il bit del passo 5.

Il metodo è semplice, permette di fare tutto quello che serve in SFC compreso i processi paralleli, ma ha alcune particolarità che possono creare dei problemi, per questo motivo c'è bisogno di evolvero ulteriormente, per fare questo bisogna entrare molto nei particolari.

Quanto ho scritto però ti può servire per iniziare.

Domanda:

Ma perchè non usi un plc con già disponibile il linguaggio SFC?

Link al commento
Condividi su altri siti

@Roberto: chiaramente questo schema (o meglio parte di schema) difficilmente potrà essere "disegnato" tal quale in un ambiente di programmazione PLC reale, ma dubito che non sia conforme allo standard SFC (quale standard? IEC 61131?). Nonostante la bruttezza estetica, infatti, si tratta di un pattern a dir poco "classico", che realizza la mutua esclusione di sottosequenze (nel caso specifico corrispondono semplicemente alle fasi 4 e 5) per mezzo di una fase "semaforo" mutex (in questo caso la fase 1). Con questo sistema le fasi 4 e 5 non possono essere mai attive contemporaneamente. In pratica ci sono due catene concorrenti ma esiste una sezione critica in cui può entrare un solo flusso (thread) di elaborazione alla volta (di solito per arbitrare l'accesso a risorse condivise). Appena ho tempo mi spiego meglio

Link al commento
Condividi su altri siti

Uanema! Scusa il ritardo ma ieri sera sono crollato... Ma voi studentessi moderni non studiate più di giorno?

:lol: in realtà studiamo anche di sera, almeno io lo faccio finche non mi entrano le cose nella capoccia :wallbash:

Non ho idea di cosa siano i contatti NC 4.X e 5.X che hai usato, spiegamelo appena puoi (non ho una conoscenza accademica dell'argomento).

E' il modo in cui il libro che sto leggendo chiama le variabili booleane associate alla fase che se sono vere assumono valore 1 altrimenti 0

Ad ogni modo, per la sola valutazione delle transizioni, io farei semplicemente così (più tardi posto la mia spiegazione).

Per semplicità ho chiamato TRa la transizione associata alla condizione 'a', e analogamente TRb, TRc, TRd.

    1     2     a          TRa
+--| |---| |---| |---------( )--+

    1     3     b          TRb
+--| |---| |---| |---------( )--+

    5     c                TRc
+--| |---| |---------------( )--+

    4     d                TRd
+--| |---| |---------------( )--+

Allora ho capito la tua soluzione in pratica in ladder dici che se la fase 1 e 2 sono vere ed è soddisfatta la condizione a allora viene realizzata la transizione TRa

Effettivamente come avevo scritto io non aveva molto senso perchè avevo scritto che se 1 e 2 sono vere si realizza la condizione TRa ma cià non è vero perchè ci sta anche la condizione.

Ok adesso posso ritornare a stare più tranquillo :roflmao: (quando non capisco una cosa se non la riesco a risolvere mi "ingrippo" )

Se non sono fuori tema vorrei farti vedere se ti va una soluzione che ho elaborato per un esercizio sempre della traduzione in ladder che mi ha dato qualche rogna però piuttosto che scrivere tutto l'esercizio che è infinito ti accenno giusto l'idea che ho avuto. :)

La rappresentazione grafica che hai postato non è conforme allo standard SFC, e a dire il vero ci assomiglia anche poco.

Probabilmente per farlo hai usato uno di quei software free che vengono usati per creare delle flow chart.

Sopratutto il blocco in mezzo (step 1) diventa impossibile connetterlo logicamente con gli altri, guardando questa rappresentazione.

Ti ringrazio per la risposta, in realtà io ho visto delle slide trovate in rete di un università in cui veniva proposto uno schema per gestire la contesa di due risorse concorrenti.

Domanda:

Ma perchè non usi un plc con già disponibile il linguaggio SFC?

Perchè stavo facendo qualche esercizio per verificare se avevo capito il concetto e mi ero intestardito con questo caso :D

chiaramente questo schema (o meglio parte di schema) difficilmente potrà essere "disegnato" tal quale in un ambiente di programmazione PLC reale, ma dubito che non sia conforme allo standard SFC (quale standard? IEC 61131?). Nonostante la bruttezza estetica, infatti, si tratta di un pattern a dir poco "classico", che realizza la mutua esclusione di sottosequenze (nel caso specifico corrispondono semplicemente alle fasi 4 e 5) per mezzo di una fase "semaforo" mutex (in questo caso la fase 1). Con questo sistema le fasi 4 e 5 non possono essere mai attive contemporaneamente. In pratica ci sono due catene concorrenti ma esiste una sezione critica in cui può entrare un solo flusso (thread) di elaborazione alla volta (di solito per arbitrare l'accesso a risorse condivise).

Si esattamente questo e voglio aggiungere che nello schema che ho postato io non viene risolto il caso in cui le due sequenze accedono in maniera contemporanea alla risorsa (non l'ho risalta quest cosa perchè l'esercizio che stavo vedendo dice di gestire in maniera diversa tale condizione). Comunque per risolvere tale situazione basta andare a mettere le condizioni che precedono l'accesso nella sezione critica in maniera mutuamente esclusiva :D ad esempio nello schema seguente a and not b per TRa e B per TRb.

Comunque voglio ringraziarvi a priori per il supporto siete genitlissimi e sto scoprendo che questo settore dei plc mi intriga non poco :smile:

Link al commento
Condividi su altri siti

Roberto Gioachin

Pomat:

Le norme IEC61131 definiscono anche la grafica dell'SFC, non è possibile inventarsene una nuova, nemmeno alle università.

http://it.wikipedia.org/wiki/Sequential_function_chart

Anche semplicemente su wikipedia si trova la simbologia corretta.

Molto spesso si fanno delle confusioni con gli automi a stati finiti, ma per SFC c'è una codifica sia del linguaggio che della rappresentazione grafica acettatta da tutti i costruttori.

Per fare un esempio con l'immagine del post 3, il passo 1 sembrerebbe il passo iniziale proprio perchè è il numero 1, ma non si vedono quali siano le transizioni per accedere ai sucessivi.

Inoltre non si riesce a capire se si ha una selezione singola oppure l'apertura si processi paralleli.

Io ritengo che nel momento in cui si sta studiando un nuovo argomento, è bene studiarlo nel modo giusto, e per noi programmatori PLC il modo giusto è quello definito dalle IEC61131.

n.b. non prendete queso come polemica, il mio vuole essere un consiglio.

Roberto

Link al commento
Condividi su altri siti

Inserita: (modificato)

Per fare un esempio con l'immagine del post 3, il passo 1 sembrerebbe il passo iniziale proprio perchè è il numero 1, ma non si vedono quali siano le transizioni per accedere ai sucessivi.

Inoltre non si riesce a capire se si ha una selezione singola oppure l'apertura si processi paralleli.

è proprio quello il problema per me poichè dovendolo tradurre in ladder mi risultava strano dato che non vedevo la transizione. Ma se leggi il ladder intuisci che è la stessa delle fasi che precedono il parallelismo.

Adesso non so come si faccia ad implementare in un ide per la programmazione in plc perchè io non ho mai messo mani purtroppo però mi interesserebbe saperlo :smile:

Modificato: da mehehe
Link al commento
Condividi su altri siti

n.b. non prendete queso come polemica, il mio vuole essere un consiglio.

Roberto ma scherzi? Siamo qui apposta per confrontarci...

Non c'è dubbio che la numerazione usata nello schema in questione sia fuorviante - di sicuro nessun diagramma nel mondo reale verrebbe fuori numerato a quel modo - e trae sicuramente in inganno se a colpo d'occhio non si riconosce il pattern della mutua esclusione.

Per quanto riguarda la simbologia, pur con percorsi collassati e in direzioni non convenzionali, sono abbastanza sicuro che si possa ricondurre ad una forma accettabile da un qualsiasi ambiente di programmazione PLC. Il discorso eventualmente è diverso per quanto riguarda la topologia del grafo, che (forse) potrebbe essere considerata in qualche modo scorretta dall'editor. Tuttavia questo non implica che lo schema non possa essere convertito in ladder secondo la classica procedura e funzionare (la valutazione delle transizioni non sarebbe molto diversa da quella da me ipotizzata).

Anche la doppia cornice della fase semaforo, che associata al numero 1 sembra fatta apposta per far credere che si tratti dello stato iniziale, in realtà penso serva solo a rimarcare la particolare funzione della fase e, specialmente, il fatto che questa debba essere inizializzata come attiva affinché il sistema funzioni (il che la rende in effetti uno stato iniziale :blink:).

Per chiarire il concetto generico ho cercato di migliorare un po' il diagramma:

        .                                             .
        .                                             .
        .                                             .

     +-----+                                       +-----+
     | Si  |      +-----<------+------>-----+      | Sj  |
     +-----+      |            |            |      +-----+
        |         |            |            |         |
   ====================        |        ====================
        |                      |                      |
   (a) -+- Tx                  |           (!a &&  -+- Ty
        |                      ^                      |
     +-----+                   |                   +-----+
     |     |                   |                   |     |
     +-----+                   |                   +-----+
                               |
        .                   +-----+                   .
        .                   | Sm  |                   .
        .                   +-----+                   .
                               |
     +-----+                   |                   +-----+
     |     |                   |                   |     |
     +-----+                   |                   +-----+
        |                      ^                      |
       -+-                     |                     -+-
        |                      |                      |
   ====================        |        ====================
        |         |            |            |         |
     +-----+      |            |            |      +-----+
     |     |      +----->------+------<-----+      |     |
     +-----+                                       +-----+

        .                                             .
        .                                             .
        .                                             .

Il principio in sintesi è che, se la transizione Tx è stata superata, finché non si esce dalla sezione critica la fase Sm resta inattiva e la transizione Ty non può essere superata (a prescindere dallo stato Sj e dalla condizione abilitante). Stessa cosa ovviamente mutatis mutandis. L'unica differenza tra i due flussi d'elaborazione paralleli è la priorità d'entrata nella sezione critica. In quest'esempio Tx ha la priorità: infatti, se a e b si verificano nello stesso istante, a prescindere dalla transizione che viene valutata per prima, !a && b è falsa e quindi la transizione ad essere superata è inevitabilmente Tx.

Io ritengo che nel momento in cui si sta studiando un nuovo argomento, è bene studiarlo nel modo giusto

Senza dubbio, ma più che altro quello che mi sentirei di chiedere @mehehe (ti prego dicci il tuo nome vero!) è: stai vedendo 'ste cose per prepararti ad un esame (maturità, universitario)?

Se invece le stai vedendo per prepararti alla professione, sarà pure interessante ma sinceramente penso che questa cosa della mutua esclusione nel mondo reale difficilmente la vedremmo programmata in questo modo. Io piuttosto che queste cose prettamente teoriche cercherei di trovare qualche esempio di progettazione più pratico (come quelli che giustamente ti ha proposto Roberto), magari calato nel contesto di una marca famosa di PLC.

in realtà studiamo anche di sera, almeno io lo faccio finche non mi entrano le cose nella capoccia

Fidati, quando sei in impasse continuare a rimugginare è controproducente, molto meglio dormirci sopra (in senso lato) e ritornare sulle cose a mente fresca.

Link al commento
Condividi su altri siti

Inserita: (modificato)

Senza dubbio, ma più che altro quello che mi sentirei di chiedere [at]mehehe (ti prego dicci il tuo nome vero!) è: stai vedendo 'ste cose per prepararti ad un esame (maturità, universitario)?

Se invece le stai vedendo per prepararti alla professione, sarà pure interessante ma sinceramente penso che questa cosa della mutua esclusione nel mondo reale difficilmente la vedremmo programmata in questo modo. Io piuttosto che queste cose prettamente teoriche cercherei di trovare qualche esempio di progettazione più pratico (come quelli che giustamente ti ha proposto Roberto), magari calato nel contesto di una marca famosa di PLC.

Il mio nome è Marco ed è un piacere poter confrontarmi con persone che ne sanno mooolto più di me...Io sto studiando per un interrogazione a scuola e, per questo, ho questo tipo di problematiche da affrontare...

Mi piacerebbe sapere come si implementa una situazione del genere nella realtà, io so che si usano programmi per programmare plc come quello della S. ed ho visto usarli ma non so se tali programmi possono realizzare questo tipo di cose.

Inoltre di questo esercizio avevo un altro dubbio sempre inerente alla conversione in ladder che mi farebbe piacere poter condividere con voi

Fidati, quando sei in impasse continuare a rimugginare è controproducente, molto meglio dormirci sopra (in senso lato) e ritornare sulle cose a mente fresca.

Si hai ragione ma questo mi capita spesso con le materie che mi piacciono :)

Modificato: da mehehe
Link al commento
Condividi su altri siti

... Ho scritto davvero "rimugginare" con due 'g'?!? unbelievable :blink:

Inoltre di questo esercizio avevo un altro dubbio sempre inerente alla conversione in ladder che mi farebbe piacere poter condividere con voi

Prima di farlo, ti sei per caso documentato bene sui procedimenti canonici per la conversione in ladder?? Quello che ti ho dato io è solo uno spunto ma, come dice Roberto, perché tutto funzioni correttamente "bisogna entrare molto nei particolari" e noi siam mica qui a far ballare la scimmia :P

Ripeto quel che ho già scritto proprio oggi in un'altra discussione: cerca qualcosa tipo sfc to ladder nel popolare motore di ricerca di cui ora mi sfugge il nome... ;)

Link al commento
Condividi su altri siti

Prima di farlo, ti sei per caso documentato bene sui procedimenti canonici per la conversione in ladder?? Quello che ti ho dato io è solo uno spunto ma, come dice Roberto, perché tutto funzioni correttamente

Certo, mi sono studiato un appendice che mi hanno fornito a scuola inerente alla conversione degli sfc al ladder e so che esiste un apposito algoritmo che prevede la creazione di apposite sezioni per poter effettuare una corretta traduzione.

Il mio dubbio è inerente a come tradurre un comportamento dell'sfc che ho realizzato. Siccome non voglio annoiarvi con montagne di sfc e ladder che ho scritto :D vorrei prima descrivervi il compotamento che devo implementare.

In pratica devo gestire il caso in cui le due sequenze entrano contemporaneamente nella risorsa condivisa privileggiando quella che ha usato la risorsa un numero pari di volte.

Ora la cosa l'ho svolta in questo modo, ho fatto un sfc per contare l'accesso alla risorsa condivisa con due variabili cnt1 e cnt2 che in ladder implementerò con due contatori.

Poi ho implementato un altro sfc che gestisce la contesa e per fare ciò l'ho realizzato con una scelta in cui se è pari cnt1 va la sequenza 1 viceversa cnt2 la sequenza 2 e fin qui penso di non aver sbagliato nulla. Supponendo che accedono contemporaneamente e che cnt1 è pari, impongo una sospensione della seq2 e non appena la seq1 esce dalla sezione critica, avvio una forzatura sulla fase che si trova prima dell'accesso all'area condivisa.

Dopo questo sproloquio, volevo chiedervi se è corretto usare un functional block in cui scrivendo in testo strutturato realizzo la funzione di confronto della variabile cnt1 o cnt2 che nel caso in cui è pari mi da in uscita una variable booleana true e una false nel caso contrario.

è corretta questa scelta proggettuale o si riesce a realizzare in ladder?(ovviamente se è corretta ma si puo' realizzare anche in ladder non mi interessa perchè io il ladder lo odio xD)

Link al commento
Condividi su altri siti

entrano contemporaneamente nella risorsa condivisa privileggiando

Aaah vedo che la doppia g è contaggggggiosa :P

Beh spero che non entrino davvero contemporaneamente nella sezione critica sennò non abbiamo risolto nulla!! ;)

volevo chiedervi se è corretto usare un functional block in cui scrivendo in testo strutturato realizzo la funzione di confronto della variabile cnt1 o cnt2 che nel caso in cui è pari mi da in uscita una variable booleana true e una false nel caso contrario.

è corretta questa scelta proggettuale o si riesce a realizzare in ladder?(ovviamente se è corretta ma si puo' realizzare anche in ladder non mi interessa perchè io il ladder lo odio xD)

Vedere se un intero è pari o dispari richiede poche istruzioni elementari, quindi di solito lo puoi fare col linguaggio che ti pare, in ladder poi spesso si può accedere facilmente ai singoli bit con la notazione del punto (es. M10.5), quindi la cosa potrebbe addirittura ridursi ad un'unica istruzione, cioè prelevare il bit meno significativo della variabile (bit 0) usandolo direttamente come booleano (eventualmente negato per avere true quando il numero è pari). Se poi ritieni di realizzare un blocco funzione apposta nessuno te lo vieta.

Più che altro sarebbe da capire se interessa davvero tenere il conto degli accessi. Perché, se non interessa, c'è un modo ancora più comodo e adatto all'applicazione per sapere se il numero di accessi finora eseguiti è pari o dispari, e non devo certo essere io a dirtelo! :lol:

Link al commento
Condividi su altri siti

Aaah vedo che la doppia g è contaggggggiosa :P

No, l'ho scritta per solidarietà hahahah xD

Vedere se un intero è pari o dispari richiede poche istruzioni elementari, quindi di solito lo puoi fare col linguaggio che ti pare, in ladder poi spesso si può accedere facilmente ai singoli bit con la notazione del punto (es. M10.5), quindi la cosa potrebbe addirittura ridursi ad un'unica istruzione, cioè prelevare il bit meno significativo della variabile (bit 0) usandolo direttamente come booleano (eventualmente negato per avere true quando il numero è pari). Se poi ritieni di realizzare un blocco funzione apposta nessuno te lo vieta.

Questo non pensavo si potesse fare, molto spesso ho usato una soluzione simile quando ho fatto l'assembly perciò...La scelta del functional block l'ho fatta solo perchè non avevo idea di come risolvere il problema :)

Più che altro sarebbe da capire se interessa davvero tenere il conto degli accessi. Perché, se non interessa, c'è un modo ancora più comodo e adatto all'applicazione per sapere se il numero di accessi finora eseguiti è pari o dispari, e non devo certo essere io a dirtelo! :lol:

Il realtà tenere conto degli accessi non è richiesto, ho scelto io di farlo perchè in questo modo potevo andare a valutare se una sequenza accedeva alla sezione critica un numero pari di volte. Però sono sincero l'unica cosa che mi viene in mente è usare un contatore che conta fino a due in modo da poter andare a controllare la sua uscita se è alta perchè in tal caso è stato fatto l'accesso almeno due volte (se ho indovinato mi gaso tantissimo xDxD)

Avevo un dubbione di nuovo sulla struttura mutex che devo assolutamente farti e dico devo perchè domani ho l'interrogazione e diciamo che mi sta iniziando a venire un po di ansia :(

Se io implemento il mutex abbiamo detto che il semaforo va come fase iniziale, ma le due sequenze che il semaforo collega rimangono senza fase iniziale o devo mettere anche le loro fasi di partenza come fasi iniziali?

Link al commento
Condividi su altri siti

Inserita: (modificato)

Anzi ho trovato un ulteriore modo che secondo me è semplice più del primo e senza bisogno di contatori...

Se monitorassi ad esempio i fronti di salita della prima fase della sezione critica potrebbe essere una soluzione, no? adesso provo a fare un esempio

           ------------
           ||        ||
           ||   1    ||
           ||        ||
           -----------
                |
    3           |
--|P|-------+------- 
                |
                |
           -----------
           ||       ||
           ||   2   ||
           ||       ||
           -----------
                |
   3            |
--|P|-------+------- 
                |
                |
           -----------     __________________
           ||       ||    |                  |
           ||   3   ||----|  Forza SFC: {}   |
           ||       ||    |__________________|
           -----------
                |
                |
                .
                .
                . 

Dove 3 è la variabile associata alla prima fase della sequenza critica che è 1 se è attiva e 0 altrimenti.

Modificato: da mehehe
Link al commento
Condividi su altri siti

Più che contare fino a 2, mio caro, magari contare fino a 1, e ho detto tutto...

Il tuo ultimo post non mi convince molto, ma potrei non aver capito bene tutta la faccenda... Ad ogni modo penso di non poterti aiutare oltre nemmeno facendo l'interrogazione al posto tuo! :P
Seriamente, anche solo per darmi tutti gli elementi per poter valutare faremmo notte. Rifletti bene e se cominci a "sclerare" chiudi tutto, è solo un'interrogazione, l'importante è essersi impegnati.

In bocca al lupo, ciao :thumb_yello:

Link al commento
Condividi su altri siti

Ok ti ringrazio sei stato più che gentile nel darmi certe dritte...assolutamente non voglio che tu faccia l'interrogazione al posto mio xD anche perchè diventa per me un modo per poter mostrare quanto mi sia appassionato e quanto ho capito l'argomento trattato.

Crepi il lupo :)

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