Jump to content
PLC Forum


ricerca dato in DB con array


Pedro16
 Share

Recommended Posts

Pedro16

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 to comment
Share on other sites


Pedro16

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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

 

 

Edited by drn5
Link to comment
Share on other sites

Pedro16

Ciao ragazzi,

 

@Simone.Salarsi si hai ragione ho commesso un errore, l'array 0 lo utilizzo.

 

@Simone.Salarsi@dott.cicala @drn5 cosa dire se non ringraziarvi per questi consigli...   appena possibile le metto subito in simulazione e vi farò sapere come procedono i test.

 

grazie per ora e a presto

 

Link to comment
Share on other sites

Pedro16
Posted (edited)

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 🙏

 

 

 

Edited by Pedro16
Link to comment
Share on other sites

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 to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...