Vai al contenuto
PLC Forum


Fx3G - Timer - Linguaggio St


Turing

Messaggi consigliati

Salve a tutti,

chiedo scusa per la domanda che può sembrare più che banale ma ci ho perso un sacco di tempo e non ho trovato ancora la risposta...

Sto programmando in ST in quanto provengo dal mondo informatico.

Ho una semplice variabile globale T_Stop :=Timer tra le Global Variables.

In CoDeSys scrivevo in questo modo (e tutto era OK):

T_Stop.IN := I_Stop;
T_Stop.PT := stoptime;
IF (T_Stop.Q) THEN
   NextState := 1;
   I_Stop := FALSE;
   T_Stop.IN := FALSE; 
END_IF; 
(lasciando perdere le varie variabili, voglio mostrare il concetto)
Portando su GX Works 2 il codice non funziona.
Sul manuale riporta (alla voce TON):
TON(IN,PT,Q,ET);
Example:
Instance name(IN:=M0, PT:=Label 1,Q:=M10, ET:=Label 2);
ma anche scrivendo:
T_Stop(IN:=I_Stop, PT:= stoptime, Q := T_Stop_Q, ET: = T_Stop_ET);
oppure
T_Stop(I_Stop, stoptime, T_Stop_Q, T_Stop_ET);
dove stoptime : Time, T_Stop_Q : Bit, T_Stop_ET : Time
in compilazione dice "Invalid data type".
Dove sbaglio?
Da quando vedo il linguaggio ST non è poi così standard quanto credevo...
E poi, con Ladder non sono costretto ad assegnare tutte le uscite (es. elapsed time), in ST sì?
Grazie a tutti!
Link al commento
Condividi su altri siti


ciao

in compilazione dice "Invalid data type".

significa che hai dichiarato una delle tue variabile con un tipo non corretto.

es. assegnare a un booleano un valore numerico oppure un numero con virgola ad un intero,eccc

Link al commento
Condividi su altri siti

Che invalid data type voglia dire quello è ovvio, per quello ho specificato nel post precedente i tipi utilizzati...

Per maggiore chiarezza riporto dal manuale Mitsubishi "GX Works 2 Ver1 Structured Programming Manual (Application Functions)":

Input variables:

EN - Execution condition - Bit
IN (s) - Input signal - Bit
PT (n) - ON start time data - Time
Output variables:
ENO - Execution status - Bit
Q (d1) - Output signal - Bit
ET (d2) - ON start time current value - Time
Le mie variabili sono:
I_Stop : Bit, stoptime : Time, T_Stop_Q : Bit, T_Stop_ET : Time

Ancora non trovo una soluzione a nessuno dei dubbi esposti nel post di sopra.

Ho provato a cambiare usando anche OUT_T ma anche lì probabilmente sbaglio qualcosa...

Purtroppo tutti gli esempi li trovo solo in ladder...

Link al commento
Condividi su altri siti

Allora, ho trovato una mezza soluzione, la posto, dovesse servire a qualcuno in modo che non impazzisca come me...

Tra le System Labels in Melsoft Navigator (variabili globali) avevo inserito T_Stop : Timer, non è possibile specificare altro, un Function Block specifico come TON ad esempio.

Queste label vengono poi importate tra le Global Variables dentro GX Works 2 o GT Designer 3 tramite diverse reflections e viceversa. Questa procedura è necessaria per rendere visibili anche a GT Designer 3 le variabili in modo da poter essere usate su HMI.

(non so che avevano fumato gli sviluppatori di Melsoft quando hanno ideato questa genialata di procedura, spero non lo veda mai Jakob Nielsen)

Ad ogni modo ho dichiarato un altro Timer, questa volta esplicitamente TON, tra le Local Variables del programma in GX Works e finalmente con quel timer tutto funziona, sia il codice che funzionava su CoDeSys, sia gli altri che ho riportato nel codice precedente.

Per dare un chiarimento sul funzionamento anche di OUT_T, mi sembra di aver constatato che funziona solo con indirizzamenti diretti del tipo:

OUT_T(X000,TC1,100);

OUT(TS1,Y010);

e non con le variabili, ma potrei sbagliarmi.

Avrei risolto, perchè i valori del timer posso comunque esporli globalmente con assegnazioni manuali, ma rimane solo l'enigma: ma a che serve e come si usa il tipo primitivo "Timer"?

Link al commento
Condividi su altri siti

Ciao Turing,

Per quanto riguarda il discorso Navigator... il Navigator è uno strumento essenzialmente molto potente per quanto riguarda la gestione di più apparecchi Mitsubishi in una stessa configurazione (magari hai più GOT o più PLC o altri dispositivi).

Il mio consiglio è questo: se hai un solo PLC e un solo GOT potresti anche evitare di reindirizzare il tutto nel Navigator, ma gestire i due singoli file se non sei pratico nel maneggiare questo strumento.

Per il secondo discorso, anche io programmo pesantemente in strutturato avendo una mentalità più "informatizzata", ma con la modalità ST/Ladder il bello è interfacciare il ladder puro (che ha il bellissimo vantaggio della leggibilità in fase di debug), e l'ST che mi permette di creare in maniera relativamente semplice blocchi funzione complessi (contenenti CASE,IF,FOR, etc..) che sono più facili da gestire in questa modalità.

Tornando all'argomento temporizzatore:

Nei FB io utilizzo sempre la funzione OUT_T,

All'interno di quest'ultima si possono tranquillamente usare le variabili. Ti allego un piccolo esempio con variabili preimpostate. Partiamo con il presupposto che il TC1 ha come base tempi 0,1 s.

Start_Timer_1 (Bit nelle global, lo usiamo come controllo per abilitare il temporizzatore)

Emergency (Ingresso X0 nelle global, lo useremo con controllo aggiuntivo per il temporizzatore)

Timer_Limit_1 (Valore massimo del contatore, puoi definirlo come costante, o calcolarlo, o pescarlo dal GOT, ipotizziamo 2 secondi quindi 20)

Timer_1_Middle_Action (Valore intermedio che mi serve per fare altre cose, te lo metto da esempio, ipotizziamo 1 secondo quindi 10)

Scrivendo il tuo codice abiliti il valore Start

IF ((X5) AND (NOT Start_Timer_1)) THEN (*Questo IF è il blocco precedente all'abilitazione del Timer, se la X5 che può essere un Micro va ad 1, magari gestisce le uscite e poi abilita il temporizzatore. Me lo sono inventato)

SET (TRUE, Y1);

RST (TRUE, Y2);

SET (NOT Y2, Start_Timer_1);

END_IF;

IF (NOT Y2) THEN (*Ok, per esempio ho bisogno di lasciare Y2 ad OFF per 2 secondi quando X5 va ad 1*)

OUT_T ( (NOT Emergency) AND (Start_Timer_1), TC01 , Timer_Limit_1 ); (*Definisco il Timer, quando per esempio non sono in emergenza e la X5 è a 0, gli definisco il TC01, con la variabile che ho dichiarato precedentemente*).

SET ( TN01=Timer_1_Middle_Action , Y10); (* Questo mi permette di confrontare il valore in tempo reale del temporizzatore, quando il conteggio arriva a 10, la Y10 si alza per qualche tuo motivo, non sei obbligato a rispettare l'arrivo al TS01*)

SET ( TS01 , Y2 ); (*Dopo i due secondi, risetti la Y2 e torni come prima.

RST ( Y2 , TN01); (Resetti il valore del TN prima di uscire dal ciclo*)

RST (Y2 , Start_Timer_1); (*Ok non ho più bisogno che il temporizzatore sia attivo, resettandogli l'enable smetterà di essere attivo*).

END_IF;

Ovviamente se la X5 rimarrà ad 1, avrai il tutto continuamente in loop.

Spero di essere stato chiaro, a presto!

Alberto

Link al commento
Condividi su altri siti

Ti ringrazio per la tua pazienza e i chiarimenti che hai dato sulla temporizzazione e anche per i tuoi consigli generali, molto ben accetti, ne ho bisogno essendo alle prime armi... :)

Solo un'altra curiosità sempre sulla temporizzazione, avevi parlato del GOT... il PLC è senza batteria, ma ho un GOT GT14 con batteria.

Un secondo step che volevo raggiungere è temporizzare ad un orario preciso, ad es. alle 8 di mattina (e poi ad intervalli regolari).

Avevo pensato di valorizzare una variabile del plc che indichi l'orario corrente, tramite il GOT.

Ho provato sul GT Designer 3 ad inserire nel pannello un oggetto Time Display, ma non trovo una opzione con variabile (label/device) su cui scrivere.

Ho provato sul Time Display a specificare uno script (in Advanced Settings->Script) ma senza arrivare a far funzionare qualcosa, la documentazione non mi ha aiutato abbastanza.

Ho provato in Common -> Time Action ma da quanto ho visto non sembra adatto allo scopo.

Conosci un modo per farlo?

Link al commento
Condividi su altri siti

Figurati Tuning,

Allora riguardo l'ora io ti sconsiglio di usare quella sul got ma di usare quella sul PLC e per fare questo ci sono dei registri speciali sull'FX.

Devi sapere che l'FX ha dei bit e delle word riservate a funzioni speciali (M8000+ e D8000+). L'ora è una di queste.

Secondi correnti:D8013

Minuti correnti:D8014

Ora corrente:D8015

Giorno corrente: D8016

Mese corrente: D8017

Anno corrente:D8018

Giorno corrente:D8019 (0=domenica, 6=sabato)

Se tu facessi uno watch su queste variabili, vedresti il valore che nel PLC è l'ora attuale.

Sicuramente ti capiterà di doverla cambiare. Non pensare neanche lontanamente di fare una semplice istruzione MOV, non funzionerà su un registro speciale come questo.

Per l'ora e la data ci sono due istruzioni dedicate, le puoi trovare nell'elenco, si chiamano TRD e TWR.

TRD: Con questa istruzione puoi appoggiare le D speciali (D8000+) in D normali. In pratica puoi leggere e fare in automatico un mov su una zona di D libera. Se per esempio fai il blocchetto TRD e come d di uscita metti D100, avrai i seguenti campi in automatico compilati.

Secondi correnti:D100

Minuti correnti:D101

Ora corrente:D102

Giorno corrente: D103

Mese corrente: D104

Anno corrente:D105

Giorno corrente:D106 (0=domenica, 6=sabato)

Dal got hai la possibilità pure di visualizzare direttamente l'ora mettendo D8013, D8014, etc.. come data display.

TWR: Istruzione per SCRIVERE l'ora. Il TWR ha la s di ingresso. E' lo stesso discorso rovesciato. Se ci metti D100, lui farà un MOV da D100->M8013, D101->M8014,....,D106->D8019.

Un'ultima raccomandazione. Quando usi l'istruzione TWR per cambiare l'ora del PLC, lascia alto per tutta la durata dell'esecuzione dell'istruzione il bit speciale M8015 (è il bit speciale di time setting e time stopping).

Se hai bisogno ti posso mandare un piccolo file per plc e got con una pagina e due righe in croce che fanno già tutto.

A presto!

Alberto

Modificato: da tato88
Link al commento
Condividi su altri siti

Grazie mille, prima di chiederti gli esempi proverò da solo, sei stato chiarissimo :)

I registri quindi funzionano anche senza batteria? (a parte un eventuale reset dell'orario se cade la corrente)

Link al commento
Condividi su altri siti

Ciao Turing,

Puoi tener monitorato lo status della tua batteria tramite il Merker M8005 (quando la batteria è ad un livello basso, diventa 1).

Eventualmente puoi tenere monitorato anche il livello di tensione della batteria tramite il registro speciale D8005.

Saluti.

Alberto

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