亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

一只名叫tom的貓 2024-01-04 17:14:53
我正在嘗試加載一個 XML 文件,該文件將用于在 LabVIEW 中配置我的 DAQ。因此,當我查看選項時,我有:我的 XML 通道配置是動態的 - 這意味著一個 XML 可能有 3 個通道,另一個 XML 可能有 >100 個通道。對我來說,用 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)需要幫助:如何在LabVIEW中執行代碼?如何在LabVIEW中處理DICT?或者有更好的解決方案來傳遞數據嗎?使用 paras 數據動態配置 DAQmx 通道我沒有設法在 LabVIEW 中創建 xml 解析器,因為它強制執行更多硬編碼并具有固定的限制。我的目標是 LV DAQmx 繼續采樣示例,并用解析的 xml 替換配置。
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

在Labview中解析XML

在 LV 中解析 XML 有點棘手,但也不是那么困難。也許,你嘗試一下?

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

https://img1.sycdn.imooc.com/6596773f0001fdfe07880465.jpg

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

https://img1.sycdn.imooc.com/6596774d0001c3d303320113.jpg

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

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


如果你堅持使用Python

如今,可以選擇直接從 LV 運行 Python。我不知道這一點,我的 LV 是 2017 年的。在那里,可以使用System Exec.vi在命令行上運行任何命令,并將其輸出讀回 LV:

https://img1.sycdn.imooc.com/6596775d000143e902820149.jpg

最后,Python 打印的內容將以字符串形式返回。我會使用 JSON,它可以輕松地將 dict 轉換為 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))

輸出:


[{"name": "CH_PH1", "virtual": false, "RollingAvgFrame": 3.141}, 

{"name": "CH_PH2", "virtual": true, "RollingAvgFrame": 42.0}]

在LV中,根據JSON結構定義一個簇,并使用Unflatten from JSONVI填充它。集群元素的名稱必須與 JSON 代碼中的名稱匹配。

https://img1.sycdn.imooc.com/6596776e00016ad805310250.jpg

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



查看完整回答
反對 回復 2024-01-04
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號