Vai al contenuto
PLC Forum


TIA13 Puntatori con DIX


Roman1090

Messaggi consigliati

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

in TIA 13 non funziona questo procedimento..

Grazie 

Step7.png

TIA13.png

Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

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? 

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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: da walterword
Link al commento
Condividi su altri siti

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

Ma 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 INT

2) nei DB crei una struttura che fa riferimento al tipo di dati

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

 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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 ;)

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