Vai al contenuto
PLC Forum


Scrittura Array Da Wincc Script A Db


manu_88

Messaggi consigliati

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


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

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

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

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

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

Grazie mille

Link al commento
Condividi su altri siti

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

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

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

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!! :smile:

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