簡體   English   中英

將 XML 作為任務/集群讀取到 LabVIEW,使用 Python 配置 DAQ

[英]Read XML to LabVIEW as task / Cluster using Python to configure DAQ

我正在嘗試加載一個 XML 文件,該文件將用於在 LabVIEW 中配置我的 DAQ。

因此,在查看選項時,我有:

  1. 我的 XML 通道配置是動態的——這意味着一個 XML 可能有 3 個通道,另一個可能有 >100 個通道。
  2. 對我來說,解析 Python 中的 xml 並將數據作為結構/任務傳遞給 LabVIEW 會容易得多。

例如 XML 頻道

<Channels>
        <Channel name="CH_PH1" enable="True" visible="False" virtual="False" units="A" physical_channel="PXI1Slot2/ai0" b_factor="0" m_factor="1033.221069" measurement_type="VOLTAGE" type="D" max_value="0.1" min_value="-0.1">
          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />
        </Channel>
        <Channel name="CH_PH2" enable="True" visible="False" virtual="False" units="A" physical_channel="PXI1Slot2/ai1" b_factor="0" m_factor="1073.772766" measurement_type="VOLTAGE" type="D" max_value="0.1" min_value="-0.1">
          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />
        </Channel>
        <Channel name="P_CH" enable="True" visible="False" virtual="True" units="V" formula="CH_PH1*CH_PH2" doTotalEnergy="False">
          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />
        </Channel>
        <Channel name="P_PH_Total" enable="True" visible="False" virtual="True" units="V" formula="CH_PH1+CH_PH2" doTotalEnergy="False">
          <RollingAvg do_rolling_avg="False" rolling_avg_frame_sec="0" />
        </Channel>
</Channels>

我的代碼在Python解析xml:

def xml():
    import xml.etree.ElementTree as ET
    tree = ET.parse(r'C:\Users\LAB_PTG\Desktop\Cosmo_v0.93.6\nidaq.xml')
    root = tree.getroot()
    P={}
    C={}
    for Channel in root.iter('Channel'):
        z=(Channel.attrib)
        if z['virtual']=='False':
            P.update({z['name']:(z['physical_channel'],z['enable'],z['m_factor'],z['max_value'])})
        else:
            C.update({z['name']:(z['formula'])})
    print(P,C)

需要幫助:

  1. 如何在LabVIEW中執行代碼?
  2. 如何在 LabVIEW 中處理 DICT? 還是有更好的解決方案來傳遞數據?
  3. 使用參數數據動態配置 DAQmx 通道

我沒有設法在 LabVIEW 中創建 xml 解析器,因為它強制執行更多的硬編碼並具有固定的結構。

我的目標是 LV DAQmx 繼續采樣示例,並將配置替換為已解析的 xml。

在此處輸入圖像描述

感謝每一位支持 Assaf Baker 的人

在Labview中解析XML

在 LV 中解析 XML 有點棘手,但並不難。 也許,你試一試?

此代碼遍歷所有通道,提取屬性namevirtual ,並從它們的子RollingAvg中提取屬性do_rolling_avg

在此處輸入圖像描述

可能,首先獲取節點的所有屬性/值的列表,然后處理生成的數組會更方便:

在此處輸入圖像描述

現在,重要的是在最后關閉所有引用以避免 memory 泄漏,這是快速而骯臟的,在這里完成。

此外,如果未找到某些內容,搜索 VI 將拋出錯誤。 (您的 Python 也會這樣做)。 如有必要,應添加一些錯誤處理。


如果你堅持使用Python

今天,有一個選項可以直接從 LV 運行 Python。 我不知道,我的 LV 是 2017 年的。在那里,可以使用System Exec.vi在命令行上運行任何命令,並將其 output 讀回 LV:

在此處輸入圖像描述

最后,Python 打印的內容將作為字符串返回。 我會使用 JSON,它可以輕松地將字典轉換為 JSON:

import json

a=[]
a.append({'name':'CH_PH1', 'virtual':False, 'RollingAvgFrame':3.141})
a.append({'name':'CH_PH2', 'virtual':True, 'RollingAvgFrame':42.0})
print(json.dumps(a))

Output:

[{"name": "CH_PH1", "virtual": false, "RollingAvgFrame": 3.141}, 
{"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]

在LV中,根據JSON結構體定義一個cluster,使用Unflatten from JSON VI進行填充。 簇元素的名稱必須與 JSON 代碼中的名稱匹配。

在此處輸入圖像描述

然而,JSON 只知道簡單的數據類型。 無法傳輸時間或任何其他更復雜的數據類型,除非可以將其打包為更簡單的內容,例如包含時間戳的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM