Claudio F Inserito: 25 febbraio Segnala Share Inserito: 25 febbraio 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 More sharing options...
dina_supertramp Inserita: 25 febbraio Segnala Share Inserita: 25 febbraio (modificato) 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: 25 febbraio da dina_supertramp Link al commento Condividi su altri siti More sharing options...
Claudio F Inserita: 26 febbraio Autore Segnala Share Inserita: 26 febbraio 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 More sharing options...
dina_supertramp Inserita: 26 febbraio Segnala Share Inserita: 26 febbraio 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 More sharing options...
batta Inserita: 26 febbraio Segnala Share Inserita: 26 febbraio 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 More sharing options...
dina_supertramp Inserita: 27 febbraio Segnala Share Inserita: 27 febbraio 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora