ken Inserito: 11 dicembre 2019 Segnala Inserito: 11 dicembre 2019 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?
pigroplc Inserita: 11 dicembre 2019 Segnala Inserita: 11 dicembre 2019 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.
ken Inserita: 11 dicembre 2019 Autore Segnala Inserita: 11 dicembre 2019 (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: 11 dicembre 2019 da ken
pigroplc Inserita: 11 dicembre 2019 Segnala Inserita: 11 dicembre 2019 (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: 11 dicembre 2019 da pigroplc
ken Inserita: 11 dicembre 2019 Autore Segnala Inserita: 11 dicembre 2019 Dopo cena gli do una guardata. grazie
ifachsoftware Inserita: 6 marzo 2020 Segnala Inserita: 6 marzo 2020 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
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