Vai al contenuto
PLC Forum


ricerca dato in DB con array


Pedro16

Messaggi consigliati

Buonasera a tutti,

ho creato un DB con array[0..100] di UDT, la struttura di questa UDT ha dati diversi (String, INT, ed una serie di boolean)

 

Volevo capire se fosse possibile, dopo aver ricevuto un dato dall'esterno in formato String (ricevo questo dato in OPCUA), verificare se esiste lo stesso valore String nella DB sopra descritta.

Se il dato in ingresso corrisponde al primo dato String, allora dovrei caricare tutti i dati di quell'indice in una DB d'appoggio che avrà la stessa struttura dell'UDT ma non più in array.

 

La CPU utilizzata è una 1511C. 

Se fosse possibile realizzare quanto sopra descritto, in SCL è la strada migliore? non ho grandissime esperienze in SCL ma lo trovo molto interessante.

Vi ringrazio in anticipo per qualsiasi consiglio.

spero innanzi tutto che possa essere chiara la mia problematica.

Grazie 1000

 

 

 

Link al commento
Condividi su altri siti


Ciao drn5, 

il ciclo FOR dovrei strutturarlo per cercare la stessa stringa nel mio array, mentre  l'IF all'interno sarà l'istruzione che interrompe il ciclo FOR quando la condizione di ricerca è soddisfatta?

scusa la domanda, sicuramente banale, ma non ho grandi esperienze in SCL, questo potrebbe essere corretto? 

==================================================

 FOR index := 1 TO 100 BY 1 DO
            StringaLetta := Dati[index].Stringa;
            IF (StringaLetta = StringaRicevuta) THEN     
                StringaTrovata := 1 
            END_IF;
  END_FOR;

==================================================

se fosse corretto, come posso Identificare e poter caricare tutto il pacchetto dati di quell'indice a cui corrisponde la stringa trovata? 

ti ringrazio in anticipo per l'ulteriore consiglio... appena posso inizio a simulare qualcosa e ti faccio sapere.

 

Link al commento
Condividi su altri siti

Simone.Salarsi


Nel primo post hai dichiarato un array[0..100] of UDT però nel ciclo for hai messo da 1 a 100. Significa che l'array 0 non viene utilizzato ?

 

rispetto al tuo codice farei le seguenti modifiche:


VAR
    indiceStringa INT
    stringaTrovata: BOOL
END_VAR

 

FOR index := 0 to 100 DO
    IF stringaRicevuta = myDB1.array(index].stringa THEN
        indiceStringa := index; // memorizzo l'indice trovato nella variabile indiceStringa
        stringaTrovata := TRUE;
        EXIT; // se trovo l'elemento uguale posso evitare di scorrere l'array fino in fondo perchè suppongo non vi siano elementi duplicati, quindi esco dal ciclo.
    ELSE
        stringaTrovata := FALSE;        
    END_IF;
END_FOR;


IF stringaTrovata THEN
    myDB2 := myDB1.array[indiceStringa];
END_IF;

Link al commento
Condividi su altri siti

stringaTrovata := FALSE;

 

FOR index := 0 to 100 DO
    IF stringaRicevuta = myDB1.array(index].stringa THEN
        myDB2 := myDB1.array[indiceStringa];
        stringaTrovata := TRUE; 

       EXIT;

    END_IF;
END_FOR;

 

 

Più efficiente così..

Link al commento
Condividi su altri siti

dott.cicala
10 minuti fa, drn5 ha scritto:

stringaTrovata := FALSE;

 

FOR index := 0 to 100 DO
    IF stringaRicevuta = myDB1.array(index].stringa THEN
        myDB2 := myDB1.array[indiceStringa];
        stringaTrovata := TRUE; 

       EXIT;

    END_IF;
END_FOR;

 

 

Più efficiente così..

Ottimo ma c'è qualche errore?

 

FOR index := 0 to 100 DO
    IF stringaRicevuta = myDB1.array[index].stringa THEN
        myDB2 := myDB1.array[index];
        stringaTrovata := TRUE; 

       EXIT;

    END_IF;
END_FOR;

 

 

Link al commento
Condividi su altri siti

opss. l'ho copiato pari pari.... grrr...

 

sostituire index con  #indiceStringa o anche viceversa .😁

 

il # andrebbe anche davanti al stringaTrovata

 

anche se poi e qui ogni tanto mi sbaglio... il # quando scrivi in scl ci vuole quando scrivi negli script del pannello no... (ma è anche vero che quello non è Scl) però crea confusione....

 

 

Modificato: da drn5
Link al commento
Condividi su altri siti

Inserita: (modificato)

volevo ringraziarvi nuovamente... il progetto, anche se in simulazione, sta procedendo bene.

ora sto cercando di aggiungere alcuni controlli, tipo segnalazione se non trovo la Stringa ricevuta e possibilità di inserire dati nel primo array di stringhe vuoto.

 

mi ci vorrà ancora qualche prova, visto che sono alle prime armi con SCL, ma mi sta appassionando sempre più.

vi auguro un buon weekend e grazie ancora 🙏

 

 

 

Modificato: da Pedro16
Link al commento
Condividi su altri siti

Simone.Salarsi

La parte della stringa non trovata è praticamente già fatta, se subito dopo aver eseguito il ciclo FOR stringaTrovata risulta ancora FALSE generi il messaggio.

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