Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Timers - problemi sull'uso


Messaggi consigliati

Inserito:

ho la necessità di innescare un timer di 10 sec., durante il quale devo contare le variazioni on/off di un input; trascorsi i 10 sec. se non ci sono state variazioni considero l'input ok altrimenti ko.

Chi mi può dare una mano (possibilmente con esempi in SCL) ?

grazie


Luca Bettinelli
Inserita: (modificato)

Mi sembra che l'SCL sia un po eccessivo per fare quello che dici basterebbe un segmento scritto in KOP, un timer che va ad abilitare per 10s un contatore che conta gli impulsi sull'input, alla fine dei 10s vai a verificare il conteggio se è 0 il test è superato se > 0 no!, spero di essere stato abbastanza chiaro.

Ciao

Modificato: da Luca Bettinelli
Gianmario Pedrani
Inserita:

sono d'accordo con Bettinelli scl in questa circostanza e sprecato quello che devi fare tu e molto banale che si puo sviluppare in kop/fup/awl , e l'esempio sopra riportato e molto azzeccato

ciao alla prossima

Inserita:

sono d'accordo sul fatto che il problema posto così sembri banale, ma la soluzione va inserita come funzione (possibilmente SCL per un fatto formale) da richiamare nell'ambito di un prg molto più complesso.

spero di aver chiarito comunque grazie. :(

Luca Bettinelli
Inserita:

Dovessi fare io una funzione simile farei una funzione FCxx che all'interno ha un segmento per fare quello che hai bisogno, all'interno del software scritto in SCL richiamo la funzione FCxx che in uscita mi può dare l'esito del controllo Ok NotOk come RetVal, poi se vuoi la FC la proteggere con Know_How_Protect in modo che rimane protetta e non si vede dentro cosa va a fare.

Oppure più compelsso riporti il giochetto direttamente nel codice SCL che però secondo me non è molto agevole da fare, in quanto dovresti lanciare un timer S7 ed un conteggio.

Inserita:

d'accordo sulla funzione FCxx, fra l'altro non importa che sia protetta, però non ottengo i risultati che mi aspetto dal codice che segue:

________________________________________________________

in DB1 ho la seguente struttura:

STRUCT

TON BOOL FALSE

STS BOOL FALSE

BCD WORD W#16#0

TNO INT 1

END_STRUCT

in OB1 ho il seguente codice:

ORGANIZATION_BLOCK MainProgram

VAR_TEMP

informazioni : ARRAY[0..19] OF BYTE;

BCD : S5TIME;

END_VAR

BEGIN

IF E2.2 THEN

IF NOT CONF.TON THEN

CONF.TON:=TRUE;

BCD := S_ODTS(T_NO:=CONF.TNO,S:=True,TV:=T#10s,R:=false,Q:=CONF.STS,BI:=conf.BCD);

END_IF;

ELSE

CONF.TON:=false;

BCD := S_ODTS(T_NO:=CONF.TNO,S:=False,TV:=T#0s,R:=True,Q:=CONF.STS,BI:=conf.BCD);

END_IF;

END_ORGANIZATION_BLOCK

__________________________________________________________________________ ;)

mi aspetto che CONF.STS diventi true allo scadere dei 10 sec. e CONF.BCD che ( a detta dei manuali) dovrebbe contenere il tempo restante.

Invece conf.STS diventa true immediatamente e CONF.BCD contiene un valore fisso di 640 ms.

dov'è l'errore?

Inserita:

In altre parole se eseguo lo statement:

bcd := S_ODTS(T_NO:=T1,S:=True,TV:=T#10s,q:=STS)

mi attendo che STS trascorsi i 10 sec diventi true

questo NON avviene sbaglio qualcosa? oppure non ho capito niente sui timers? :(

Inserita: (modificato)

Premetto che non conosco questo linguaggio,ma proverei cosi:

VAR_TEMP

informazioni : ARRAY[0..19] OF BYTE;

BCD : S5TIME;

//Aggiungi questa dischiarazione

SetTimer:S5TIME;

END_VAR

//Quindi

SetTimer:=T#10S

//Cambia TV=

bcd := S_ODTS(T_NO:=T1,S:=True,TV:=SetTimer,q:=STS)

p.s. Un'altra cosa potrebbe essere che il formato BCD si porta dietro anche la base

di tempo del timer.Ad esempio 10s visti in BCD potrebbero essere (1)010.

Modificato: da dago_
Inserita:

Grazie ho provato anche così, ma il comportamento è lo stesso. comunque il linguaggio è SCL.

Luca Bettinelli
Inserita:

In questo momento sono all'estero e non ho sotto mano la documentazione SCL se puoi attendere fino a giovedì provo a darti una mano.

Inserita: (modificato)

Mi intrometto anche se non conosco SCL, la mia domanda è questa: l'elaborazione di ob1 (da BEGIN a END_ORGANIZATION_BLOCK) è ciclica come in KOP e AWL?

Se la risposta è no, non leggere qui sotto... :)

Se la risposta è sì con il tuo codice quando va alto E2.2, CONF.TON cambia di stato ad'ogni ciclo, a questo punto nei cicli dispari viene elaborata l'istruzione:

BCD := S_ODTS(...S:=True,TV:=T#10s,R:=false.....),

mentre nei cicli pari BCD := S_ODTS(.....S:=False,TV:=T#0s,R:=True...).

E' normale? :blink:

Forse risolveresti usando al posto dell'ingresso il suo fronte di salita, ma non ho capito bene cosa vuoi fare, perche' una volta setti il timer e il ciclo successivo lo resetti, ecc.ecc.

O forse dovresti provare a fare questa parte in AWL o KOP e poi cercare di convertirla in SCL.

Spero di non averle sparate troppo grosse, ma a volte anche le caz**** servono a far venire qualche idea. :P

Ciao

Modificato: da JumpMan
Inserita:

mi spiegate come si programma in scl perche quello che vuoi fare in awl 0 kop o in un blocco idicizzato non è una cosa impossibile da realizzare

mi spieghi perche scl ;)

ciao

Inserita:

Nei timer scritti in SCl valgono le stesse regole dei i timer in AWL, quindi la riga di comando del timer deve sempre essere ciclata. Tu invece la esegui solo per un ciclo di scansione. Devi eliminare quindi la gestione fatta con il bit CONF.TON

La istruzione corretta è la seguente:

IF E2.2 THEN

BCD := S_ODTS(T_NO:=CONF.TNO,S:=True,TV:=T#10s,R:=false,Q:=CONF.STS,BI:=conf.BCD);

ELSE

BCD := S_ODTS(T_NO:=CONF.TNO,S:=False,TV:=T#0s,R:=True,Q:=CONF.STS,BI:=conf.BCD);

END_IF;

Per semplificare ulteriormente io ti consiglio di mettere direttamente l'ingresso E2.2 nei bit di Avvio (S) e di Reset ®

BCD := S_ODTS(T_NO:=CONF.TNO,S:=E2.2,TV:=T#10s,R:=NOT E2.2,Q:=CONF.STS,BI:=conf.BCD);

CIAO

e buon SCL

Inserita:
Spero di non averle sparate troppo grosse, ma a volte anche le caz**** servono a far venire qualche idea

Non hai scritto cazzate ma hai individuato l'errore.

CIAO

Inserita:

Grazie a tutti soprattutto Scipione e JumpMan (mi hanno illuminato)!

ciao :P

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