francescotiziano Inserito: 26 agosto 2006 Segnala Inserito: 26 agosto 2006 ciao vorrei cercare di capire ma non riesco come nei blocchi di codice delle cpu s7 siemens la tabella delle variabili del blocco si interconnetta con il programma editato grazie a tutti ..
floppydisco Inserita: 26 agosto 2006 Segnala Inserita: 26 agosto 2006 Non ho capito tanto bene cosa intendi per "tabella delle variabili del blocco", comunque proviamo.Se intendi quella tabella che puoi creare nella cartella Blocchi che di default si chiamano VAT_xx, allora questa è una tabella che serve a monitorare e forzare operandi nella CPU quando sei online. Scrivi gli operandi desiderati E, A, M, DB, ecc poi se premi il tasto "occhiali", vedi i valori attuali. Se scrivi dei valori nella colonna "valori di comando" e premi il tasto "lampo", vai a scrivere quei valori negli operandi corrispondenti.Se intendi la tabella in testa ad ogni blocco, Li puoi assegnare delle variabili di 4 tipi: TEMP, IN, OUT, IN/OUT.-TEMP sono variabili locali che puoi utilizzare solo all'interno di quel blocco, al termine del quale, vengono perse.-IN, OUT, IN/OUT sono variabili che usi all'interno del blocco e che prendono il valore dell'operando assegnato al momento del richiamo del blocco. Serve se hai una funzione ripetitiva, richiami il blocco piu volte cambiando solo gli operandi.Spero di essere stato abbastanza chiaro.
francescotiziano Inserita: 26 agosto 2006 Autore Segnala Inserita: 26 agosto 2006 scusami sdi non essere stato abbastanza chiaro in primis e' proprio la tabella che si trova sopra ogni blocco che no riesco a capire come e' in connessione col programma quando ce' un richiamo cosa succede grazie floppydisco
walterword Inserita: 26 agosto 2006 Segnala Inserita: 26 agosto 2006 (modificato) La tabella che sta sopra , ai corsi siemens la chiamano tendina dei parametri, la chiamo cosi anche io quando faccio i corsi dove sono l'istruttore. E' una tabella dove puoi inserire variaili locali , ossia valide solo nel blocco dove sono usate .Non mantengono i valori , cio vuol dire che alla fine del blocco vengono distrutte e rigenerate all'inizio.Queste variabili sono le cosi chiamate temporanee , dichiarabili sotto la voce temp.Poi ci sono le In , OUT , IN- OUT che fanno parte sempre dello stack e servono per copiare o meglio dire fare da immagine per le variabili appaoggiate dall'esterno quando il blocco viene richiamato .in breve , se prendi un FC o FB , questo puo avere due significati "informatici "1- essere una subroutine 2-essere una funzione COme ben saprai , sia in visual basic che in C o altri linguaggi , quando crei una funzione devi dichiarare dei parametri di ingresso , e anche di uscita .Quelli in ingresso sono solamente letti e non puoi sovrascriverli , mentre quelli di out sono solo scrivibili I parametri che passi dall'esterno sono copiati e non midficati dalla funzione I parametri invece IN-OUT possono essere letti e scritti dalla funzione e dall'esterno quindi modificati , se la funzione li modifica ovviamente .Anche se graficamente non si vede , i parametri IN-OUT sono passati per riferimento (in C sarebbe &variabile dove passi il puntatore alla variabile e cioe il suo indirizzo in RAM)I concetti di programmazione alla fine "son sempre quelli " che siano elettronici (plc e micro ) o informatici (pc) .Per tornare alla tua domanda , quella tabella che trovi sopra al blocco , che talvolta e' sempre bassa e rompe le palle serve per dichiarare i parametri dell'FC , che non si chiamera ' funzione , bensi' FC parametrizzato .Spero di esser stato chiaro ciao walter Modificato: 26 agosto 2006 da walterword
francescotiziano Inserita: 26 agosto 2006 Autore Segnala Inserita: 26 agosto 2006 si ma come attribuisco una variabile del blocco ad un ingresso reale del plc mi spiego se io programmo con il nome della variabile IN tipo di dati BOOL a quale ingresso fisico del plc mi riferisco???
walterword Inserita: 26 agosto 2006 Segnala Inserita: 26 agosto 2006 a nessunoti ho gia spiegato sopra che quelle sono variabili dello stack , non hanno un indirizzo come gli I/O o i merker o i db tu crei una funzione con le variabili interne ad essa Poi , quando la richiami le ti chiedera' i parametri , e se ci vai sopra col puntatore del mouseti dira' anche il tipo di dato A questo punto gli passerai la variabile , che se e' un INT puo passargli una MWxx , dichiarata nell tabella dei simboli con INT e non come WORD seno' non te la prende , e' siemens ....Cioe l' FC parametrizzato lo puoi richiamare da un altro blocco di codice che sia FC o FB oppure nel'OB1per esempio , la scegli nel catalogo delle librerie del progetto ciao walter
francescotiziano Inserita: 26 agosto 2006 Autore Segnala Inserita: 26 agosto 2006 una qualunque dichiarata nella tabella dei simboli come intgraziefrancesco..
walterword Inserita: 26 agosto 2006 Segnala Inserita: 26 agosto 2006 (modificato) fai un progettino con ob1 e poi crei fc1entri in fc1 , vai nella tabella delle variabili , clicchi su IN e dai il nome simbolico e poi il tipo (INT)Salvi e carichi .Vai in OB1 e digiti call FC1 e a questo punto step 7 ti propone i paramentri , devrebbe anche proporti ret_val come uscita che sarebbe il risultato della funzione , per defult .Al parametro gli passi mw10 dichiarata come int , e al ret val mw 12 sempre come int oppure una temp dell'ob1 ,aggiunta nella tabella in ob 1 sotto a quelli che gi ati passa il sistema operativo Per richiamare un fc senza parametri puoi usare UC FC1 , senza parametri significa unconditioned call e vuol dire che viene chiamata indipendentemente dall'rlc , anche se vale 0CC FC1 senza parametri che significa conditioned call , e vuol dire che viene richiamata quando l'rlc e'=1 CC e' come UC senza che pero metti il salto per renderla condizionata se invece hai i parametri scrivi CALL FC1 ed in automatico ti verranno proposti i parametri ......UC FC1 , senza parametri e senza condizioni ......u m0.0 , senza parametri ma con condizio ne di richiamo CC FC1 ......CALL FC1 ,con parametri senza condizioni di richiamo par1:=tua variabile ret_val:=#ret_val...u m0.0spbn saltCALL FC1 ,on parametri con condizione di richiamo par1:=tua variabile ret_val:=#ret_valsalt: nop 0fratellino , questi post sono una giornata di corso , spero che tu li abbia capiti perche diversamente non saprei come spiegarteli , e' chiaro che con davanti lo step 7 tutto torna subito facile ed intuibile ciao walterp.s. dimenticavo ..... salva l'OB 1 e caricalo dopo aver caricato l'FC1 , seno' il sistema operativo chiamera l'ob degli errori di programmazione che non essendoci ti mandera' in stop la cpu Modificato: 26 agosto 2006 da walterword
francescotiziano Inserita: 26 agosto 2006 Autore Segnala Inserita: 26 agosto 2006 ti ringrazio per la tuo coinvolgimento al mio non conosceregrazie di cuore cioa francesco..
walterword Inserita: 26 agosto 2006 Segnala Inserita: 26 agosto 2006 (modificato) Per concludere , a tabella delle variabili e' un'altra cosa , la VAT E' un oggetto che si crea, si aggiungono fiumi di variabili e lei ti da lo stato a fine ciclo di scansione hai fatto le prove?puoi anche farle senza caricare il plc , vedi il risultato lo stesso ...prego Modificato: 26 agosto 2006 da walterword
francescotiziano Inserita: 27 agosto 2006 Autore Segnala Inserita: 27 agosto 2006 ciao walter sfogliando nel mio pg ho trovato un programma delle macchine twin controllo numerico 840d della siemens me lo trovo perche' tempo addietro ho fatto il manutentore di quelle macchine e guardando un blocco mi sono accorto che nella tendine delle variabili i nomi di variabile erano solo degli aut e rifacendomi al tuo esempio ho aperto ob1 e i nomi erano proprio li' come set o ingressi adesso credo di aver capito correggimi se sbaglio ma sono appoggi di memoria nel blocco stesso? grazie francesco
walterword Inserita: 28 agosto 2006 Segnala Inserita: 28 agosto 2006 fra ,sono variabili locali "prese " dallo stack di memoria .Ti faccio un esempio in C void my_func (int par1) { int b; b=par1; } ....my_func(3);il parametro chiesot in ingresso par1 e' come la variabile IN del blocco FC parametrizzato ciao walter
walterword Inserita: 29 agosto 2006 Segnala Inserita: 29 agosto 2006 (modificato) quanto vale b ?b poteva essere anche globale come una MWx .par1 che indirizzo ha?avra un indirizzo di sicuro ma non ti interessa , sara' sicuramente un registro della cpu , ma nemmeno questo ti interessa .my_func (int par1) e' la tua FC parametrizzata e par1 e' il tuo parametro IN , intero ,chiamato par1 nella tua tendina delle variabili .dove vale par1 ? vale al di fuori della funzione my_func(...) ? NO !!! , vale solo li dentro , lo stesso per le variabili IN e OUT e temp Le variabili IN-OUT anche valgono solo li , ma hanno il "potere" di leggere e scrivere la variabile che appoggi "dal di fuori " nel momento del richiamo .In C sarebbe :void my_func (int *par1) {*par1=100;}.........my_func(&mia_var);Il concetto e' questo , adesso dimmi che non conosci nemmeno un pochino il C , che lo so io che ho fatto l'elettricista fino a 6 anni fa e sono un elettrotecnico .Domani dovrei avere tempo e ti scrivo qua sul post una sorgente awl , compilabile in blocco FC .Nel tuo progetto aggiungerai una sorgente nella cartella sorgenti , copierai quello che ti posto io , salvi e compili .da OB1 scriverai call FC1 e vedi cosa succede e poi ci giochi un po , facendo delle prove nella sorgente o nel blocco FC1 direttamente .Proverai a scrivere una variabile IN e vedrai che ti dira' che non si puo , ect ect ciao Modificato: 29 agosto 2006 da walterword
walterword Inserita: 29 agosto 2006 Segnala Inserita: 29 agosto 2006 FUNCTION FC 15 : VOIDTITLE =VERSION : 0.1VAR_INPUT add1 : INT ; //addendo 1 add2 : INT ; //addendo 2END_VARVAR_OUTPUT ris : INT ; //risultato END_VARBEGINNETWORKTITLE =somma addendo passati come IN L #add1; L #add2; +I ; T #ris; END_FUNCTION/////////////////////////////////////////////////////////////////////////////////////////////////////////copia ed incolla nella tua sorgente fino a end_function poi salva e compila e vedrai comparire nella lista dei blocchi il nuovo FC1Apri OB1 e scrivi call FC1 e premi invio Crei 3 variabili dichiarate come int nella tabella dei simboli oppure in un db e le passi ad FC1 carichi tutto e provi se hai il simulatore oppure il plc ciao walterp.s. poi vai nel FC1 compilato e vai a vedere nella tendina come sono dichiarati francesco piu di cosi .......cerca di non dirmi che non hai capito perche ' seno '............
francescotiziano Inserita: 29 agosto 2006 Autore Segnala Inserita: 29 agosto 2006 ciao walter ho compilato il file sorgente come tu mi hai illustrato tutto ok ho salvato il file ,ma in lista blocchi non mi e' comparso l'fc15ancora una cosa ti chiedo e se io volessi usare una variabile di un blocco dati dichiarata come INT lo posso fere?
batta Inserita: 30 agosto 2006 Segnala Inserita: 30 agosto 2006 ho compilato il file sorgente come tu mi hai illustrato tutto ok ho salvato il file ,ma in lista blocchi non mi e' comparso l'fc15La compilazione viene portata a termine o vengono segnalati errori? Io ho provato e funziona.ancora una cosa ti chiedo e se io volessi usare una variabile di un blocco dati dichiarata come INT lo posso fere?Non ho capito dove vuoi usare la variabile del blocco dati. Se intendi dichiararla direttamente nella tendina, la risposta è no, a meno che non si tratti di una FB e del suo DB di istanza. Qui però le cose si complicano un pò. Meglio procedere per passi.Se invece intendi passare il dato alla FC, allora la risposta è sì. Esempio: CALL FC 15 add1:=DB100.DBW0 add2:=DB100.DBW2 ris :=DB100.DBW4I parametri IN, OUT ed IN-OUT servono proprio per questo.
walterword Inserita: 30 agosto 2006 Segnala Inserita: 30 agosto 2006 francesco per prima cosa quando compili una sprgente deve comparire nella lista blocchi .Puoi passare un int se la funzione , o meglio FC parametrizzato , lo richiede un INTE' chiaro che se l'FC vuole un DINT o un REAL devi passare un DINT o un REAL Francesco . io non riescoa capire dove trovi ancora il problema Adesso ti posto una funzione simile alla precedente ma dove richiede un parametro par1 intero come IN , un parametro intero come DINT in IN-OUT lo controlla che non siafuori di un certo range , fa la somma dopo aver "trasformato " l'intero in doppio intero e ti restituisce un REALE .Farai le stesse manovre di compilarlo e quando lo avrai visto nella lista blocchi lo richiamerai da ob1 per esempio .ORGANIZATION_BLOCK OB 1TITLE = "Main Program Sweep (Cycle)"VERSION : 0.1VAR_TEMP OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1) OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1) OB1_PRIORITY : BYTE ; //Priority of OB Execution OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1) OB1_RESERVED_1 : BYTE ; //Reserved for system OB1_RESERVED_2 : BYTE ; //Reserved for system OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds) OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds) OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds) OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 startedEND_VARBEGINNETWORKTITLE = CALL FC 2 ( par1 := DB2.DBW 0, ris := DB2.DBD 6, par2 := DB2.DBD 2);END_ORGANIZATION_BLOCK////////////////////////////////////////////////////////////////////////////////////////////////////////////////////FUNCTION FC 2 : VOIDTITLE =VERSION : 0.1VAR_INPUT par1 : INT ; END_VARVAR_OUTPUT ris : REAL ; END_VARVAR_IN_OUT par2 : DINT ; END_VARBEGINNETWORKTITLE = U( ; L #par2; L L#100; >D ; ) ; SPBN salt; L L#100; T #par2; salt: NOP 0; L #par1; ITD ; L #par2; +D ; DTR ; T #ris; END_FUNCTION//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////DATA_BLOCK DB 2TITLE =VERSION : 0.1 STRUCT var1 : INT ; var2 : DINT ; va3 : REAL ; END_STRUCT ; BEGIN var1 := 0; var2 := L#0; va3 := 0.000000e+000; END_DATA_BLOCKDATA_BLOCK DB 2TITLE =VERSION : 0.1 STRUCT var1 : INT ; var2 : DINT ; va3 : REAL ; END_STRUCT ; BEGIN var1 := 0; var2 := L#0; va3 := 0.000000e+000; END_DATA_BLOCK///////////////////////////////////////////////////////////////////////////////////////////////////Allora hai OB1 , FC2 e DB2 Compilali tutti e prova.In OB1 puo andare online -tasto dx e comandare le variabili forzandole ai valori desiderati , oppure sotto nella tab page comanda , oppure crei una VAT e li forzi da li poi ti mando la fattura ok ?
francescotiziano Inserita: 30 agosto 2006 Autore Segnala Inserita: 30 agosto 2006 ciao waltercome faccio ad assegnare un dato ad (add1)????lo devo riprendere in questo modo esempioL mw 0 //prima wordL mw 6 //seconda word *IT #add1 tutto questo fatto nella fc 15 o forse non e' possibile perche (add1) e' un parametro IN e no e' un AUTancora ciao come sempre disponibile, grazie.resto in attesa della parcella, mi raccomando a te come sempre .. francesco
batta Inserita: 30 agosto 2006 Segnala Inserita: 30 agosto 2006 Una cosa non mi è chiara: hai provato a scrivere, all'interno di una FC che non sia FC15 quanto segue:CALL FC15Fatto questo ti apparirà: CALL FC 15 add1:= add2:= ris := Con le righe add1, add2 e ris evidenziate in rosso. Se posizioni il cursore su "add1" ti verrà segnalato che è richiesto un parametro in ingresso di tipo INT. Lo stesso per "add2". "ris" è invece un parametro in uscita, sempre di tipo INT. Ad "add1" e "add2" puoi assegnare quindi qualsiasi variabile INT oppure direttamente un valore, sempre in formato INT. Il valore "ris" verrà scritto nella variabile INT che assocerai a questo parametro in uscita. Esempio: CALL FC 15 add1:=MW100 add2:=MW102 ris :=MW104 Somma il valore di MW100 al valore di MW102 e metti il risultato in MW104 Oppure: CALL FC 15 add1:=5000 add2:=200 ris :=DB10.DBW0 Somma 5000 + 200 e metti il risultato in DB10.DBW0Tu puoi richiamare nel programma la FC15 varie volte, ogni volta passando parametri diversi.Forse ho capito male ma mi sembra che tu stia cercando di passare il valore ai parametri di FC15 dall'interno di FC15 stessa.Prova a postare un esempio e vediamo se riusciamo a capire meglio qual è il problema.
walterword Inserita: 31 agosto 2006 Segnala Inserita: 31 agosto 2006 hai due parametri in ingresso che giustamente devi assegnare.Puoi farlo cosi :L 10 T DB2.DBW0oppure come ti ho detto sopra puoi FORZARLO da vat oppure in modalita' online Ma raga' leggete i post o cosa ? Francesco io credevo che qualcosa di step 7 la sapevi , ma se non sai nemmeno come assegnare un valore ad una variabile , scusa se te lo dico ,e' prematura saper scrivere una funzione parametrizzata .Impara prima pe cose basilari e semplici
walterword Inserita: 31 agosto 2006 Segnala Inserita: 31 agosto 2006 (modificato) francesco , invece di passare alla FC parametrizzata delle variabili passa delle costanti , per esempio 10 per l'intero , L#100 per il doppio intero .Per i doppi interi , quando assegni un valore devi fare L L#20 T miodoppiointero L# serve per avvisare il registro delll'accumulatore ACCU1 che dovra caricare a 32 bit.FRANCESCOOOOOOOOOOOOOOOOOOO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!dai che e' facile ....ca**o !!!!! Modificato: 31 agosto 2006 da walterword
francescotiziano Inserita: 31 agosto 2006 Autore Segnala Inserita: 31 agosto 2006 ciao walteradesso mi e' tutto cristallino mi devi scusare se ti ho dato filo da torcere nel senso che non ho compreso sin dai primi tuoi messaggi quello che volevo sapere, ti chiedo ancora le mie scuse e non so' davvero se un semplice grazie possa bastare per il tuo interesse al mio problema .grazie !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!Francesco
walterword Inserita: 31 agosto 2006 Segnala Inserita: 31 agosto 2006 (modificato) non ti devi scusare l'importante e' che hai capito Hai capito allora si o no ? p.s. per il grazie non c'e' problema , l'importante e' che continui a frequentare il forum e quando saprai di piu aiuterai il prossimo , ma non come fa il 95% degli iscritti chesi fa sentire solo quando ha bisogno e basta E' chiaro ? Modificato: 31 agosto 2006 da walterword
francescotiziano Inserita: 1 settembre 2006 Autore Segnala Inserita: 1 settembre 2006 ciao walter ho papito, e tutto questo grazie alla tua gentilezza e a questo forum che e' magnifico davvero grazie a tutti.......non ce' ombrea di dubbio che continuero'a frequentare il forum e un giorno quado saro in grado di poter dare un aiuto, anzi tutta la mia esperienza lo faro' con grande piacere e tanta voglia di rende la vita piu' facile a chi ha come me bisogno del vostro aiuto grazie saro' sempre con voi .....Francesco
walterword Inserita: 1 settembre 2006 Segnala Inserita: 1 settembre 2006 va be per sempre magari e' esagerato facciamo .... ognitanto eh ?
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