Vai al contenuto
PLC Forum


Funzioni Parametriche


Matteo81

Messaggi consigliati

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


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

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

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 spenta

Il 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 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;

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 THEN

SET Luce;

SET Memoria;

ELSIF Luce AND Pulsante AND NOT Memoria THEN

RESET Luce;

SET Memoria;

ELSIF NOT Pulsante THEN

RESET Memoria;

END_IF;

Ogni volta che richiamo quella funzione DFB passo i parametri che voglio, ad esempio:

%I2.0 --> Pulsante

%Q4.0 --> Luce

%M0 --> Memoria

Per la lampada successiva passo:

%I2.1 --> Pulsante

%Q4.1 --> Luce

%M1 --> Memoria

Ora 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 THEN

SET %Q4.0;

ELSIF %Q4.0 AND RE %I2.0 THEN

RESET %Q4.0;

END_IF;

Modificato: da Matteo81
Link al commento
Condividi su altri siti

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

  • 1 month later...

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

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