Turing Inserito: 8 febbraio 2014 Segnala Share Inserito: 8 febbraio 2014 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 More sharing options...
lelos Inserita: 9 febbraio 2014 Segnala Share Inserita: 9 febbraio 2014 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 More sharing options...
Turing Inserita: 9 febbraio 2014 Autore Segnala Share Inserita: 9 febbraio 2014 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 More sharing options...
Turing Inserita: 9 febbraio 2014 Autore Segnala Share Inserita: 9 febbraio 2014 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 More sharing options...
tato88 Inserita: 13 febbraio 2014 Segnala Share Inserita: 13 febbraio 2014 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 More sharing options...
Turing Inserita: 13 febbraio 2014 Autore Segnala Share Inserita: 13 febbraio 2014 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 More sharing options...
tato88 Inserita: 13 febbraio 2014 Segnala Share Inserita: 13 febbraio 2014 (modificato) 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: 13 febbraio 2014 da tato88 Link al commento Condividi su altri siti More sharing options...
Turing Inserita: 14 febbraio 2014 Autore Segnala Share Inserita: 14 febbraio 2014 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 More sharing options...
lelos Inserita: 14 febbraio 2014 Segnala Share Inserita: 14 febbraio 2014 ciao i sono i registri che vanno con la batteria e quelli senza(vedi manuale) per il costo irrisorio che ha io uso la batteria. Link al commento Condividi su altri siti More sharing options...
tato88 Inserita: 14 febbraio 2014 Segnala Share Inserita: 14 febbraio 2014 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 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