Pedro16 Inserito: 6 marzo Segnala Share Inserito: 6 marzo 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 More sharing options...
drn5 Inserita: 6 marzo Segnala Share Inserita: 6 marzo Un ciclo FOR con dentro un bel IF ? Link al commento Condividi su altri siti More sharing options...
Pedro16 Inserita: 7 marzo Autore Segnala Share Inserita: 7 marzo 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 More sharing options...
Simone.Salarsi Inserita: 7 marzo Segnala Share Inserita: 7 marzo 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 More sharing options...
drn5 Inserita: 7 marzo Segnala Share Inserita: 7 marzo 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 More sharing options...
dott.cicala Inserita: 7 marzo Segnala Share Inserita: 7 marzo 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 More sharing options...
drn5 Inserita: 7 marzo Segnala Share Inserita: 7 marzo (modificato) 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: 7 marzo da drn5 Link al commento Condividi su altri siti More sharing options...
Pedro16 Inserita: 7 marzo Autore Segnala Share Inserita: 7 marzo 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 al commento Condividi su altri siti More sharing options...
Pedro16 Inserita: 8 marzo Autore Segnala Share Inserita: 8 marzo (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: 8 marzo da Pedro16 Link al commento Condividi su altri siti More sharing options...
Simone.Salarsi Inserita: 9 marzo Segnala Share Inserita: 9 marzo 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 More sharing options...
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