Vai al contenuto
PLC Forum


Indicizzare DB in scl


Messaggi consigliati

Inserito:

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?


Inserita:

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.

Inserita: (modificato)

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
Inserita: (modificato)

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
  • 2 months later...
ifachsoftware
Inserita:

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

 

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