Vai al contenuto
PLC Forum


Funzionamento della coda di attesa.


Giovanni Segreto

Messaggi consigliati

Giovanni Segreto

Buonasera a tutti. Ma come funzionale coda di attesa nei plc Siemens?

 

La CPU elabora i codici solo in run,

la coda di attesa viene generata dagli eventi di allarme(ad esempio un bool che attiva l ob x)  gli eventi di allarme si programmano e vengono elaborati negli ob di avvio e sono letti dalla CPU nella fase avviamento?

Gli ob  di allarme vengono messi dalla CPU in coda di attesa per essere successivamente elaborati in  "run" in un punto casuale del programma? 

 

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


9 ore fa, Giovanni Segreto ha scritto:

Gli ob  di allarme vengono messi dalla CPU in coda di attesa per essere successivamente elaborati in  "run" in un punto casuale del programma? 

 

Se sono eventi legati ad interrupt l'attuazione è immediata, salvo il tempo di latenza dell'interrupt che, se ricordo bene, è un dato da manuale.

Link al commento
Condividi su altri siti

Ai vari OB è attribuita una priorità. OB con priorità più alta, se richiamati, interrompono OB con priorità più bassa.
Per fare qualche esempio:
Gli OB "Program Cycle" (tipo OB1) hanno priorità 1
Un OB a tempo ha priorità 13.

Un OB MC-Servo ha priorità 26.

 

La priorità la puoi vedere nelle proprietà dei blocchi. Per quasi tutti i blocchi è anche modificabile ma, personalmente, eviterei di stravolgere le priorità assegnate di default.
Per tornare all'esempio riportato sopra, se dovessi assegnare ad un OB "MC-Servo", che serve per il motion, una priorità bassa, è chiaro che non potrei pretendere di avere buone prestazioni del motion.

Link al commento
Condividi su altri siti

Giovanni Segreto
Il 9/12/2020 alle 21:30 , batta ha scritto:

Per tornare all'esempio riportato sopra, se dovessi assegnare ad un OB "MC-Servo", che serve per il motion, una priorità bassa, è chiaro che non potrei pretendere di avere buone prestazioni del motion.

Perché il richiamo dei blocchi con priorità più alta non consentirebbero ai blocchi Motion di avere il movimento "aggiornato" a causa della scansione di altri blocchi? 

 

Il 9/12/2020 alle 21:30 , batta ha scritto:

Ai vari OB è attribuita una priorità. OB con priorità più alta, se richiamati, interrompono OB con priorità più bassa.

Quindi se mi sta eseguendo un OB con priorità 2 nel quale suo interno c'e' un evento che richiama un OB con priorità 1 stacca ob priorità 2 per cambio ad ob priorità 1?  E questa la logica? 

 

Quindi un plc nella sua fase di avviamento crea le code di attesa così? 

Link al commento
Condividi su altri siti

2 ore fa, Giovanni Segreto ha scritto:

Perché il richiamo dei blocchi con priorità più alta non consentirebbero ai blocchi Motion di avere il movimento "aggiornato" a causa della scansione di altri blocchi?

Se, ad un OB del motion, assegni una priorità bassa, potrebbe venire interrotto da altri OB con priorità più alta, e questo peggiorerebbe le prestazioni del motion.

 

2 ore fa, Giovanni Segreto ha scritto:

Quindi se mi sta eseguendo un OB con priorità 2 nel quale suo interno c'e' un evento che richiama un OB con priorità 1 stacca ob priorità 2 per cambio ad ob priorità 1?  E questa la logica? 

Non importa che l'evento sia all'interno dell'OB. Un OB di interrupt, per esempio, non è richiamato da nessuna parte nel programma.
Per il resto, è esattamente il contrario. OB1, per esempio, ha priorità 1. Se, durante la normale esecuzione di OB1 (e di tutti i blocchi richiamati da OB1) viene avviato un OB Cyclic Interrupt che ha priorità più alta (13, se non ricordo male), l'elaborazione delle istruzioni di OB1 viene interrotta, vengono eseguite le istruzioni dell'OB con priorità più alta e, terminata l'elaborazione di questo OB, viene ripresa l'elaborazione di OB1 dal punto dove era stata interrotta.

 

Non sono "code di attesa", sono semplicemente task con priorità diverse. Chi ha priorità più alta, interrompe il lavoro di chi ha priorità più bassa.

 

Immagina di essere impegnato in un lavoro. Arriva il capo e ti dice: "Sospendi quello che stai facendo, che c'è un lavoro più importante da fare". Tu che fai? Ti dedichi al nuovo lavoro e, una volta terminato, riprendi il lavoro precedente da dove l'avevi abbandonato.

Link al commento
Condividi su altri siti

  • 4 weeks later...
Giovanni Segreto

Quindi gli ob servono a stabilire quale evento è più importante di un altro e di conseguenza a dare la priorità di esecuzione ai singoli eventi che si possono verificare durante il processo?  

@batta

16099473849256442510580486298832.jpg

Link al commento
Condividi su altri siti

4 ore fa, Giovanni Segreto ha scritto:

Quindi gli ob servono a stabilire quale evento

No, sono gli interrupt che hanno priorità diverse e in alcune cpu come quelle della serie S7-400 puoi addirittura abbinare l'interrupt a certi OB così da poter discriminare il codice da eseguire in base all'interrupt che si scatena. Poi per alcuni OB per esempio il 35 che si aggancia ad un interrupt a tempo puoi impostare ogni quanti msec questo OB venga richiamato da quell'interrupt. Ed inoltre in alcuni casi puoi anche stabilire l'offset con il quale il tuo OB venga ritardato rispetto all'evento interrupt che lo richiama..

 

Link al commento
Condividi su altri siti

Giovanni Segreto
48 minuti fa, drn5 ha scritto:

No, sono gli interrupt che hanno priorità diverse

Mi sono espresso male, Per interrupt intendi gli eventi che generano l avvio del relativo ob o comunque eventi con priorità superiore agli ob ciclici? 

In configurazione hardware si possono assegnare booleani ad ob di interrupt di processo? Esempio se bool 1 é true si avvia relativo ob interrupt ? 

Grazie

@drn5

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

12 minuti fa, Giovanni Segreto ha scritto:

Per interrupt intendi gli eventi che generano l avvio del relativo ob o comunque eventi con priorità superiore agli ob ciclici? 

Per quanto riguarda questa discussione diciamo di si.

13 minuti fa, Giovanni Segreto ha scritto:

assegnare booleani

Se intendi se puoi "settare" un merker all'arrivo dell'interrupt dentro la configurazione hw della cpu, no.

Non lo puoi fare in configurazione hardware ma dentro l'OB che viene richiamato dall'interrupt.

Anche se "detta male" dentro l'OB scatenato dovresti scrivere "abbastanza" codice da gestire in modo "completo" la reazione del sistema all'evento che si è scatenato.

Tieni presente che per sua natura l'interrupt è "imprevedibile" quindi potrebbe capitare che intervenga in qualsiasi parte del codice eseguito... per questo dico "abbastanza completo".

Ciao

 

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