Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18
  1. #11
    Scusaste il ritardo, il codice che ho scritto per adesso è questo, ma a parte il problema del timer ora ho anche un'errore duranete la lettura del valore nel timer.

    codice:
                myTask.AIChannels.CreateVoltageChannel("Dev1/ai0", "", _
                         AITerminalConfiguration.Rse, 0, _
                          5, AIVoltageUnits.Volts)
    
                myTask.Control(TaskAction.Verify)
                myAnalogReader = New AnalogMultiChannelReader(myTask.Stream)
               loopTimer.Enabled = True
    
    
     Private Sub loopTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles loopTimer.Tick
            Try
            data = myAnalogReader.ReadSingleSample()
            Catch exception As DaqException
            MessageBox.Show(exception.Message)
            End Try    
        End Sub

  2. #12
    Di quale problema si tratta? Puoi darci un link alla documentazione di queste classi di gestione della tua scheda che stai usando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #13
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Originariamente inviato da Antonyy74
    Scusaste il ritardo, il codice che ho scritto per adesso è questo, ma a parte il problema del timer ora ho anche un'errore duranete la lettura del valore nel timer.
    Vedo che utilizzi le librerie DAQmx...come ti è stato detto la soluzione che hai postato non va bene, non puoi pensare di prelevare dei dati con una frequenza elevata via software. Ovviamente devi passare a un'acquisizione hardware ovvero sarà la scheda (che sia PCI o USB ) a riempire un buffer interno e a fornire il risultato a lavoro fatto. Più tardi vedo come posso aiutarti......
    Per l'errore a cui ti riferisci, guardando le poche righe di codice che hai postato, mi sembra che tu imposti un lettore [i ]AnalogMultiChannelReader[/i]

    codice:
     myAnalogReader = New AnalogMultiChannelReader(myTask.Stream)
    quando invece poi richiedi solo l'acquisizione di un solo canale. Manca comunque la dichiarazione delle variabili in gioco che noi non vediamo, data di che tipo è?

    codice:
      data = myAnalogReader.ReadSingleSample()
    Sbagliare è umano, perseverare è diabolico.

  4. #14
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,487

    Moderazione

    Stiamo andando discretamente off topic.

    Posto che il Timer non supporta frequenze inferiori a quelle desiderate, e che si tratta di una scelta sbagliata nell'ambito del problema specifico, suggerisco di aprire una nuova discussione per parlare delle questioni legate all'uso della libreria di acquisizione, che è una tematica non strettamente correlata.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #15
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Vedi la classe StopWatch

    che è mooooolto più precisa del timer.
    I got the remedy

  6. #16
    Originariamente inviato da albgen
    Vedi la classe StopWatch

    che è mooooolto più precisa del timer.
    Non credo comunque che si possa ottenere una risoluzione di 10 Ksample/secondo. Bisogna lavorare sui buffer che mette a disposizione l'hardware utilizzato (e da qualche esempio che ho visto la libreria fornisce tutti gli strumenti per impostare la frequenza di campionamento e acquisire i sample ti tanto in tanto).
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #17
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    La classe Daqmx contiene tutto il necessario per fare acquisizioni hardware e dipendentemente da questo puoi acquisire anche fino a 1 MHz con singolo canale.
    Un semplice esempio per acquisire 100000 campioni in un secondo (100KHz), riprendendo il codice che avevi postato:

    codice:
    myTask = New Task("mytask")
            myTask.AIChannels.CreateVoltageChannel("Dev1\ai0", "myCanali", AITerminalConfiguration.Rse, 0, 10, AIVoltageUnits.Volts)
            myTask.Timing.ConfigureSampleClock(String.Empty, 100000, _
            SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, 100000)
            myTask.Control(TaskAction.Verify)
            reader = New AnalogMultiChannelReader(myTask.Stream)
            reader.SynchronizeCallbacks = True
            reader.BeginReadMultiSample(100000, AddressOf myCallBack, Nothing)
    in cui myCallBack è la Sub che viene chiamata a fine elaborazione restituendoti un oggetto di tipo IAsyncResult con tutti i 100000 campioni acquisiti.


    Sbagliare è umano, perseverare è diabolico.

  8. #18
    Funziona alla grande, grazie 1000 anche se ci ho messo un po a capire come avere la matrice dall'oggetto IAsyncResult .
    Ora nasce il problema di come convertire velocemente una matrice bidimensionale in due matrici distinte.......ma aprirò per questo un'altra discussione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.