Oppure

Loading
02/05 16:54
iz1kbp
Buongiorno a tutti,
Sono alla ricerca di un suggerimento su come velocizzare una mia routine, che ora comunque funziona.
Per informazione, creo un byte secondo il protocollo ArtNet per il pilotaggio di fari intelligenti (luci per spettacoli)
Private Sub Timer7_Timer()

'stringa artnet>>>>>>>>>>>>>>
artnet0 = "Art-Net"
For n = 1 To 7
    singolo = Mid(artnet0, n, 1)
        buffer(n - 1) = Asc(singolo) ' creo la frase Art-net
Next
'fine stringa artnet >>>>>>>>>>
buffer(7) = Val(vbNullChar)                 ' richiesto carattere null
'fine creazione stringa>>>>>>
buffer(8) = "0"                      'tipo di dato >  5000 (80) per dmx
buffer(9) = "80"                     '  lo
buffer(10) = "0"                     'protocollo hi >1400
buffer(11) = "14"                    '  lo
If sequenza > 255 Then sequenza = 0
buffer(12) = sequenza '"0"          'sequenza> numero di trasmissione 0 per disabilitare, 1toff
buffer(13) = "0"                     'physical porta dmx in ingresso ?
'universo dmx >>>>>>>>>>>>>>>>
buffer(14) = "0" 'subuni             'universo
buffer(15) = "0"                     'net
'lunghezza array dmx>>>>>>>>>>
buffer(16) = "2"                    'lunghezza array dmx > hi > 1 per un singolo canale
buffer(17) = "0"                    'lunghezza lo >0
'fine costruzione stringa ora carico i valori dei 512 canali >>>>>>>>>>>>>>>>>>>>>>>>>>  (XXX)
Dim artnetch As Integer
For artnetch1 = 1 To 512
    buffer(17 + artnetch) = generalech(artnetch)  >>> questa è la matrice in cui salvo i valori dei singoli canali GENERALCH(CANALE)=VALORE
Next
'fine costruzione pacchetto canali >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  (YYY)
'Spedisco la stringa via UDP
stringa = StrConv(buffer, vbUnicode)
On Error GoTo errore_udp
If sockattivo(0) = True And host0(0) = 1 Then sockMain.SendData stringa

Questo il funzionamento per sommi capi:
Il programma memorizza un una matrice di 512 caselle, il valore dei singoli canali dmx (valore della luce) che vanno appunto da 1 a 512, per 255 livelli ciascuno.
Nel momento in cui modifico il valore di un canale, es il 10 lo porto al max, vado a modificare solo la casella,, ad esempio, generalech(10) =255.
Il protocollo prevere che questa matrice sia mandata in continuo da 1 a 512 sulla rete.
Di queste matrici, il protocollo ArtNet, ne prevede...16530.
Come si vede, io creo il byte da spedire , scansionando tutta la matrice dei calori dei canali DMX da 1 a 512 (il codice compreso tra XXX e YYY)
Usando solo una matrice, il ciclo for riesce a star dentro nel normale refresh dell'invio dei dati ( lo faccio ogni 10 ms)..se però utilizzo 3 matrici, il ciclo FOR mi fa perdere molti dati, perchè se io cambio il valore di un canale nella matrice 1, ma nel frattempo sta processando la matrice 2 e poi deve fare la matrice 3, perdo 3 informazioni.

La domanda è :esiste un metodo per evitare il ciclo for, per creare questi bytes tutto in un colpo?
Ho letto in forum inglesi di una API "RtlMoveMemory API function to copy data" che muove appunto blocci di memoria.Purtroppo le mie conoscenze sono un po limitate.qualcuno potrebbe illuminarmi/suggerirmi la corretta sintassi
dovre essere una cosa del genere ma non riesco a capire la sintassi giusta
CopyBytes buffer(da 17 a 512), ByVal generalech (da 1 a 512), 512


grazie a chiunque mi possa dare una mano.:)

Mario
aaa
02/05 18:36
nessuno
Se ho capito bene all'inizio del codice scrivi

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

e al posto della For dovrebbe bastare questa linea

CopyMemory buffer(18), generalech(1), 512



Detto questo, non capisco perché devi copiare i dati se li hai già.
Se assumiamo che buffer sia costituito SOLO dai byte da 0 a 17 allora puoi evitare la copia e scrivere direttamente

stringa = StrConv(buffer, vbUnicode) & StrConv(generalech, vbUnicode)
Ultima modifica effettuata da nessuno 02/05 18:49
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
02/05 19:21
Carlo
Aspetto la risposta che darai a nessuno.

La porzione di codice:
Dim artnetch As Integer
For artnetch1 = 1 To 512
    buffer(17 + artnetch) = generalech(artnetch)  '>>> questa è la matrice in cui salvo i valori dei singoli canali GENERALCH(CANALE)=VALORE
Next

nel For usi: artnetch1 ma poi per ottenre l'indice usi: artnetch, è un errore nella trascrizione oppure...
Se il codice è così e funziona, come ti ha già detto nessuno fai un ciclo che fa 512 volte la stessa cosa.
Ultima modifica effettuata da Carlo 02/05 19:24
in programmazione tutto è permesso
03/05 6:01
iz1kbp
@Carlo...si, è solo un errore di riporto.
@Nessuno...il programma è nato circa 10 anni fa (gia evoluzioni di precedenti versioni quando usavo ancora Io/Out su porte LPT ) quando questo protocollo non lo conoscevo e tutte le implementazioni successivo sono state fatte partendo dal modello iniziale.
Ho ragionato su quello che hai scritto, me devo dire che hai ragione: io gia creo una matrice (pezzo per pezzo) e poi , ignorantemente, vado a ricrearne un'altra "identica" spazzolando quella appena creata ...perdendo tempo!!
Posso creare direttamente il singolo byte all'inizio, mentre creo il singolo pezzo di matrice in questo modo mi trovo il pacchetto gia fatto e devo solo spedire la stringa convertita.
Evito cosi di fare giri strani con le API..

Grazie per lo spunto!!:k:

Mario
aaa
03/05 17:56
nessuno
Ok facci sapere

P.S. Per curiosità, cosa usavi per l'output su I/O verso LPT1?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
04/05 8:22
iz1kbp
Postato originariamente da nessuno:

Ok facci sapere

P.S. Per curiosità, cosa usavi per l'output su I/O verso LPT1?


Ciao ragazzi...dunque risolto.
Mi sono ricordato che gia avevo predisposto la creazione della singola casella della matrice e quindi, dopo avere controllato tutte le routine interessate, è stato "sufficiente" affiancare la creazione del singolo byte...."semplicemente"

per quanto riguarda l'I/O...usavo inpout32.dll per il comandare una porta LPT che a sua volta comandava un PIC per la creazione del segnale dmx (rs485)..ma ero legato al massimo ad avere 128 canali per via del fatto che usavo solo 8 bit

Grazie ancora per gli spunti!:k:

Mario
aaa