step-80 Inserito: 22 maggio 2014 Segnala Share Inserito: 22 maggio 2014 Buonasera ragazzi dubbio stupido che mi ha assalito: Somachine,plc M258,linguaggio di programmazione ST. Mi sono sempre chiesto che differenza faccia la posizione in cui inserisco un blocco funzionale(poniamo il caso un banale temporizzatore ad impulsi TP,ma potrebbe essere qualunque altro blocco funzione). Dunque è mia abitudine richiamare tutte le istanze all'inizio dell'FC (temporizzatori,fronti di salita ecc) e poi usare un istruzione CASE per eseguire le mie cicliche...ad un certo punto avevo appunto l'istruzione case che ad esempio riporta:(copio-incollo esattamente il mio codice) 40:IF MOVEABS_PRINC.Busy THEN FASE_INIEZ:=45; END_IF //CONTROLLO MOVIMENTO PARTITO 45:IF MOVEABS_PRINC.Done THEN MOVEABS_PRINC.Execute:=FALSE; FASE_INIEZ:=50; END_IF //MOVIMENTO FONDO TERMINATO 50:TON_P_FONDO.IN:=TRUE; TP_SEGN_POMPA.IN:=TRUE; FASE_INIEZ:=55; //SETTO UN TIMER CHE RITARDA LA RISALITA DEGLI AGHI 55:TP_SEGN_POMPA.IN:=FALSE; FASE_INIEZ:=60; Questa naturalmente è una parte, se vedete alla quarta riga metto ad '1' il bit del timer 'TP_SEGN_POMPA.IN' ed alla riga successiva lo metto a zero. Così facendo mi sarei aspettato che il timer non partisse mai,in quanto l'istanza è richiamata all'inizio del codice e quindi in teoria non avrebbe mai visto che il bit 'IN' è andato ad uno. Invece il timer parte,e non capisco perchè...Qualcuno mi può illuminare per cortesia? Grazie a tutti anticipatamente Matteo Link al commento Condividi su altri siti More sharing options...
bigalex Inserita: 23 maggio 2014 Segnala Share Inserita: 23 maggio 2014 Ciao Matteo. E' giusto che il timer TP_SEGN_POMPA si attivi perchè TP_SEGN_POMPA.IN rimane a TRUE per un ciclo di scansione (cioè fino a quando non viene rielaborata l'istruzione CASE. Essendo un timer di tipo TP (Pulse) basta al minimo un ciclo di scansione di TP_SEGN_POMPA.IN = TRUE per fare eseguire l'istruzione generando un impulso. bigalex Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 23 maggio 2014 Autore Segnala Share Inserita: 23 maggio 2014 (modificato) Ciao bigAlex Allora l'istruzione CASE fa una specie di 'registro di immagine' prima di eseguire le istruzioni in essa contenute? Credevo che le istruzioni fossero eseguite in sequenza, e cioè che nel mio caso l'istruzione 55 fosse eseguita subito dopo la 50...non il ciclo di scansione successivo...è cosi? Modificato: 23 maggio 2014 da step-80 Link al commento Condividi su altri siti More sharing options...
Giuseppe Signorella Inserita: 23 maggio 2014 Segnala Share Inserita: 23 maggio 2014 (modificato) Con l'istruzione case, (select case) in altri linguaggi, vengono eseguiti dei salti, quindi alcune istruzioni (righe di codice) vengono saltate e non eseguite. C'è però da tener conto "non conosco l' ST da te utilizzato, anche se comprensibile, ma la sintassi potrebbe essere differente da quella che conosco io", che in alcuni linguaggi dopo aver eseguito le istruzioni case, devi uscire dal select case, altrimenti vengono eseguite anche le istruzioni successive. Modificato: 23 maggio 2014 da Giuseppe Signorella Link al commento Condividi su altri siti More sharing options...
step-80 Inserita: 23 maggio 2014 Autore Segnala Share Inserita: 23 maggio 2014 Grazie BigAlex e Giuseppe, ora credo di aver capito L'istruzione CASE (parlando di somachine) esegue la riga di codice corrispondente al valore della variabile (nel mio caso FASE_INIEZ) ma poi una volta elaborata l'istruzione esce dal costrutto . Ecco spiegato perchè il timer parte, perchè la fase 50 e la 55 vengono elaborate in due scansioni contigue e non di seguito in un unica scansione come pensavo io. Grazie ancora Matteo 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