Matteo81 Inserito: 8 settembre 2008 Segnala Share Inserito: 8 settembre 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 Link al commento Condividi su altri siti More sharing options...
Matteo81 Inserita: 9 settembre 2008 Autore Segnala Share Inserita: 9 settembre 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. Link al commento Condividi su altri siti More sharing options...
Claudio Monti Inserita: 9 settembre 2008 Segnala Share Inserita: 9 settembre 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!!! Link al commento Condividi su altri siti More sharing options...
Matteo81 Inserita: 9 settembre 2008 Autore Segnala Share Inserita: 9 settembre 2008 (modificato) 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; Modificato: 9 settembre 2008 da Matteo81 Link al commento Condividi su altri siti More sharing options...
Matteo81 Inserita: 9 settembre 2008 Autore Segnala Share Inserita: 9 settembre 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 Link al commento Condividi su altri siti More sharing options...
matteobenatti Inserita: 15 ottobre 2008 Segnala Share Inserita: 15 ottobre 2008 prova cosi: (SCL di Siemens, ma il concetto è lo stesso)IF pulsante & NOT pulsanteOld THEN uscita := NOT uscita;END_IF;pulsanteOld := pulsante;ciao! 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