Vai al contenuto
PLC Forum


Auto-referenza ad istanze


treval

Messaggi consigliati

Premetto che la mia domanda è un po' "filosofica" e non è indirizzata a risolvere un problema specifico.
L'ambiente è l'S7-1500.

Supponiamo che abbia sviluppato una FB chiamata "myClass" utilizzata con un suo DB di istanza che chiameremo "myInstace", in linguaggio SCL il richiamo dell'FB sarà qualcosa del tipo:
       "myInstace"();

Supponiamo ancora che abbia creato una FC di nome "myMethod" che ha come parametro di IN/OUT la variabile "INST" di tipo "myClass" , la chiamata della FC sarà qualcosa del tipo:

      "myMethod"(INST:="myInstace");

La domanda è se esiste la possibilità di richiamare l'FC anche all'interno dell'FB "myClass", in quanto servirebbe un puntatore autoreferenziale all'istanza dell'FB, in altre parole una specie di "THIS" del Java.

 

Grazie

 

 

Link al commento
Condividi su altri siti


non so se ho capito la tua richiesta ma io la farei così:

devi dichiarare l'istanza della tua FB come parametro input/output

 

b.png

a.png

ovviamente devi dichiarare la tua istanza non come DB globale ma come DB istanziata nella tua classe FB

Link al commento
Condividi su altri siti

Ok, questo che  hai mostrato è come sto già utilizzando ora questa tecnica,

quello che mi interesserebbe fare è spingermi oltre ed utilizzare l'FC anche all'interno dell'FB, non solo all'esterno.

per fare questo non posso richiamarla allo stesso modo: cioè:

"myMethod"("myInstace");

in quanto punterebbe ad una specifica istanza, io voglio invece che punti all'istanza dell'FB chiamante.

 

 

Link al commento
Condividi su altri siti

una FC non è istanziata. L'unico modo di inscatolare richiami di FB è come ti ho mostrato, mettendolo come richiamo IN/OUT perché come richiamo TEMP non te lo accetta.

 

Se vuoi creare una multi-istanza (tipico esempio di una macchina con più assi controllati, dove si crea una FB "madre" che contiene nei parametri statici i richiami delle FB delle molteplici funzioni (es. start asse, homing, stop asse ecc.).
La multi-istanza che si crea al richiamo della FB madre contiene inscatolate tutte le strutture delle FB definite come statiche.

 

 

 

Link al commento
Condividi su altri siti

Credo di non riuscire a spiegarmi come vorrei, e ne chiedo scusa.

Togliamo dalla discussione tutto quanto riguarda le multi-istanze, non sono tema della mia domanda.

L'FC richiamata nel modo da te descritto (che tra l'altro è esattamente come la utilizzo io) ha piena visibilità sul DB di istanza "myInstace", può vedere tutte le variabili, manipolarle per fornire per esempio un servizio specifico.

Bene, supponiamo che anche l'FB madre (che io penso giri sempre a differenza delle FC che verrebbero richiamate ad-hoc per eseguire compiti specifici) abbia bisogno di richiamare una particolare funzione che è già fornita come FC....

In tal caso sono costretto a riscrivere due volte il codice una volta dentro l'FB e una volta dentro l'FC, in quanto non posso utilizzare l'FC all'interno dell'FB stessa.

 

Riporto solo a titolo di esempio una schermata che spero possa essere di aiuto

 

 

Annotazione 2019-12-21 194139.png

Link al commento
Condividi su altri siti

treval,

 

quello che ne ho capito io è che tu vorresti applicare la logica OOP nel PLC. Questo non è possibile a quanto ne so io, a meno che con il TIA16 non ci sia qualcosa di simile. Visto che nell'esempio usi una tecnologica e ne deduco quindi funzioni motion anche complesse ti consiglierei di esplorare il mondo Simotion, dove OOP è possibile.

Tra l'altro potresti migrare gran parte del codice SCL modificando solamente i richiami delle funzioni tecnologiche.

Se ti incuriosisce l'argomento c'é questo:

https://new.siemens.com/global/en/products/automation/systems/motion-control/simotion-software/oop.html

 

 

 

 

Link al commento
Condividi su altri siti

Capisco che questo sia solo un semplice esempio, mentre poi vorrai fare cose più complicate, ma non capisco perché tu voglia passare alla FC "slidePosition" tutta la struttura della FB "slideAxis". Perché non passi solo la struttura "Config"?

Per rendere le cose più semplici, ti crei un tipo di dati con la struttura delle variabili "Config", in modo che, in caso di modifiche, ti basta modificare solo il tipo di dati, e non tutte le funzioni.
Esempio:

image.thumb.png.e3b0c82ff4a5b8b74a75ab22fdfb7209.png

Modificato: da batta
Link al commento
Condividi su altri siti

Purtroppo o per fortuna cerco sempre la logica OOP in tutti gli ambienti in cui mi trovo ad operare, anche se limitata o parziale.
Il TIA su 1500  ha introdotto i FunctionBlock alla stregua dei tipi di dati per quanto riguarda i parametri dei blocchi, ed in alcuni rarissimi casi anche nei DB (ad esempio si possono dichiarare variabili di tipo TON_TIME in un DB globale ) sintomo che la strada intrapresa è quella.
Sono in molti a nutrire aspettative su TIA16, come se dovesse essere la panacea a tutti gli aspetti incompiuti dell'attuale versione, speriamo bene!

 

Grazie per il link

Link al commento
Condividi su altri siti

Ciao Batta,
il passare tutta la struttura dell'istanza è il modo più semplice ed intuitivo per passare l'oggetto ai suoi metodi.
 

è più semplice scrivere:

pendenza := "slidePosition"(linearPosition:= 100.0, slide:="mySlide");

 

invece di:

pendenza := "slidePosition"(linearPosition:= 100.0, slide:="mySlide".config);

 

certamente è possibile creare una UDT con tutti i dati dell'oggetto e passarla ai vari metodi e proprietà, ma continuo a pensare che sia un workaround e non la vera soluzione.

Quello che mi ruga è che il puntatore all'istanza è conosciuto all'interno dell'FB e non capisco perchè non venga reso disponibile tramite una parola chiave.

 

Se fossimo nel S7-300 il puntatore all'istanza non è altro che il DBI con indirizzo di base AR2....

 

 

 

Link al commento
Condividi su altri siti

Forse è solo perché non ci sono abituato, ma non mi piace molto l'idea di passare la struttura di tutta l'istanza.
Nel caso specifico, passare solo la struttura "Config" mi fa capire al volo cosa passo alla FC, senza dover entrare nella FC.
E, anche dall'interno della FC è più semplice individuare le variabili usate. Passare tutta la struttura, significa certamente avere tutti i dati a disposizione, ma significa anche non capire al volo quali dati sono effettivamente usati dalla funzione stessa.
Poi, come scrittura, scrivere:

pendenza := "slidePosition"(linearPosition:= 100.0, slide:="mySlide");

oppure:

pendenza := "slidePosition"(linearPosition:= 100.0, slide:=#config);

non mi pare poi tanto diverso.

 

Magari un giorno sarà possibile anche nel TIA la programmazione OOP e, magari, mi chiederò come si poteva farne senza. Al momento, non ne sento la mancanza.

Link al commento
Condividi su altri siti

Magari un giorno sarà possibile anche nel TIA la programmazione OOP e, magari, mi chiederò come si poteva farne senza. Al momento, non ne sento la mancanza.

Siamo in due a non sentirne la mancanza. Pur avendone la possibilità (lavorando su Simotion) non sono riuscito a sfruttare e capire le sue potenzialità, e sì che ho pure studiato il libro un paio di volte. Penso che sia difficile innestare un modo di lavorare diverso a chi ha radicato un metodo di lavoro ottimizzato in decenni e decenni, Quando ho preso in mano il libro continuavo a ripetermi frasi del tipo "...eh, ma queste cose si fanno semplicemente con UDT e multi-istanze" 

La prossima trasferta riprovo a studiare, anche se comunque una programmazione ottimizzata e professionale è già pensata a lavorare con "oggetti"

Modificato: da pigroplc
Link al commento
Condividi su altri siti

Programmare ad oggetti è più naturale di quanto si pensi, ora è "normale" costruire FB ed istanze per gestire dispositivi quali assi, valvole, motori ed altro....

ma un ventennio fa si facevano salti tripli per tentare di riprodurre "l'oggetto" affidandoci solo ai blocchi funzionali dell'S5, creando blocchi standard che lavorassero su dati diversi per gestire i vari dispositivi.

Ritornando alla mia domanda iniziale è .... che fatto 30....si poteva fare pure 31.

 

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