Matteo81 Posted September 8, 2008 Report Posted September 8, 2008 Salve a tutti, questo è il mio primo post, ho una domanda da porvi.Devo programmare una CPU TSX 572623, sono alle prime armi, conosco il C e in C è prassi comune definire delle funzioni parametrizzate, vale a dire funzione alle quali è possibile passare delle variabili e quindi fare utilizzare queste variabili all'interno della funzione stessa.Ora la domanda è questa, esiste una cosa simile anche per il plc sopraindicato?Il codice che ho scritto io è il seguente:(* Funzione passo-passo *)IF NOT %Q4.0 AND %I2.0 AND NOT %M0 AND NOT %M0 THEN SET %Q4.0; SET %M0;ELSIF %Q4.0 AND %I2.0 AND NOT %M0 THEN RESET %Q4.0; SET %M0;ELSIF NOT %I2.0 THEN RESET %M0;END_IF;e mi serve per gestire i pulsanti per l'accensione di punti luce. Siccome i punti luce sono un bel numero, è possibile definire una funzione unica e ogni volta che viene richiamata passargli l'uscita da abilitare, l'ingresso da utilizzare e la memoria alla quale appoggiarsi?Ho ancora una domanda, per simulare il comportamento di un Flip-Flop SR esiste una via più breve di questa senza l'utilizzo di memorie ed utilizzando i fronti di salita e di discesa oppure no? In altre parole io voglio che quando il pulsante sull'ingresso %I2.0 viene premuto si accenda la luce collegata all'uscita %Q4.0 e resti accesa finchè il pulsante non venga premuto una seconda volta.Tale funzione è l'equivalente di un normale relè passo-passo.Ringrazio chiunque intervenga.Matteo
Matteo81 Posted September 8, 2008 Author Report Posted September 8, 2008 Alla prima domanda forse ho trovato una risposta leggendo nella guida la parte relativa alle funzioni DFB, per la seconda domanda invece non ho altre idee.
Claudio Monti Posted September 9, 2008 Report Posted September 9, 2008 Se tu assegni un valore ad una WORD ogni volta che premi un pulsante, puoi utilizzare tale valore per accendere le lampade.Ad es.:(*assegni il valore di ogni singolo bit di 16 ingressi ad una Word*) IF %I2.0 THEN %MW100:=1; ELSIF %I2.1 THEN %MW100:=2; [...] ELSE %MW100:=0; END_if; IF (il controllo che ti serve) THEN SET %Q4.0[%MW100]; (*accendi la lampada corrispondente a partire dalla %Q4.0*)Per la seconda domanda puoi usare i fronti di salita e discesa, in ST si chiamano RE e FE... fai un po' di prove vedrai che funziona.Occhio solo a non utilizzare i fronti di %M che precedentemente hai usati in SET/RESET: il codice non ti da errore ma NON funzionano!!!
Matteo81 Posted September 9, 2008 Author Report Posted September 9, 2008 (edited) Ok, grazie può essere una buona idea quella di utilizzare WORD anzichè variabili BOOL, l'unica cosa è che devo scrivere tutti gli if per ciascuna lampada e poi devo resettarle allo stesso modo utilizzando altre WORD da quello che ho capito, in altre parole:%MW100:=1 --> lampada 1 accesa%MW100:=2 --> lampada 1 spentaIl codice che ho scritto prima è sbagliato, ho fatto un copia incolla errato, in verità io nel software ho scritto:(* Funzione passo-passo *)IF NOT %Q4.0 AND %I2.0 AND NOT %M0 THENSET %Q4.0;SET %M0;ELSIF %Q4.0 AND %I2.0 AND NOT %M0 THENRESET %Q4.0;SET %M0;ELSIF NOT %I2.0 THENRESET %M0;END_IF;Inserendo poi questo codice in un blocco DFB, ho scritto il codice come segue:(* Funzione passo-passo *)IF NOT Luce AND Pulsante AND NOT memoria THENSET Luce;SET Memoria;ELSIF Luce AND Pulsante AND NOT Memoria THENRESET Luce;SET Memoria;ELSIF NOT Pulsante THENRESET Memoria;END_IF;Ogni volta che richiamo quella funzione DFB passo i parametri che voglio, ad esempio:%I2.0 --> Pulsante%Q4.0 --> Luce%M0 --> MemoriaPer la lampada successiva passo:%I2.1 --> Pulsante%Q4.1 --> Luce%M1 --> MemoriaOra sono un po' di fretta e non riesco ad immaginare un modo equivalente utilizzando una WORD, ma stasera con più calma provo a studiare un attimo, così da non dover scrivere troppo codice ripetitivo.Mi puoi confermare che utilizzando RE ed FE la cosa funziona senza l'utilizzo di una memoria? Io ho provato a farlo qualche giorno fa ma non ci sono riuscito, magari sbagliavo qualcosa, oggi riprovo con una cosa del tipo:(* Funzione passo-passo *)IF NOT %Q4.0 AND FE %I2.0 THENSET %Q4.0;ELSIF %Q4.0 AND RE %I2.0 THENRESET %Q4.0;END_IF; Edited September 9, 2008 by Matteo81
Matteo81 Posted September 9, 2008 Author Report Posted September 9, 2008 Ciao, ho riprovato ad usare i fronti di salita e di discesa, ma non so che cosa sbaglio, di fatto non funziona.Ho provato anche il tuo metodo, ma ora non so come resettare le uscite utilizzando lo stesso ingresso che ho usato per settarle.Ciao
matteobenatti Posted October 15, 2008 Report Posted October 15, 2008 prova cosi: (SCL di Siemens, ma il concetto è lo stesso)IF pulsante & NOT pulsanteOld THEN uscita := NOT uscita;END_IF;pulsanteOld := pulsante;ciao!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now