Cenni sull’utilizzo del linguaggio SFC
Home › Forum › Informazioni ambiente di sviluppo LogicLab › Cenni sull’utilizzo del linguaggio SFC
- Questo topic ha 10 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 5 mesi fa da
Stefano.
-
AutorePost
-
Gennaio 12, 2015 alle 11:49 am #35704
Stefano
PartecipanteNel progetto che sto sviluppando ho un programma SFC principale che definisce degli step di logica ad alto livello. Questi contengono macroazioni. Le macroazioni sono, a loro volta, scritte in SFC e gestiscono azioni a più basso livello.
Quando uno step ad alto livello cessa di essere attivo, tutto il codice riferito alla macroazione cessa di essere eseguito come da aspettative. Nel momento in cui lo step nel programma principale torna ad essere attivo, la relativa macroazione riprende a funzionare ma lo fa ripartendo dallo stato in cui era precedentemente.
Per la mia applicazione avrei bisogno che la macroazione riparta dallo step Init. Prima di inventarmi costrutti nello schema vorrei capire se esiste un comando che resetti una azione scritta in SFC.
Gennaio 12, 2015 alle 3:26 pm #38636Sergio Bertana
Amministratore del forumPremesso che non sono un esperto di linguaggio SFC, concordo con te che lo scenario è quello descritto, e non esiste un modo per resettare il flusso di esecuzione di un programma SFC.
Tu puoi in una azione modificare via linguaggio ST variabili utilizzate nel programma SFC ma non è possibile in nessun modo gestire il flusso di esecuzione. Quindi quando lo step ad alto livello cessa di essere attivo gli step che gestiscono le azioni a basso livello rimangono congelati allo stato in cui sono.
Gennaio 12, 2015 alle 3:49 pm #38640Stefano
PartecipanteSperavo in una variabile tipo SFCInit come in codesys. Vedo di girarci attorno con un qualche costrutto.
Gennaio 12, 2015 alle 5:07 pm #38641Sergio Bertana
Amministratore del forumHo contattato al riguardo la Axel che mi ha dato alcuni suggerimenti, abilitando la flag Check functions and functions blocks external variables (Screenshot) si attivano anche le flag di controllo dello stato SFC (Vedi nota tecnica).
Gennaio 13, 2015 alle 8:51 am #38642Stefano
PartecipanteGrazie mille! Avevo notato quei flag in opzioni progetto ma nella documentazione non ne era spiegato il funzionamento.
Sarebbe comodo avere a disposizione in donwload la libreria (SFCControl.pll) menzionata nella documentazione. Le variabili descritte, comunque, fanno egregiamente il loro dovere.
Gennaio 13, 2015 alle 10:42 am #38647Stefano
PartecipanteHo parlato troppo presto. Funzionava perchè avevo lasciato i miei costrutti di reset.
Se dichiaro la variabile tra le locali, o tra le globali, il compilatore passa i controlli ma poi nell’esecuzione del programma non avviene il reset.
Gennaio 14, 2015 alle 5:00 pm #38648Sergio Bertana
Amministratore del forumHo rispolverato un vecchio progetto di esempio con un lampeggiante (Topic) ed ho aggiunto una transizione divergente. In una azione ho inserito il controllo su l’ingresso logico Di00CPU che oltre ad essere copiato sull’uscita logica Do01CPU sul fronte di attivazione setta la variabile Nome POU_RESET_SFC.
E se attivi l’ingresso Di00CPU il flusso di esecuzione SFC si resetta come deve essere (Ecco lo screenshot). Allego il programma sorgente.
Gennaio 19, 2015 alle 11:23 pm #38668Stefano
PartecipanteHo esaminato il programma di esempio, funziona ma è leggermente diverso dallo scenario descitto da me. Esempio:
– Creiamo un programma SFC chiamato Main.
– All’interno di questo creiamo una azione in linguaggio SFC (chiamiamola subSFC)La mia esigenza è applicare il flag _RESET_SFC dal programma “Main” in modo da resettare lo step “subSFC”. Se all’interno di “subSFC” applico il flag “Main_RESET_SFC” il compilatore non da errori e quando il flag diventa true il programma “Main” si resetta. Stessa cosa se all’interno di “Main” setto a true il flag “Main_RESET_SFC”.
Se all’interno di “Main” setto il flag “subSFC_RESET_SFC” il compilatore da errore. Idem se lo facco all’interno di “subSFC”. Ho provato anche con costrutti tipo “Main.subSFC_RESET_SFC” oppure “NomePasso.subSFC_RESET_SFC” o anche “NomeAzione.subSFC_RESET_SFC” (quindi “subSFC.subSFC_RESET_SFC”) ma il compilatore segnala sempre un errore.
Gennaio 20, 2015 alle 8:50 am #38669Sergio Bertana
Amministratore del forumSe guardi la nota il costrutto esatto per riferirsi alla flag di reset SFC della Action è [Programma]_[Action]_RESET_SFC. Quindi nel tuo esempio sarà Main_subSFC_RESET_SFC.
Ho modificato l’esempio di prima aggiungendo una Action in SFC (ABlink) ed ho gestito il comando di reset del SFC della Action sia dal programma SFC principale (Screenshot), allego il programma sorgente.
Il programma esegue 10 lampeggi della uscita e poi resta in attesa per 5 secondi con l’uscita attiva, prima di riprendere il ciclo dall’inizio. Con un ingresso digitale Di00CPU è possibile resettare in qualsiasi momento l’esecuzione del ciclo.
Gennaio 21, 2015 alle 9:40 pm #38674Stefano
PartecipanteGrazie mille, ora funziona tutto come da specifiche. Avevo interpretato la nota relativa al reset di una azione in modo differente.
Ottobre 30, 2019 alle 9:28 am #50473Stefano
PartecipantePurtroppo, a distanza di quasi 5 anni, devo rimettere mano al programma in cui ho utilizzato le variabili relative a questi post. Il programma era stato scritto con l vecchio LogicLab3 (2.3.0.0) e salvato con estensione ppjs. Se lo carico con l’ultima versione di LogicLab e cerco di compilare mi dice:
BLINKVALUE(39) – errore S1305: DIV => Funzione sconosciuta
DIV fa parte degli operatori di base. Dato che nel progetto ci sono anche link alle librerie in formato PLL ho pensato di salvare il progetto in plcprj e fare il link alle nuove librerie. Ora, compilando, l’errore è:
MAINPROGRAM(17) – errore A4097: CONTROLLOMACCHINA_RESET_SFC => Oggetto non trovato
MAINPROGRAM(18) – errore A4097: VISALLARMISFC_RESET_SFC => Oggetto non trovatoNon trovo riferimenti a queste due variabili nel software, anche se da qualche parte dovrei averle usate. Le trovo però nel file temporaneo LLSFCPreProc.lst creato in compilazione:
{SRC:MAINPROGRAM}
LD MAINPROGRAM_HOLD_SFC
LD MAINPROGRAM_RESET_SFC
S CONTROLLOMACCHINA_RESET_SFC
S VISALLARMISFC_RESET_SFC
…La cosa strana è che se tolgo il flag da “Abilita le opzioni del controllo SFC” la compilazione avviene correttamente, anche se non so se poi il software funzioni ancora una volta usato nella macchina.
Aggiungo che nemmeno il software di esempio presente qui si compila con l’ultima versione di LogicLab.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.