manu_88 Inserito: 6 luglio 2013 Segnala Share Inserito: 6 luglio 2013 Salve a tutti, sono alle prese con la realizzazione di un software per la gestione di una novantina di utenze digitali. Tale sw deve controllare queste utenze con cadenza di 100ms (ogni 100ms ognuna di queste utenze sarà a 0 o a 1). Per poter programmare queste sequenze ho deciso di utilizzare gli script di wincc leggendo un file di testo. Nella parte PLC ho inserito un DB formato da n (numero dipeso dal numero di utenze) array di 255 bit che verranno scritti dal runtime wincc. Quando vado ad eseguire lo script mi accorgo che la scrittura è molto, molto lenta (più o meno 1 array ogni 40sec). Avevo pensato come soluzione di scrivere un array alla volta direttamente da dentro questo script e non un bit alla volta utilizzando il ciclo for, il problema però è stato che non sono riuscito a scrivere direttamente un array da script. Quello che stavo cercando era un consiglio su come rendere questa scrittura piu veloce e sicura. Comunque il sistema è formato da una CPU 314C-2PN/DP con PC industriale con wincc runtime collegati in Ethernet. Spero di essermi espresso bene Grazie infinite per l'aiuto. Link al commento Condividi su altri siti More sharing options...
rguaresc Inserita: 6 luglio 2013 Segnala Share Inserita: 6 luglio 2013 il mio non è un aiuto, ma se vuoi sorvegliare tanti dati con una interrogazione ogni 100 ms non ti resta che fare questa operazione nella cpu in step 7. Wincc è concepito per funzionare da interfaccia operatore e gli script, anche secondo la documentazione, sono per un uso sporadico. Link al commento Condividi su altri siti More sharing options...
elettrix01 Inserita: 8 luglio 2013 Segnala Share Inserita: 8 luglio 2013 Scusa, ma non ho capito se vuoi aggiornare i dati da wincc flex ogni 100ms oppure ogni 100ms devi controllare le utenze. Comunque per quanto riguarda la prima opzione quoto quanto detto da rguaresc. Per la seconda io giocherei con le ricette, il come non riesco a dirtelo perchè non ho wincc flex sotto mano, ma si dovrebbe poter fare. Link al commento Condividi su altri siti More sharing options...
manu_88 Inserita: 8 luglio 2013 Autore Segnala Share Inserita: 8 luglio 2013 Salve a tutti e grazie mille per le risposte celeri. gli script di wincc li utilizzo solo per una lettura sporadica di un file di testo. Quando l'utente vuole caricare una "ricetta", preme il pulsante "carica" e lo script scrive nel DB tutto ciò che ha letto nel file di testo. Poi sarà il plc a leggere ogni 100ms il valore da scrivere nell'uscita digitale dall'array. Quindi non ci sarà un'interrogazione ogni 100ms tra plc e runtime. ciao a tutti Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 8 luglio 2013 Segnala Share Inserita: 8 luglio 2013 Visto che si tratta di segnali booleani ti consiglio di utilizzare delle doppie word sulle quali sono mappati tutti i bit. A livello di step7 ti vai a mappare le uscite e con 10 dword per esempio vai a pilotare 320 bit / lampade. Con uno script quindi vai a copiare tutti i 10 tag oppure fai un for-next se per caso vuoi utilizzare un array. A te la scelta, tieni conto che il for-next un po di tempo lo porta via, ma trattandosi di poca roba direi che difficilmente te ne accorgi. Il tutto è dovuto al fatto che anche se accedi ad un singolo elemento di array winccflx carica l'array intero. pigroplc Link al commento Condividi su altri siti More sharing options...
manu_88 Inserita: 8 luglio 2013 Autore Segnala Share Inserita: 8 luglio 2013 Ciao Pigroplc sinceramente ho pensato anch'io all'idea delle dword ma il problema che ho è che necessito di 90 utenze quindi avrei bisogno di piu o meno 900 dword. Il probema che riscontro sta nella fase di trasferimento da wincc a db. Nel modo che attualmente uso, il trasferimento impiega quasi 1 ora, anche se ovviamente lo script viene eseguito in qualche secondo. Vorrei capire se c'è un metodo più veloce o mi devo rassegnare . Grazie mille Link al commento Condividi su altri siti More sharing options...
elettrix01 Inserita: 8 luglio 2013 Segnala Share Inserita: 8 luglio 2013 Scusa ma se hai 900 utenze hai bisogno di una trentina di dword Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 9 luglio 2013 Segnala Share Inserita: 9 luglio 2013 Nel modo che attualmente uso, il trasferimento impiega quasi 1 ora, anche se ovviamente lo script viene eseguito in qualche secondo. C'è qualcosa che evidentemente non capisco, visto che la tua spiegazione non mi risulta esaudiente ti spiego ciò che faccio io e vediamo se parliamo della stessa cosa: Io gestisco ricette di circa 2000 tag, l'unico problema che riscontro a livello di winccflx (2008 SP3 Runtime su PC) è la saturazione del buffer (è un preciso codice di errore di cui ora non ricordo il numero). Per ovviare a questo inconveniente faccio dei for-next dello stesso array da 50 alla volta, quindi ci metto un timerino di 1 secondo: esempio for 1 = 0 to 49 istruzioni di copia next i timer = 1 secondo circa for 1 = 50 to 99 istruzioni di copia next i timer = 1 secondo circa .... .... il tutto ripetuto fino a 2000 ti assicuro che ci mette circa 30 secondi, ovviamente se vai a vedere le risorse del computer nel frattempo lavora al massimo, ma si tratta solamente del download della ricetta, dal file ricette all'array di visualizzazione HMI. Il file operativo poi viene copiato a livello di PLC (nel caso del PLC per esempio dalla SFC20), nel caso di Simotion basta molto di meno.... La direzione inversa invece non ha la necessità del trucco di attesa, si compone l'array e alla fine lo si salva su file, quindi ci mette quasi zero tempo. (per i pignoli = meno di 1 secondo). La cosa che non mi piace è l'utilizzo elevato della CPU del pc in fase di download della ricetta, ma non ho trovato un modo furbo inserire un timer di ritardo vbasic senza questo inconveniente. A questo punto mi dici cosa fai tu ??? pigroplc Link al commento Condividi su altri siti More sharing options...
manu_88 Inserita: 9 luglio 2013 Autore Segnala Share Inserita: 9 luglio 2013 Buongiorno all'inizio dello script vado a leggere il file di testo precompilato tramite un ciclo while. Tutto cio che ho letto dal file di testo (quindi per 90 volte 255 stati tra 0 e 1) lo inserisco in una matrice [var(x,y)]. Appena fatto ciò faccio un ciclo for per convertire ogni carattere che ha letto in "true" o "false". Fatto ciò, sempre con un ciclo for scrivo tutto ciò che è stato convertito in bool nel db. While objFile.AtEndOfStream = False strRiga(i) = objFile.ReadLine If Left(strRiga(i), 1) <> "#" And strRiga(i) <> "" Then xProvv = Split(strRiga(i), ",") For ii=0 To 254 xEV(i,ii) = xProvv(ii) If xEV(i,ii) = "0" Then xUtenze(i,ii)=False Else xUtenze(i,ii)=True End If Next i = i + 1 End If Wend For iii=1 To 90 For iiii=0 To 255 SmartTags("Cartella_1\Working DB.EV" & CStr(iii))(iiii)= xUtenze(iii,iiii) Next Next Ho scritto una cosa del genere. Comunque Pigroplc penso che proverò a fare quello che hai fatto tu, cioè ogni 50 variabili attendo qualcosa. Spero di essere stato esaudiente. ciao a tutti Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 9 luglio 2013 Segnala Share Inserita: 9 luglio 2013 ciò che mi sembra di capire è che vai a pilotare un bit alla volta, cosa che mi sembra alquanto macchinosa. Crearti un array di bit resta una soluzione complicata, quando puoi copiarne 32 in un colpo solo. Certo la ricetta sarà indubbiamente meno leggibile, ma in compenso avrai sul tuo tag (una doppia merker word per esempio) tutti gli stati vero o falso dei bit mappati. 255 bit significa 8 doppie word = meno codice = meno tempo di esecuzione. pigroplc Link al commento Condividi su altri siti More sharing options...
manu_88 Inserita: 11 luglio 2013 Autore Segnala Share Inserita: 11 luglio 2013 Grazie mille pigroplc per i tuoi consigli. ho provato un'altra strada usando le ricette di wincc. Il trasferimento è immediato e la compilazione delle ricette è semplice e intuitiva. Grazie di nuovo a tutti!! 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