Python NIdaqmx AI-fråga

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26150
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Python NIdaqmx AI-fråga

Inlägg av Icecap »

Jag har kört ett bra tag med att mäta analoga data från bl.a. 3 analoga kanaler via en National Instruments USB-6210.

Jag använder PyCharm Community 2023.3.2, fullt uppdaterat.

Exempel (del av min class för NI):

Kod: Markera allt

    def Measure_Output(self, Reads):
        if not Reads:
            return 0.0, 0.0, 0.0
        task = nidaqmx.Task()
        task.ai_channels.add_ai_voltage_chan(self.Out_Pad_N, terminal_config=nidaqmx.constants.TerminalConfiguration.RSE, min_val= 0.0, max_val=10.0, units=nidaqmx.constants.VoltageUnits.VOLTS)
        task.ai_channels.add_ai_voltage_chan(self.Out_mA_N, terminal_config=nidaqmx.constants.TerminalConfiguration.RSE, min_val= 0.0, max_val=10.0, units=nidaqmx.constants.VoltageUnits.VOLTS)
        task.ai_channels.add_ai_voltage_chan(self.Out_Volt_N, terminal_config=nidaqmx.constants.TerminalConfiguration.RSE, min_val= 0.0, max_val=10.0, units=nidaqmx.constants.VoltageUnits.VOLTS)
        #task.timing.cfg_samp_clk_timing(1000, active_edge=Edge.RISING, sample_mode=AcquisitionType.FINITE)
        task.timing.cfg_samp_clk_timing(1000, active_edge=Edge.RISING, sample_mode=AcquisitionType.FINITE, samps_per_chan=Reads)  # Ändrat till detta
        task.start()  # Tillagt!!!
        Pad_Raw, mA_Raw, Vout_Raw = task.read(Reads)
        task.stop()
        task.close()
        return Pad_Raw, mA_Raw, Vout_Raw
'Reads' är i detta fall 250 så jag får 250 mätningar per kanal o de samplas med 1000 Hz.
Jag har verifierat detta vid att se på längden av varje retur-lista efter kallet och det fungerar perfekt.

Men nu plötsligt får jag:
DaqWarning: Warning 200010 occurred. Finite acquisition or generation has been stopped before the requested number of samples were acquired or generated.

Jag har inte fått denna varning tidigare och programmet gör ändå som det ska, alla data-lister som kommer har rätt storlek osv. så jag anar inte vad som sker.

Någon som har en aning om vad som händer?

EDIT:
Jag har hittat något nu! Om jag lägger in en:
task.wait_until_done(1.0)
direkt efter task.read(Reads)
får jag inte detta problem.

Hela programmet kör långsammare då varje task helt klart behöver mer tid på sig - men det får jag ta.

Mer EDIT:
Om jag i raden:
task.timing.cfg_samp_clk_timing(1000, active_edge=Edge.RISING, sample_mode=AcquisitionType.FINITE)
lägger till så att den läser:
task.timing.cfg_samp_clk_timing(1000, active_edge=Edge.RISING, sample_mode=AcquisitionType.FINITE, samps_per_chan=Reads)

kommer timingen åter till "normal" hastighet.

Jag har även lagt till en task.start() efter timingen är inställd, det gav lite extra hastighet.
Såklart har jag tagit bort vänta-funktionen efter detta.

Sista EDIT:
Jag inser att det att jag rent faktisk startar task ('task.start()') ihop med att jag anger antal mätningar som ska tas ('samps_per_char= Reads') är vad som ska till, då startas samplingen direkt när task startas.