Python DAQmx Task 執行需要跑很長時間才能完成

更新 Jan 9, 2025

產品資訊

驅動程式

  • NI-DAQmx

程式語言

  • Python

問題敘述

  • 我用 Python DAQmx API 從我的 DAQ 硬體獲取或產生資料,每次執行我的程式碼時,我都會注意到寫入或讀取 task 需要超過 200 毫秒才能完成。我怎樣才能減少執行時間?
  • 我用 Python API 將一組值寫入我的 DAQ 硬體,儘管我只有寫少量程式碼,但我的程式碼總是需要幾百毫秒才能完成。有沒有辦法讓它更快?

解決方案

Python 程式碼的執行速度取決於許多因素,包括:

  • API 的呼叫方式。
  • 用於任務的 API 選擇。
  • 軟體限制。

要確定您的執行速度是否可以提高,請執行以下步驟:

1. 盡量減少 task 打開和關閉的次數。

  • 建立和設定 task 時,Python 必須定位並載入與初始化關聯的 DLL。這將增加執行時間。
  • 如果可能,在開始時初始化一次任務,並在不關閉或重新初始化的情況下重複讀/寫操作。
  • 注意: DAQmx 任務應該在您使用完硬體後打開一次並關閉一次。

2. 如果使用類比輸入/輸出,請嘗試使用stream_readersstream_writers

3. 確保您正確安排了任務的時間。

  • 導入 Python Module以對特定程式碼段計時。
    注意:一個通用Module是使用 datetime 這個Module。
  • 取得function 之前的時間,並在 function 之後立即再次取一次時間以計算執行所花費的時間。對每個功能重複此操作以確定哪個功能執行時間最長。
  • 下面是一個 DAQmx 寫定時的例子。
import nidaqmx
import datetime

with nidaqmx.Task() as task:
    #get module and channels
    module1 = nidaqmx.system.System().devices[1].ao_physical_chans.all.name
    task.ao_channels.add_ao_current_chan(module1)

    #configure timing
    task.timing.samp_timing_type = nidaqmx.constants.SampleTimingType.SAMPLE_CLOCK
    acquis_type = nidaqmx.constants.AcquisitionType.FINITE
    task.timing.cfg_samp_clk_timing(rate=24000,sample_mode=acquis_type,samps_per_chan=24)
  
    #obtain start time, execute a write function, and then obtain the end time
    st = datetime.datetime.now()
    print(task.write([[0.001,0.002,0.003], [0.004,0.005,0.006], [0.007,0.008,0.009],[0.001,0.002,0.003], [0.004,0.005,0.006], [0.007,0.008,0.009],[0.001,0.002,0.003], [0.004,0.005,0.006]], auto_start=True))
    et = datetime.datetime.now()
    
    #calculate the difference between the start and end time, and print the result
    ft = et - st
    print(ft.microseconds)



4. 考慮以下軟體限制是否影響了您的執行速度。

  • Windows 作業系統是不確定的,有幾個因素可能造成此結果: 持續執行且無法終止的後台任務、更新和程序。因此預計程式碼至少需要幾毫秒才能完成(可能更多,具體取決於程式碼的複雜性)。
  • Python API 是 C API 之上的 Wrapper。因此Python 必須呼叫 DLL 來執行每個功能,每個 DLL 都需要處理器時間,因此請考慮修改您的程式碼以呼叫盡可能少的 DLL。
  • PC 的 CPU 負載將對程式碼執行時間產生影響,所以如果 PC 正在執行後台應用程式、程序或更新,程式碼將需要更長的時間來執行。