Vai al contenuto
PLC Forum


Stesura codice scl


Giovanni Segreto

Messaggi consigliati

Giovanni Segreto

Buonasera a tutti,

il codice allegato sotto in foto e il codice di una fb.

Vorrei comprendere la logica con il quale si imposta il codice per gli ingressi del fb.

La variabile #index e usata come variabile di base? Può essere una variabile static di tipo int del fb?

Nella stesura del scl #index Serve per dichiarare al plc che si lavora al interno del fb?

Inoltre i richiami a index:=10 o 

Index:= 20 servono a indicare spazi di azione di determinati comandi? O meglio dire al plc se index è 20 allora comportati cosi?

 

Grazie

 

20200516_223210.jpg

Link al commento
Condividi su altri siti


13 ore fa, Giovanni Segreto ha scritto:

La variabile #index e usata come variabile di base? Può essere una variabile static di tipo int del fb?

la variabile #index sarà una variabile istanziata nelle variabili statiche e sarà parte della DB di istanza del blocco.

la funzione CASE è la tipica funzione per gestire una logica sequenziale. Quello che ti consiglio è il commento maniacale di qualsiasi passo es. so che nel passo 170 il caricatore è in salita e aspetta la posizione alta. Raggiunta la posizione alta aspetta 100 ms quindi parte per alimentare la pressa

(*
-----------------------------------------------------------------
Wait for loading crane upward
-----------------------------------------------------------------
*)
        170:
            IF "Stop UPW crane" THEN
                "AutoUPW_Crane" := FALSE;
            END_IF;
            
            #tonDelayAuto(IN := NOT "AutoUPW_Crane",
                          PT := T#100ms);   // timer on delay                  
            IF #tonDelayAuto.Q THEN
                #StepLoadingCrane := 180; // goto next step
                IF "DB_GD".PassoPasso THEN
                    "DB_GD".StartCiclo := FALSE;
                END_IF;
            END_IF;
            
            
(*
-----------------------------------------------------------------
Loading crane FRW goto press brake
-----------------------------------------------------------------
*)
        180:
            IF "DB_GD".bofeedbackciclo THEN
                "AutoFRW_Crane" := TRUE;
                #StepLoadingCrane := 190; // goto feeding the beast
            END_IF;

Nel mio caso l'indice #StepLoadingCrane è l'indice di una catena sequenziale che fa riferimento a quella stazione della macchina. Individuate i sottoinsiemi della linea ( o stazioni qualsivoglia chiamarle) si ottiene il numero minimo delle catene sequenziali da inserire nella logica.

 

Qualora si intenda ramificare la logica basta innescare altri indici ed aspettarne il completamento della sottologica.

 


 

 

Link al commento
Condividi su altri siti

Giovanni Segreto

@pigroplc pultroppo sia il codice che l inglese in combo mi mettono in difficolta!

Mi sembra di comprende peró nel caso del case che index e una variabile static della db ed 0 1 2 3 50 51 sono valori della variabile #index definita nella db di istanza e a questi valori corrispondono linee di codice operativo? E corretto??

Grazie

Link al commento
Condividi su altri siti

Giovanni Segreto
9 ore fa, pigroplc ha scritto:

 

Qualora si intenda ramificare la logica basta innescare altri indici ed aspettarne il completamento della sottologica.

Cioè usare altri #index di altri parti macchina/Automazione?

Link al commento
Condividi su altri siti

2 ore fa, Giovanni Segreto ha scritto:

valori corrispondono linee di codice operativo? E corretto??

esatto. Se il valore è 0 in genere la catena sequenziale resta bloccata, ma questa è una scelta di logica di chi sviluppa, poi se le condizioni sono soddisfatte il valore passa a 10 per esempio e la parte di codice successiva viene eseguita.

 

2 ore fa, Giovanni Segreto ha scritto:

Cioè usare altri #index di altri parti macchina/Automazione?

certamente. Per far partire altre catene sequenziali per esempio.

Link al commento
Condividi su altri siti

Giovanni Segreto
23 ore fa, pigroplc ha scritto:

certamente. Per far partire altre catene sequenziali per 

 

@pigroplc per catena sequenziale intendi ad esempio: soddisfatta la index 10 vado alla 12. Mi viene il dubbio peró che se ad esempio la variabile finale sarà 12  al ciclo successivo del fb la parte 10 viene scartata dalla scansione.

Questo presuppone che la index 10 e stata completata?

 

Poi approfitto per chiederti anche  un altra cosa a proposito 

Sulla scansione di un fb richiamato in un ob.

Premessa:Il ciclo di scansione di un ob (esempio n segmenti )funziona cosi: la cpu legge gli ingressi e li mette nel immagine di processo degli ingressi

Idem per le uscite, poi esegue il RLC scrive le uscite fisiche (se ho capito bene) .

Ma per le variabili locali di un fb funziona alla stessa maniera ? Ovvero legge gli ingressi dirichiarati nel interfaccia del blocco fb e in fine dopo che ha fatto le operazioni scrive in out sempre del interfaccia ?

Grazie!

 

Modificato: da Giovanni Segreto
Link al commento
Condividi su altri siti

il ciclo CASE è semplice: può solamente processare una condizione. Esistono infiniti modi per svilupparlo, all'interno dello stesso CASE puoi gestire tanta logica ma io non sono tanto bravo e prediligo le cose semplici es:

10: abilita l'uscita di salita del caricatore e imposta l'indice a 20 (questo sul 10 non ci gira più manco morto)
20: attendi il fine corsa di caricatore alto, spegni quindi l'uscita di salita. Dopo 100 ms che l'uscita è spenta abilita l'uscita di avanzamento per alimentare la bestia e imposta l'indice a 30

30: ecc ecc

 

si può anche fare così:

 

10: abilita l'uscita di salita del caricatore e imposta l'indice a 20 (questo sul 10 non ci gira più manco morto)
20: attendi il fine corsa di caricatore alto, spegni quindi l'uscita di salita e imposta l'indice a 30

30: Dopo 100 ms che l'uscita è spenta abilita l'uscita di avanzamento per alimentare la bestia e imposta l'indice a 40

40: ecc ecc

 

8 ore fa, Giovanni Segreto ha scritto:

Sulla scansione di un fb richiamato in un ob

esatto, magari aggiorna solamente gli ingressi e ingressi/uscite. Le uscite pure le aggiorna alla fine 

Link al commento
Condividi su altri siti

@Giovanni Segreto ho come l’impressione che , per quanto riguarda il Case, tu tenda a complicare le cose rispetto a quanto realmente lo siano. 
Voglio dire, la variabile ‘index’ sei tu che ci scrivi dentro il valore che vuoi in modo da farla avanzare solo quando vuoi. Non è una variabile di sistema , comandata dal sistema. 
Il costrutto Case , come già ti ha detto pigro, processa e valuta ‘index’. Se vale 10, esegue quello che sta scritto di seguito. Una volta terminato, salta dopo l’etichetta End_Case. I casi 20,30 ecc non vengono valutati. Se nel 10 ci sono le condizioni per proseguire , carichi 20 in index e quindi alla scansione successiva non verrà piu processato 10 ma 20. 
 

Spero di essere stato piu chiaro

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