pinobosco Inserito: 11 aprile 2003 Segnala Inserito: 11 aprile 2003 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: 11 aprile 2003 Segnala Inserita: 11 aprile 2003 (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: 11 aprile 2003 da Luca Bettinelli
Gianmario Pedrani Inserita: 11 aprile 2003 Segnala Inserita: 11 aprile 2003 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
pinobosco Inserita: 11 aprile 2003 Autore Segnala Inserita: 11 aprile 2003 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: 11 aprile 2003 Segnala Inserita: 11 aprile 2003 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.
pinobosco Inserita: 11 aprile 2003 Autore Segnala Inserita: 11 aprile 2003 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_STRUCTin OB1 ho il seguente codice:ORGANIZATION_BLOCK MainProgramVAR_TEMP informazioni : ARRAY[0..19] OF BYTE; BCD : S5TIME;END_VARBEGINIF 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?
pinobosco Inserita: 14 aprile 2003 Autore Segnala Inserita: 14 aprile 2003 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 truequesto NON avviene sbaglio qualcosa? oppure non ho capito niente sui timers?
dago_ Inserita: 14 aprile 2003 Segnala Inserita: 14 aprile 2003 (modificato) Premetto che non conosco questo linguaggio,ma proverei cosi:VAR_TEMPinformazioni : ARRAY[0..19] OF BYTE;BCD : S5TIME;//Aggiungi questa dischiarazioneSetTimer:S5TIME;END_VAR//QuindiSetTimer:=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 basedi tempo del timer.Ad esempio 10s visti in BCD potrebbero essere (1)010. Modificato: 14 aprile 2003 da dago_
pinobosco Inserita: 14 aprile 2003 Autore Segnala Inserita: 14 aprile 2003 Grazie ho provato anche così, ma il comportamento è lo stesso. comunque il linguaggio è SCL.
Luca Bettinelli Inserita: 14 aprile 2003 Segnala Inserita: 14 aprile 2003 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.
JumpMan Inserita: 14 aprile 2003 Segnala Inserita: 14 aprile 2003 (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? 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. Ciao Modificato: 14 aprile 2003 da JumpMan
puntalino Inserita: 14 aprile 2003 Segnala Inserita: 14 aprile 2003 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 realizzaremi spieghi perche scl ciao
beppeconti Inserita: 15 aprile 2003 Segnala Inserita: 15 aprile 2003 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.TONLa istruzione corretta è la seguente:IF E2.2 THENBCD := 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);CIAOe buon SCL
beppeconti Inserita: 15 aprile 2003 Segnala Inserita: 15 aprile 2003 Spero di non averle sparate troppo grosse, ma a volte anche le caz**** servono a far venire qualche ideaNon hai scritto cazzate ma hai individuato l'errore.CIAO
pinobosco Inserita: 15 aprile 2003 Autore Segnala Inserita: 15 aprile 2003 Grazie a tutti soprattutto Scipione e JumpMan (mi hanno illuminato)!ciao
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