Vai al contenuto
PLC Forum


Indicizzare DB in scl


ken

Messaggi consigliati

Per questione di scambio dati con un db sql esterno ho 4 blocchi dati differenti con la medesima struttura (tipo di dato). ogni DB rappresenta una delle 4 sorgenti di materiale che posso avere.

fin'ora avevo un solo DB con 4 array del tipo di dato e in scl facilmente mi ero creato il puntatore per prelevare i dati che mi servivano.

ora con i 4 db differenti non trovo un modo "elegante" per fare la stessa cosa.

la soluzione provvisoria è quella di creare nei dati temp un array identico a quello dei DB e con 4 istruzioni if vado a copiare l'intero db nei dati temporanei:

IF #Braccio = 1 THEN
    #Dati_braccio:= "DB101 Braccio 1".pacco;
END_IF;

dove #dati_braccio è l'array temporaneo del tipo di dato (è un array di 32 tipi di dato)

dove "DB101 Braccio 1".pacco è un DB con un array di 32 tipo di dato

 

quello che non mi piace è copiare l'intera area.

i 32 elementi dell'array contengono dati di una singola bobina, potrei avere perciò un massimo di 32 bobine. quello che solitamente faccio è leggere, verificare e copiare i dati del singolo elemento dell'array direttamente da DB. esempio:

IF "DB111 Dati bobine".Braccio[#Braccio].Codice[#Item]= #"Ultima riga" // Controlla codice se corrisponde a ultima bobina del braccio
THEN
        #"Fine ordine" := 1; // alza bit fine ordine
        RETURN;
END_IF;

dove #Braccio è il numero del braccio da cui leggere i dati (da 1 a 4)

dove #Item è l'elemento dell'array di cui voglio leggere la stringa di caratetteri Codice e verificare se è uguale a quello che identifica l'ultima riga e quindi alzare il bit per il ladder normale.

ora, con 4 DB differenti non trovo il modo per sostituite ""DB111 Dati bobine"" in una variabile.

l'unico modo che ho pensato e utilizzato è quello di creare la medesima struttura nei dati temp.

 

esiste un modo per evitare di copiare i dati?

Link al commento
Condividi su altri siti


mettere un case a monte e discriminare le 4 DB?

altrimenti si può comporre il tag tramite script sullo scada, soluzione che però non mi piace se deve cambiare dei flag nel PLC.

Link al commento
Condividi su altri siti

Si faccio col case e discrimino ma correggimi se sbaglio, in questo modo copio il db scelto con case in area locale per poi leggere ogni singolo dato dell'array.

 

In awl potevo fare :

auf DBxx

per poi fare

L DBWxx

 

questo in scl non lo posso fare o almeno non sono capace io di farlo. nella soluzione Blocco dati con 4 array avevo risolto la situazione in modo semplice, capibile e con poche righe di programma.

Modificato: da ken
Link al commento
Condividi su altri siti

ti fai un puntatore in ingresso poi lo gestisci con l'overlay (funzione AT). 

ultimamente ho postato del codice per la gestione di una sirena per allarmi o un'altra diavoleria del genere. Potresti prendere spunto da li

tipo questo 

 

 

 

Modificato: da pigroplc
Link al commento
Condividi su altri siti

  • 2 months later...
ifachsoftware

Se passi il dato come IN/OUT alla tua funzione , non esegui nessuna copia , ma semplicementi passi il puntatore alla tua struttura e ci lavori tranquillamente

 

Esempio

 

db1.PNG.5f85a0f5da846bceff879188dd12df39.PNG

DB2.PNG.2e0092d695fbdd304550384acc0a185a.PNGDB3.PNG.b1a5ac4ed2eb6bbd7339fa57b30b726b.PNGPROCESSDATA.PNG.fcc02890ce567d3cbf4955dbad2d7291.PNGSELECTDATA.PNG.89ca537805d661c61a5380c20ee8de94.PNG

 

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