![](/img/trans.png)
[英]Read .daq (Data Acquisition Toolbox for Matlab) file format in python
[英]Read XML to LabVIEW as task / Cluster using Python to configure DAQ
我正在嘗試加載一個 XML 文件,該文件將用於在 LabVIEW 中配置我的 DAQ。
因此,在查看選項時,我有:
例如 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 中創建 xml 解析器,因為它強制執行更多的硬編碼並具有固定的結構。
我的目標是 LV DAQmx 繼續采樣示例,並將配置替換為已解析的 xml。
感謝每一位支持 Assaf Baker 的人
在 LV 中解析 XML 有點棘手,但並不難。 也許,你試一試?
此代碼遍歷所有通道,提取屬性name
和virtual
,並從它們的子RollingAvg
中提取屬性do_rolling_avg
。
可能,首先獲取節點的所有屬性/值的列表,然后處理生成的數組會更方便:
現在,重要的是在最后關閉所有引用以避免 memory 泄漏,這是快速而骯臟的,在這里完成。
此外,如果未找到某些內容,搜索 VI 將拋出錯誤。 (您的 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.