Vai al contenuto
PLC Forum


Dubbio su riconoscimento fronti al primo ciclo


Claudio F

Messaggi consigliati

Premetto che con i PLC non ci lavoro, mi interessano a livello teorico, e mi trovo diverse volte a realizzare piccoli "blocchi funzionali" in C++ che "simulano" i vari R_TRIG, TON, CTU ecc.

 

Il mio dubbio è questo: i blocchi funzionali predefiniti per i PLC reali (indipendentemente che i programmi siano in LD, ST, FBD) che hanno un ingresso sensibile al fronte, come si comportano al primo ciclo se l'ingresso ha già livello attivo?

 

Un R_TRIG o un CTU con ingresso alto al primo ciclo, lo considerano valido, oppure prima lo devono sentire basso per almeno un ciclo?

 

Il comportamento è identico per tutti i costruttori o ci sono differenze?

 

E, allo stesso modo, il tempo contato dai temporizzatori, o il conteggio dei contatori, si fermano quando viene raggiunto il valore/soglia previsti, oppure internamente proseguono?

 

Un contatore a decremento può scendere sotto lo zero?

 

Ok, si, in effetti i dubbi sono più di uno 😅

Link al commento
Condividi su altri siti


dina_supertramp

Ciao,

 

le istruzioni di riconoscimento fronti (edge)

devono vedere sempre un cambiamento di stato verso l’alto (positivo/rise) o verso il basso (negativo/fall).

 

Se al primo ciclo la variabile da interrogare ha già valore 1 (per fronte positivo in questo caso) il fronte non viene riconosciuto.

 

In poche parole:

Un fronte per essere riconosciuto deve avere una transizione di stato tra il ciclo precedente e l’attuale.

L’uscita del fronte sarà alta solo per il ciclo in cui la transizione è stata riconosciuta.

 

Normativa

IEC61131-3

Ti risolve tutti i dubbi che hai.

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti

Grazie per la conferma.

Si, ho provato a cercare informazioni non puramente introduttive/descrittive su IEC61131-3, ma ho trovato poco.

Link al commento
Condividi su altri siti

dina_supertramp

Di nulla.

Cerca bene che trovi, i temporizzatori come anche i contatori IEC sono normati, non devi inventarti nulla. 
Codesys e Beckhoff hanno molti esempi…

Link al commento
Condividi su altri siti

Il 25/2/2024 alle 10:56 , dina_supertramp ha scritto:

Se al primo ciclo la variabile da interrogare ha già valore 1 (per fronte positivo in questo caso) il fronte non viene riconosciuto.

Non è sempre così. E, a seconda dei casi, è preferibile un comportamento oppure l'altro. Important è sapere cosa succede.
Con Siemens, per esempio, lo stato alto viene rilevato come fronte.
Per evitarlo, si può usare come memoria di appoggio una memoria ritentiva. Ma, anche in questo caso, dipende dallo stato del segnale prima dello spegnimento del PLC.
Voglio dire: se prima dello spegnimento il segnale era alto ed uso una memoria ritentiva, all'accensione un segnale alto non verrà rilevato come fronte; ma se allo spegnimento il segnale era basso, anche con memoria di appoggio ritentiva lo stato alto, al primo ciclo, verrà rilevato come fronte.

 

Il rilevamento del fronte, un tempo te lo dovevi scrivere. E ci sono due modi per scriverlo:
 

fronte := stato AND NOT memStato;
memStato := stato;

Oppure:

fronte := stato AND memStatoNeg;
memStatoNeg := NOT stato;

Oggi non è più mecessario scriverlo per esteso (anche se, personalmente, in strutturato piuttosto che usare P_TRIG preferisco ancora scriverlo), ma le varie funzioni di rilevamento del fronte usano sempre questo sistema.
E, se il rilevamento del fronte è fatto come nel primo modo, al primo ciclo (salvo i casi detti sopra) lo stato alto viene rilevato come fronte.
Sarebbe quindi più corretto utilizzare il secondo modo? A mio avviso, no, perché il fatto di rilevare il fronte potrebbe essere voluto.
Importante è sapere cosa succede, ed agire di conseguenza.

 

Fino ad ora come "fronte" è sempre stato inteso "fronte positivo". Le stesse considerazioni andrebbero ripetute per il "fronte negativo".


Su altri PLC, non mi pronuncio.
 

Link al commento
Condividi su altri siti

dina_supertramp
18 ore fa, batta ha scritto:

Con Siemens, per esempio, lo stato alto viene rilevato come fronte.
Per evitarlo, si può usare come memoria di appoggio una memoria ritentiva. Ma, anche in questo caso, dipende dallo stato del segnale prima dello spegnimento del PLC.
Voglio dire: se prima dello spegnimento il segnale era alto ed uso una memoria ritentiva, all'accensione un segnale alto non verrà rilevato come fronte; ma se allo spegnimento il segnale era basso, anche con memoria di appoggio ritentiva lo stato alto, al primo ciclo, verrà rilevato come fronte.
 

Grazie mille @batta!!!

Non ne ho mai avuto la necessità di verificarlo, ma adesso che lo so, visto che per lo più lavoro con Siemens lo terrò moooolto in considerazione il fatto che anche al primo ciclo lo stato alto viene visto come fronte (per fronte positivo).

Ho sempre lavorato con il merker first scan oppure con l'OB100

Ho indagato un po' sulla questione e avendo a disposizione la norma IEC 61131 ho trovato quanto allego (IEC 61131-8) che tra l'atro si riferisce proprio a quanto hai fatto notare sopra per fronti positivi, ed inoltre fa una bella analisi del fronte negativo

7.10.3 Use of edge-triggered function blocks


The R_TRIG and F_TRIG function blocks exhibit different behaviour following “cold restart".
The Q output of an R_TRIG instance can be set to 1 on the first invocation but the Q output of
an F_TRIG instance always requires at least two invocations before being set to 1.

This behaviour can be explained as follows.
– Since the default value of Boolean variables is 0, then if the CLK input is 1 on the first
invocation, it means that the input has changed its value from 0 to 1 i.e. a rising edge has
been detected and thus the Q of an R_TRIG instance is set to 1.
– In the case of an F_TRIG instance, the CLK input shall first be detected as being a 1 before
a change of state from 1 to 0 can be detected. Thus, at least two invocations are needed.

 

An interesting use of R_TRIG as a “first-cycle detection mechanism” follows from the above
description.

 

If the CLK input to an R_TRIG instance is the constant 1 (or TRUE), the output Q will
be true only on the first invocation since no subsequent change of state from 0 to 1 will be
possible.

 

This may be used as a first-cycle detect mechanism, for example,

 

VAR firstCycle: R_TRIG;

END_VAR

 

firstCycle( CLK:= TRUE );


IF firstCycle.Q THEN (* first cycle only *)
....
ELSE
...
END_IF;
....

 

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