Vai al contenuto
PLC Forum


Testo Strutturato - Funzione While


Messaggi consigliati

Inserito:

Buongirno,

Su un FPX ho provato ad utilizzare la while,ma quando spedisco il tutto al plc ,mando in run e l'ingresso X5 va a 1 il plc va in

errore e mi disabilita la comunicazione con il PC.

Disabilitando la comunicazione con il PC non riesco a vedere il codice di errore.

L'istruzione che ho scritto e questa,il compilatore la compila senza errori

WHILE (X5) DO
                
R31:=TRUE;
                
END_WHILE;

Secondo voi dovè l'errore?

Grazie


del_user_56966
Inserita:

Secondo me non c'è nessun errore che il compilatore può ravvedere

durante la compilazione...

più semplicemente penso che X5 non verrà mai aggiornata e quindi che il loop superi il tempo di watchdog del PLC...

Gianmario Pedrani
Inserita:

Anche secondo me, il problema è che quando entri nel while, non esci più ed entri in un ciclo infinito, mandando il plc in watchdog..

L'errore credo che sia la logica con cui hai pensato al ciclo while!!!

Inserita:

OK :unsure:

L'errore credo che sia la logica con cui hai pensato al ciclo while!!!

Non sto utilizzando la funzione per realizzare un progetto,ma solo per uso didattico

Se ho capito bene il plc entra in un ciclo infinito,"o quasi" e siccome il timere watchdog non viene azzerato il plc va in errore.

E possibile alzare il timer?.

Una curiosità personale;l'errore succede anche quando si programma un programma che girerà su un pc o no?,ad esempio in C

Inserita:

I cicli di while, di do e altri cicli son sempre pericolosi se non si fa attenzione. Se si sbaglia o non si verifica mai la condizione per uscirne il dispositivo (PLC o elaboratore) sta fermo in loop sino a che non interviente un evento Hw (watch dog p,e,) a interrompere il ciclo.

Per evitare questo è buona norma mettere un limite, tramite un contatore, che interrompa il ciclo.

del_user_56966
Inserita:
E possibile alzare il timer?.

Di sicuro puoi fare un upgrade del watchdog tramite la F142 tipo...

IF ON_Start THEN

F142_WDT (1005) ' / esegue un upgrade del timer a 100,5 mS

END IF

Ma la funzione che vuoi fare tu non si dovrebbe eseguire in questo linguaggio o almeno non cosi...

penso il suo linguaggio naturale sia la programmazione sequenziale SFC... che è appunto un altro linguaggio dei 5 standard che trovi in FPWIN PRO..

Una curiosità personale;l'errore succede anche quando si programma un programma che girerà su un pc o no?,ad esempio in C

Dipende dall'errore che commetti, se fai un errore tipo quelli che dice Livio direi di si!, mentre il solito tuo programma gestito da un ambiente multitasking può

funzionare sempre che in quel caso la gestione del refresh di X5 sia affidata a un task separato, considera comunque che il task del ciclo white rimarrebbe in loop

fino al cambio di stato di X5 e in ogni caso l'uso dei cicli di loop richiede sempre molta attenzione... :)

Inserita:

Ho deciso di non ripostare un'altro Topic,perche siamo l'argomento tratta sempre il testo strutturato.

Come ho detto sopra,e da poco che sto utilizzando il testo strutturato,devo dire che è tutto un altro mondo,si avvicina molto ai linguaggi di alto livello.Devo convertire in ST una piccola funzione IL,ve la posto:

LD R100

AND R101

S R102

DFN

R R102

In linguaggio ST come viene convertito il tutto?

Grazie

Roberto Gioachin
Inserita:

In questi casi si usa l'istruzione "IF" non si usa "WHILE".

NON si devono fare dei loop per eseguire delle semplici istruzioni paragonanabili a contatti in serie, parellelo e assegnazioni.

Prova scrivere IF e premere il tasto "F1"

Ciao

Roberto

Inserita:

Ciao roberto,

In questi casi si usa l'istruzione "IF" non si usa "WHILE".

Come ho gia detto nel mio precedente, post non c'entra nulla l'istruzione IF con il WHILE,era solo didattica

Prova scrivere IF e premere il tasto "F1"

Ho provato a scrivere IF e premere F1 "La guida online" ma su IF non esce nulla.Forse e la versione del PRO.

Tu che versione hai?

Grazie

Roberto Gioachin
Inserita:

Scusa mazzinga per il ritardo con cui ti rispondo.

La mia risposta precedente dava un pò per scontato che l'. in linea fosse fatto bene, ma trattandosi di programmi tedeschi..........

Ho quindi verificato ed ho visto che se vuoi informazioni per la tua richiesta devi cercare sull'. il seguente argomento:

". on Transforming your LD Program to an ST Program"

In questa pagina trovi gli esempi che ti servono, sia con l'istruzione "IF" sia senza questa istruzione; alla fine non cambia nulla in quanto il compilatore converte il programma in codice plc nello stesso modo.

Io comunque sono dell'opinione che il vero vantaggio con questo linguaggio lo si ha quando si lavora con numeri e non con i bit.

Mi spiego meglio, le istruzioni a bit sono istruzioni logiche, nella fase di monitoraggio la rappresentazione grafica del ladder ti permette una maggiore immediatezza nell'interpretare la condizioni che producono un certo segnale in uscita.

Cio non toglie che per avere una riutilizzabilità del programma fra questo ambiente ed altri, solo questo (ST) è il linguaggio che puoi utilizzare.

Ciao

Roberto

Inserita:

Ok grazie della info.

Io comunque sono dell'opinione che il vero vantaggio con questo linguaggio lo si ha quando si lavora con numeri e non con i bit.

Sicuramente quando si lavora con i numeri i vantaggi sono notevoli,ma penso che una volta che si entra nell'ottica del'editor rimane abbastanza facile anche la logica a bit.

Io ti posso dire che fino a qualche anno fa,circa 5/6,per programmare in linguaggi strutturati,Lista Istruzioni o Testo strutturato sembrava fantascienza.

Fino a quando non ho iniziato ad utilizzato il IL "AWL per intenderci"e ti posso dire che è tutto un altro mondo,il Lader lo lasciato perdere e non ricordo neanche più come si utilizza,Scrivere un codice è piu versatile veloce.Ora sto iniziando ad utilizzare il Testo Strutturato e mi trovo ancora meglio del IL sia per la logica a Bit che per i numeri.

Diciamo anche che sono gusti.

nella fase di monitoraggio la rappresentazione grafica del ladder ti permette una maggiore immediatezza nell'interpretare la condizioni che producono un certo segnale in uscita.

Su questo punto sono d'accordo con te,il Lader non lo supera nessuno.

Tu che linguaggi usi maggiormente per creare i tuoi codici?

Ciao

Inserita:

Meglio precisare

Io ti posso dire che fino a qualche anno fa,circa 5/6,per programmare in linguaggi strutturati,Lista Istruzioni o Testo strutturato sembrava fantascienza.

Naturalmente lo era per me.

Grazie

Roberto Gioachin
Inserita:

Cerco di imparare ad usarli tutti, ma sopratutto di non usare sempre lo stesso linguaggio per qualsiasi cosa.

Naturalmente per la logica utilizzo "ladder", per le sequenze "SFC" per i calcoli... un misto, in futuro vedremo.

Di certo una volta compilato, mi vado a vedere il codice plc per verificare quale sia la soluzione meno pesante in termini di dimensione della memoria impegnata.

Ciao

Roberto

Inserita:
Di certo una volta compilato, mi vado a vedere il codice plc per verificare quale sia la soluzione meno pesante in termini di dimensione della memoria impegnata.

Questo se il problema principale è la memoria! :) , alias compattezza.

Io credo che ci siano 3 parametri fondamentali nei "listati":

- Leggibilità (Si generano molte linee, spesso molto semplici POCA COMPATTEZZA)

- Compattezza (spesso si usano funzioni ricorsive o chiamate a subroutine, POCO LEGGIBILE)

- Velocità (POCO dei precedenti....)

Questi tre parametri non vanno molto d'accordo, quindi non sono mai presenti contemporaneamente, dipende quale sia lo scopo primario per cui è scritto un programma.

Roberto Gioachin
Inserita:
Questo se il problema principale è la memoria!

Se ti ritrovi ad impegnare il 99 percento della memoria programma, certe cose le guardi, eccome.

Per la mia esperienza (non sono proprio giovanissimo), un programma ben fatto è sempre facilmente legibile, anche se si utilizzano funzioni ricorsive.

I programmatori, sempre secondo me si dovrebbero abituare ad alcune cose importanti.

Realizzare programmi sempre comprensibili (che non vuol dire semplici), abbituarsi ad usare il minimo indispensabile delle risorse.

Il fatto di abbituarci a sprecare memoria o velocità di elaborazione, potrebbe trovarci impreparati ad ottimizzare, nel momento in cui si arriva ai limiti del plc.

Passare ad un taglia superiore non è sempre una soluzione ottimale.

Il fatto poi di guardare il risultato sul compilato, mi permette di ottimizzare le mie funzioni e non solo......

Di certo non mi interessa verificare il compilato di tutto un programma, ma non la ritengo una pratica inutile, anche se questa è solo una mia opinione.

Io faccio così, gli altri.......

Ciao

Roberto

Inserita:
...... Realizzare programmi sempre comprensibili (che non vuol dire semplici), abbituarsi ad usare il minimo indispensabile delle risorse.

.....

Concordo a grandi linee....

Proprio per questo, pur generalizzando, mi spingevo un po' oltre, per esempio dentro il compilatore :)

Ti faccio un esempio anche se è riferito ad un microprocessore, lo Z80:

per azzerare l'accumulatore (registro A) in assembler si scrive LD A,0 semplice e chiaro, ma in memoria l'occupazione è di due byte, uno per l'istruzione e l'altro per il dato.

Se ho problemi di memoria allora scrivo Xor A, che di fatto azzera il registro (A=A xor A), ma in memoria occupa un solo byte.

In prima battuta la seconda soluzione risulta meno "leggibile", pur essendo più compatta e veloce.

Inserita:

Un altro esempio....

in qualsiasi linguaggio sommare i valori di un vettore per esempio Elementi(1000) si può scrivere così:

Totale = 0
For I = 1 to 1000 
  Totale = Totale + Elementi(I)
NEXT I
oppure:
Totale = 0
Totale = Totale + Elementi(1)
Totale = Totale + Elementi(2)
Totale = Totale + Elementi(3)
.....
Totale = Totale + Elementi(1000)

Il risultato è lo identico, il primo codice è compatto ma lento, il secondo codice è veloce ma non compatto!

Questo perchè nel primo codice viene eseguito un test sulla variabile I per ogni elemnto del vettore. Si potrebbe quasi dire che il tempo di esecuzzione è doppio rispetto al secondo esempio di codice.

Roberto Gioachin
Inserita:

Quello che scrivi non fa una piega, anche per il plc si possono usare strategie diverse con risultati simili a quelli che hai presentato, ma io non mi riferisco a questo tipo di problema.

In realtà non mi riferisco alla scelta se utilizzere o no un loop, o una subroutine (Function o Function Block), ma mi riferisco invece alle situazioni in cui uno stesso programma può essere scritto impegnando più o meno variabili e passi di programma, a volte basta anche invertire due condizioni senza che cambi il risultato, per usare qualche bit in più.

Secondo me, ripeto, non è una cattiva abitudine tenere sott'occhio il compilatore per capire meglio quello che combina, io ho avuto molte sorprerse.

Per chi come me che conosce molto bene il linguaggio "macchina" del plc (Panasonic), guardare il compilato può aiutare anche a non commettere errori, sembra strano ma ti assicuro che non lo è.

Ciao

Roberto

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