Roman1090 Inserito: 15 gennaio 2016 Segnala Inserito: 15 gennaio 2016 Salve a tutti ho un problemino con TIA, non riesco a puntare le variabili come in STEP7 (Molto comodo)Vorrei fare un puntamento indiretto.. non trovo nessun modo per farlo... ;( avete qualche idea di come si potesse risolvere..ES: in step 7 se faccio un CALL Ingresso :=DBX10.0in TIA 13 non funziona questo procedimento..Grazie
drugo66 Inserita: 15 gennaio 2016 Segnala Inserita: 15 gennaio 2016 Ciao, prova a togliere il segno di spunta da Blocco Ottimizzato dalle proprietà del blocco dato che utilizzi.
Roman1090 Inserita: 17 gennaio 2016 Autore Segnala Inserita: 17 gennaio 2016 Ciao ho gia provato in tutte le maniere, non ci sono riuscito... ma con TIA non si puo puntare le variabili tramite commento ? come in A&B.
batta Inserita: 17 gennaio 2016 Segnala Inserita: 17 gennaio 2016 Io ho provato, e la sintassi "DIX10.0" non mi crea problemi. AUFDI %DB21 U %DIX10.0 = %DIX20.0 Sicuro che il problema non sia nella funzione "Speed Management"? che tipo di variabile vuole in ingresso?Sono variabili del DB di istanza della FB aperta o di un'altra FB? Sicuro, inoltre, che non ci sia un modo più elegante per fare la stessa cosa, magari utilizzando i nomi delle variabili o un array? Oppure passando alla funzione tutti i parametri come un'unica struttura? Per quanto riguarda l'indirizzamento indiretto, se il blocco è "non ottimizzato", col 1500 puoi utilizzare le stesse istruzioni del 300.
Roman1090 Inserita: 20 gennaio 2016 Autore Segnala Inserita: 20 gennaio 2016 Non mi passa parametri nella FC. tramite DIX.. hai ragione è un modo complicato, non è tanto chiaro.. sto cercando di scriverlo in un altra maniera. perchè riferimento incrociato in TIA non funzionano in parte...Sto cercando di farlo tramite un array. che non è facile, come hai suggerito, ma non trovo nessuna guida fatta bene, che ti spiega tutte le potenzialità del simbolico, magari hai qualche suggerimento un link di un manuale?
batta Inserita: 20 gennaio 2016 Segnala Inserita: 20 gennaio 2016 Per capire se si può utilizzare un altro sistema, dovrei sapere nel dettaglio cosa devi fare. Forse, potrebbe tornare utile la "sovrapposizione delle variabili con AT".Significa che, in una funzione (FB o FC), puoi dichiarare una variabile, per esempio un array di booleane e, subito sotto, dichiarare i singoli bit.Cerca "AT" nel manuale in linea del TIA. Altra possibilità (ma dovrei conoscere nei dettagli il caso specifico), potrebbe essere quella di utilizzare una struttura di variabili, e passare alla funzione l'intera struttura anziché le singole variabili.
walterword Inserita: 20 gennaio 2016 Segnala Inserita: 20 gennaio 2016 prova a dichiarare i parametri come IN-OUT , per un puntatore ....
Roman1090 Inserita: 21 gennaio 2016 Autore Segnala Inserita: 21 gennaio 2016 Nella mia FC passo, un valore della velocità attuale(SpeedRequest), 10 valori INT è la percentuale con la quale deve andare motore. puoi tramite una selezione Condition1 o 2 o 3 ecc..Prendo velocità attuale la moltiplico per un valore INT selezionato tramite Condition è divido per 100.#ActualSpeed := #SpeedRequest;(* Condizione 1 *)IF #Condition1 = 1 THEN #ActualSpeed := #SpeedRequest * #Speed1Perc / 100;END_IF;(* Condizione 2 *)IF #Condition2 = 1 THEN #ActualSpeed := #SpeedRequest * #Speed2perc / 100;END_IF; Pero sta funziona va fatta per tutti motori... per non andare a scrivere sempre la DB volevo puntare FC tramite DIX.. per aprire soltanto all inizio AUF della DB
walterword Inserita: 21 gennaio 2016 Segnala Inserita: 21 gennaio 2016 (modificato) puoi fare una FB e richiamarla N volte instanziando N volte N DB di istanza.Ogni motore avrà il suo DB di istanza pulito senza conflitto con gli altri .O seno fai una FC agganciata ad un DB globale con all'interno un array di N strutture ognuna delle quali contiene i parametri di un motore ed indicizzi con SCL.La condizione N diventa l'indice che estrapola la struttura del motore N o della situazione N.o seno mi mandi le specifiche che te lo faccio io , cosa vuoi che ti dica....le cose più semplici sembra quasi vi divertiate a complicarle con i puntatori Modificato: 21 gennaio 2016 da walterword
batta Inserita: 21 gennaio 2016 Segnala Inserita: 21 gennaio 2016 Pero sta funziona va fatta per tutti motori... per non andare a scrivere sempre la DB volevo puntare FC tramite DIX.. per aprire soltanto all inizio AUF della DBMa richiami la FC n. volte quanti sono i motori, ogni volta anteponendo il richiamo l'istruzione esplicita di apertura del DB, oppure richiami una sola volta la FC, aprendo di volta in volta un diverso DB?A me pare di aver capito che siamo nel primo caso: n richiami per n motori. L'apertura del DB ti permette solo di risparmiare un po' di scritture di indirizzi. Questa soluzione però ti impedisce di fare un cross reference. Comunque, se richiami la FC per ogni motore, la soluzione è molto semplice:1) crei un "Tipo di dati" con le 10 variabili BOOL e le 10 variabili INT2) nei DB crei una struttura che fa riferimento al tipo di dati3) nella FC crei una struttura IN/OUT che fa riferimento sempre allo stesso tipo di dati (viene creato un puntatore)4) quando richiami l'FC, in un'unica riga passi tutta la struttura. Tutto poi viene fatto utilizzando il simbolico, quindi anche la leggibilità ne guadagna. Nel caso invece tu volessi richiamare una sola volta l'FC, potresti creare un unico DB con all'interno un array del tipo di dati di cui sopra.Quando richiami la FC, puoi mettere una variabile INT tra le parentesi quadre. Cambiando il valore di questa variabile, punti al motore che ti interessa.
Roman1090 Inserita: 24 gennaio 2016 Autore Segnala Inserita: 24 gennaio 2016 Perfetto grazie mille... richiamo FC n. volte con la sua DB. anche software sara piu leggibile.. volevo fare qualcosa di piu carino con TIA.. ma dopo hai dei svantaggi tipo cros reference non funziona piu... aspetto la versione successiva magari risolveranno questo "piccolo problema" Per walterworld.. io non volevo fare una cosa complicata, volevo fare un software scritto soltanto in simbolico con le DB ottimizzate, ma puoi ho iniziato a scoprire vari BUG del TIA... e lasciamo perdere le bestemmie dette al telefono con assistenza SIEMENS.. Purtroppo non sono molto bravo in SCL, lo sto scoprendo adesso. mio problema che dopo ogni motore ha la sua ricetta, quindi devo ricopiare dati ricetta per ogni motore. se lo faccio nella vecchia maniera con DB non ottimizzate non avrei questo problema.... Con DB ottimizzate mi trovo in difficoltà... ES: Ho 10 motori creo le mie 10 DB per ogni motore... ogni motore puo contenere 10 velocità differenti. DB del motore: Ricetta Attuale : 10 INT. Ricetta 1: 10 INT. Ricetta 2: 10 IN. eccc. quando carico programma devo caricare valori dalla ricetta 1 in quella attuale, o se salvo devo salvare da ricetta attuale in una ricetta che ho scelto. con un motore è facile ma se ne ho di piu.... Nel S7 aprivo la DB copiavo dati della ricetta e puoi incrementavo la DB +1 per motore successivo... a quanto pare con Symbolico del TIA non riesco a farlo
batta Inserita: 24 gennaio 2016 Segnala Inserita: 24 gennaio 2016 Quote Nel S7 aprivo la DB copiavo dati della ricetta e puoi incrementavo la DB +1 per motore successivo... a quanto pare con Symbolico del TIA non riesco a farlo Col simbolico del TIA lo fai in modo più semplice e più pulito. Devi solo organizzare i dati di ogni singolo motore in una struttura. Poi, anziché avere un DB per ogni motore, crei un unico DB con un array di strutture. Nella FB o FC dichiari come INOUT sempre la stessa struttura e, in una sola riga, passi alla funzione tutti i dati. Se ti prepari un "tipo do dati" con la struttura dei dati di un motore, diventa tutto estremamente semplice, perché ti basta, nella dichiarazione delle variabili, fare sempre riferimento al tipo di dati. Se fai una modifica al tipo di dati, ti basta aggiornare i blocchi dove il tipo di dati è utilizzato, e sei a posto. Insomma, tutto più chiaro, più pulito, più facile, più elegante. Se vuoi automatizzare il tutto, ti basta incrementare, al posto del numero del DB, l'indice dell'array. Ricorda poi che, con le CPU 1200/1500, l'istruzione MOVE non copia solo byte, int e dint, ma intere strutture. Basta che la struttura sorgente e la struttura destinazione siano uguali. Quindi, anche per gestire eventuali ricette nel plc tutto diventa più semplice. Quote ma puoi ho iniziato a scoprire vari BUG del TIA... Quali sarebbero questi bugs? Se ti riferisci a qualche lacuna del cross reference, non si tratta di bugs ma, purtroppo, di una scelta di Siemens. Spero vivamente che, un bel giorno, rinsaviscano e sistemino la cosa. Comunque, se apri il DB e poi utilizzi DIX e DIW, di cross reference non se ne parla proprio. Di altri problemi, almeno inerenti a quello che vuoi fare, io non ne conosco.
Roman1090 Inserita: 25 gennaio 2016 Autore Segnala Inserita: 25 gennaio 2016 è si devo utilizzare la stessa DB, non è bello specialmente quando ne hai una 70 - 80 motori sulla linea.. è ogni motore contiene 10 di ricette, comunque ho puntato per la tua soluzione quella di una DB array... adesso vediamo che cosa ne esce fuori.. Grazie mille per aiuto..al posto di MOVE ho utilizzato serializza e deserializza.
batta Inserita: 26 gennaio 2016 Segnala Inserita: 26 gennaio 2016 Quote e ogni motore contiene 10 di ricette Con "10 ricette" intendi le 10 velocità? Se è così, si tratta di 22 byte per motore (20 per le word e 2 per i bit). Ben poca cosa. Anche nel caso ogni ricetta contenga le 10 velocità, non è certo un problema. Tieni presente poi che puoi anche creare array a più dimensioni (max 6). Quote al posto di MOVE ho utilizzato serializza e deserializza. Non mi pare una buona idea. Sono istruzioni che servono per tutt'altro scopo.
Roman1090 Inserita: 28 gennaio 2016 Autore Segnala Inserita: 28 gennaio 2016 ogni ricetta ha 10 interi e dieci ricette sono 100 interi, per 100 motori... ci puo stare come dimensioni.. Quello che mi interessa e serializza e deserializza, xk dici serve per altro? leggo meglio manuali, se si puo fare con un semplice move utilizzo quello, grazie
Roman1090 Inserita: 5 febbraio 2016 Autore Segnala Inserita: 5 febbraio 2016 Salve Ho finito, alla fine è più facile di quello che sembrava: #IndiceMotore := #PrimoMotore; #IndiceFormato := #FormatoSelezionato; IF #SalvaFormato = 1 THEN FOR #IndiceMotore := #PrimoMotore TO #UltimoMotore BY 1 DO "Motori".Motore[#IndiceMotore].Formati[#IndiceFormato] := "Motori".Motore[#IndiceMotore].FormatoAttuale; END_FOR; END_IF; GRAZIE a tutti per aiuto PS: un puo mi disp che non riesco farlo con le DB, incrementare indice delle DB, sarebbe figo
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