Vai al contenuto
PLC Forum


Comando Awl Uc


starktony

Messaggi consigliati

Buongiorno a tutti,

studiando la guida step 7 mi sono imbattuto nel comando UC <identificazione del blocco di codice> (Richiamo incondizionato di un blocco), ma non riesco a capire come funziona. Dovrebbe essere l'equivalente di CALL ma senza parametri

Se richiamo una FC parametrizzata con magari un parametro in ingresso e uno in uscita come faccio ad essegnare l' ingresso?

Ho provato a richiamare tramite UC l' SFC 20 BLKMOV ma non me lo permette. Qualcuno puà darmi una mano?

Grazie in anticipo

Link al commento
Condividi su altri siti


Dovrebbe essere l'equivalente di CALL ma senza parametri

Ti sei già dato la risposta.

Ovviamente, puoi usare l'istruzione UC al posto di CALL solo per richiamare FC che non richiedono parametri.

Se ci sono parametri, devi uasre per forza l'istruzione CALL.

Link al commento
Condividi su altri siti

Cercando ho trovato questo esempio:


UC	"BLKMOV"

			P#L 8.0

			P#L 36.0

			P#L 18.0

sembra che usa i dati locali per i parametri necessari all'sfc 20. Ma l'sfc in questione richiede 2 parametri Any e uno Int mentre qui viene caricato il valore del puntatore riferito a quell'area di dati locali. Non riesco a capire come funziona.

Volendo emulare il codice che ho scritto, il plc non accetta il comando UC "BLKMOV" e mi rimane rosso.

Modificato: da starktony
Link al commento
Condividi su altri siti

Non so dove tu abbia trovato quell'esempio, ma è completamente sbagliato.

Prima di tutto, non si può usare l'istruzione UC per richiamare SFC20.

Poi sono completamente sbagliati i collegamenti delle variabili.

SRCBLK e DSTBLK richiedono una variabile di tipo ANY, che può essere richiamata semplicemente usando il simbolico (per esempio assegnando il nome di una variabile, di una struttura o di un array), o indicando l'indirizzo.

Nel caso si voglia usare l'indirizzo, nell'esempio manca la lunghezza dell'area di dati da trasferire.

Al posto di:

P#L 8.0

si dovrebbe scrivere, per esempio:

P#L 8.0 BYTE 20

A RET_VAL si deve collegare una variabile di tipo INT. Quindi, sempre per seguire l'esempio, al posto di:

P#L 36.0

si potrebbe scrivere:

LW 36.0

Poi io trovo estremamente brutto accedere alle variabili locali con l'indirizzo. Molto meglio usare il simbolico.

Se usi l'indirizzo, se modifichi la struttura delle variabili locali devi rimettere a posto tutti gli indirizzi.

Insomma, sarei proprio curioso di sapere dove hai trovato quell'esempio, perché non mi è mai capitato di trovare così tanti errori tutti insieme.

Link al commento
Condividi su altri siti

Ho controllato il programma che mi hai inviato.

Effettivamente ci sono le istruzioni esattamente come le hai scritte tu ma, se provi tu a scrivere qualcosa di simile, non te lo accetta.

La spiegazione però è molto semplice: la funzione FC160 che contiene il richiamo "anomalo" di "BLKMOVE", è stata scritta in SCL.

Il codice sorgente SCL però è mancante, e l'FC160 che ti ritrovi è stata scaricata così com'è direttamente dalla CPU.

La CPU però lavora solo con codice AWL, anche se il programma viene scritto in altri linguaggi. Quindi, se scrivi una funzione in SCL, il compilatore la converte in AWL prima di scaricarla nella CPU.

I blocchi generati dal compilatore SCL possono contenere istruzioni che non vengono accettate dall'editor AWL.

Inoltre, come puoi notare, il codice AWL generato dal compilatore SCL è estremamente contorto. In questo caso, fa addirittura riferimento ad indirizzi nell'area locale che non sono nemmeno stati dichiarati nell'interfaccia delle variabili.

Spesso riuscire a capire il funzionamento di un blocco partendo da codice così generato, è impresa impossibile o quasi.

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